@tuki-io/tuki-widgets 0.0.200 → 0.0.202
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/esm2020/di2mt/shared/components/stat-card/stat-card.component.mjs +4 -4
- package/esm2020/user-creation/src/app.constants.mjs +16 -2
- package/esm2020/user-creation/src/classes/notification.mjs +32 -0
- package/esm2020/user-creation/src/environments/environment.mjs +11 -0
- package/esm2020/user-creation/src/interfaces/user-creation-wizard.interfaces.mjs +199 -0
- package/esm2020/user-creation/src/shared/components/notification/notification.component.mjs +38 -0
- package/esm2020/user-creation/src/shared/material.module.mjs +35 -7
- package/esm2020/user-creation/src/shared/pipes/truncate.pipe.mjs +30 -0
- package/esm2020/user-creation/src/shared/services/notification.service.mjs +62 -0
- package/esm2020/user-creation/src/shared/services/user-creation-api.service.mjs +43 -19
- package/esm2020/user-creation/src/shared/shared.module.mjs +27 -4
- package/esm2020/user-creation/src/user-creation.module.mjs +40 -7
- package/esm2020/user-creation/src/utils/app-loader/app-loader.mjs +14 -0
- package/esm2020/user-creation/src/utils/build-savable-end-user.mjs +147 -0
- package/esm2020/user-creation/src/utils/device-default-prefix.mjs +13 -0
- package/esm2020/user-creation/src/utils/device-name-validation.mjs +23 -0
- package/esm2020/user-creation/src/utils/model.mjs +19 -0
- package/esm2020/user-creation/src/utils/parse-device-name-rule.mjs +26 -0
- package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.mjs +512 -20
- package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-overview-step/user-overview-step.component.mjs +3 -3
- package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.mjs +80 -34
- package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.mjs +83 -19
- package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.mjs +599 -124
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +3 -3
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +2129 -325
- package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +3 -3
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +2084 -314
- package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
- package/package.json +1 -1
- package/user-creation/src/app.constants.d.ts +10 -0
- package/user-creation/src/classes/notification.d.ts +18 -0
- package/user-creation/src/environments/environment.d.ts +9 -0
- package/user-creation/src/interfaces/user-creation-wizard.interfaces.d.ts +554 -0
- package/user-creation/src/shared/components/notification/notification.component.d.ts +19 -0
- package/user-creation/src/shared/material.module.d.ts +5 -1
- package/user-creation/src/shared/pipes/truncate.pipe.d.ts +7 -0
- package/user-creation/src/shared/services/notification.service.d.ts +18 -0
- package/user-creation/src/shared/services/user-creation-api.service.d.ts +8 -2
- package/user-creation/src/shared/shared.module.d.ts +3 -1
- package/user-creation/src/user-creation.module.d.ts +17 -10
- package/user-creation/src/utils/app-loader/app-loader.d.ts +6 -0
- package/user-creation/src/utils/build-savable-end-user.d.ts +23 -0
- package/user-creation/src/utils/device-default-prefix.d.ts +5 -0
- package/user-creation/src/utils/device-name-validation.d.ts +6 -0
- package/user-creation/src/utils/model.d.ts +1 -0
- package/user-creation/src/utils/parse-device-name-rule.d.ts +8 -0
- package/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.d.ts +83 -7
- package/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.d.ts +11 -4
- package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.d.ts +18 -0
- package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.d.ts +71 -56
package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.mjs
CHANGED
|
@@ -1,11 +1,38 @@
|
|
|
1
1
|
import { inject, Injectable } from "@angular/core";
|
|
2
2
|
import { UserCreationApiService } from "../../shared/services/user-creation-api.service";
|
|
3
|
+
import { catchError, forkJoin, map, of, Subject, switchMap, tap } from "rxjs";
|
|
4
|
+
import Big from "big.js";
|
|
5
|
+
import { SiteDefaults } from "../../classes/site";
|
|
6
|
+
import { Site } from "../../classes/site";
|
|
7
|
+
import { DnRangeType, EndUser, } from "../../interfaces/user-creation-wizard.interfaces";
|
|
8
|
+
import { buildSavableEndUser } from "../../utils/build-savable-end-user";
|
|
9
|
+
import { applyDefaultDevicePrefixIfMissing } from "../../utils/device-default-prefix";
|
|
10
|
+
import { parseDeviceNameRegexBody } from "../../utils/parse-device-name-rule";
|
|
3
11
|
import * as i0 from "@angular/core";
|
|
4
12
|
export class UserCreationWizardService {
|
|
13
|
+
get currentSite() {
|
|
14
|
+
return this._currentSite;
|
|
15
|
+
}
|
|
16
|
+
get firstLineRoutePartition() {
|
|
17
|
+
return this.lines[0]?.directoryNumber?.routePartitionName ?? '';
|
|
18
|
+
}
|
|
19
|
+
get siteDefaultRoutePartition() {
|
|
20
|
+
return this.siteDefaults?.routePartition || '';
|
|
21
|
+
}
|
|
22
|
+
get routePartitionNamesList() {
|
|
23
|
+
return this.siteDefaults ? this.siteDefaults.routePartitionFilter : [];
|
|
24
|
+
}
|
|
5
25
|
constructor() {
|
|
6
|
-
this.
|
|
26
|
+
this.userCreationApiService = inject(UserCreationApiService);
|
|
7
27
|
this.ldapTableColumns = ['userId', 'firstName', 'lastName', 'email', 'add'];
|
|
8
28
|
this.userCreationTypes = ['CUCM', 'MT'];
|
|
29
|
+
this.template = null;
|
|
30
|
+
this.endUser = null;
|
|
31
|
+
this.lines = [];
|
|
32
|
+
this.devices = [];
|
|
33
|
+
this.deviceProfiles = [];
|
|
34
|
+
this.templateLinesSnapshot = null;
|
|
35
|
+
this._currentSite = null;
|
|
9
36
|
this.siteOptions = [];
|
|
10
37
|
this.templateOptions = [];
|
|
11
38
|
this.lineOptions = [];
|
|
@@ -15,40 +42,89 @@ export class UserCreationWizardService {
|
|
|
15
42
|
this.overviewUsers = [];
|
|
16
43
|
this.overviewLines = [];
|
|
17
44
|
this.overviewDevices = [];
|
|
45
|
+
this.overviewDeviceProfiles = [];
|
|
46
|
+
this.userDetailsFormValue = null;
|
|
18
47
|
this.userDetailsForm = {
|
|
19
48
|
userId: '',
|
|
20
49
|
firstName: '',
|
|
21
50
|
lastName: '',
|
|
22
|
-
email: ''
|
|
51
|
+
email: '',
|
|
23
52
|
};
|
|
24
53
|
this.lineSelections = [];
|
|
25
54
|
this.deviceEntries = [];
|
|
55
|
+
this.availableNumbers = [];
|
|
56
|
+
this.deviceTypes = [];
|
|
57
|
+
this.siteDefaults = null;
|
|
58
|
+
this.originalSiteDefaults = null;
|
|
59
|
+
this.templateLines = [];
|
|
60
|
+
this.templateDevices = [];
|
|
61
|
+
this.templateUserDetails = {};
|
|
26
62
|
this.selectedSite = null;
|
|
27
|
-
this.
|
|
63
|
+
this.selectedTemplateName = null;
|
|
64
|
+
this.selectedTemplateId = null;
|
|
28
65
|
this.selectedUserCreationType = 'CUCM';
|
|
29
|
-
this.
|
|
30
|
-
this.
|
|
66
|
+
this.availableDidPatternsMappedToDn = {};
|
|
67
|
+
this.deviceDefaultsLoadedSubject = new Subject();
|
|
68
|
+
this.deviceDefaultsLoaded$ = this.deviceDefaultsLoadedSubject.asObservable();
|
|
69
|
+
this.selectedLdapUser = null;
|
|
70
|
+
this.ldapUsersTotal = 0;
|
|
71
|
+
// this.loadPlaceholderData();
|
|
72
|
+
}
|
|
73
|
+
get isLdapIntegrated() {
|
|
74
|
+
return !!this.endUser?.ldapIntegrated;
|
|
75
|
+
}
|
|
76
|
+
selectLdapUser(user) {
|
|
77
|
+
this.selectedLdapUser = user;
|
|
78
|
+
if (this.endUser) {
|
|
79
|
+
this.endUser.ldapIntegrated = true;
|
|
80
|
+
this.endUser.userid = user.userid;
|
|
81
|
+
this.endUser.firstName = user.firstName ?? '';
|
|
82
|
+
this.endUser.lastName = user.lastName ?? '';
|
|
83
|
+
this.endUser.email = user.email ?? '';
|
|
84
|
+
}
|
|
85
|
+
this.userDetailsForm = {
|
|
86
|
+
userId: user.userid,
|
|
87
|
+
firstName: user.firstName ?? '',
|
|
88
|
+
lastName: user.lastName ?? '',
|
|
89
|
+
email: user.email ?? '',
|
|
90
|
+
};
|
|
91
|
+
this.rebuildOverviewUsers();
|
|
31
92
|
}
|
|
32
|
-
|
|
93
|
+
clearLdapUserSelection() {
|
|
94
|
+
this.selectedLdapUser = null;
|
|
95
|
+
if (this.endUser) {
|
|
96
|
+
this.endUser.ldapIntegrated = false;
|
|
97
|
+
this.endUser.userid = '';
|
|
98
|
+
this.endUser.firstName = '';
|
|
99
|
+
this.endUser.lastName = '';
|
|
100
|
+
this.endUser.email = '';
|
|
101
|
+
}
|
|
33
102
|
this.userDetailsForm = {
|
|
34
|
-
userId:
|
|
35
|
-
firstName:
|
|
36
|
-
lastName:
|
|
37
|
-
email:
|
|
103
|
+
userId: '',
|
|
104
|
+
firstName: '',
|
|
105
|
+
lastName: '',
|
|
106
|
+
email: '',
|
|
38
107
|
};
|
|
39
|
-
this.addedLdapUserIds.add(row.userId);
|
|
40
108
|
this.rebuildOverviewUsers();
|
|
41
109
|
}
|
|
42
|
-
|
|
43
|
-
return this.
|
|
110
|
+
isLdapUserRowSelected(row) {
|
|
111
|
+
return this.selectedLdapUser?.userid === row.userid;
|
|
112
|
+
}
|
|
113
|
+
setLdapUsersResult(users, total) {
|
|
114
|
+
this.ldapUsers = users;
|
|
115
|
+
this.ldapUsersTotal = total;
|
|
44
116
|
}
|
|
45
117
|
setSelectedSite(site) {
|
|
46
|
-
this.selectedSite = site;
|
|
118
|
+
this.selectedSite = site || null;
|
|
47
119
|
}
|
|
48
120
|
setSelectedTemplate(template) {
|
|
49
|
-
this.
|
|
121
|
+
this.selectedTemplateName = template?.name || null;
|
|
122
|
+
this.selectedTemplateId = template?.id || null;
|
|
50
123
|
this.rebuildOverviewUsers();
|
|
51
124
|
}
|
|
125
|
+
setCurrentSite(site) {
|
|
126
|
+
this._currentSite = site;
|
|
127
|
+
}
|
|
52
128
|
resetTemplateDrivenData() {
|
|
53
129
|
this.lineOptions = [];
|
|
54
130
|
this.routePartitionOptions = [];
|
|
@@ -59,69 +135,124 @@ export class UserCreationWizardService {
|
|
|
59
135
|
this.rebuildOverviewDevices();
|
|
60
136
|
}
|
|
61
137
|
applyTemplateTokenPayload(payload) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
138
|
+
this.template = this.extractTemplateFromTokenPayload(payload);
|
|
139
|
+
this.endUser = new EndUser(this.template?.endUser);
|
|
140
|
+
this.lines = this.endUser && Array.isArray(this.endUser.lines) ? this.endUser.lines : [];
|
|
141
|
+
this.devices = this.endUser && Array.isArray(this.endUser.devices) ? this.endUser.devices : [];
|
|
142
|
+
this.deviceProfiles = this.endUser && Array.isArray(this.endUser.deviceProfiles) ? this.endUser.deviceProfiles : [];
|
|
143
|
+
this.initTemplateDnsNamesForLines();
|
|
144
|
+
// this.userDetailsForm = {
|
|
145
|
+
// userId: this.valueToString(this.endUser?.userid ?? ''),
|
|
146
|
+
// firstName: this.valueToString(this.endUser?.firstName ?? ''),
|
|
147
|
+
// lastName: this.valueToString(this.endUser?.lastName ?? ''),
|
|
148
|
+
// email: this.valueToString(this.endUser?.email ?? '')
|
|
149
|
+
// };
|
|
150
|
+
// const mappedLineOptions: LineOption[] = linesFromTemplate
|
|
151
|
+
// .map(line => ({
|
|
152
|
+
// number: this.valueToString(line?.directoryNumber?.directoryNumber),
|
|
153
|
+
// did: this.valueToString(line?.didPatterns?.[0]?.pattern || line?.directoryNumber?.directoryNumber),
|
|
154
|
+
// css: this.valueToString(
|
|
155
|
+
// typeof line?.callingSearchSpace === 'string'
|
|
156
|
+
// ? line.callingSearchSpace
|
|
157
|
+
// : line?.callingSearchSpace?.name
|
|
158
|
+
// ),
|
|
159
|
+
// description: this.valueToString(line?.description)
|
|
160
|
+
// }))
|
|
161
|
+
// .filter(line => line.number.trim().length > 0);
|
|
162
|
+
this.devices.forEach(device => {
|
|
163
|
+
this.initDeviceWithSiteInfo(device);
|
|
164
|
+
applyDefaultDevicePrefixIfMissing(device);
|
|
165
|
+
});
|
|
166
|
+
this.deviceProfiles.forEach(device => this.initDeviceWithSiteInfo(device));
|
|
167
|
+
this.lines.forEach(line => this.initLineWithSiteInfo(line));
|
|
168
|
+
this.captureTemplateLinesSnapshot();
|
|
169
|
+
if (this.selectedSite) {
|
|
170
|
+
this.loadDeviceDefaultsForDevices(this.selectedSite).subscribe();
|
|
171
|
+
}
|
|
172
|
+
// if (mappedLineOptions.length) {
|
|
173
|
+
// this.lineOptions = this.uniqueByNumber(mappedLineOptions);
|
|
174
|
+
// this.lineSelections = this.lineOptions.map(line => ({
|
|
175
|
+
// lineNumber: line.number,
|
|
176
|
+
// routePartitionName: linesFromTemplate.find(
|
|
177
|
+
// source => (source?.directoryNumber?.directoryNumber || '') === line.number
|
|
178
|
+
// )?.directoryNumber?.routePartitionName || null
|
|
179
|
+
// }));
|
|
180
|
+
// } else {
|
|
181
|
+
// const lineAssociations = devicesFromTemplate.flatMap(device => device.lineAssociations || []);
|
|
182
|
+
// const associatedLineOptions: LineOption[] = lineAssociations
|
|
183
|
+
// .map(association => {
|
|
184
|
+
// const number = association?.directoryNumber?.directoryNumber || '';
|
|
185
|
+
// return {
|
|
186
|
+
// number,
|
|
187
|
+
// did: number,
|
|
188
|
+
// css: '',
|
|
189
|
+
// description: ''
|
|
190
|
+
// };
|
|
191
|
+
// })
|
|
192
|
+
// .filter(line => line.number.trim().length > 0);
|
|
193
|
+
// this.lineOptions = this.uniqueByNumber(associatedLineOptions);
|
|
194
|
+
// this.lineSelections = this.lineOptions.map(line => ({
|
|
195
|
+
// lineNumber: line.number,
|
|
196
|
+
// routePartitionName: lineAssociations.find(
|
|
197
|
+
// source => (source?.directoryNumber?.directoryNumber || '') === line.number
|
|
198
|
+
// )?.directoryNumber?.routePartitionName || null
|
|
199
|
+
// }));
|
|
200
|
+
// this.templateLines.forEach((line: any) => this.initLineWithSiteInfo(line));
|
|
201
|
+
// this.initTemplateDnsNamesForLines(this.templateLines);
|
|
202
|
+
// }
|
|
203
|
+
// const routePartitions = this.lineSelections
|
|
204
|
+
// .map(line => line.routePartitionName)
|
|
205
|
+
// .filter((value): value is string => !!value && value.trim().length > 0);
|
|
206
|
+
// this.routePartitionOptions = this.uniqueStrings(routePartitions);
|
|
207
|
+
// this.deviceEntries = devicesFromTemplate.map(device => ({
|
|
208
|
+
// deviceType: this.valueToString(device.deviceType),
|
|
209
|
+
// protocol: this.valueToString(device.protocol),
|
|
210
|
+
// buttonTemplate: this.valueToString(device.buttonTemplate),
|
|
211
|
+
// name: this.valueToString(device.name)
|
|
212
|
+
// }));
|
|
213
|
+
// this.deviceRows = this.deviceEntries.map((_, index) => index + 1);
|
|
214
|
+
// this.rebuildOverviewUsers();
|
|
215
|
+
// this.rebuildOverviewLines();
|
|
216
|
+
// this.rebuildOverviewDevices();
|
|
217
|
+
}
|
|
218
|
+
setSelectedUserCreationType(type) {
|
|
219
|
+
this.selectedUserCreationType = type;
|
|
220
|
+
}
|
|
221
|
+
resetUserDetailsStepState() {
|
|
222
|
+
this.userDetailsFormValue = null;
|
|
66
223
|
this.userDetailsForm = {
|
|
67
|
-
userId:
|
|
68
|
-
firstName:
|
|
69
|
-
lastName:
|
|
70
|
-
email:
|
|
224
|
+
userId: '',
|
|
225
|
+
firstName: '',
|
|
226
|
+
lastName: '',
|
|
227
|
+
email: '',
|
|
71
228
|
};
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
? line.callingSearchSpace
|
|
78
|
-
: line?.callingSearchSpace?.name),
|
|
79
|
-
description: this.valueToString(line?.description)
|
|
80
|
-
}))
|
|
81
|
-
.filter(line => line.number.trim().length > 0);
|
|
82
|
-
if (mappedLineOptions.length) {
|
|
83
|
-
this.lineOptions = this.uniqueByNumber(mappedLineOptions);
|
|
84
|
-
this.lineSelections = this.lineOptions.map(line => ({
|
|
85
|
-
lineNumber: line.number,
|
|
86
|
-
routePartitionName: linesFromTemplate.find(source => (source?.directoryNumber?.directoryNumber || '') === line.number)?.directoryNumber?.routePartitionName || null
|
|
87
|
-
}));
|
|
229
|
+
this.selectedLdapUser = null;
|
|
230
|
+
this.ldapUsers = [];
|
|
231
|
+
this.ldapUsersTotal = 0;
|
|
232
|
+
if (this.templateLinesSnapshot) {
|
|
233
|
+
this.lines = JSON.parse(JSON.stringify(this.templateLinesSnapshot));
|
|
88
234
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
this.lineOptions = this.uniqueByNumber(associatedLineOptions);
|
|
103
|
-
this.lineSelections = this.lineOptions.map(line => ({
|
|
104
|
-
lineNumber: line.number,
|
|
105
|
-
routePartitionName: lineAssociations.find(source => (source?.directoryNumber?.directoryNumber || '') === line.number)?.directoryNumber?.routePartitionName || null
|
|
106
|
-
}));
|
|
235
|
+
this.devices.forEach(device => {
|
|
236
|
+
device.name = '';
|
|
237
|
+
});
|
|
238
|
+
this.deviceProfiles.forEach(profile => {
|
|
239
|
+
profile.name = '';
|
|
240
|
+
});
|
|
241
|
+
if (this.endUser) {
|
|
242
|
+
this.endUser.userid = '';
|
|
243
|
+
this.endUser.firstName = '';
|
|
244
|
+
this.endUser.lastName = '';
|
|
245
|
+
this.endUser.email = '';
|
|
246
|
+
this.endUser.ldapIntegrated = false;
|
|
247
|
+
this.endUser.lines = this.lines;
|
|
107
248
|
}
|
|
108
|
-
|
|
109
|
-
.map(line => line.routePartitionName)
|
|
110
|
-
.filter((value) => !!value && value.trim().length > 0);
|
|
111
|
-
this.routePartitionOptions = this.uniqueStrings(routePartitions);
|
|
112
|
-
this.deviceEntries = devicesFromTemplate.map(device => ({
|
|
113
|
-
deviceType: this.valueToString(device.deviceType),
|
|
114
|
-
protocol: this.valueToString(device.protocol),
|
|
115
|
-
buttonTemplate: this.valueToString(device.buttonTemplate),
|
|
116
|
-
name: this.valueToString(device.name)
|
|
117
|
-
}));
|
|
118
|
-
this.deviceRows = this.deviceEntries.map((_, index) => index + 1);
|
|
119
|
-
this.rebuildOverviewUsers();
|
|
249
|
+
this.overviewUsers = [];
|
|
120
250
|
this.rebuildOverviewLines();
|
|
121
251
|
this.rebuildOverviewDevices();
|
|
252
|
+
this.rebuildOverviewDeviceProfiles();
|
|
122
253
|
}
|
|
123
|
-
|
|
124
|
-
this.
|
|
254
|
+
captureTemplateLinesSnapshot() {
|
|
255
|
+
this.templateLinesSnapshot = JSON.parse(JSON.stringify(this.lines));
|
|
125
256
|
}
|
|
126
257
|
setUserDetailsField(field, value) {
|
|
127
258
|
this.userDetailsForm = {
|
|
@@ -130,6 +261,47 @@ export class UserCreationWizardService {
|
|
|
130
261
|
};
|
|
131
262
|
this.rebuildOverviewUsers();
|
|
132
263
|
}
|
|
264
|
+
applyUserDetailsFormValue(formValue) {
|
|
265
|
+
this.userDetailsFormValue = formValue;
|
|
266
|
+
this.userDetailsForm = {
|
|
267
|
+
userId: formValue.userId || '',
|
|
268
|
+
firstName: formValue.firstName || '',
|
|
269
|
+
lastName: formValue.lastName || '',
|
|
270
|
+
email: formValue.email || '',
|
|
271
|
+
};
|
|
272
|
+
formValue.lines?.forEach((lineValue, index) => {
|
|
273
|
+
const line = this.lines[index];
|
|
274
|
+
if (!line?.directoryNumber) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
line.directoryNumber.directoryNumber = lineValue.number || '';
|
|
278
|
+
line.directoryNumber.routePartitionName = lineValue.routePartition || '';
|
|
279
|
+
});
|
|
280
|
+
formValue.devices?.forEach((deviceValue, index) => {
|
|
281
|
+
const device = this.devices[index];
|
|
282
|
+
if (!device) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
device.name = deviceValue.name || '';
|
|
286
|
+
});
|
|
287
|
+
formValue.deviceProfiles?.forEach((profileValue, index) => {
|
|
288
|
+
const profile = this.deviceProfiles[index];
|
|
289
|
+
if (!profile) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
profile.name = profileValue.name || '';
|
|
293
|
+
});
|
|
294
|
+
if (this.endUser) {
|
|
295
|
+
this.endUser.userid = formValue.userId || '';
|
|
296
|
+
this.endUser.firstName = formValue.firstName || '';
|
|
297
|
+
this.endUser.lastName = formValue.lastName || '';
|
|
298
|
+
this.endUser.email = formValue.email || '';
|
|
299
|
+
}
|
|
300
|
+
this.rebuildOverviewUsers();
|
|
301
|
+
this.rebuildOverviewLines();
|
|
302
|
+
this.rebuildOverviewDevices();
|
|
303
|
+
this.rebuildOverviewDeviceProfiles();
|
|
304
|
+
}
|
|
133
305
|
setLineSelection(index, lineNumber) {
|
|
134
306
|
if (!this.lineSelections[index]) {
|
|
135
307
|
return;
|
|
@@ -179,63 +351,83 @@ export class UserCreationWizardService {
|
|
|
179
351
|
}
|
|
180
352
|
return entry.name || '';
|
|
181
353
|
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
{
|
|
188
|
-
number: '557046',
|
|
189
|
-
did: '+13125557046',
|
|
190
|
-
css: 'Atlanta_internal_css',
|
|
191
|
-
description: ''
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
number: '557047',
|
|
195
|
-
did: '+13125557047',
|
|
196
|
-
css: 'Atlanta_internal_css',
|
|
197
|
-
description: ''
|
|
198
|
-
},
|
|
199
|
-
{
|
|
200
|
-
number: '557048',
|
|
201
|
-
did: '+13125557048',
|
|
202
|
-
css: 'Atlanta_internal_css',
|
|
203
|
-
description: ''
|
|
354
|
+
getSiteAllData(siteId) {
|
|
355
|
+
return this.userCreationApiService.getSiteAllData(siteId).pipe(tap((res) => {
|
|
356
|
+
if (res && res[0]) {
|
|
357
|
+
const site = new Site(res[0]);
|
|
358
|
+
this.selectedSite = site.id;
|
|
204
359
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
{ userId: 'John.Doe', firstName: 'John', lastName: 'Doe', email: 'john.doe@car.west.io' },
|
|
210
|
-
{ userId: 'Jane.Smith', firstName: 'Jane', lastName: 'Smith', email: 'jane.smith@car.west.io' }
|
|
211
|
-
];
|
|
212
|
-
this.lineSelections = [
|
|
213
|
-
{
|
|
214
|
-
lineNumber: null,
|
|
215
|
-
routePartitionName: this.routePartitionOptions[0] || null
|
|
360
|
+
if (res && res[1]) {
|
|
361
|
+
this.siteDefaults = new SiteDefaults(res[1], false);
|
|
362
|
+
this.originalSiteDefaults = new SiteDefaults(res[1], false);
|
|
363
|
+
this.routePartitionOptions = [...this.routePartitionNamesList];
|
|
216
364
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
{
|
|
220
|
-
deviceType: 'Cisco 8851',
|
|
221
|
-
protocol: 'SIP',
|
|
222
|
-
buttonTemplate: 'Standard 8851 SIP',
|
|
223
|
-
name: ''
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
deviceType: 'Cisco Unified Client Services Framework',
|
|
227
|
-
protocol: 'SIP',
|
|
228
|
-
buttonTemplate: 'Standard Client Services Framework',
|
|
229
|
-
name: ''
|
|
365
|
+
if (res && res[2]) {
|
|
366
|
+
this.deviceTypes = res[2];
|
|
230
367
|
}
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
this.
|
|
235
|
-
|
|
368
|
+
}), switchMap(res => this.loadDeviceDefaultsForDevices(siteId).pipe(map(() => res))));
|
|
369
|
+
}
|
|
370
|
+
loadDeviceDefaultsForDevices(siteId) {
|
|
371
|
+
const deviceTypes = this.getUniqueDeviceTypes();
|
|
372
|
+
if (!deviceTypes.length) {
|
|
373
|
+
return of(undefined);
|
|
374
|
+
}
|
|
375
|
+
const requests = deviceTypes.map(deviceType => this.userCreationApiService.getDeviceDefaults(String(siteId), deviceType).pipe(tap(defaults => this.applyDeviceDefaultsToType(deviceType, defaults)), catchError(() => of(null))));
|
|
376
|
+
return forkJoin(requests).pipe(tap(() => this.deviceDefaultsLoadedSubject.next()), map(() => undefined));
|
|
377
|
+
}
|
|
378
|
+
getUniqueDeviceTypes() {
|
|
379
|
+
const types = [
|
|
380
|
+
...this.devices.map(device => device.deviceType),
|
|
381
|
+
...this.deviceProfiles.map(profile => profile.deviceType),
|
|
382
|
+
].filter((type) => !!type && type.trim().length > 0);
|
|
383
|
+
return [...new Set(types)];
|
|
384
|
+
}
|
|
385
|
+
applyDeviceDefaultsToType(deviceType, defaults) {
|
|
386
|
+
const nameValidationRegex = parseDeviceNameRegexBody(defaults.deviceNameRegex);
|
|
387
|
+
const targets = [...this.devices, ...this.deviceProfiles].filter(device => device.deviceType === deviceType);
|
|
388
|
+
targets.forEach(device => {
|
|
389
|
+
device.deviceDefaults = defaults;
|
|
390
|
+
device.nameValidationRegex = nameValidationRegex;
|
|
391
|
+
device.nameValidationCaption = defaults.deviceNameExplained;
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
getDeviceNamePrefix(deviceIndex, isProfile = false) {
|
|
395
|
+
const device = isProfile ? this.deviceProfiles[deviceIndex] : this.devices[deviceIndex];
|
|
396
|
+
const prefix = device?.prefix?.trim();
|
|
397
|
+
return prefix || null;
|
|
398
|
+
}
|
|
399
|
+
getDeviceNameValidationCaption(deviceIndex, isProfile = false) {
|
|
400
|
+
const device = isProfile ? this.deviceProfiles[deviceIndex] : this.devices[deviceIndex];
|
|
401
|
+
return device?.nameValidationCaption || device?.deviceDefaults?.deviceNameExplained || '';
|
|
402
|
+
}
|
|
403
|
+
getDeviceNameValidationOptions(deviceIndex, isProfile = false) {
|
|
404
|
+
const device = isProfile ? this.deviceProfiles[deviceIndex] : this.devices[deviceIndex];
|
|
405
|
+
const regex = device?.nameValidationRegex?.trim() ||
|
|
406
|
+
parseDeviceNameRegexBody(device?.deviceDefaults?.deviceNameRegex);
|
|
407
|
+
if (!regex) {
|
|
408
|
+
return null;
|
|
409
|
+
}
|
|
410
|
+
return {
|
|
411
|
+
regex,
|
|
412
|
+
caption: this.getDeviceNameValidationCaption(deviceIndex, isProfile),
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
getNumberRange(siteId, routePartition) {
|
|
416
|
+
this.availableDidPatternsMappedToDn = {};
|
|
417
|
+
const pageSize = 9999;
|
|
418
|
+
const params = { dntype: DnRangeType.extension, routepartition: routePartition, size: pageSize, page: 0 };
|
|
419
|
+
this.availableNumbers = [];
|
|
420
|
+
return this.userCreationApiService.getAvailableDnInRanges(siteId, params)
|
|
421
|
+
.pipe(map((res) => {
|
|
422
|
+
res.availableNumberList.forEach((availableNumber) => {
|
|
423
|
+
this.setAvailableDidMappedToDn(availableNumber);
|
|
424
|
+
this.availableNumbers = [...this.availableNumbers, ...this.getUnwrapNumberRange(availableNumber)];
|
|
425
|
+
});
|
|
426
|
+
}));
|
|
427
|
+
// .pipe(this.handleError(true, false));
|
|
236
428
|
}
|
|
237
429
|
rebuildOverviewUsers() {
|
|
238
|
-
const userTemplate = this.
|
|
430
|
+
const userTemplate = this.selectedTemplateName || '';
|
|
239
431
|
const hasUserData = Object.values(this.userDetailsForm).some(value => value.trim().length > 0);
|
|
240
432
|
this.overviewUsers = hasUserData
|
|
241
433
|
? [{
|
|
@@ -248,6 +440,23 @@ export class UserCreationWizardService {
|
|
|
248
440
|
: [];
|
|
249
441
|
}
|
|
250
442
|
rebuildOverviewLines() {
|
|
443
|
+
const formLines = this.userDetailsFormValue?.lines;
|
|
444
|
+
if (formLines?.length) {
|
|
445
|
+
this.overviewLines = formLines
|
|
446
|
+
.filter(line => !!line?.number?.trim())
|
|
447
|
+
.map((lineValue, index) => {
|
|
448
|
+
const templateLine = this.lines[index];
|
|
449
|
+
const css = this.valueToString(templateLine?.callingSearchSpace);
|
|
450
|
+
return {
|
|
451
|
+
number: lineValue.number,
|
|
452
|
+
did: lineValue.lineNumber || lineValue.number,
|
|
453
|
+
routePartitionName: lineValue.routePartition || '',
|
|
454
|
+
css,
|
|
455
|
+
description: this.valueToString(templateLine?.description),
|
|
456
|
+
};
|
|
457
|
+
});
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
251
460
|
this.overviewLines = this.lineSelections
|
|
252
461
|
.map(selection => {
|
|
253
462
|
if (!selection?.lineNumber) {
|
|
@@ -269,6 +478,18 @@ export class UserCreationWizardService {
|
|
|
269
478
|
}
|
|
270
479
|
rebuildOverviewDevices() {
|
|
271
480
|
const selectedLineNumbers = this.overviewLines.map(line => line.number).join(', ');
|
|
481
|
+
const formDevices = this.userDetailsFormValue?.devices;
|
|
482
|
+
if (formDevices?.length) {
|
|
483
|
+
this.overviewDevices = formDevices
|
|
484
|
+
.filter(device => !!device.deviceType?.trim() || !!device.name?.trim())
|
|
485
|
+
.map(device => ({
|
|
486
|
+
name: device.name || '',
|
|
487
|
+
deviceType: device.deviceType || '',
|
|
488
|
+
lines: selectedLineNumbers,
|
|
489
|
+
description: `${device.protocol || ''} / ${device.buttonTemplate || ''}`.trim(),
|
|
490
|
+
}));
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
272
493
|
this.overviewDevices = this.deviceEntries
|
|
273
494
|
.map((device, index) => ({
|
|
274
495
|
device,
|
|
@@ -282,6 +503,22 @@ export class UserCreationWizardService {
|
|
|
282
503
|
description: `${device.protocol} / ${device.buttonTemplate}`
|
|
283
504
|
}));
|
|
284
505
|
}
|
|
506
|
+
rebuildOverviewDeviceProfiles() {
|
|
507
|
+
const selectedLineNumbers = this.overviewLines.map(line => line.number).join(', ');
|
|
508
|
+
const formProfiles = this.userDetailsFormValue?.deviceProfiles;
|
|
509
|
+
if (!formProfiles?.length) {
|
|
510
|
+
this.overviewDeviceProfiles = [];
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
this.overviewDeviceProfiles = formProfiles
|
|
514
|
+
.filter(profile => !!profile.deviceType?.trim() || !!profile.name?.trim())
|
|
515
|
+
.map(profile => ({
|
|
516
|
+
name: profile.name || '',
|
|
517
|
+
deviceType: profile.deviceType || '',
|
|
518
|
+
lines: selectedLineNumbers,
|
|
519
|
+
description: `${profile.protocol || ''} / ${profile.buttonTemplate || ''}`.trim(),
|
|
520
|
+
}));
|
|
521
|
+
}
|
|
285
522
|
extractTemplateFromTokenPayload(payload) {
|
|
286
523
|
if (!payload || typeof payload !== 'object') {
|
|
287
524
|
return null;
|
|
@@ -308,14 +545,252 @@ export class UserCreationWizardService {
|
|
|
308
545
|
valueToString(value) {
|
|
309
546
|
return typeof value === 'string' ? value : '';
|
|
310
547
|
}
|
|
548
|
+
getUnwrapNumberRange(availableNumber) {
|
|
549
|
+
let unwrapNumberRange = this.unwrapNumberRange(availableNumber.phoneNumberRange.from, availableNumber.phoneNumberRange.to)
|
|
550
|
+
.map((unwrappedNumber) => {
|
|
551
|
+
const dn = availableNumber.phoneNumberRange.prefix + unwrappedNumber;
|
|
552
|
+
let str = dn;
|
|
553
|
+
if (this.availableDidPatternsMappedToDn[dn] && this.availableDidPatternsMappedToDn[dn].length > 0) {
|
|
554
|
+
if (this.availableDidPatternsMappedToDn[dn][0]['mappedDids'] && this.availableDidPatternsMappedToDn[dn][0]['mappedDids'].length > 0) {
|
|
555
|
+
str += ' DID: ' + (this.availableDidPatternsMappedToDn[dn][0]['mappedDids'].length > 1 ? 'multiple' :
|
|
556
|
+
this.availableDidPatternsMappedToDn[dn][0]['mappedDids'][0]);
|
|
557
|
+
}
|
|
558
|
+
if (this.availableDidPatternsMappedToDn[dn][0]['vm']) {
|
|
559
|
+
str += ' In Use - VM';
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
return str;
|
|
563
|
+
});
|
|
564
|
+
unwrapNumberRange = unwrapNumberRange.filter((unwrappedNumber) => !availableNumber.usedNumbers.includes(unwrappedNumber));
|
|
565
|
+
return unwrapNumberRange;
|
|
566
|
+
}
|
|
567
|
+
unwrapNumberRange(start, end) {
|
|
568
|
+
const regExp = /(^0+)/;
|
|
569
|
+
let leadingZeros = '';
|
|
570
|
+
const matches = start.match(regExp);
|
|
571
|
+
if (matches) {
|
|
572
|
+
leadingZeros = matches[1];
|
|
573
|
+
}
|
|
574
|
+
const startNumeric = new Big(start);
|
|
575
|
+
const endNumeric = new Big(end);
|
|
576
|
+
return Array.from({ length: Number(endNumeric.minus(startNumeric).plus(new Big(1)).toFixed(0)) }, (v, k) => {
|
|
577
|
+
const number = String(startNumeric.plus(new Big(k.toString())).toFixed(0));
|
|
578
|
+
if ((leadingZeros + number).length > start.length) {
|
|
579
|
+
leadingZeros = leadingZeros.substr(1);
|
|
580
|
+
}
|
|
581
|
+
return leadingZeros + number;
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
setAvailableDidMappedToDn(availableNumber) {
|
|
585
|
+
if (availableNumber.unUsedNumbersWithDids && availableNumber.unUsedNumbersWithDids.length) {
|
|
586
|
+
availableNumber.unUsedNumbersWithDids.forEach((numberWithDids) => {
|
|
587
|
+
const dn = numberWithDids['unUsedNumber'];
|
|
588
|
+
this.availableDidPatternsMappedToDn[dn] = [{}];
|
|
589
|
+
if (numberWithDids['translationPatternList'] && numberWithDids['translationPatternList'].length > 0) {
|
|
590
|
+
this.availableDidPatternsMappedToDn[dn] = numberWithDids['translationPatternList'];
|
|
591
|
+
this.availableDidPatternsMappedToDn[dn][0]['mappedDids'] = [{}];
|
|
592
|
+
if (numberWithDids['mappedDids'] && numberWithDids['mappedDids'].length > 0) {
|
|
593
|
+
this.availableDidPatternsMappedToDn[dn][0]['mappedDids'] = numberWithDids['mappedDids'];
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
this.availableDidPatternsMappedToDn[dn][0]['vm'] = numberWithDids['vm'];
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
}
|
|
311
600
|
// TODO: replace placeholders with real API integration.
|
|
312
601
|
loadDataFromApi() {
|
|
313
602
|
// this.api.getWizardBootstrapData().subscribe(...)
|
|
314
603
|
}
|
|
604
|
+
initLineWithSiteInfo(line) {
|
|
605
|
+
line.directoryNumber.routePartitionName = this.siteDefaults?.routePartition || '';
|
|
606
|
+
let callingSearchSpaceVal = this.siteDefaults?.lineCss || '';
|
|
607
|
+
line.callingSearchSpace = callingSearchSpaceVal;
|
|
608
|
+
}
|
|
609
|
+
// private initTemplateDnsNamesForLines(userLines: TemplateLineLike[]): void {
|
|
610
|
+
// const routePartition = this.siteDefaults?.routePartition || '';
|
|
611
|
+
// if (userLines && userLines.length > 0) {
|
|
612
|
+
// userLines.forEach((line, index) => {
|
|
613
|
+
// line && line.directoryNumber && (line.directoryNumber.templateDirectoryNumber = line.directoryNumber.directoryNumber);
|
|
614
|
+
// line && line.directoryNumber && (line.directoryNumber.directoryNumber = '');
|
|
615
|
+
// return line;
|
|
616
|
+
// });
|
|
617
|
+
// // const routePartition = this.siteDefaults?.routePartition || '';
|
|
618
|
+
// // if (line.lineAssociations && line.lineAssociations.length) {
|
|
619
|
+
// // this.setLineAssociationsForDevice(line, routePartition);
|
|
620
|
+
// // }
|
|
621
|
+
// }
|
|
622
|
+
// this.templateDevices.forEach(device => {
|
|
623
|
+
// if (device.lineAssociations && device.lineAssociations.length) {
|
|
624
|
+
// this.setLineAssociationsForDevice(device, routePartition);
|
|
625
|
+
// }
|
|
626
|
+
// });
|
|
627
|
+
// }
|
|
628
|
+
setLineAssociationsForDevice(device, routePartition) {
|
|
629
|
+
const lineAssociations = device.lineAssociations || [];
|
|
630
|
+
if (lineAssociations && lineAssociations.length) {
|
|
631
|
+
lineAssociations.forEach(lineAssociation => {
|
|
632
|
+
lineAssociation && lineAssociation.directoryNumber && (lineAssociation.directoryNumber.templateDirectoryNumber = lineAssociation.directoryNumber.directoryNumber || '');
|
|
633
|
+
lineAssociation && lineAssociation.directoryNumber && (lineAssociation.directoryNumber.routePartitionName = routePartition);
|
|
634
|
+
lineAssociation && lineAssociation.logMissedCall && (lineAssociation.logMissedCall = lineAssociation.logMissedCall || 'false');
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
initDeviceWithSiteInfo(device) {
|
|
639
|
+
device.newName = device.name;
|
|
640
|
+
device.name = '';
|
|
641
|
+
if (!device['enabledExtensionMobility']) {
|
|
642
|
+
device.enabledExtensionMobility = this.siteDefaults?.enableEm ?? false;
|
|
643
|
+
}
|
|
644
|
+
else if (device['enabledExtensionMobility'].toString() === 'Yes') {
|
|
645
|
+
device.enabledExtensionMobility = true;
|
|
646
|
+
}
|
|
647
|
+
else if (device['enabledExtensionMobility'].toString() === 'No') {
|
|
648
|
+
device.enabledExtensionMobility = false;
|
|
649
|
+
}
|
|
650
|
+
if (device.location) {
|
|
651
|
+
const replacedValue = this.replaceDynamicValueSiteInfo(device.location, this.currentSite?.shortName ?? '') ?? null;
|
|
652
|
+
device.location = replacedValue;
|
|
653
|
+
}
|
|
654
|
+
if (device.location) {
|
|
655
|
+
const replacedValue = this.replaceDynamicValueSiteInfo(device.devicePoolName, this.currentSite?.shortName ?? '') ?? null;
|
|
656
|
+
device.devicePoolName = replacedValue;
|
|
657
|
+
}
|
|
658
|
+
if (device.location) {
|
|
659
|
+
const replacedValue = this.replaceDynamicValueSiteInfo(device.callingSearchSpaceName, this.currentSite?.shortName ?? '') ?? null;
|
|
660
|
+
device.callingSearchSpaceName = replacedValue;
|
|
661
|
+
}
|
|
662
|
+
if (device.extraOptions) {
|
|
663
|
+
const replacedValue = this.replaceDynamicValueSiteInfo(device.extraOptions.aarCss, this.currentSite?.shortName ?? '') ?? null;
|
|
664
|
+
device.extraOptions.aarCss = replacedValue;
|
|
665
|
+
}
|
|
666
|
+
if (!device.description && this.siteDefaults) {
|
|
667
|
+
device.description = this.siteDefaults.deviceDescription;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
replaceDynamicValueSiteInfo(fieldValue, siteShortName) {
|
|
671
|
+
if (fieldValue) {
|
|
672
|
+
fieldValue = this.replaceDynamicValueFormat(fieldValue);
|
|
673
|
+
const paramsToReplaces = { 'SiteShortName': siteShortName };
|
|
674
|
+
return this.mutliStringReplace(paramsToReplaces, fieldValue);
|
|
675
|
+
}
|
|
676
|
+
return null;
|
|
677
|
+
}
|
|
678
|
+
replaceDynamicValueFormat(str) {
|
|
679
|
+
str = str.replace(/\[FN\]/ig, '[FN]').replace(/\[LN\]/ig, '[LN]').replace(/\[ID\]/ig, '[UserId]')
|
|
680
|
+
.replace(/\[UserId\]/ig, '[UserId]').replace(/<Match User ID>/ig, '[UserId]')
|
|
681
|
+
.replace(/\[Email\]/ig, '[Email]').replace(/\[DN\(/ig, '[DN(')
|
|
682
|
+
.replace(/\[SiteShortName\]/ig, '[SiteShortName]').replace(/\$\(SiteShortName\)/ig, '[SiteShortName]')
|
|
683
|
+
.replace(/\$\{SiteShortName\}/ig, '[SiteShortName]').replace(/{SiteShortName}/ig, '[SiteShortName]')
|
|
684
|
+
.replace(/\[FN\(/ig, '[FN(').replace(/\[LN\(/ig, '[LN(')
|
|
685
|
+
.replace(/\[ID\(/ig, '[ID(');
|
|
686
|
+
return str;
|
|
687
|
+
}
|
|
688
|
+
mutliStringReplace(object, input, directoryNumber, user) {
|
|
689
|
+
var val = input;
|
|
690
|
+
if (val.includes('[DN]') && directoryNumber && !directoryNumber.includes('Line')) {
|
|
691
|
+
val = val.replace('[DN]', directoryNumber);
|
|
692
|
+
}
|
|
693
|
+
var indexOfDN = val.indexOf('[DN(');
|
|
694
|
+
if (indexOfDN !== -1 && directoryNumber) {
|
|
695
|
+
var digit = val.substring(indexOfDN + 4, val.indexOf(')', indexOfDN + 4));
|
|
696
|
+
var digitCount = Number(digit) || 0;
|
|
697
|
+
var dnDigit = (digitCount > val.length) ? directoryNumber : directoryNumber.substring(directoryNumber.length - digitCount, directoryNumber.length);
|
|
698
|
+
val = val.replace('[DN(' + digit + ')]', dnDigit);
|
|
699
|
+
}
|
|
700
|
+
var indexOfFN = val.indexOf('[FN(');
|
|
701
|
+
if (indexOfFN !== -1 && user && user.firstName) {
|
|
702
|
+
var digit = val.substring(indexOfFN + 4, val.indexOf(')', indexOfFN + 4));
|
|
703
|
+
var fnDigit = user.firstName.substring(0, digit);
|
|
704
|
+
val = val.replace('[FN(' + digit + ')]', fnDigit);
|
|
705
|
+
}
|
|
706
|
+
var indexOfLN = val.indexOf('[LN(');
|
|
707
|
+
if (indexOfLN !== -1 && user && user.lastName) {
|
|
708
|
+
var digit = val.substring(indexOfLN + 4, val.indexOf(')', indexOfLN + 4));
|
|
709
|
+
var lnDigit = user.lastName.substring(0, digit);
|
|
710
|
+
val = val.replace('[LN(' + digit + ')]', lnDigit);
|
|
711
|
+
}
|
|
712
|
+
var indexOfID = val.indexOf('[ID(');
|
|
713
|
+
if (indexOfID !== -1 && user && user.userid) {
|
|
714
|
+
var digit = val.substring(indexOfID + 4, val.indexOf(')', indexOfID + 4));
|
|
715
|
+
var idDigit = user.userid.substring(0, digit);
|
|
716
|
+
val = val.replace('[ID(' + digit + ')]', idDigit);
|
|
717
|
+
}
|
|
718
|
+
var entries = Object.entries(object);
|
|
719
|
+
entries.forEach((para) => {
|
|
720
|
+
var find = '[' + para[0] + ']';
|
|
721
|
+
var replacement = para[1] != null ? String(para[1]) : '';
|
|
722
|
+
val = val.split(find).join(replacement);
|
|
723
|
+
});
|
|
724
|
+
return val;
|
|
725
|
+
}
|
|
726
|
+
initTemplateDnsNamesForLines() {
|
|
727
|
+
if (this.lines && this.lines.length > 0) {
|
|
728
|
+
this.lines.forEach((line, index) => {
|
|
729
|
+
line.directoryNumber.templateDirectoryNumber = line.directoryNumber.directoryNumber;
|
|
730
|
+
line.directoryNumber.directoryNumber = '';
|
|
731
|
+
return line;
|
|
732
|
+
});
|
|
733
|
+
const routePartition = this.siteDefaults?.routePartition || '';
|
|
734
|
+
this.devices.forEach(device => {
|
|
735
|
+
if (device.lineAssociations && device.lineAssociations.length) {
|
|
736
|
+
this.setLineAssociationsForDevice(device, routePartition);
|
|
737
|
+
}
|
|
738
|
+
});
|
|
739
|
+
this.deviceProfiles.forEach(deviceProfile => {
|
|
740
|
+
if (deviceProfile.lineAssociations && deviceProfile.lineAssociations.length) {
|
|
741
|
+
this.setLineAssociationsForDevice(deviceProfile, routePartition);
|
|
742
|
+
}
|
|
743
|
+
});
|
|
744
|
+
if (this.endUser?.singleNumberReach && this.endUser.singleNumberReach.associatedLines && this.endUser.singleNumberReach.associatedLines.length) {
|
|
745
|
+
if (this.endUser.singleNumberReach.associatedLines && this.endUser.singleNumberReach.associatedLines.length) {
|
|
746
|
+
this.endUser.singleNumberReach.associatedLines.map(lineAssociation => {
|
|
747
|
+
lineAssociation.directoryNumber.templateDirectoryNumber = lineAssociation.directoryNumber.directoryNumber;
|
|
748
|
+
lineAssociation.directoryNumber.routePartitionName = routePartition;
|
|
749
|
+
});
|
|
750
|
+
}
|
|
751
|
+
if (this.endUser.singleNumberReach.remoteDestinations && this.endUser.singleNumberReach.remoteDestinations.length) {
|
|
752
|
+
this.endUser.singleNumberReach.remoteDestinations.forEach(remoteDestination => {
|
|
753
|
+
if (remoteDestination.lineAssociations && remoteDestination.lineAssociations.length) {
|
|
754
|
+
remoteDestination.lineAssociations.map(lineAssociation => {
|
|
755
|
+
lineAssociation.directoryNumber.templateDirectoryNumber = lineAssociation.directoryNumber.directoryNumber;
|
|
756
|
+
lineAssociation.directoryNumber.routePartitionName = routePartition;
|
|
757
|
+
});
|
|
758
|
+
}
|
|
759
|
+
});
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
buildSavableEndUser() {
|
|
765
|
+
if (!this.endUser) {
|
|
766
|
+
throw new Error('No template user loaded');
|
|
767
|
+
}
|
|
768
|
+
return buildSavableEndUser(this.endUser, this.lines, this.devices, this.deviceProfiles, this.userDetailsForm, {
|
|
769
|
+
resolveDeviceName: (index, device) => this.resolveDeviceNameForSave(index, device),
|
|
770
|
+
resolveDeviceProfileName: (index, profile) => this.resolveDeviceNameForSave(index, profile),
|
|
771
|
+
});
|
|
772
|
+
}
|
|
773
|
+
resolveDeviceNameForSave(_index, device) {
|
|
774
|
+
const rawName = (device.name || device.newName || '').trim();
|
|
775
|
+
if (!rawName) {
|
|
776
|
+
return '';
|
|
777
|
+
}
|
|
778
|
+
const prefix = device.prefix?.trim();
|
|
779
|
+
if (prefix && !rawName.toUpperCase().startsWith(prefix.toUpperCase())) {
|
|
780
|
+
return `${prefix}${rawName}`;
|
|
781
|
+
}
|
|
782
|
+
return rawName;
|
|
783
|
+
}
|
|
784
|
+
saveNewUser() {
|
|
785
|
+
const user = this.buildSavableEndUser();
|
|
786
|
+
const siteId = String(this.selectedSite ?? '');
|
|
787
|
+
const templateId = String(this.selectedTemplateId ?? '');
|
|
788
|
+
return this.userCreationApiService.saveTemplateUser(user, templateId, siteId);
|
|
789
|
+
}
|
|
315
790
|
}
|
|
316
791
|
UserCreationWizardService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserCreationWizardService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
317
792
|
UserCreationWizardService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserCreationWizardService });
|
|
318
793
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserCreationWizardService, decorators: [{
|
|
319
794
|
type: Injectable
|
|
320
795
|
}], ctorParameters: function () { return []; } });
|
|
321
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jcmVhdGlvbi13aXphcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy91c2VyLWNyZWF0aW9uL3NyYy93aWRnZXRzL3VzZXItY3JlYXRpb24td2l6YXJkL3VzZXItY3JlYXRpb24td2l6YXJkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7O0FBeUZ6RixNQUFNLE9BQU8seUJBQXlCO0lBOEJsQztRQTdCaUIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTdDLHFCQUFnQixHQUFhLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pGLHNCQUFpQixHQUF1QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVoRSxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUMzQixvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUMvQixnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0IsMEJBQXFCLEdBQWEsRUFBRSxDQUFDO1FBQ3JDLGVBQVUsR0FBYSxFQUFFLENBQUM7UUFDMUIsY0FBUyxHQUFrQixFQUFFLENBQUM7UUFDOUIsa0JBQWEsR0FBc0IsRUFBRSxDQUFDO1FBQ3RDLGtCQUFhLEdBQXNCLEVBQUUsQ0FBQztRQUN0QyxvQkFBZSxHQUF3QixFQUFFLENBQUM7UUFDMUMsb0JBQWUsR0FBb0I7WUFDL0IsTUFBTSxFQUFFLEVBQUU7WUFDVixTQUFTLEVBQUUsRUFBRTtZQUNiLFFBQVEsRUFBRSxFQUFFO1lBQ1osS0FBSyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBQ0YsbUJBQWMsR0FB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S0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVELHdEQUF3RDtJQUN4RCxlQUFlO1FBQ1gsbURBQW1EO0lBQ3ZELENBQUM7O3VIQS9WUSx5QkFBeUI7MkhBQXpCLHlCQUF5Qjs0RkFBekIseUJBQXlCO2tCQURyQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVXNlckNyZWF0aW9uQXBpU2VydmljZSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvc2VydmljZXMvdXNlci1jcmVhdGlvbi1hcGkuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMZGFwVXNlclJvdyB7XHJcbiAgICB1c2VySWQ6IHN0cmluZztcclxuICAgIGZpcnN0TmFtZTogc3RyaW5nO1xyXG4gICAgbGFzdE5hbWU6IHN0cmluZztcclxuICAgIGVtYWlsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcnZpZXdVc2VyUm93IGV4dGVuZHMgTGRhcFVzZXJSb3cge1xyXG4gICAgdXNlclRlbXBsYXRlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcnZpZXdMaW5lUm93IHtcclxuICAgIG51bWJlcjogc3RyaW5nO1xyXG4gICAgZGlkOiBzdHJpbmc7XHJcbiAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IHN0cmluZztcclxuICAgIGNzczogc3RyaW5nO1xyXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPdmVydmlld0RldmljZVJvdyB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBkZXZpY2VUeXBlOiBzdHJpbmc7XHJcbiAgICBsaW5lczogc3RyaW5nO1xyXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgVXNlckNyZWF0aW9uVHlwZSA9ICdDVUNNJyB8ICdNVCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJEZXRhaWxzRm9ybSB7XHJcbiAgICB1c2VySWQ6IHN0cmluZztcclxuICAgIGZpcnN0TmFtZTogc3RyaW5nO1xyXG4gICAgbGFzdE5hbWU6IHN0cmluZztcclxuICAgIGVtYWlsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGluZU9wdGlvbiB7XHJcbiAgICBudW1iZXI6IHN0cmluZztcclxuICAgIGRpZDogc3RyaW5nO1xyXG4gICAgY3NzOiBzdHJpbmc7XHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGVkTGluZVJvdyB7XHJcbiAgICBsaW5lTnVtYmVyOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcm91dGVQYXJ0aXRpb25OYW1lOiBzdHJpbmcgfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERldmljZUVudHJ5IHtcclxuICAgIGRldmljZVR5cGU6IHN0cmluZztcclxuICAgIHByb3RvY29sOiBzdHJpbmc7XHJcbiAgICBidXR0b25UZW1wbGF0ZTogc3RyaW5nO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgVGVtcGxhdGVMaW5lTGlrZSB7XHJcbiAgICBkaXJlY3RvcnlOdW1iZXI/OiB7XHJcbiAgICAgICAgZGlyZWN0b3J5TnVtYmVyPzogc3RyaW5nO1xyXG4gICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICB9O1xyXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgY2FsbGluZ1NlYXJjaFNwYWNlPzogc3RyaW5nIHwgeyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbDtcclxuICAgIGRpZFBhdHRlcm5zPzogQXJyYXk8eyBwYXR0ZXJuPzogc3RyaW5nIHwgbnVsbCB9PiB8IG51bGw7XHJcbn1cclxuXHJcbmludGVyZmFjZSBUZW1wbGF0ZURldmljZUxpa2Uge1xyXG4gICAgZGV2aWNlVHlwZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICBwcm90b2NvbD86IHN0cmluZyB8IG51bGw7XHJcbiAgICBidXR0b25UZW1wbGF0ZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGxpbmVBc3NvY2lhdGlvbnM/OiBBcnJheTx7XHJcbiAgICAgICAgZGlyZWN0b3J5TnVtYmVyPzoge1xyXG4gICAgICAgICAgICBkaXJlY3RvcnlOdW1iZXI/OiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICAgICAgfTtcclxuICAgIH0+O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgVGVtcGxhdGVFbmRVc2VyTGlrZSB7XHJcbiAgICB1c2VyaWQ/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgZmlyc3ROYW1lPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGxhc3ROYW1lPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGxpbmVzPzogVGVtcGxhdGVMaW5lTGlrZVtdIHwgbnVsbDtcclxuICAgIGRldmljZXM/OiBUZW1wbGF0ZURldmljZUxpa2VbXSB8IG51bGw7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcGkgPSBpbmplY3QoVXNlckNyZWF0aW9uQXBpU2VydmljZSk7XHJcblxyXG4gICAgcmVhZG9ubHkgbGRhcFRhYmxlQ29sdW1uczogc3RyaW5nW10gPSBbJ3VzZXJJZCcsICdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAnZW1haWwnLCAnYWRkJ107XHJcbiAgICByZWFkb25seSB1c2VyQ3JlYXRpb25UeXBlczogVXNlckNyZWF0aW9uVHlwZVtdID0gWydDVUNNJywgJ01UJ107XHJcblxyXG4gICAgc2l0ZU9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsaW5lT3B0aW9uczogTGluZU9wdGlvbltdID0gW107XHJcbiAgICByb3V0ZVBhcnRpdGlvbk9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBkZXZpY2VSb3dzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgbGRhcFVzZXJzOiBMZGFwVXNlclJvd1tdID0gW107XHJcbiAgICBvdmVydmlld1VzZXJzOiBPdmVydmlld1VzZXJSb3dbXSA9IFtdO1xyXG4gICAgb3ZlcnZpZXdMaW5lczogT3ZlcnZpZXdMaW5lUm93W10gPSBbXTtcclxuICAgIG92ZXJ2aWV3RGV2aWNlczogT3ZlcnZpZXdEZXZpY2VSb3dbXSA9IFtdO1xyXG4gICAgdXNlckRldGFpbHNGb3JtOiBVc2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgdXNlcklkOiAnJyxcclxuICAgICAgICBmaXJzdE5hbWU6ICcnLFxyXG4gICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICBlbWFpbDogJydcclxuICAgIH07XHJcbiAgICBsaW5lU2VsZWN0aW9uczogU2VsZWN0ZWRMaW5lUm93W10gPSBbXTtcclxuICAgIGRldmljZUVudHJpZXM6IERldmljZUVudHJ5W10gPSBbXTtcclxuXHJcbiAgICBzZWxlY3RlZFNpdGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgc2VsZWN0ZWRUZW1wbGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBzZWxlY3RlZFVzZXJDcmVhdGlvblR5cGU6IFVzZXJDcmVhdGlvblR5cGUgPSAnQ1VDTSc7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhZGRlZExkYXBVc2VySWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkUGxhY2Vob2xkZXJEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkTGRhcFVzZXIocm93OiBMZGFwVXNlclJvdyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtID0ge1xyXG4gICAgICAgICAgICB1c2VySWQ6IHJvdy51c2VySWQsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogcm93LmZpcnN0TmFtZSxcclxuICAgICAgICAgICAgbGFzdE5hbWU6IHJvdy5sYXN0TmFtZSxcclxuICAgICAgICAgICAgZW1haWw6IHJvdy5lbWFpbFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5hZGRlZExkYXBVc2VySWRzLmFkZChyb3cudXNlcklkKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNMZGFwVXNlckFkZGVkKHJvdzogTGRhcFVzZXJSb3cpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRlZExkYXBVc2VySWRzLmhhcyhyb3cudXNlcklkKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFNpdGUoc2l0ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTaXRlID0gc2l0ZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gdGVtcGxhdGU7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0VGVtcGxhdGVEcml2ZW5EYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGluZU9wdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLnJvdXRlUGFydGl0aW9uT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLmRldmljZUVudHJpZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmRldmljZVJvd3MgPSBbXTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlUZW1wbGF0ZVRva2VuUGF5bG9hZChwYXlsb2FkOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZXh0cmFjdFRlbXBsYXRlRnJvbVRva2VuUGF5bG9hZChwYXlsb2FkKTtcclxuICAgICAgICBjb25zdCBlbmRVc2VyOiBUZW1wbGF0ZUVuZFVzZXJMaWtlID0gdGVtcGxhdGU/LmVuZFVzZXIgfHwge307XHJcbiAgICAgICAgY29uc3QgbGluZXNGcm9tVGVtcGxhdGU6IFRlbXBsYXRlTGluZUxpa2VbXSA9IEFycmF5LmlzQXJyYXkoZW5kVXNlci5saW5lcykgPyBlbmRVc2VyLmxpbmVzIDogW107XHJcbiAgICAgICAgY29uc3QgZGV2aWNlc0Zyb21UZW1wbGF0ZTogVGVtcGxhdGVEZXZpY2VMaWtlW10gPSBBcnJheS5pc0FycmF5KGVuZFVzZXIuZGV2aWNlcykgPyBlbmRVc2VyLmRldmljZXMgOiBbXTtcclxuXHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy52YWx1ZVRvU3RyaW5nKGVuZFVzZXIudXNlcmlkKSxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiB0aGlzLnZhbHVlVG9TdHJpbmcoZW5kVXNlci5maXJzdE5hbWUpLFxyXG4gICAgICAgICAgICBsYXN0TmFtZTogdGhpcy52YWx1ZVRvU3RyaW5nKGVuZFVzZXIubGFzdE5hbWUpLFxyXG4gICAgICAgICAgICBlbWFpbDogdGhpcy52YWx1ZVRvU3RyaW5nKGVuZFVzZXIuZW1haWwpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgbWFwcGVkTGluZU9wdGlvbnM6IExpbmVPcHRpb25bXSA9IGxpbmVzRnJvbVRlbXBsYXRlXHJcbiAgICAgICAgICAgIC5tYXAobGluZSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiB0aGlzLnZhbHVlVG9TdHJpbmcobGluZT8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIpLFxyXG4gICAgICAgICAgICAgICAgZGlkOiB0aGlzLnZhbHVlVG9TdHJpbmcobGluZT8uZGlkUGF0dGVybnM/LlswXT8ucGF0dGVybiB8fCBsaW5lPy5kaXJlY3RvcnlOdW1iZXI/LmRpcmVjdG9yeU51bWJlciksXHJcbiAgICAgICAgICAgICAgICBjc3M6IHRoaXMudmFsdWVUb1N0cmluZyhcclxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgbGluZT8uY2FsbGluZ1NlYXJjaFNwYWNlID09PSAnc3RyaW5nJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGxpbmUuY2FsbGluZ1NlYXJjaFNwYWNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbGluZT8uY2FsbGluZ1NlYXJjaFNwYWNlPy5uYW1lXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMudmFsdWVUb1N0cmluZyhsaW5lPy5kZXNjcmlwdGlvbilcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lLm51bWJlci50cmltKCkubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgIGlmIChtYXBwZWRMaW5lT3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5saW5lT3B0aW9ucyA9IHRoaXMudW5pcXVlQnlOdW1iZXIobWFwcGVkTGluZU9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zID0gdGhpcy5saW5lT3B0aW9ucy5tYXAobGluZSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogbGluZS5udW1iZXIsXHJcbiAgICAgICAgICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IGxpbmVzRnJvbVRlbXBsYXRlLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlID0+IChzb3VyY2U/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyIHx8ICcnKSA9PT0gbGluZS5udW1iZXJcclxuICAgICAgICAgICAgICAgICk/LmRpcmVjdG9yeU51bWJlcj8ucm91dGVQYXJ0aXRpb25OYW1lIHx8IG51bGxcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVBc3NvY2lhdGlvbnMgPSBkZXZpY2VzRnJvbVRlbXBsYXRlLmZsYXRNYXAoZGV2aWNlID0+IGRldmljZS5saW5lQXNzb2NpYXRpb25zIHx8IFtdKTtcclxuICAgICAgICAgICAgY29uc3QgYXNzb2NpYXRlZExpbmVPcHRpb25zOiBMaW5lT3B0aW9uW10gPSBsaW5lQXNzb2NpYXRpb25zXHJcbiAgICAgICAgICAgICAgICAubWFwKGFzc29jaWF0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1iZXIgPSBhc3NvY2lhdGlvbj8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaWQ6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3NzOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGxpbmUgPT4gbGluZS5udW1iZXIudHJpbSgpLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5saW5lT3B0aW9ucyA9IHRoaXMudW5pcXVlQnlOdW1iZXIoYXNzb2NpYXRlZExpbmVPcHRpb25zKTtcclxuICAgICAgICAgICAgdGhpcy5saW5lU2VsZWN0aW9ucyA9IHRoaXMubGluZU9wdGlvbnMubWFwKGxpbmUgPT4gKHtcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmUubnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lOiBsaW5lQXNzb2NpYXRpb25zLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlID0+IChzb3VyY2U/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyIHx8ICcnKSA9PT0gbGluZS5udW1iZXJcclxuICAgICAgICAgICAgICAgICk/LmRpcmVjdG9yeU51bWJlcj8ucm91dGVQYXJ0aXRpb25OYW1lIHx8IG51bGxcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgcm91dGVQYXJ0aXRpb25zID0gdGhpcy5saW5lU2VsZWN0aW9uc1xyXG4gICAgICAgICAgICAubWFwKGxpbmUgPT4gbGluZS5yb3V0ZVBhcnRpdGlvbk5hbWUpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+ICEhdmFsdWUgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApO1xyXG4gICAgICAgIHRoaXMucm91dGVQYXJ0aXRpb25PcHRpb25zID0gdGhpcy51bmlxdWVTdHJpbmdzKHJvdXRlUGFydGl0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMuZGV2aWNlRW50cmllcyA9IGRldmljZXNGcm9tVGVtcGxhdGUubWFwKGRldmljZSA9PiAoe1xyXG4gICAgICAgICAgICBkZXZpY2VUeXBlOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLmRldmljZVR5cGUpLFxyXG4gICAgICAgICAgICBwcm90b2NvbDogdGhpcy52YWx1ZVRvU3RyaW5nKGRldmljZS5wcm90b2NvbCksXHJcbiAgICAgICAgICAgIGJ1dHRvblRlbXBsYXRlOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLmJ1dHRvblRlbXBsYXRlKSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy52YWx1ZVRvU3RyaW5nKGRldmljZS5uYW1lKVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICB0aGlzLmRldmljZVJvd3MgPSB0aGlzLmRldmljZUVudHJpZXMubWFwKChfLCBpbmRleCkgPT4gaW5kZXggKyAxKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3TGluZXMoKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFVzZXJDcmVhdGlvblR5cGUodHlwZTogVXNlckNyZWF0aW9uVHlwZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VyQ3JlYXRpb25UeXBlID0gdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VyRGV0YWlsc0ZpZWxkKGZpZWxkOiBrZXlvZiBVc2VyRGV0YWlsc0Zvcm0sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy51c2VyRGV0YWlsc0Zvcm0sXHJcbiAgICAgICAgICAgIFtmaWVsZF06IHZhbHVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TGluZVNlbGVjdGlvbihpbmRleDogbnVtYmVyLCBsaW5lTnVtYmVyOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSxcclxuICAgICAgICAgICAgbGluZU51bWJlclxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFJvdXRlUGFydGl0aW9uU2VsZWN0aW9uKGluZGV4OiBudW1iZXIsIHJvdXRlUGFydGl0aW9uTmFtZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0sXHJcbiAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERldmljZU5hbWUoaW5kZXg6IG51bWJlciwgbmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0uZGV2aWNlVHlwZSB8fCAnJztcclxuICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IGRldmljZVR5cGUuaW5jbHVkZXMoJzg4NTEnKVxyXG4gICAgICAgICAgICA/IG5hbWUucmVwbGFjZSgvXlNFUFxccyovaSwgJycpXHJcbiAgICAgICAgICAgIDogbmFtZTtcclxuICAgICAgICB0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmRldmljZUVudHJpZXNbaW5kZXhdLFxyXG4gICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGV2aWNlRGlzcGxheU5hbWUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmICghZW50cnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVudHJ5LmRldmljZVR5cGU/LmluY2x1ZGVzKCc4ODUxJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGBTRVAgJHtlbnRyeS5uYW1lIHx8ICcnfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IDEpIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZU51bWJlciA9IHRoaXMubGluZVNlbGVjdGlvbnNbMF0/LmxpbmVOdW1iZXI7XHJcbiAgICAgICAgICAgIHJldHVybiBsaW5lTnVtYmVyID8gYENTRiR7bGluZU51bWJlcn1gIDogJ0NTRltETl0nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVudHJ5Lm5hbWUgfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGxhY2Vob2xkZXIgYm9vdHN0cmFwIHVudGlsIGJhY2tlbmQgQVBJcyBhcmUgY29ubmVjdGVkLlxyXG4gICAgbG9hZFBsYWNlaG9sZGVyRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNpdGVPcHRpb25zID0gWydTaXRlIDEnLCAnU2l0ZSAyJywgJ1NpdGUgMyddO1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVPcHRpb25zID0gWyc4ODUxICsgQ1NGJ107XHJcbiAgICAgICAgdGhpcy5saW5lT3B0aW9ucyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiAnNTU3MDQ2JyxcclxuICAgICAgICAgICAgICAgIGRpZDogJysxMzEyNTU1NzA0NicsXHJcbiAgICAgICAgICAgICAgICBjc3M6ICdBdGxhbnRhX2ludGVybmFsX2NzcycsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJydcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiAnNTU3MDQ3JyxcclxuICAgICAgICAgICAgICAgIGRpZDogJysxMzEyNTU1NzA0NycsXHJcbiAgICAgICAgICAgICAgICBjc3M6ICdBdGxhbnRhX2ludGVybmFsX2NzcycsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJydcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiAnNTU3MDQ4JyxcclxuICAgICAgICAgICAgICAgIGRpZDogJysxMzEyNTU1NzA0OCcsXHJcbiAgICAgICAgICAgICAgICBjc3M6ICdBdGxhbnRhX2ludGVybmFsX2NzcycsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJydcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgPSBbJ0F0bGFudGFfaW50ZXJuYWxfUFQnLCAnQmVpamluZ19uYXRpb25hbF9QVCddO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlUm93cyA9IFsxLCAyXTtcclxuICAgICAgICB0aGlzLmxkYXBVc2VycyA9IFtcclxuICAgICAgICAgICAgeyB1c2VySWQ6ICdKb2huLkRvZScsIGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0RvZScsIGVtYWlsOiAnam9obi5kb2VAY2FyLndlc3QuaW8nIH0sXHJcbiAgICAgICAgICAgIHsgdXNlcklkOiAnSmFuZS5TbWl0aCcsIGZpcnN0TmFtZTogJ0phbmUnLCBsYXN0TmFtZTogJ1NtaXRoJywgZW1haWw6ICdqYW5lLnNtaXRoQGNhci53ZXN0LmlvJyB9XHJcbiAgICAgICAgXTtcclxuICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lOiB0aGlzLnJvdXRlUGFydGl0aW9uT3B0aW9uc1swXSB8fCBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlRW50cmllcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogJ0Npc2NvIDg4NTEnLFxyXG4gICAgICAgICAgICAgICAgcHJvdG9jb2w6ICdTSVAnLFxyXG4gICAgICAgICAgICAgICAgYnV0dG9uVGVtcGxhdGU6ICdTdGFuZGFyZCA4ODUxIFNJUCcsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiAnQ2lzY28gVW5pZmllZCBDbGllbnQgU2VydmljZXMgRnJhbWV3b3JrJyxcclxuICAgICAgICAgICAgICAgIHByb3RvY29sOiAnU0lQJyxcclxuICAgICAgICAgICAgICAgIGJ1dHRvblRlbXBsYXRlOiAnU3RhbmRhcmQgQ2xpZW50IFNlcnZpY2VzIEZyYW1ld29yaycsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPz8gbnVsbDtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVidWlsZE92ZXJ2aWV3VXNlcnMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdXNlclRlbXBsYXRlID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlIHx8ICcnO1xyXG4gICAgICAgIGNvbnN0IGhhc1VzZXJEYXRhID0gT2JqZWN0LnZhbHVlcyh0aGlzLnVzZXJEZXRhaWxzRm9ybSkuc29tZSh2YWx1ZSA9PiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCk7XHJcbiAgICAgICAgdGhpcy5vdmVydmlld1VzZXJzID0gaGFzVXNlckRhdGFcclxuICAgICAgICAgICAgPyBbe1xyXG4gICAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJEZXRhaWxzRm9ybS51c2VySWQsXHJcbiAgICAgICAgICAgICAgICBmaXJzdE5hbWU6IHRoaXMudXNlckRldGFpbHNGb3JtLmZpcnN0TmFtZSxcclxuICAgICAgICAgICAgICAgIGxhc3ROYW1lOiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5sYXN0TmFtZSxcclxuICAgICAgICAgICAgICAgIGVtYWlsOiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5lbWFpbCxcclxuICAgICAgICAgICAgICAgIHVzZXJUZW1wbGF0ZVxyXG4gICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICA6IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVidWlsZE92ZXJ2aWV3TGluZXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vdmVydmlld0xpbmVzID0gdGhpcy5saW5lU2VsZWN0aW9uc1xyXG4gICAgICAgICAgICAubWFwKHNlbGVjdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbj8ubGluZU51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRMaW5lID0gdGhpcy5saW5lT3B0aW9ucy5maW5kKGxpbmUgPT4gbGluZS5udW1iZXIgPT09IHNlbGVjdGlvbi5saW5lTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRMaW5lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcjogc2VsZWN0ZWRMaW5lLm51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICBkaWQ6IHNlbGVjdGVkTGluZS5kaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lOiBzZWxlY3Rpb24ucm91dGVQYXJ0aXRpb25OYW1lIHx8IHRoaXMucm91dGVQYXJ0aXRpb25PcHRpb25zWzBdIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNzczogc2VsZWN0ZWRMaW5lLmNzcyxcclxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogc2VsZWN0ZWRMaW5lLmRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmlsdGVyKChsaW5lKTogbGluZSBpcyBPdmVydmlld0xpbmVSb3cgPT4gISFsaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYnVpbGRPdmVydmlld0RldmljZXMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRMaW5lTnVtYmVycyA9IHRoaXMub3ZlcnZpZXdMaW5lcy5tYXAobGluZSA9PiBsaW5lLm51bWJlcikuam9pbignLCAnKTtcclxuICAgICAgICB0aGlzLm92ZXJ2aWV3RGV2aWNlcyA9IHRoaXMuZGV2aWNlRW50cmllc1xyXG4gICAgICAgICAgICAubWFwKChkZXZpY2UsIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgZGV2aWNlLFxyXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuZ2V0RGV2aWNlRGlzcGxheU5hbWUoaW5kZXgpXHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAuZmlsdGVyKCh7IGRldmljZSwgZGlzcGxheU5hbWUgfSkgPT4gZGlzcGxheU5hbWUudHJpbSgpLmxlbmd0aCA+IDAgfHwgZGV2aWNlLmRldmljZVR5cGUudHJpbSgpLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIC5tYXAoKHsgZGV2aWNlLCBkaXNwbGF5TmFtZSB9KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbmFtZTogZGlzcGxheU5hbWUsXHJcbiAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiBkZXZpY2UuZGV2aWNlVHlwZSxcclxuICAgICAgICAgICAgICAgIGxpbmVzOiBzZWxlY3RlZExpbmVOdW1iZXJzLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke2RldmljZS5wcm90b2NvbH0gLyAke2RldmljZS5idXR0b25UZW1wbGF0ZX1gXHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4dHJhY3RUZW1wbGF0ZUZyb21Ub2tlblBheWxvYWQocGF5bG9hZDogYW55KTogYW55IHtcclxuICAgICAgICBpZiAoIXBheWxvYWQgfHwgdHlwZW9mIHBheWxvYWQgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZFswXSB8fCBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmaXJzdEtleSA9IE9iamVjdC5rZXlzKHBheWxvYWQpWzBdO1xyXG4gICAgICAgIHJldHVybiBmaXJzdEtleSA/IHBheWxvYWRbZmlyc3RLZXldIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVuaXF1ZUJ5TnVtYmVyKGxpbmVzOiBMaW5lT3B0aW9uW10pOiBMaW5lT3B0aW9uW10ge1xyXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgICAgICByZXR1cm4gbGluZXMuZmlsdGVyKGxpbmUgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMobGluZS5udW1iZXIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2Vlbi5hZGQobGluZS5udW1iZXIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVuaXF1ZVN0cmluZ3MoaXRlbXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoaXRlbXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHZhbHVlVG9TdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPOiByZXBsYWNlIHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgQVBJIGludGVncmF0aW9uLlxyXG4gICAgbG9hZERhdGFGcm9tQXBpKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIHRoaXMuYXBpLmdldFdpemFyZEJvb3RzdHJhcERhdGEoKS5zdWJzY3JpYmUoLi4uKVxyXG4gICAgfVxyXG59Il19
|
|
796
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jcmVhdGlvbi13aXphcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy91c2VyLWNyZWF0aW9uL3NyYy93aWRnZXRzL3VzZXItY3JlYXRpb24td2l6YXJkL3VzZXItY3JlYXRpb24td2l6YXJkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFJekYsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRixPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUM7QUFDekIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQXdDLE1BQU0sb0JBQW9CLENBQUM7QUFDaEYsT0FBTyxFQW9CSCxXQUFXLEVBRVgsT0FBTyxHQUNWLE1BQU0sa0RBQWtELENBQUM7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7O0FBRzlFLE1BQU0sT0FBTyx5QkFBeUI7SUFjbEMsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFzQ0QsSUFBSSx1QkFBdUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsSUFBSSxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQUkseUJBQXlCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFJLHVCQUF1QjtRQUN2QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBS0Q7UUFwRWlCLDJCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRWhFLHFCQUFnQixHQUFhLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pGLHNCQUFpQixHQUF1QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV4RCxhQUFRLEdBQWlDLElBQUksQ0FBQztRQUMvQyxZQUFPLEdBQTRCLElBQUksQ0FBQztRQUN4QyxVQUFLLEdBQW9CLEVBQUUsQ0FBQztRQUM1QixZQUFPLEdBQXNCLEVBQUUsQ0FBQztRQUNoQyxtQkFBYyxHQUFzQixFQUFFLENBQUM7UUFDdEMsMEJBQXFCLEdBQTJCLElBQUksQ0FBQztRQUNyRCxpQkFBWSxHQUFnQixJQUFJLENBQUM7UUFNekMsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFDM0Isb0JBQWUsR0FBYSxFQUFFLENBQUM7UUFDL0IsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBQy9CLDBCQUFxQixHQUFhLEVBQUUsQ0FBQztRQUNyQyxlQUFVLEdBQWEsRUFBRSxDQUFDO1FBQzFCLGNBQVMsR0FBd0IsRUFBRSxDQUFDO1FBQ3BDLGtCQUFhLEdBQXNCLEVBQUUsQ0FBQztRQUN0QyxrQkFBYSxHQUFzQixFQUFFLENBQUM7UUFDdEMsb0JBQWUsR0FBd0IsRUFBRSxDQUFDO1FBQzFDLDJCQUFzQixHQUF3QixFQUFFLENBQUM7UUFDakQseUJBQW9CLEdBQWdDLElBQUksQ0FBQztRQUN6RCxvQkFBZSxHQUFvQjtZQUMvQixNQUFNLEVBQUUsRUFBRTtZQUNWLFNBQVMsRUFBRSxFQUFFO1lBQ2IsUUFBUSxFQUFFLEVBQUU7WUFDWixLQUFLLEVBQUUsRUFBRTtTQUNaLENBQUM7UUFDRixtQkFBYyxHQUFzQixFQUFFLENBQUM7UUFDdkMsa0JBQWEsR0FBa0IsRUFBRSxDQUFDO1FBQ2xDLHFCQUFnQixHQUFhLEVBQUUsQ0FBQztRQUNoQyxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUMzQixpQkFBWSxHQUF3QixJQUFJLENBQUM7UUFDekMseUJBQW9CLEdBQXdCLElBQUksQ0FBQztRQUNqRCxrQkFBYSxHQUF1QixFQUFFLENBQUM7UUFDdkMsb0JBQWUsR0FBeUIsRUFBRSxDQUFDO1FBQzNDLHdCQUFtQixHQUF3QixFQUFFLENBQUM7UUFFOUMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLHlCQUFvQixHQUFrQixJQUFJLENBQUM7UUFDM0MsdUJBQWtCLEdBQWtCLElBQUksQ0FBQztRQUN6Qyw2QkFBd0IsR0FBcUIsTUFBTSxDQUFDO1FBQ3BELG1DQUE4QixHQUFRLEVBQUUsQ0FBQztRQUV4QixnQ0FBMkIsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQzFELDBCQUFxQixHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQWNqRixxQkFBZ0IsR0FBNkIsSUFBSSxDQUFDO1FBQ2xELG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBR2YsOEJBQThCO0lBQ2xDLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNoQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQXVCO1FBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7U0FDekM7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ25CLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFO1lBQy9CLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUU7WUFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtTQUMxQixDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELHNCQUFzQjtRQUNsQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7U0FDM0I7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ25CLE1BQU0sRUFBRSxFQUFFO1lBQ1YsU0FBUyxFQUFFLEVBQUU7WUFDYixRQUFRLEVBQUUsRUFBRTtZQUNaLEtBQUssRUFBRSxFQUFFO1NBQ1osQ0FBQztRQUNGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxHQUFzQjtRQUN4QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUN4RCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBMEIsRUFBRSxLQUFhO1FBQ3hELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxlQUFlLENBQUMsSUFBbUI7UUFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxRQUE0QztRQUM1RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsUUFBUSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUM7UUFDbkQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDO1FBQy9DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxjQUFjLENBQUMsSUFBVTtRQUM1QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsdUJBQXVCO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELHlCQUF5QixDQUFDLE9BQThCO1FBQ3BELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVwSCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUVwQywyQkFBMkI7UUFDM0IsOERBQThEO1FBQzlELG9FQUFvRTtRQUNwRSxrRUFBa0U7UUFDbEUsMkRBQTJEO1FBQzNELEtBQUs7UUFFTCw0REFBNEQ7UUFDNUQsc0JBQXNCO1FBQ3RCLDhFQUE4RTtRQUM5RSw4R0FBOEc7UUFDOUcsbUNBQW1DO1FBQ25DLDJEQUEyRDtRQUMzRCw0Q0FBNEM7UUFDNUMsbURBQW1EO1FBQ25ELGFBQWE7UUFDYiw2REFBNkQ7UUFDN0QsVUFBVTtRQUNWLHNEQUFzRDtRQUV0RCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEMsaUNBQWlDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFFcEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDcEU7UUFFRCxrQ0FBa0M7UUFDbEMsaUVBQWlFO1FBQ2pFLDREQUE0RDtRQUM1RCxtQ0FBbUM7UUFDbkMsc0RBQXNEO1FBQ3RELHlGQUF5RjtRQUN6Rix5REFBeUQ7UUFDekQsV0FBVztRQUNYLFdBQVc7UUFDWCxxR0FBcUc7UUFDckcsbUVBQW1FO1FBQ25FLGdDQUFnQztRQUNoQyxrRkFBa0Y7UUFDbEYsdUJBQXVCO1FBQ3ZCLDBCQUEwQjtRQUMxQiwrQkFBK0I7UUFDL0IsMkJBQTJCO1FBQzNCLGtDQUFrQztRQUNsQyxpQkFBaUI7UUFDakIsYUFBYTtRQUNiLDBEQUEwRDtRQUUxRCxxRUFBcUU7UUFDckUsNERBQTREO1FBQzVELG1DQUFtQztRQUNuQyxxREFBcUQ7UUFDckQseUZBQXlGO1FBQ3pGLHlEQUF5RDtRQUN6RCxXQUFXO1FBRVgsa0ZBQWtGO1FBQ2xGLDZEQUE2RDtRQUM3RCxJQUFJO1FBRUosOENBQThDO1FBQzlDLDRDQUE0QztRQUM1QywrRUFBK0U7UUFDL0Usb0VBQW9FO1FBRXBFLDREQUE0RDtRQUM1RCx5REFBeUQ7UUFDekQscURBQXFEO1FBQ3JELGlFQUFpRTtRQUNqRSw0Q0FBNEM7UUFDNUMsT0FBTztRQUNQLHFFQUFxRTtRQUVyRSwrQkFBK0I7UUFDL0IsK0JBQStCO1FBQy9CLGlDQUFpQztJQUNyQyxDQUFDO0lBRUQsMkJBQTJCLENBQUMsSUFBc0I7UUFDOUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztJQUN6QyxDQUFDO0lBRU0seUJBQXlCO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLGVBQWUsR0FBRztZQUNuQixNQUFNLEVBQUUsRUFBRTtZQUNWLFNBQVMsRUFBRSxFQUFFO1lBQ2IsUUFBUSxFQUFFLEVBQUU7WUFDWixLQUFLLEVBQUUsRUFBRTtTQUNaLENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBRXhCLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzVCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7U0FDdkU7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMxQixNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2xDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ25DO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVPLDRCQUE0QjtRQUNoQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUE0QixFQUFFLEtBQWE7UUFDM0QsSUFBSSxDQUFDLGVBQWUsR0FBRztZQUNuQixHQUFHLElBQUksQ0FBQyxlQUFlO1lBQ3ZCLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSztTQUNqQixDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELHlCQUF5QixDQUFDLFNBQStCO1FBQ3JELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUM7UUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRztZQUNuQixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sSUFBSSxFQUFFO1lBQzlCLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxJQUFJLEVBQUU7WUFDcEMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLElBQUksRUFBRTtZQUNsQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFO1NBQy9CLENBQUM7UUFFRixTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO2dCQUN4QixPQUFPO2FBQ1Y7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUM5RCxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1FBQzdFLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDOUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNULE9BQU87YUFDVjtZQUNELE1BQU0sQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN0RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1YsT0FBTzthQUNWO1lBQ0QsT0FBTyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1NBQzlDO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWEsRUFBRSxVQUF5QjtRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ3pCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDN0IsVUFBVTtTQUNiLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsMEJBQTBCLENBQUMsS0FBYSxFQUFFLGtCQUFpQztRQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ3pCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDN0Isa0JBQWtCO1NBQ3JCLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWEsRUFBRSxJQUFZO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzVCLE9BQU87U0FDVjtRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUM5RCxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUM5QyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDWCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ3hCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDNUIsSUFBSSxFQUFFLGNBQWM7U0FDdkIsQ0FBQztRQUNGLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFhO1FBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sT0FBTyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUM7WUFDdEQsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUN0RDtRQUVELE9BQU8sS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLGNBQWMsQ0FBQyxNQUFjO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQzFELEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ2IsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNmLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQWtCLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO2FBQy9CO1lBQ0QsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNmLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2FBQ2xFO1lBQ0QsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNmLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBYSxDQUFDO2FBQ3pDO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQ1osSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDakUsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVNLDRCQUE0QixDQUFDLE1BQWM7UUFDOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDckIsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDeEI7UUFFRCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQzFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUMxRSxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQ3JFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDN0IsQ0FDSixDQUFDO1FBRUYsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUMxQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQ2xELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FDdkIsQ0FBQztJQUNOLENBQUM7SUFFTyxvQkFBb0I7UUFDeEIsTUFBTSxLQUFLLEdBQUc7WUFDVixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUNoRCxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztTQUM1RCxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRSxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxVQUFrQixFQUFFLFFBQWlDO1FBQ25GLE1BQU0sbUJBQW1CLEdBQUcsd0JBQXdCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9FLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FDNUQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FDN0MsQ0FBQztRQUVGLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckIsTUFBTSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7WUFDakMsTUFBTSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1lBQ2pELE1BQU0sQ0FBQyxxQkFBcUIsR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsV0FBbUIsRUFBRSxTQUFTLEdBQUcsS0FBSztRQUN0RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEYsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN0QyxPQUFPLE1BQU0sSUFBSSxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVELDhCQUE4QixDQUFDLFdBQW1CLEVBQUUsU0FBUyxHQUFHLEtBQUs7UUFDakUsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hGLE9BQU8sTUFBTSxFQUFFLHFCQUFxQixJQUFJLE1BQU0sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLElBQUksRUFBRSxDQUFDO0lBQzlGLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxXQUFtQixFQUFFLFNBQVMsR0FBRyxLQUFLO1FBSWpFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RixNQUFNLEtBQUssR0FDUCxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFO1lBQ25DLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxPQUFPO1lBQ0gsS0FBSztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQztTQUN2RSxDQUFDO0lBQ04sQ0FBQztJQUVNLGNBQWMsQ0FBQyxNQUFjLEVBQUUsY0FBc0I7UUFDeEQsSUFBSSxDQUFDLDhCQUE4QixHQUFHLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdEIsTUFBTSxNQUFNLEdBQUcsRUFBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFDO1FBQ3hHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQzthQUN4RSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDbkIsR0FBRyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQW1ELEVBQUUsRUFBRTtnQkFDcEYsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3RHLENBQUMsQ0FBQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0wsQ0FBQTtRQUNELHdDQUF3QztJQUM1QyxDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUM7UUFDckQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVc7WUFDNUIsQ0FBQyxDQUFDLENBQUM7b0JBQ0MsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTTtvQkFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUztvQkFDekMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUTtvQkFDdkMsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztvQkFDakMsWUFBWTtpQkFDZixDQUFDO1lBQ0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNiLENBQUM7SUFFTyxvQkFBb0I7UUFDeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQztRQUNuRCxJQUFJLFNBQVMsRUFBRSxNQUFNLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTO2lCQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDdEMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN0QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNqRSxPQUFPO29CQUNILE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtvQkFDeEIsR0FBRyxFQUFFLFNBQVMsQ0FBQyxVQUFVLElBQUksU0FBUyxDQUFDLE1BQU07b0JBQzdDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxjQUFjLElBQUksRUFBRTtvQkFDbEQsR0FBRztvQkFDSCxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDO2lCQUM3RCxDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQUM7WUFDUCxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjO2FBQ25DLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNiLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFO2dCQUN4QixPQUFPLElBQUksQ0FBQzthQUNmO1lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6RixJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNmLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFDRCxPQUFPO2dCQUNILE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTTtnQkFDM0IsR0FBRyxFQUFFLFlBQVksQ0FBQyxHQUFHO2dCQUNyQixrQkFBa0IsRUFBRSxTQUFTLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3ZGLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDckIsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO2FBQ3hDLENBQUM7UUFDTixDQUFDLENBQUM7YUFDRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLHNCQUFzQjtRQUMxQixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDO1FBQ3ZELElBQUksV0FBVyxFQUFFLE1BQU0sRUFBRTtZQUNyQixJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVc7aUJBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUN0RSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNaLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUU7Z0JBQ25DLEtBQUssRUFBRSxtQkFBbUI7Z0JBQzFCLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQyxjQUFjLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFO2FBQ2xGLENBQUMsQ0FBQyxDQUFDO1lBQ1IsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYTthQUNwQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JCLE1BQU07WUFDTixXQUFXLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQztTQUNoRCxDQUFDLENBQUM7YUFDRixNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQ3pHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLElBQUksRUFBRSxXQUFXO1lBQ2pCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixLQUFLLEVBQUUsbUJBQW1CO1lBQzFCLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLE1BQU0sTUFBTSxDQUFDLGNBQWMsRUFBRTtTQUMvRCxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFTyw2QkFBNkI7UUFDakMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLGNBQWMsQ0FBQztRQUMvRCxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRTtZQUN2QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxZQUFZO2FBQ3JDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2FBQ3pFLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDYixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ3hCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUU7WUFDcEMsS0FBSyxFQUFFLG1CQUFtQjtZQUMxQixXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsTUFBTSxPQUFPLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRTtTQUNwRixDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFTywrQkFBK0IsQ0FBQyxPQUFZO1FBQ2hELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO1lBQ3pDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO1NBQzdCO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0MsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFtQjtRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQy9CLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN2QixPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGFBQWEsQ0FBQyxLQUFlO1FBQ2pDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBYztRQUNoQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVPLG9CQUFvQixDQUFDLGVBQW9CO1FBQzdDLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQzthQUNySCxHQUFHLENBQUMsQ0FBQyxlQUF1QixFQUFFLEVBQUU7WUFDakMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUM7WUFDckUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxJQUFJLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQy9GLElBQUksSUFBSSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNySSxHQUFHLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ3pHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRTtnQkFDRCxJQUFJLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDdEQsR0FBRyxJQUFJLHFCQUFxQixDQUFDO2lCQUM1QjthQUNKO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztRQUNQLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQXVCLEVBQUUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUVsSSxPQUFPLGlCQUFpQixDQUFDO0lBQzdCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxLQUFhLEVBQUUsR0FBVztRQUNoRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxPQUFPLEVBQUU7WUFDVCxZQUFZLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBUyxFQUFFLEVBQUU7WUFDN0csTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUNuRCxZQUFZLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNyQztZQUNELE9BQU8sWUFBWSxHQUFHLE1BQU0sQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSx5QkFBeUIsQ0FBQyxlQUFvQjtRQUNqRCxJQUFJLGVBQWUsQ0FBQyxxQkFBcUIsSUFBSSxlQUFlLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFO1lBRXZGLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFtQixFQUFFLEVBQUU7Z0JBQ3RFLE1BQU0sRUFBRSxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQy9DLElBQUksY0FBYyxDQUFDLHdCQUF3QixDQUFDLElBQUksY0FBYyxDQUFDLHdCQUF3QixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDakcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO29CQUNuRixJQUFJLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDaEUsSUFBSSxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQzdFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7cUJBQ3ZGO2lCQUNKO2dCQUNELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEUsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsZUFBZTtRQUNYLG1EQUFtRDtJQUN2RCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsSUFBbUI7UUFDNUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFFbEYsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDN0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDO0lBQ3BELENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsc0VBQXNFO0lBQ3RFLCtDQUErQztJQUMvQywrQ0FBK0M7SUFDL0MscUlBQXFJO0lBQ3JJLDJGQUEyRjtJQUMzRiwyQkFBMkI7SUFDM0IsY0FBYztJQUVkLDZFQUE2RTtJQUM3RSwwRUFBMEU7SUFDMUUsc0VBQXNFO0lBQ3RFLGVBQWU7SUFDZixRQUFRO0lBQ1IsK0NBQStDO0lBQy9DLDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDekUsWUFBWTtJQUNaLFVBQVU7SUFDVixJQUFJO0lBR0ksNEJBQTRCLENBQUMsTUFBMEIsRUFBRSxjQUFzQjtRQUNuRixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7UUFDdkQsSUFBRyxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7WUFDNUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUN2QyxlQUFlLElBQUksZUFBZSxDQUFDLGVBQWUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3hLLGVBQWUsSUFBSSxlQUFlLENBQUMsZUFBZSxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsR0FBRyxjQUFjLENBQUMsQ0FBQztnQkFDNUgsZUFBZSxJQUFJLGVBQWUsQ0FBQyxhQUFhLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxHQUFHLGVBQWUsQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLENBQUM7WUFDbkksQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUF1QjtRQUNsRCxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDN0IsTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxFQUFFO1lBQ3pDLE1BQU0sQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsSUFBSSxLQUFLLENBQUM7U0FDdEU7YUFBTSxJQUFJLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEtBQUssRUFBRTtZQUNwRSxNQUFNLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1NBQ3RDO2FBQU0sSUFBSSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkUsTUFBTSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztTQUN2QztRQUVELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUNqQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUM7WUFDbkgsTUFBTSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUM7U0FDbkM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDakIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO1lBQ3pILE1BQU0sQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO1lBQ2pJLE1BQU0sQ0FBQyxzQkFBc0IsR0FBRyxhQUFhLENBQUM7U0FDakQ7UUFDRCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7WUFDckIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUM5SCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUM7U0FDOUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQzFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztTQUM1RDtJQUNMLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxVQUFlLEVBQUUsYUFBcUI7UUFDdEUsSUFBSSxVQUFVLEVBQUU7WUFDaEIsVUFBVSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN4RCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQzVELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVPLHlCQUF5QixDQUFDLEdBQVE7UUFDdEMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7YUFDaEcsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDO2FBQzVFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUM7YUFDN0QsT0FBTyxDQUFDLHFCQUFxQixFQUFFLGlCQUFpQixDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLGlCQUFpQixDQUFDO2FBQ3JHLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQzthQUNuRyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDO2FBQ3ZELE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0IsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRU0sa0JBQWtCLENBQUMsTUFBVyxFQUFFLEtBQWEsRUFBRSxlQUF3QixFQUFFLElBQVU7UUFDdEYsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBRWhCLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzlFLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztTQUM5QztRQUVELElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLElBQUksZUFBZSxFQUFFO1lBQ3JDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRSxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLElBQUksT0FBTyxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsVUFBVSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuSixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDNUMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRCxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyRDtRQUNELElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDM0MsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoRCxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyRDtRQUNELElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDekMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsR0FB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QUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1NBQzlGLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxNQUFjLEVBQUUsTUFBdUI7UUFDcEUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0QsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3JDLElBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRTtZQUNuRSxPQUFPLEdBQUcsTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVNLFdBQVc7UUFDZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEYsQ0FBQzs7dUhBMzRCUSx5QkFBeUI7MkhBQXpCLHlCQUF5Qjs0RkFBekIseUJBQXlCO2tCQURyQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVXNlckNyZWF0aW9uQXBpU2VydmljZSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvc2VydmljZXMvdXNlci1jcmVhdGlvbi1hcGkuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBBUEkgfSBmcm9tIFwiLi4vLi4vYXBwLmNvbnN0YW50c1wiO1xyXG4vLyBpbXBvcnQgeyBBdmFpbGFibGVQaG9uZU51bWJlclJhbmdlSW50ZXJmYWNlLCBBdmFpbGFibGVSYW5nZUludGVyZmFjZSwgRG5SYW5nZVR5cGUsIExpbmVJbnRlcmZhY2UgfSBmcm9tIFwicHJvamVjdHMvdHVraS93aWRnZXRzL3VzZXJzLWxpc3Qvc3JjL2NsYXNzZXMvbGluZVwiO1xyXG5pbXBvcnQgeyBBUElTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9hcGkvYXBpLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZm9ya0pvaW4sIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IEJpZyBmcm9tIFwiYmlnLmpzXCI7XHJcbmltcG9ydCB7IFNpdGVEZWZhdWx0cyB9IGZyb20gXCIuLi8uLi9jbGFzc2VzL3NpdGVcIjtcclxuaW1wb3J0IHsgU2l0ZSwgU2l0ZUludGVyZmFjZSwgU2l0ZVRlbXBsYXRlSW50ZXJmYWNlIH0gZnJvbSBcIi4uLy4uL2NsYXNzZXMvc2l0ZVwiO1xyXG5pbXBvcnQge1xyXG4gICAgRGV2aWNlRW50cnksXHJcbiAgICBFbmRVc2VySW50ZXJmYWNlLFxyXG4gICAgTGluZU9wdGlvbixcclxuICAgIE92ZXJ2aWV3RGV2aWNlUm93LFxyXG4gICAgT3ZlcnZpZXdMaW5lUm93LFxyXG4gICAgT3ZlcnZpZXdVc2VyUm93LFxyXG4gICAgU2VsZWN0ZWRMaW5lUm93LFxyXG4gICAgVGVtcGxhdGVEZXZpY2VMaWtlLFxyXG4gICAgVGVtcGxhdGVFbmRVc2VyTGlrZSxcclxuICAgIFRlbXBsYXRlTGluZUxpa2UsXHJcbiAgICBVc2VyQ3JlYXRpb25UeXBlLFxyXG4gICAgVXNlckRldGFpbHNGb3JtLFxyXG4gICAgVXNlckRldGFpbHNGb3JtVmFsdWUsXHJcbiAgICBVc2VyVGVtcGxhdGVJbnRlcmZhY2UsXHJcbiAgICBMaW5lSW50ZXJmYWNlLFxyXG4gICAgRGV2aWNlSW50ZXJmYWNlLFxyXG4gICAgRGV2aWNlRGVmYXVsdHNJbnRlcmZhY2UsXHJcbiAgICBBdmFpbGFibGVQaG9uZU51bWJlclJhbmdlSW50ZXJmYWNlLFxyXG4gICAgQXZhaWxhYmxlUmFuZ2VJbnRlcmZhY2UsXHJcbiAgICBEblJhbmdlVHlwZSxcclxuICAgIExpc3RVc2VySW50ZXJmYWNlLFxyXG4gICAgRW5kVXNlcixcclxufSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy91c2VyLWNyZWF0aW9uLXdpemFyZC5pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IGJ1aWxkU2F2YWJsZUVuZFVzZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvYnVpbGQtc2F2YWJsZS1lbmQtdXNlclwiO1xyXG5pbXBvcnQgeyBhcHBseURlZmF1bHREZXZpY2VQcmVmaXhJZk1pc3NpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGV2aWNlLWRlZmF1bHQtcHJlZml4XCI7XHJcbmltcG9ydCB7IHBhcnNlRGV2aWNlTmFtZVJlZ2V4Qm9keSB9IGZyb20gXCIuLi8uLi91dGlscy9wYXJzZS1kZXZpY2UtbmFtZS1ydWxlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBVc2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlckNyZWF0aW9uQXBpU2VydmljZSA9IGluamVjdChVc2VyQ3JlYXRpb25BcGlTZXJ2aWNlKTtcclxuXHJcbiAgICByZWFkb25seSBsZGFwVGFibGVDb2x1bW5zOiBzdHJpbmdbXSA9IFsndXNlcklkJywgJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsICdlbWFpbCcsICdhZGQnXTtcclxuICAgIHJlYWRvbmx5IHVzZXJDcmVhdGlvblR5cGVzOiBVc2VyQ3JlYXRpb25UeXBlW10gPSBbJ0NVQ00nLCAnTVQnXTtcclxuXHJcbiAgICBwcml2YXRlIHRlbXBsYXRlOiBVc2VyVGVtcGxhdGVJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcclxuICAgIHB1YmxpYyBlbmRVc2VyOiBFbmRVc2VySW50ZXJmYWNlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwdWJsaWMgbGluZXM6IExpbmVJbnRlcmZhY2VbXSA9IFtdO1xyXG4gICAgcHVibGljIGRldmljZXM6IERldmljZUludGVyZmFjZVtdID0gW107XHJcbiAgICBwdWJsaWMgZGV2aWNlUHJvZmlsZXM6IERldmljZUludGVyZmFjZVtdID0gW107XHJcbiAgICBwcml2YXRlIHRlbXBsYXRlTGluZXNTbmFwc2hvdDogTGluZUludGVyZmFjZVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIF9jdXJyZW50U2l0ZTogU2l0ZSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGdldCBjdXJyZW50U2l0ZSgpOiBTaXRlIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHNpdGVPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgdGVtcGxhdGVPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGluZU9wdGlvbnM6IExpbmVPcHRpb25bXSA9IFtdO1xyXG4gICAgcm91dGVQYXJ0aXRpb25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZGV2aWNlUm93czogbnVtYmVyW10gPSBbXTtcclxuICAgIGxkYXBVc2VyczogTGlzdFVzZXJJbnRlcmZhY2VbXSA9IFtdO1xyXG4gICAgb3ZlcnZpZXdVc2VyczogT3ZlcnZpZXdVc2VyUm93W10gPSBbXTtcclxuICAgIG92ZXJ2aWV3TGluZXM6IE92ZXJ2aWV3TGluZVJvd1tdID0gW107XHJcbiAgICBvdmVydmlld0RldmljZXM6IE92ZXJ2aWV3RGV2aWNlUm93W10gPSBbXTtcclxuICAgIG92ZXJ2aWV3RGV2aWNlUHJvZmlsZXM6IE92ZXJ2aWV3RGV2aWNlUm93W10gPSBbXTtcclxuICAgIHVzZXJEZXRhaWxzRm9ybVZhbHVlOiBVc2VyRGV0YWlsc0Zvcm1WYWx1ZSB8IG51bGwgPSBudWxsO1xyXG4gICAgdXNlckRldGFpbHNGb3JtOiBVc2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgdXNlcklkOiAnJyxcclxuICAgICAgICBmaXJzdE5hbWU6ICcnLFxyXG4gICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICBlbWFpbDogJycsXHJcbiAgICB9O1xyXG4gICAgbGluZVNlbGVjdGlvbnM6IFNlbGVjdGVkTGluZVJvd1tdID0gW107XHJcbiAgICBkZXZpY2VFbnRyaWVzOiBEZXZpY2VFbnRyeVtdID0gW107XHJcbiAgICBhdmFpbGFibGVOdW1iZXJzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZGV2aWNlVHlwZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBzaXRlRGVmYXVsdHM6IFNpdGVEZWZhdWx0cyB8IG51bGwgPSBudWxsO1xyXG4gICAgb3JpZ2luYWxTaXRlRGVmYXVsdHM6IFNpdGVEZWZhdWx0cyB8IG51bGwgPSBudWxsO1xyXG4gICAgdGVtcGxhdGVMaW5lczogVGVtcGxhdGVMaW5lTGlrZVtdID0gW107XHJcbiAgICB0ZW1wbGF0ZURldmljZXM6IFRlbXBsYXRlRGV2aWNlTGlrZVtdID0gW107XHJcbiAgICB0ZW1wbGF0ZVVzZXJEZXRhaWxzOiBUZW1wbGF0ZUVuZFVzZXJMaWtlID0ge307XHJcblxyXG4gICAgc2VsZWN0ZWRTaXRlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHNlbGVjdGVkVGVtcGxhdGVOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIHNlbGVjdGVkVGVtcGxhdGVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICBzZWxlY3RlZFVzZXJDcmVhdGlvblR5cGU6IFVzZXJDcmVhdGlvblR5cGUgPSAnQ1VDTSc7XHJcbiAgICBhdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG46IGFueSA9IHt9O1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlRGVmYXVsdHNMb2FkZWRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHJlYWRvbmx5IGRldmljZURlZmF1bHRzTG9hZGVkJCA9IHRoaXMuZGV2aWNlRGVmYXVsdHNMb2FkZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIGdldCBmaXJzdExpbmVSb3V0ZVBhcnRpdGlvbigpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVzWzBdPy5kaXJlY3RvcnlOdW1iZXI/LnJvdXRlUGFydGl0aW9uTmFtZSA/PyAnJztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2l0ZURlZmF1bHRSb3V0ZVBhcnRpdGlvbigpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpdGVEZWZhdWx0cz8ucm91dGVQYXJ0aXRpb24gfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvdXRlUGFydGl0aW9uTmFtZXNMaXN0KCk6IHN0cmluZ1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaXRlRGVmYXVsdHMgPyB0aGlzLnNpdGVEZWZhdWx0cy5yb3V0ZVBhcnRpdGlvbkZpbHRlciA6IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdGVkTGRhcFVzZXI6IExpc3RVc2VySW50ZXJmYWNlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsZGFwVXNlcnNUb3RhbCA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLy8gdGhpcy5sb2FkUGxhY2Vob2xkZXJEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzTGRhcEludGVncmF0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5lbmRVc2VyPy5sZGFwSW50ZWdyYXRlZDtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RMZGFwVXNlcih1c2VyOiBMaXN0VXNlckludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMZGFwVXNlciA9IHVzZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuZW5kVXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIubGRhcEludGVncmF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIudXNlcmlkID0gdXNlci51c2VyaWQ7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5maXJzdE5hbWUgPSB1c2VyLmZpcnN0TmFtZSA/PyAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmxhc3ROYW1lID0gdXNlci5sYXN0TmFtZSA/PyAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmVtYWlsID0gdXNlci5lbWFpbCA/PyAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIHVzZXJJZDogdXNlci51c2VyaWQsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogdXNlci5maXJzdE5hbWUgPz8gJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiB1c2VyLmxhc3ROYW1lID8/ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogdXNlci5lbWFpbCA/PyAnJyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3VXNlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckxkYXBVc2VyU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMZGFwVXNlciA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuZW5kVXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIubGRhcEludGVncmF0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLnVzZXJpZCA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIuZmlyc3ROYW1lID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5sYXN0TmFtZSA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIuZW1haWwgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIHVzZXJJZDogJycsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgZW1haWw6ICcnLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzTGRhcFVzZXJSb3dTZWxlY3RlZChyb3c6IExpc3RVc2VySW50ZXJmYWNlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMZGFwVXNlcj8udXNlcmlkID09PSByb3cudXNlcmlkO1xyXG4gICAgfVxyXG5cclxuICAgIHNldExkYXBVc2Vyc1Jlc3VsdCh1c2VyczogTGlzdFVzZXJJbnRlcmZhY2VbXSwgdG90YWw6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGRhcFVzZXJzID0gdXNlcnM7XHJcbiAgICAgICAgdGhpcy5sZGFwVXNlcnNUb3RhbCA9IHRvdGFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRTZWxlY3RlZFNpdGUoc2l0ZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTaXRlID0gc2l0ZSB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNlbGVjdGVkVGVtcGxhdGUodGVtcGxhdGU/OiBVc2VyVGVtcGxhdGVJbnRlcmZhY2UgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGU/Lm5hbWUgfHwgbnVsbDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVJZCA9IHRlbXBsYXRlPy5pZCB8fCBudWxsO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3VXNlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Q3VycmVudFNpdGUoc2l0ZTogU2l0ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRTaXRlID0gc2l0ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXNldFRlbXBsYXRlRHJpdmVuRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxpbmVPcHRpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5kZXZpY2VFbnRyaWVzID0gW107XHJcbiAgICAgICAgdGhpcy5kZXZpY2VSb3dzID0gW107XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5VGVtcGxhdGVUb2tlblBheWxvYWQocGF5bG9hZDogVXNlclRlbXBsYXRlSW50ZXJmYWNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMuZXh0cmFjdFRlbXBsYXRlRnJvbVRva2VuUGF5bG9hZChwYXlsb2FkKTtcclxuICAgICAgICB0aGlzLmVuZFVzZXIgPSBuZXcgRW5kVXNlcih0aGlzLnRlbXBsYXRlPy5lbmRVc2VyKTtcclxuICAgICAgICB0aGlzLmxpbmVzID0gdGhpcy5lbmRVc2VyICYmIEFycmF5LmlzQXJyYXkodGhpcy5lbmRVc2VyLmxpbmVzKSA/IHRoaXMuZW5kVXNlci5saW5lcyA6IFtdO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlcyA9IHRoaXMuZW5kVXNlciAmJiBBcnJheS5pc0FycmF5KHRoaXMuZW5kVXNlci5kZXZpY2VzKSA/IHRoaXMuZW5kVXNlci5kZXZpY2VzIDogW107XHJcbiAgICAgICAgdGhpcy5kZXZpY2VQcm9maWxlcyA9IHRoaXMuZW5kVXNlciAmJiBBcnJheS5pc0FycmF5KHRoaXMuZW5kVXNlci5kZXZpY2VQcm9maWxlcykgPyB0aGlzLmVuZFVzZXIuZGV2aWNlUHJvZmlsZXMgOiBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0VGVtcGxhdGVEbnNOYW1lc0ZvckxpbmVzKCk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMudXNlckRldGFpbHNGb3JtID0ge1xyXG4gICAgICAgIC8vICAgICB1c2VySWQ6IHRoaXMudmFsdWVUb1N0cmluZyh0aGlzLmVuZFVzZXI/LnVzZXJpZCA/PyAnJyksXHJcbiAgICAgICAgLy8gICAgIGZpcnN0TmFtZTogdGhpcy52YWx1ZVRvU3RyaW5nKHRoaXMuZW5kVXNlcj8uZmlyc3ROYW1lID8/ICcnKSxcclxuICAgICAgICAvLyAgICAgbGFzdE5hbWU6IHRoaXMudmFsdWVUb1N0cmluZyh0aGlzLmVuZFVzZXI/Lmxhc3ROYW1lID8/ICcnKSxcclxuICAgICAgICAvLyAgICAgZW1haWw6IHRoaXMudmFsdWVUb1N0cmluZyh0aGlzLmVuZFVzZXI/LmVtYWlsID8/ICcnKVxyXG4gICAgICAgIC8vIH07XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IG1hcHBlZExpbmVPcHRpb25zOiBMaW5lT3B0aW9uW10gPSBsaW5lc0Zyb21UZW1wbGF0ZVxyXG4gICAgICAgIC8vICAgICAubWFwKGxpbmUgPT4gKHtcclxuICAgICAgICAvLyAgICAgICAgIG51bWJlcjogdGhpcy52YWx1ZVRvU3RyaW5nKGxpbmU/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyKSxcclxuICAgICAgICAvLyAgICAgICAgIGRpZDogdGhpcy52YWx1ZVRvU3RyaW5nKGxpbmU/LmRpZFBhdHRlcm5zPy5bMF0/LnBhdHRlcm4gfHwgbGluZT8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIpLFxyXG4gICAgICAgIC8vICAgICAgICAgY3NzOiB0aGlzLnZhbHVlVG9TdHJpbmcoXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdHlwZW9mIGxpbmU/LmNhbGxpbmdTZWFyY2hTcGFjZSA9PT0gJ3N0cmluZydcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgPyBsaW5lLmNhbGxpbmdTZWFyY2hTcGFjZVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICA6IGxpbmU/LmNhbGxpbmdTZWFyY2hTcGFjZT8ubmFtZVxyXG4gICAgICAgIC8vICAgICAgICAgKSxcclxuICAgICAgICAvLyAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZhbHVlVG9TdHJpbmcobGluZT8uZGVzY3JpcHRpb24pXHJcbiAgICAgICAgLy8gICAgIH0pKVxyXG4gICAgICAgIC8vICAgICAuZmlsdGVyKGxpbmUgPT4gbGluZS5udW1iZXIudHJpbSgpLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICB0aGlzLmRldmljZXMuZm9yRWFjaChkZXZpY2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmluaXREZXZpY2VXaXRoU2l0ZUluZm8oZGV2aWNlKTtcclxuICAgICAgICAgICAgYXBwbHlEZWZhdWx0RGV2aWNlUHJlZml4SWZNaXNzaW5nKGRldmljZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5kZXZpY2VQcm9maWxlcy5mb3JFYWNoKGRldmljZSA9PiB0aGlzLmluaXREZXZpY2VXaXRoU2l0ZUluZm8oZGV2aWNlKSk7XHJcbiAgICAgICAgdGhpcy5saW5lcy5mb3JFYWNoKGxpbmUgPT4gdGhpcy5pbml0TGluZVdpdGhTaXRlSW5mbyhsaW5lKSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FwdHVyZVRlbXBsYXRlTGluZXNTbmFwc2hvdCgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFNpdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkRGV2aWNlRGVmYXVsdHNGb3JEZXZpY2VzKHRoaXMuc2VsZWN0ZWRTaXRlKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIChtYXBwZWRMaW5lT3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5saW5lT3B0aW9ucyA9IHRoaXMudW5pcXVlQnlOdW1iZXIobWFwcGVkTGluZU9wdGlvbnMpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zID0gdGhpcy5saW5lT3B0aW9ucy5tYXAobGluZSA9PiAoe1xyXG4gICAgICAgIC8vICAgICAgICAgbGluZU51bWJlcjogbGluZS5udW1iZXIsXHJcbiAgICAgICAgLy8gICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IGxpbmVzRnJvbVRlbXBsYXRlLmZpbmQoXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc291cmNlID0+IChzb3VyY2U/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyIHx8ICcnKSA9PT0gbGluZS5udW1iZXJcclxuICAgICAgICAvLyAgICAgICAgICk/LmRpcmVjdG9yeU51bWJlcj8ucm91dGVQYXJ0aXRpb25OYW1lIHx8IG51bGxcclxuICAgICAgICAvLyAgICAgfSkpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGxpbmVBc3NvY2lhdGlvbnMgPSBkZXZpY2VzRnJvbVRlbXBsYXRlLmZsYXRNYXAoZGV2aWNlID0+IGRldmljZS5saW5lQXNzb2NpYXRpb25zIHx8IFtdKTtcclxuICAgICAgICAvLyAgICAgY29uc3QgYXNzb2NpYXRlZExpbmVPcHRpb25zOiBMaW5lT3B0aW9uW10gPSBsaW5lQXNzb2NpYXRpb25zXHJcbiAgICAgICAgLy8gICAgICAgICAubWFwKGFzc29jaWF0aW9uID0+IHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCBudW1iZXIgPSBhc3NvY2lhdGlvbj8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIgfHwgJyc7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgbnVtYmVyLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBkaWQ6IG51bWJlcixcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgY3NzOiAnJyxcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfTtcclxuICAgICAgICAvLyAgICAgICAgIH0pXHJcbiAgICAgICAgLy8gICAgICAgICAuZmlsdGVyKGxpbmUgPT4gbGluZS5udW1iZXIudHJpbSgpLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICAvLyAgICAgdGhpcy5saW5lT3B0aW9ucyA9IHRoaXMudW5pcXVlQnlOdW1iZXIoYXNzb2NpYXRlZExpbmVPcHRpb25zKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5saW5lU2VsZWN0aW9ucyA9IHRoaXMubGluZU9wdGlvbnMubWFwKGxpbmUgPT4gKHtcclxuICAgICAgICAvLyAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmUubnVtYmVyLFxyXG4gICAgICAgIC8vICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lOiBsaW5lQXNzb2NpYXRpb25zLmZpbmQoXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc291cmNlID0+IChzb3VyY2U/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyIHx8ICcnKSA9PT0gbGluZS5udW1iZXJcclxuICAgICAgICAvLyAgICAgICAgICk/LmRpcmVjdG9yeU51bWJlcj8ucm91dGVQYXJ0aXRpb25OYW1lIHx8IG51bGxcclxuICAgICAgICAvLyAgICAgfSkpO1xyXG5cclxuICAgICAgICAvLyAgICAgdGhpcy50ZW1wbGF0ZUxpbmVzLmZvckVhY2goKGxpbmU6IGFueSkgPT4gdGhpcy5pbml0TGluZVdpdGhTaXRlSW5mbyhsaW5lKSk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuaW5pdFRlbXBsYXRlRG5zTmFtZXNGb3JMaW5lcyh0aGlzLnRlbXBsYXRlTGluZXMpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gY29uc3Qgcm91dGVQYXJ0aXRpb25zID0gdGhpcy5saW5lU2VsZWN0aW9uc1xyXG4gICAgICAgIC8vICAgICAubWFwKGxpbmUgPT4gbGluZS5yb3V0ZVBhcnRpdGlvbk5hbWUpXHJcbiAgICAgICAgLy8gICAgIC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+ICEhdmFsdWUgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApO1xyXG4gICAgICAgIC8vIHRoaXMucm91dGVQYXJ0aXRpb25PcHRpb25zID0gdGhpcy51bmlxdWVTdHJpbmdzKHJvdXRlUGFydGl0aW9ucyk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuZGV2aWNlRW50cmllcyA9IGRldmljZXNGcm9tVGVtcGxhdGUubWFwKGRldmljZSA9PiAoe1xyXG4gICAgICAgIC8vICAgICBkZXZpY2VUeXBlOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLmRldmljZVR5cGUpLFxyXG4gICAgICAgIC8vICAgICBwcm90b2NvbDogdGhpcy52YWx1ZVRvU3RyaW5nKGRldmljZS5wcm90b2NvbCksXHJcbiAgICAgICAgLy8gICAgIGJ1dHRvblRlbXBsYXRlOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLmJ1dHRvblRlbXBsYXRlKSxcclxuICAgICAgICAvLyAgICAgbmFtZTogdGhpcy52YWx1ZVRvU3RyaW5nKGRldmljZS5uYW1lKVxyXG4gICAgICAgIC8vIH0pKTtcclxuICAgICAgICAvLyB0aGlzLmRldmljZVJvd3MgPSB0aGlzLmRldmljZUVudHJpZXMubWFwKChfLCBpbmRleCkgPT4gaW5kZXggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgICAgIC8vIHRoaXMucmVidWlsZE92ZXJ2aWV3TGluZXMoKTtcclxuICAgICAgICAvLyB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFVzZXJDcmVhdGlvblR5cGUodHlwZTogVXNlckNyZWF0aW9uVHlwZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VyQ3JlYXRpb25UeXBlID0gdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVzZXRVc2VyRGV0YWlsc1N0ZXBTdGF0ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybVZhbHVlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAgICAgdXNlcklkOiAnJyxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgbGFzdE5hbWU6ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogJycsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTGRhcFVzZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGRhcFVzZXJzID0gW107XHJcbiAgICAgICAgdGhpcy5sZGFwVXNlcnNUb3RhbCA9IDA7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlTGluZXNTbmFwc2hvdCkge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnRlbXBsYXRlTGluZXNTbmFwc2hvdCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kZXZpY2VzLmZvckVhY2goZGV2aWNlID0+IHtcclxuICAgICAgICAgICAgZGV2aWNlLm5hbWUgPSAnJztcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRldmljZVByb2ZpbGVzLmZvckVhY2gocHJvZmlsZSA9PiB7XHJcbiAgICAgICAgICAgIHByb2ZpbGUubmFtZSA9ICcnO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5lbmRVc2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci51c2VyaWQgPSAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmZpcnN0TmFtZSA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIubGFzdE5hbWUgPSAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmVtYWlsID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5sZGFwSW50ZWdyYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIubGluZXMgPSB0aGlzLmxpbmVzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vdmVydmlld1VzZXJzID0gW107XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlUHJvZmlsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhcHR1cmVUZW1wbGF0ZUxpbmVzU25hcHNob3QoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUxpbmVzU25hcHNob3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMubGluZXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VyRGV0YWlsc0ZpZWxkKGZpZWxkOiBrZXlvZiBVc2VyRGV0YWlsc0Zvcm0sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy51c2VyRGV0YWlsc0Zvcm0sXHJcbiAgICAgICAgICAgIFtmaWVsZF06IHZhbHVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlVc2VyRGV0YWlsc0Zvcm1WYWx1ZShmb3JtVmFsdWU6IFVzZXJEZXRhaWxzRm9ybVZhbHVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm1WYWx1ZSA9IGZvcm1WYWx1ZTtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAgICAgdXNlcklkOiBmb3JtVmFsdWUudXNlcklkIHx8ICcnLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IGZvcm1WYWx1ZS5maXJzdE5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiBmb3JtVmFsdWUubGFzdE5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgIGVtYWlsOiBmb3JtVmFsdWUuZW1haWwgfHwgJycsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZm9ybVZhbHVlLmxpbmVzPy5mb3JFYWNoKChsaW5lVmFsdWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmxpbmVzW2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKCFsaW5lPy5kaXJlY3RvcnlOdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaW5lLmRpcmVjdG9yeU51bWJlci5kaXJlY3RvcnlOdW1iZXIgPSBsaW5lVmFsdWUubnVtYmVyIHx8ICcnO1xyXG4gICAgICAgICAgICBsaW5lLmRpcmVjdG9yeU51bWJlci5yb3V0ZVBhcnRpdGlvbk5hbWUgPSBsaW5lVmFsdWUucm91dGVQYXJ0aXRpb24gfHwgJyc7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGZvcm1WYWx1ZS5kZXZpY2VzPy5mb3JFYWNoKChkZXZpY2VWYWx1ZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGV2aWNlID0gdGhpcy5kZXZpY2VzW2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKCFkZXZpY2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZXZpY2UubmFtZSA9IGRldmljZVZhbHVlLm5hbWUgfHwgJyc7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGZvcm1WYWx1ZS5kZXZpY2VQcm9maWxlcz8uZm9yRWFjaCgocHJvZmlsZVZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5kZXZpY2VQcm9maWxlc1tpbmRleF07XHJcbiAgICAgICAgICAgIGlmICghcHJvZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByb2ZpbGUubmFtZSA9IHByb2ZpbGVWYWx1ZS5uYW1lIHx8ICcnO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5lbmRVc2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci51c2VyaWQgPSBmb3JtVmFsdWUudXNlcklkIHx8ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIuZmlyc3ROYW1lID0gZm9ybVZhbHVlLmZpcnN0TmFtZSB8fCAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmxhc3ROYW1lID0gZm9ybVZhbHVlLmxhc3ROYW1lIHx8ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIuZW1haWwgPSBmb3JtVmFsdWUuZW1haWwgfHwgJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlUHJvZmlsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRMaW5lU2VsZWN0aW9uKGluZGV4OiBudW1iZXIsIGxpbmVOdW1iZXI6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdLFxyXG4gICAgICAgICAgICBsaW5lTnVtYmVyXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Um91dGVQYXJ0aXRpb25TZWxlY3Rpb24oaW5kZXg6IG51bWJlciwgcm91dGVQYXJ0aXRpb25OYW1lOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSxcclxuICAgICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGV2aWNlTmFtZShpbmRleDogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkZXZpY2VUeXBlID0gdGhpcy5kZXZpY2VFbnRyaWVzW2luZGV4XS5kZXZpY2VUeXBlIHx8ICcnO1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gZGV2aWNlVHlwZS5pbmNsdWRlcygnODg1MScpXHJcbiAgICAgICAgICAgID8gbmFtZS5yZXBsYWNlKC9eU0VQXFxzKi9pLCAnJylcclxuICAgICAgICAgICAgOiBuYW1lO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0sXHJcbiAgICAgICAgICAgIG5hbWU6IG5vcm1hbGl6ZWROYW1lXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXZpY2VEaXNwbGF5TmFtZShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZGV2aWNlRW50cmllc1tpbmRleF07XHJcbiAgICAgICAgaWYgKCFlbnRyeSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW50cnkuZGV2aWNlVHlwZT8uaW5jbHVkZXMoJzg4NTEnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYFNFUCAke2VudHJ5Lm5hbWUgfHwgJyd9YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lTnVtYmVyID0gdGhpcy5saW5lU2VsZWN0aW9uc1swXT8ubGluZU51bWJlcjtcclxuICAgICAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXIgPyBgQ1NGJHtsaW5lTnVtYmVyfWAgOiAnQ1NGW0ROXSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZW50cnkubmFtZSB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2l0ZUFsbERhdGEoc2l0ZUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbkFwaVNlcnZpY2UuZ2V0U2l0ZUFsbERhdGEoc2l0ZUlkKS5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlc1swXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpdGUgPSBuZXcgU2l0ZShyZXNbMF0gYXMgU2l0ZUludGVyZmFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNpdGUgPSBzaXRlLmlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXNbMV0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNpdGVEZWZhdWx0cyA9IG5ldyBTaXRlRGVmYXVsdHMocmVzWzFdLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbFNpdGVEZWZhdWx0cyA9IG5ldyBTaXRlRGVmYXVsdHMocmVzWzFdLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgPSBbLi4udGhpcy5yb3V0ZVBhcnRpdGlvbk5hbWVzTGlzdF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlc1syXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlVHlwZXMgPSByZXNbMl0gYXMgc3RyaW5nW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAocmVzID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWREZXZpY2VEZWZhdWx0c0ZvckRldmljZXMoc2l0ZUlkKS5waXBlKG1hcCgoKSA9PiByZXMpKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9hZERldmljZURlZmF1bHRzRm9yRGV2aWNlcyhzaXRlSWQ6IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IGRldmljZVR5cGVzID0gdGhpcy5nZXRVbmlxdWVEZXZpY2VUeXBlcygpO1xyXG4gICAgICAgIGlmICghZGV2aWNlVHlwZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVxdWVzdHMgPSBkZXZpY2VUeXBlcy5tYXAoZGV2aWNlVHlwZSA9PlxyXG4gICAgICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbkFwaVNlcnZpY2UuZ2V0RGV2aWNlRGVmYXVsdHMoU3RyaW5nKHNpdGVJZCksIGRldmljZVR5cGUpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YXAoZGVmYXVsdHMgPT4gdGhpcy5hcHBseURldmljZURlZmF1bHRzVG9UeXBlKGRldmljZVR5cGUsIGRlZmF1bHRzKSksXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKHJlcXVlc3RzKS5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5kZXZpY2VEZWZhdWx0c0xvYWRlZFN1YmplY3QubmV4dCgpKSxcclxuICAgICAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VW5pcXVlRGV2aWNlVHlwZXMoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGNvbnN0IHR5cGVzID0gW1xyXG4gICAgICAgICAgICAuLi50aGlzLmRldmljZXMubWFwKGRldmljZSA9PiBkZXZpY2UuZGV2aWNlVHlwZSksXHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGV2aWNlUHJvZmlsZXMubWFwKHByb2ZpbGUgPT4gcHJvZmlsZS5kZXZpY2VUeXBlKSxcclxuICAgICAgICBdLmZpbHRlcigodHlwZSk6IHR5cGUgaXMgc3RyaW5nID0+ICEhdHlwZSAmJiB0eXBlLnRyaW0oKS5sZW5ndGggPiAwKTtcclxuICAgICAgICByZXR1cm4gWy4uLm5ldyBTZXQodHlwZXMpXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5RGV2aWNlRGVmYXVsdHNUb1R5cGUoZGV2aWNlVHlwZTogc3RyaW5nLCBkZWZhdWx0czogRGV2aWNlRGVmYXVsdHNJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBuYW1lVmFsaWRhdGlvblJlZ2V4ID0gcGFyc2VEZXZpY2VOYW1lUmVnZXhCb2R5KGRlZmF1bHRzLmRldmljZU5hbWVSZWdleCk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IFsuLi50aGlzLmRldmljZXMsIC4uLnRoaXMuZGV2aWNlUHJvZmlsZXNdLmZpbHRlcihcclxuICAgICAgICAgICAgZGV2aWNlID0+IGRldmljZS5kZXZpY2VUeXBlID09PSBkZXZpY2VUeXBlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKGRldmljZSA9PiB7XHJcbiAgICAgICAgICAgIGRldmljZS5kZXZpY2VEZWZhdWx0cyA9IGRlZmF1bHRzO1xyXG4gICAgICAgICAgICBkZXZpY2UubmFtZVZhbGlkYXRpb25SZWdleCA9IG5hbWVWYWxpZGF0aW9uUmVnZXg7XHJcbiAgICAgICAgICAgIGRldmljZS5uYW1lVmFsaWRhdGlvbkNhcHRpb24gPSBkZWZhdWx0cy5kZXZpY2VOYW1lRXhwbGFpbmVkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERldmljZU5hbWVQcmVmaXgoZGV2aWNlSW5kZXg6IG51bWJlciwgaXNQcm9maWxlID0gZmFsc2UpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBkZXZpY2UgPSBpc1Byb2ZpbGUgPyB0aGlzLmRldmljZVByb2ZpbGVzW2RldmljZUluZGV4XSA6IHRoaXMuZGV2aWNlc1tkZXZpY2VJbmRleF07XHJcbiAgICAgICAgY29uc3QgcHJlZml4ID0gZGV2aWNlPy5wcmVmaXg/LnRyaW0oKTtcclxuICAgICAgICByZXR1cm4gcHJlZml4IHx8IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGV2aWNlTmFtZVZhbGlkYXRpb25DYXB0aW9uKGRldmljZUluZGV4OiBudW1iZXIsIGlzUHJvZmlsZSA9IGZhbHNlKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBkZXZpY2UgPSBpc1Byb2ZpbGUgPyB0aGlzLmRldmljZVByb2ZpbGVzW2RldmljZUluZGV4XSA6IHRoaXMuZGV2aWNlc1tkZXZpY2VJbmRleF07XHJcbiAgICAgICAgcmV0dXJuIGRldmljZT8ubmFtZVZhbGlkYXRpb25DYXB0aW9uIHx8IGRldmljZT8uZGV2aWNlRGVmYXVsdHM/LmRldmljZU5hbWVFeHBsYWluZWQgfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGV2aWNlTmFtZVZhbGlkYXRpb25PcHRpb25zKGRldmljZUluZGV4OiBudW1iZXIsIGlzUHJvZmlsZSA9IGZhbHNlKToge1xyXG4gICAgICAgIHJlZ2V4OiBzdHJpbmc7XHJcbiAgICAgICAgY2FwdGlvbjogc3RyaW5nO1xyXG4gICAgfSB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGRldmljZSA9IGlzUHJvZmlsZSA/IHRoaXMuZGV2aWNlUHJvZmlsZXNbZGV2aWNlSW5kZXhdIDogdGhpcy5kZXZpY2VzW2RldmljZUluZGV4XTtcclxuICAgICAgICBjb25zdCByZWdleCA9XHJcbiAgICAgICAgICAgIGRldmljZT8ubmFtZVZhbGlkYXRpb25SZWdleD8udHJpbSgpIHx8XHJcbiAgICAgICAgICAgIHBhcnNlRGV2aWNlTmFtZVJlZ2V4Qm9keShkZXZpY2U/LmRldmljZURlZmF1bHRzPy5kZXZpY2VOYW1lUmVnZXgpO1xyXG4gICAgICAgIGlmICghcmVnZXgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlZ2V4LFxyXG4gICAgICAgICAgICBjYXB0aW9uOiB0aGlzLmdldERldmljZU5hbWVWYWxpZGF0aW9uQ2FwdGlvbihkZXZpY2VJbmRleCwgaXNQcm9maWxlKSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROdW1iZXJSYW5nZShzaXRlSWQ6IHN0cmluZywgcm91dGVQYXJ0aXRpb246IHN0cmluZyk6IE9ic2VydmFibGU8QXZhaWxhYmxlUmFuZ2VJbnRlcmZhY2U+IHtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9EbiA9IHt9O1xyXG4gICAgICAgIGNvbnN0IHBhZ2VTaXplID0gOTk5OTtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7ZG50eXBlOiBEblJhbmdlVHlwZS5leHRlbnNpb24sIHJvdXRlcGFydGl0aW9uOiByb3V0ZVBhcnRpdGlvbiwgc2l6ZTogcGFnZVNpemUsIHBhZ2U6IDB9O1xyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTnVtYmVycyA9IFtdO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbkFwaVNlcnZpY2UuZ2V0QXZhaWxhYmxlRG5JblJhbmdlcyhzaXRlSWQsIHBhcmFtcylcclxuICAgICAgICAucGlwZShtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJlcy5hdmFpbGFibGVOdW1iZXJMaXN0LmZvckVhY2goKGF2YWlsYWJsZU51bWJlcjogQXZhaWxhYmxlUGhvbmVOdW1iZXJSYW5nZUludGVyZmFjZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBdmFpbGFibGVEaWRNYXBwZWRUb0RuKGF2YWlsYWJsZU51bWJlcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF2YWlsYWJsZU51bWJlcnMgPSBbLi4udGhpcy5hdmFpbGFibGVOdW1iZXJzLCAuLi50aGlzLmdldFVud3JhcE51bWJlclJhbmdlKGF2YWlsYWJsZU51bWJlcildO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICAgLy8gLnBpcGUodGhpcy5oYW5kbGVFcnJvcih0cnVlLCBmYWxzZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVidWlsZE92ZXJ2aWV3VXNlcnMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdXNlclRlbXBsYXRlID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlTmFtZSB8fCAnJztcclxuICAgICAgICBjb25zdCBoYXNVc2VyRGF0YSA9IE9iamVjdC52YWx1ZXModGhpcy51c2VyRGV0YWlsc0Zvcm0pLnNvbWUodmFsdWUgPT4gdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApO1xyXG4gICAgICAgIHRoaXMub3ZlcnZpZXdVc2VycyA9IGhhc1VzZXJEYXRhXHJcbiAgICAgICAgICAgID8gW3tcclxuICAgICAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VyRGV0YWlsc0Zvcm0udXNlcklkLFxyXG4gICAgICAgICAgICAgICAgZmlyc3ROYW1lOiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5maXJzdE5hbWUsXHJcbiAgICAgICAgICAgICAgICBsYXN0TmFtZTogdGhpcy51c2VyRGV0YWlsc0Zvcm0ubGFzdE5hbWUsXHJcbiAgICAgICAgICAgICAgICBlbWFpbDogdGhpcy51c2VyRGV0YWlsc0Zvcm0uZW1haWwsXHJcbiAgICAgICAgICAgICAgICB1c2VyVGVtcGxhdGVcclxuICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgOiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYnVpbGRPdmVydmlld0xpbmVzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGZvcm1MaW5lcyA9IHRoaXMudXNlckRldGFpbHNGb3JtVmFsdWU/LmxpbmVzO1xyXG4gICAgICAgIGlmIChmb3JtTGluZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLm92ZXJ2aWV3TGluZXMgPSBmb3JtTGluZXNcclxuICAgICAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiAhIWxpbmU/Lm51bWJlcj8udHJpbSgpKVxyXG4gICAgICAgICAgICAgICAgLm1hcCgobGluZVZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlTGluZSA9IHRoaXMubGluZXNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzcyA9IHRoaXMudmFsdWVUb1N0cmluZyh0ZW1wbGF0ZUxpbmU/LmNhbGxpbmdTZWFyY2hTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiBsaW5lVmFsdWUubnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaWQ6IGxpbmVWYWx1ZS5saW5lTnVtYmVyIHx8IGxpbmVWYWx1ZS5udW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZTogbGluZVZhbHVlLnJvdXRlUGFydGl0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZhbHVlVG9TdHJpbmcodGVtcGxhdGVMaW5lPy5kZXNjcmlwdGlvbiksXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm92ZXJ2aWV3TGluZXMgPSB0aGlzLmxpbmVTZWxlY3Rpb25zXHJcbiAgICAgICAgICAgIC5tYXAoc2VsZWN0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uPy5saW5lTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZExpbmUgPSB0aGlzLmxpbmVPcHRpb25zLmZpbmQobGluZSA9PiBsaW5lLm51bWJlciA9PT0gc2VsZWN0aW9uLmxpbmVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZExpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiBzZWxlY3RlZExpbmUubnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpZDogc2VsZWN0ZWRMaW5lLmRpZCxcclxuICAgICAgICAgICAgICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IHNlbGVjdGlvbi5yb3V0ZVBhcnRpdGlvbk5hbWUgfHwgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnNbMF0gfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgY3NzOiBzZWxlY3RlZExpbmUuY3NzLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzZWxlY3RlZExpbmUuZGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpOiBsaW5lIGlzIE92ZXJ2aWV3TGluZVJvdyA9PiAhIWxpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZExpbmVOdW1iZXJzID0gdGhpcy5vdmVydmlld0xpbmVzLm1hcChsaW5lID0+IGxpbmUubnVtYmVyKS5qb2luKCcsICcpO1xyXG4gICAgICAgIGNvbnN0IGZvcm1EZXZpY2VzID0gdGhpcy51c2VyRGV0YWlsc0Zvcm1WYWx1ZT8uZGV2aWNlcztcclxuICAgICAgICBpZiAoZm9ybURldmljZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLm92ZXJ2aWV3RGV2aWNlcyA9IGZvcm1EZXZpY2VzXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGRldmljZSA9PiAhIWRldmljZS5kZXZpY2VUeXBlPy50cmltKCkgfHwgISFkZXZpY2UubmFtZT8udHJpbSgpKVxyXG4gICAgICAgICAgICAgICAgLm1hcChkZXZpY2UgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBkZXZpY2UubmFtZSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiBkZXZpY2UuZGV2aWNlVHlwZSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICBsaW5lczogc2VsZWN0ZWRMaW5lTnVtYmVycyxcclxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7ZGV2aWNlLnByb3RvY29sIHx8ICcnfSAvICR7ZGV2aWNlLmJ1dHRvblRlbXBsYXRlIHx8ICcnfWAudHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm92ZXJ2aWV3RGV2aWNlcyA9IHRoaXMuZGV2aWNlRW50cmllc1xyXG4gICAgICAgICAgICAubWFwKChkZXZpY2UsIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgZGV2aWNlLFxyXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuZ2V0RGV2aWNlRGlzcGxheU5hbWUoaW5kZXgpXHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAuZmlsdGVyKCh7IGRldmljZSwgZGlzcGxheU5hbWUgfSkgPT4gZGlzcGxheU5hbWUudHJpbSgpLmxlbmd0aCA+IDAgfHwgZGV2aWNlLmRldmljZVR5cGUudHJpbSgpLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIC5tYXAoKHsgZGV2aWNlLCBkaXNwbGF5TmFtZSB9KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbmFtZTogZGlzcGxheU5hbWUsXHJcbiAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiBkZXZpY2UuZGV2aWNlVHlwZSxcclxuICAgICAgICAgICAgICAgIGxpbmVzOiBzZWxlY3RlZExpbmVOdW1iZXJzLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke2RldmljZS5wcm90b2NvbH0gLyAke2RldmljZS5idXR0b25UZW1wbGF0ZX1gXHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYnVpbGRPdmVydmlld0RldmljZVByb2ZpbGVzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTGluZU51bWJlcnMgPSB0aGlzLm92ZXJ2aWV3TGluZXMubWFwKGxpbmUgPT4gbGluZS5udW1iZXIpLmpvaW4oJywgJyk7XHJcbiAgICAgICAgY29uc3QgZm9ybVByb2ZpbGVzID0gdGhpcy51c2VyRGV0YWlsc0Zvcm1WYWx1ZT8uZGV2aWNlUHJvZmlsZXM7XHJcbiAgICAgICAgaWYgKCFmb3JtUHJvZmlsZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLm92ZXJ2aWV3RGV2aWNlUHJvZmlsZXMgPSBbXTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vdmVydmlld0RldmljZVByb2ZpbGVzID0gZm9ybVByb2ZpbGVzXHJcbiAgICAgICAgICAgIC5maWx0ZXIocHJvZmlsZSA9PiAhIXByb2ZpbGUuZGV2aWNlVHlwZT8udHJpbSgpIHx8ICEhcHJvZmlsZS5uYW1lPy50cmltKCkpXHJcbiAgICAgICAgICAgIC5tYXAocHJvZmlsZSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbmFtZTogcHJvZmlsZS5uYW1lIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogcHJvZmlsZS5kZXZpY2VUeXBlIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgbGluZXM6IHNlbGVjdGVkTGluZU51bWJlcnMsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7cHJvZmlsZS5wcm90b2NvbCB8fCAnJ30gLyAke3Byb2ZpbGUuYnV0dG9uVGVtcGxhdGUgfHwgJyd9YC50cmltKCksXHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4dHJhY3RUZW1wbGF0ZUZyb21Ub2tlblBheWxvYWQocGF5bG9hZDogYW55KTogYW55IHtcclxuICAgICAgICBpZiAoIXBheWxvYWQgfHwgdHlwZW9mIHBheWxvYWQgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZFswXSB8fCBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmaXJzdEtleSA9IE9iamVjdC5rZXlzKHBheWxvYWQpWzBdO1xyXG4gICAgICAgIHJldHVybiBmaXJzdEtleSA/IHBheWxvYWRbZmlyc3RLZXldIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVuaXF1ZUJ5TnVtYmVyKGxpbmVzOiBMaW5lT3B0aW9uW10pOiBMaW5lT3B0aW9uW10ge1xyXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgICAgICByZXR1cm4gbGluZXMuZmlsdGVyKGxpbmUgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMobGluZS5udW1iZXIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2Vlbi5hZGQobGluZS5udW1iZXIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVuaXF1ZVN0cmluZ3MoaXRlbXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoaXRlbXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHZhbHVlVG9TdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFVud3JhcE51bWJlclJhbmdlKGF2YWlsYWJsZU51bWJlcjogYW55KTogc3RyaW5nW10ge1xyXG4gICAgICAgIGxldCB1bndyYXBOdW1iZXJSYW5nZSA9IHRoaXMudW53cmFwTnVtYmVyUmFuZ2UoYXZhaWxhYmxlTnVtYmVyLnBob25lTnVtYmVyUmFuZ2UuZnJvbSwgYXZhaWxhYmxlTnVtYmVyLnBob25lTnVtYmVyUmFuZ2UudG8pXHJcbiAgICAgICAgICAgIC5tYXAoKHVud3JhcHBlZE51bWJlcjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRuID0gYXZhaWxhYmxlTnVtYmVyLnBob25lTnVtYmVyUmFuZ2UucHJlZml4ICsgdW53cmFwcGVkTnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgc3RyID0gZG47XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9Ebltkbl0gJiYgdGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG5bZG5dLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9Ebltkbl1bMF1bJ21hcHBlZERpZHMnXSAmJiB0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9Ebltkbl1bMF1bJ21hcHBlZERpZHMnXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzdHIgKz0gJyAgICAgICAgRElEOiAgJyArICh0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9Ebltkbl1bMF1bJ21hcHBlZERpZHMnXS5sZW5ndGggPiAxID8gJ211bHRpcGxlJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG5bZG5dWzBdWydtYXBwZWREaWRzJ11bMF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXZhaWxhYmxlRGlkUGF0dGVybnNNYXBwZWRUb0RuW2RuXVswXVsndm0nXSkge1xyXG4gICAgICAgICAgICAgICAgc3RyICs9ICcgICAgICAgIEluIFVzZSAtIFZNJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB1bndyYXBOdW1iZXJSYW5nZSA9IHVud3JhcE51bWJlclJhbmdlLmZpbHRlcigodW53cmFwcGVkTnVtYmVyOiBzdHJpbmcpID0+ICFhdmFpbGFibGVOdW1iZXIudXNlZE51bWJlcnMuaW5jbHVkZXModW53cmFwcGVkTnVtYmVyKSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHVud3JhcE51bWJlclJhbmdlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdW53cmFwTnVtYmVyUmFuZ2Uoc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgY29uc3QgcmVnRXhwID0gLyheMCspLztcclxuICAgICAgICBsZXQgbGVhZGluZ1plcm9zID0gJyc7XHJcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHN0YXJ0Lm1hdGNoKHJlZ0V4cCk7XHJcbiAgICAgICAgaWYgKG1hdGNoZXMpIHtcclxuICAgICAgICAgICAgbGVhZGluZ1plcm9zID0gbWF0Y2hlc1sxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhcnROdW1lcmljID0gbmV3IEJpZyhzdGFydCk7XHJcbiAgICAgICAgY29uc3QgZW5kTnVtZXJpYyA9IG5ldyBCaWcoZW5kKTtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOiBOdW1iZXIoZW5kTnVtZXJpYy5taW51cyhzdGFydE51bWVyaWMpLnBsdXMobmV3IEJpZygxKSkudG9GaXhlZCgwKSl9LCAodiwgazogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bWJlciA9IFN0cmluZyhzdGFydE51bWVyaWMucGx1cyhuZXcgQmlnKGsudG9TdHJpbmcoKSkpLnRvRml4ZWQoMCkpO1xyXG4gICAgICAgICAgICBpZiAoKGxlYWRpbmdaZXJvcyArIG51bWJlcikubGVuZ3RoID4gc3RhcnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxlYWRpbmdaZXJvcyA9IGxlYWRpbmdaZXJvcy5zdWJzdHIoMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGxlYWRpbmdaZXJvcyArIG51bWJlcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0QXZhaWxhYmxlRGlkTWFwcGVkVG9EbihhdmFpbGFibGVOdW1iZXI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChhdmFpbGFibGVOdW1iZXIudW5Vc2VkTnVtYmVyc1dpdGhEaWRzICYmIGF2YWlsYWJsZU51bWJlci51blVzZWROdW1iZXJzV2l0aERpZHMubGVuZ3RoKSB7XHJcblxyXG4gICAgICAgICAgICBhdmFpbGFibGVOdW1iZXIudW5Vc2VkTnVtYmVyc1dpdGhEaWRzLmZvckVhY2goKG51bWJlcldpdGhEaWRzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZG4gPSBudW1iZXJXaXRoRGlkc1sndW5Vc2VkTnVtYmVyJ107XHJcbiAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlRGlkUGF0dGVybnNNYXBwZWRUb0RuW2RuXSA9IFt7fV07XHJcbiAgICAgICAgICAgIGlmIChudW1iZXJXaXRoRGlkc1sndHJhbnNsYXRpb25QYXR0ZXJuTGlzdCddICYmIG51bWJlcldpdGhEaWRzWyd0cmFuc2xhdGlvblBhdHRlcm5MaXN0J10ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG5bZG5dID0gbnVtYmVyV2l0aERpZHNbJ3RyYW5zbGF0aW9uUGF0dGVybkxpc3QnXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlRGlkUGF0dGVybnNNYXBwZWRUb0RuW2RuXVswXVsnbWFwcGVkRGlkcyddID0gW3t9XTtcclxuICAgICAgICAgICAgICAgIGlmIChudW1iZXJXaXRoRGlkc1snbWFwcGVkRGlkcyddICYmIG51bWJlcldpdGhEaWRzWydtYXBwZWREaWRzJ10ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG5bZG5dWzBdWydtYXBwZWREaWRzJ10gPSBudW1iZXJXaXRoRGlkc1snbWFwcGVkRGlkcyddO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlRGlkUGF0dGVybnNNYXBwZWRUb0RuW2RuXVswXVsndm0nXSA9IG51bWJlcldpdGhEaWRzWyd2bSddO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogcmVwbGFjZSBwbGFjZWhvbGRlcnMgd2l0aCByZWFsIEFQSSBpbnRlZ3JhdGlvbi5cclxuICAgIGxvYWREYXRhRnJvbUFwaSgpOiB2b2lkIHtcclxuICAgICAgICAvLyB0aGlzLmFwaS5nZXRXaXphcmRCb290c3RyYXBEYXRhKCkuc3Vic2NyaWJlKC4uLilcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRMaW5lV2l0aFNpdGVJbmZvKGxpbmU6IExpbmVJbnRlcmZhY2UpIHtcclxuICAgICAgICBsaW5lLmRpcmVjdG9yeU51bWJlci5yb3V0ZVBhcnRpdGlvbk5hbWUgPSB0aGlzLnNpdGVEZWZhdWx0cz8ucm91dGVQYXJ0aXRpb24gfHwgJyc7XHJcbiAgICBcclxuICAgICAgICBsZXQgY2FsbGluZ1NlYXJjaFNwYWNlVmFsID0gdGhpcy5zaXRlRGVmYXVsdHM/LmxpbmVDc3MgfHwgJyc7XHJcbiAgICAgICAgbGluZS5jYWxsaW5nU2VhcmNoU3BhY2UgPSBjYWxsaW5nU2VhcmNoU3BhY2VWYWw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBpbml0VGVtcGxhdGVEbnNOYW1lc0ZvckxpbmVzKHVzZXJMaW5lczogVGVtcGxhdGVMaW5lTGlrZVtdKTogdm9pZCB7XHJcbiAgICAvLyAgICAgY29uc3Qgcm91dGVQYXJ0aXRpb24gPSB0aGlzLnNpdGVEZWZhdWx0cz8ucm91dGVQYXJ0aXRpb24gfHwgJyc7XHJcbiAgICAvLyAgICAgaWYgKHVzZXJMaW5lcyAmJiB1c2VyTGluZXMubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICB1c2VyTGluZXMuZm9yRWFjaCgobGluZSwgaW5kZXgpID0+IHtcclxuICAgIC8vICAgICAgICAgICAgIGxpbmUgJiYgbGluZS5kaXJlY3RvcnlOdW1iZXIgJiYgKGxpbmUuZGlyZWN0b3J5TnVtYmVyLnRlbXBsYXRlRGlyZWN0b3J5TnVtYmVyID0gbGluZS5kaXJlY3RvcnlOdW1iZXIuZGlyZWN0b3J5TnVtYmVyKTtcclxuICAgIC8vICAgICAgICAgICAgIGxpbmUgJiYgbGluZS5kaXJlY3RvcnlOdW1iZXIgJiYgKGxpbmUuZGlyZWN0b3J5TnVtYmVyLmRpcmVjdG9yeU51bWJlciA9ICcnKTtcclxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBsaW5lO1xyXG4gICAgLy8gICAgICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgICAgIC8vIGNvbnN0IHJvdXRlUGFydGl0aW9uID0gdGhpcy5zaXRlRGVmYXVsdHM/LnJvdXRlUGFydGl0aW9uIHx8ICcnO1xyXG4gICAgLy8gICAgICAgICAvLyBpZiAobGluZS5saW5lQXNzb2NpYXRpb25zICYmIGxpbmUubGluZUFzc29jaWF0aW9ucy5sZW5ndGgpIHtcclxuICAgIC8vICAgICAgICAgLy8gdGhpcy5zZXRMaW5lQXNzb2NpYXRpb25zRm9yRGV2aWNlKGxpbmUsIHJvdXRlUGFydGl0aW9uKTtcclxuICAgIC8vICAgICAgICAgLy8gfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICB0aGlzLnRlbXBsYXRlRGV2aWNlcy5mb3JFYWNoKGRldmljZSA9PiB7XHJcbiAgICAvLyAgICAgICAgIGlmIChkZXZpY2UubGluZUFzc29jaWF0aW9ucyAmJiBkZXZpY2UubGluZUFzc29jaWF0aW9ucy5sZW5ndGgpIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuc2V0TGluZUFzc29jaWF0aW9uc0ZvckRldmljZShkZXZpY2UsIHJvdXRlUGFydGl0aW9uKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG4gICAgXHJcbiAgICBcclxuICAgIHByaXZhdGUgc2V0TGluZUFzc29jaWF0aW9uc0ZvckRldmljZShkZXZpY2U6IFRlbXBsYXRlRGV2aWNlTGlrZSwgcm91dGVQYXJ0aXRpb246IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGxpbmVBc3NvY2lhdGlvbnMgPSBkZXZpY2UubGluZUFzc29jaWF0aW9ucyB8fCBbXTtcclxuICAgICAgICBpZihsaW5lQXNzb2NpYXRpb25zICYmIGxpbmVBc3NvY2lhdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxpbmVBc3NvY2lhdGlvbnMuZm9yRWFjaChsaW5lQXNzb2NpYXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgbGluZUFzc29jaWF0aW9uICYmIGxpbmVBc3NvY2lhdGlvbi5kaXJlY3RvcnlOdW1iZXIgJiYgKGxpbmVBc3NvY2lhdGlvbi5kaXJlY3RvcnlOdW1iZXIudGVtcGxhdGVEaXJlY3RvcnlOdW1iZXIgPSBsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyLmRpcmVjdG9yeU51bWJlciB8fCAnJyk7XHJcbiAgICAgICAgICAgICAgICBsaW5lQXNzb2NpYXRpb24gJiYgbGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlciAmJiAobGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlci5yb3V0ZVBhcnRpdGlvbk5hbWUgPSByb3V0ZVBhcnRpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBsaW5lQXNzb2NpYXRpb24gJiYgbGluZUFzc29jaWF0aW9uLmxvZ01pc3NlZENhbGwgJiYgKGxpbmVBc3NvY2lhdGlvbi5sb2dNaXNzZWRDYWxsID0gbGluZUFzc29jaWF0aW9uLmxvZ01pc3NlZENhbGwgfHwgJ2ZhbHNlJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXREZXZpY2VXaXRoU2l0ZUluZm8oZGV2aWNlOiBEZXZpY2VJbnRlcmZhY2UpIHtcclxuICAgICAgICBkZXZpY2UubmV3TmFtZSA9IGRldmljZS5uYW1lO1xyXG4gICAgICAgIGRldmljZS5uYW1lID0gJyc7XHJcbiAgICAgICAgaWYgKCFkZXZpY2VbJ2VuYWJsZWRFeHRlbnNpb25Nb2JpbGl0eSddKSB7XHJcbiAgICAgICAgZGV2aWNlLmVuYWJsZWRFeHRlbnNpb25Nb2JpbGl0eSA9IHRoaXMuc2l0ZURlZmF1bHRzPy5lbmFibGVFbSA/PyBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRldmljZVsnZW5hYmxlZEV4dGVuc2lvbk1vYmlsaXR5J10udG9TdHJpbmcoKSA9PT0gJ1llcycpIHtcclxuICAgICAgICBkZXZpY2UuZW5hYmxlZEV4dGVuc2lvbk1vYmlsaXR5ID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRldmljZVsnZW5hYmxlZEV4dGVuc2lvbk1vYmlsaXR5J10udG9TdHJpbmcoKSA9PT0gJ05vJykge1xyXG4gICAgICAgIGRldmljZS5lbmFibGVkRXh0ZW5zaW9uTW9iaWxpdHkgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkZXZpY2UubG9jYXRpb24pIHtcclxuICAgICAgICAgICAgY29uc3QgcmVwbGFjZWRWYWx1ZSA9IHRoaXMucmVwbGFjZUR5bmFtaWNWYWx1ZVNpdGVJbmZvKGRldmljZS5sb2NhdGlvbiwgdGhpcy5jdXJyZW50U2l0ZT8uc2hvcnROYW1lID8/ICcnKSA/PyBudWxsO1xyXG4gICAgICAgICAgICBkZXZpY2UubG9jYXRpb24gPSByZXBsYWNlZFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGV2aWNlLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VkVmFsdWUgPSB0aGlzLnJlcGxhY2VEeW5hbWljVmFsdWVTaXRlSW5mbyhkZXZpY2UuZGV2aWNlUG9vbE5hbWUsIHRoaXMuY3VycmVudFNpdGU/LnNob3J0TmFtZSA/PyAnJykgPz8gbnVsbDtcclxuICAgICAgICAgICAgZGV2aWNlLmRldmljZVBvb2xOYW1lID0gcmVwbGFjZWRWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRldmljZS5sb2NhdGlvbikge1xyXG4gICAgICAgICAgICBjb25zdCByZXBsYWNlZFZhbHVlID0gdGhpcy5yZXBsYWNlRHluYW1pY1ZhbHVlU2l0ZUluZm8oZGV2aWNlLmNhbGxpbmdTZWFyY2hTcGFjZU5hbWUsIHRoaXMuY3VycmVudFNpdGU/LnNob3J0TmFtZSA/PyAnJykgPz8gbnVsbDtcclxuICAgICAgICAgICAgZGV2aWNlLmNhbGxpbmdTZWFyY2hTcGFjZU5hbWUgPSByZXBsYWNlZFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGV2aWNlLmV4dHJhT3B0aW9ucykge1xyXG4gICAgICAgICAgICBjb25zdCByZXBsYWNlZFZhbHVlID0gdGhpcy5yZXBsYWNlRHluYW1pY1ZhbHVlU2l0ZUluZm8oZGV2aWNlLmV4dHJhT3B0aW9ucy5hYXJDc3MsIHRoaXMuY3VycmVudFNpdGU/LnNob3J0TmFtZSA/PyAnJykgPz8gbnVsbDtcclxuICAgICAgICAgICAgZGV2aWNlLmV4dHJhT3B0aW9ucy5hYXJDc3MgPSByZXBsYWNlZFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWRldmljZS5kZXNjcmlwdGlvbiAmJiB0aGlzLnNpdGVEZWZhdWx0cykge1xyXG4gICAgICAgICAgICBkZXZpY2UuZGVzY3JpcHRpb24gPSB0aGlzLnNpdGVEZWZhdWx0cy5kZXZpY2VEZXNjcmlwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXBsYWNlRHluYW1pY1ZhbHVlU2l0ZUluZm8oZmllbGRWYWx1ZTogYW55LCBzaXRlU2hvcnROYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICBpZiAoZmllbGRWYWx1ZSkge1xyXG4gICAgICAgIGZpZWxkVmFsdWUgPSB0aGlzLnJlcGxhY2VEeW5hbWljVmFsdWVGb3JtYXQoZmllbGRWYWx1ZSk7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zVG9SZXBsYWNlcyA9IHsgJ1NpdGVTaG9ydE5hbWUnOiBzaXRlU2hvcnROYW1lIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubXV0bGlTdHJpbmdSZXBsYWNlKHBhcmFtc1RvUmVwbGFjZXMsIGZpZWxkVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlcGxhY2VEeW5hbWljVmFsdWVGb3JtYXQoc3RyOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXFtGTlxcXS9pZywgJ1tGTl0nKS5yZXBsYWNlKC9cXFtMTlxcXS9pZywgJ1tMTl0nKS5yZXBsYWNlKC9cXFtJRFxcXS9pZywgJ1tVc2VySWRdJylcclxuICAgICAgICAucmVwbGFjZSgvXFxbVXNlcklkXFxdL2lnLCAnW1VzZXJJZF0nKS5yZXBsYWNlKC88TWF0Y2ggVXNlciBJRD4vaWcsICdbVXNlcklkXScpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcW0VtYWlsXFxdL2lnLCAnW0VtYWlsXScpLnJlcGxhY2UoL1xcW0ROXFwoL2lnLCAnW0ROKCcpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcW1NpdGVTaG9ydE5hbWVcXF0vaWcsICdbU2l0ZVNob3J0TmFtZV0nKS5yZXBsYWNlKC9cXCRcXChTaXRlU2hvcnROYW1lXFwpL2lnLCAnW1NpdGVTaG9ydE5hbWVdJylcclxuICAgICAgICAucmVwbGFjZSgvXFwkXFx7U2l0ZVNob3J0TmFtZVxcfS9pZywgJ1tTaXRlU2hvcnROYW1lXScpLnJlcGxhY2UoL3tTaXRlU2hvcnROYW1lfS9pZywgJ1tTaXRlU2hvcnROYW1lXScpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcW0ZOXFwoL2lnLCAnW0ZOKCcpLnJlcGxhY2UoL1xcW0xOXFwoL2lnLCAnW0xOKCcpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcW0lEXFwoL2lnLCAnW0lEKCcpO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG11dGxpU3RyaW5nUmVwbGFjZShvYmplY3Q6IGFueSwgaW5wdXQ6IHN0cmluZywgZGlyZWN0b3J5TnVtYmVyPzogc3RyaW5nLCB1c2VyPzogYW55KTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgdmFsID0gaW5wdXQ7XHJcblxyXG4gICAgICAgIGlmICh2YWwuaW5jbHVkZXMoJ1tETl0nKSAmJiBkaXJlY3RvcnlOdW1iZXIgJiYgIWRpcmVjdG9yeU51bWJlci5pbmNsdWRlcygnTGluZScpKSB7XHJcbiAgICAgICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKCdbRE5dJywgZGlyZWN0b3J5TnVtYmVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpbmRleE9mRE4gPSB2YWwuaW5kZXhPZignW0ROKCcpO1xyXG4gICAgICAgIGlmIChpbmRleE9mRE4gIT09IC0xICYmIGRpcmVjdG9yeU51bWJlcikge1xyXG4gICAgICAgICAgICB2YXIgZGlnaXQgPSB2YWwuc3Vic3RyaW5nKGluZGV4T2ZETiArIDQsIHZhbC5pbmRleE9mKCcpJywgaW5kZXhPZkROICsgNCkpO1xyXG4gICAgICAgICAgICB2YXIgZGlnaXRDb3VudCA9IE51bWJlcihkaWdpdCkgfHwgMDtcclxuICAgICAgICAgICAgdmFyIGRuRGlnaXQgPSAoZGlnaXRDb3VudCA+IHZhbC5sZW5ndGgpID8gZGlyZWN0b3J5TnVtYmVyIDogZGlyZWN0b3J5TnVtYmVyLnN1YnN0cmluZyhkaXJlY3RvcnlOdW1iZXIubGVuZ3RoIC0gZGlnaXRDb3VudCwgZGlyZWN0b3J5TnVtYmVyLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKCdbRE4oJyArIGRpZ2l0ICsgJyldJywgZG5EaWdpdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaW5kZXhPZkZOID0gdmFsLmluZGV4T2YoJ1tGTignKTtcclxuICAgICAgICBpZiAoaW5kZXhPZkZOICE9PSAtMSAmJiB1c2VyICYmIHVzZXIuZmlyc3ROYW1lKSB7XHJcbiAgICAgICAgICAgIHZhciBkaWdpdCA9IHZhbC5zdWJzdHJpbmcoaW5kZXhPZkZOICsgNCwgdmFsLmluZGV4T2YoJyknLCBpbmRleE9mRk4gKyA0KSk7XHJcbiAgICAgICAgICAgIHZhciBmbkRpZ2l0ID0gdXNlci5maXJzdE5hbWUuc3Vic3RyaW5nKDAsIGRpZ2l0KTtcclxuICAgICAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoJ1tGTignICsgZGlnaXQgKyAnKV0nLCBmbkRpZ2l0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGluZGV4T2ZMTiA9IHZhbC5pbmRleE9mKCdbTE4oJyk7XHJcbiAgICAgICAgaWYgKGluZGV4T2ZMTiAhPT0gLTEgJiYgdXNlciAmJiB1c2VyLmxhc3ROYW1lKSB7XHJcbiAgICAgICAgICAgIHZhciBkaWdpdCA9IHZhbC5zdWJzdHJpbmcoaW5kZXhPZkxOICsgNCwgdmFsLmluZGV4T2YoJyknLCBpbmRleE9mTE4gKyA0KSk7XHJcbiAgICAgICAgICAgIHZhciBsbkRpZ2l0ID0gdXNlci5sYXN0TmFtZS5zdWJzdHJpbmcoMCwgZGlnaXQpO1xyXG4gICAgICAgICAgICB2YWwgPSB2YWwucmVwbGFjZSgnW0xOKCcgKyBkaWdpdCArICcpXScsIGxuRGlnaXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaW5kZXhPZklEID0gdmFsLmluZGV4T2YoJ1tJRCgnKTtcclxuICAgICAgICBpZiAoaW5kZXhPZklEICE9PSAtMSAmJiB1c2VyICYmIHVzZXIudXNlcmlkKSB7XHJcbiAgICAgICAgICAgIHZhciBkaWdpdCA9IHZhbC5zdWJzdHJpbmcoaW5kZXhPZklEICsgNCwgdmFsLmluZGV4T2YoJyknLCBpbmRleE9mSUQgKyA0KSk7XHJcbiAgICAgICAgICAgIHZhciBpZERpZ2l0ID0gdXNlci51c2VyaWQuc3Vic3RyaW5nKDAsIGRpZ2l0KTtcclxuICAgICAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoJ1tJRCgnICsgZGlnaXQgKyAnKV0nLCBpZERpZ2l0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMob2JqZWN0KTtcclxuICAgICAgICBlbnRyaWVzLmZvckVhY2goKHBhcmEpID0+IHtcclxuICAgICAgICAgICAgdmFyIGZpbmQgPSAnWycgKyBwYXJhWzBdICsgJ10nO1xyXG4gICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBwYXJhWzFdICE9IG51bGwgPyBTdHJpbmcocGFyYVsxXSkgOiAnJztcclxuICAgICAgICAgICAgdmFsID0gdmFsLnNwbGl0KGZpbmQpLmpvaW4ocmVwbGFjZW1lbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0VGVtcGxhdGVEbnNOYW1lc0ZvckxpbmVzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmxpbmVzICYmIHRoaXMubGluZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVzLmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsaW5lLmRpcmVjdG9yeU51bWJlci50ZW1wbGF0ZURpcmVjdG9yeU51bWJlciA9IGxpbmUuZGlyZWN0b3J5TnVtYmVyLmRpcmVjdG9yeU51bWJlcjtcclxuICAgICAgICAgICAgICAgIGxpbmUuZGlyZWN0b3J5TnVtYmVyLmRpcmVjdG9yeU51bWJlciA9ICcnO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgcm91dGVQYXJ0aXRpb24gPSB0aGlzLnNpdGVEZWZhdWx0cz8ucm91dGVQYXJ0aXRpb24gfHwgJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlcy5mb3JFYWNoKGRldmljZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLmxpbmVBc3NvY2lhdGlvbnMgJiYgZGV2aWNlLmxpbmVBc3NvY2lhdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldExpbmVBc3NvY2lhdGlvbnNGb3JEZXZpY2UoZGV2aWNlLCByb3V0ZVBhcnRpdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmRldmljZVByb2ZpbGVzLmZvckVhY2goZGV2aWNlUHJvZmlsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGV2aWNlUHJvZmlsZS5saW5lQXNzb2NpYXRpb25zICYmIGRldmljZVByb2ZpbGUubGluZUFzc29jaWF0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGluZUFzc29jaWF0aW9uc0ZvckRldmljZShkZXZpY2VQcm9maWxlLCByb3V0ZVBhcnRpdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZW5kVXNlcj8uc2luZ2xlTnVtYmVyUmVhY2ggJiYgdGhpcy5lbmRVc2VyLnNpbmdsZU51bWJlclJlYWNoLmFzc29jaWF0ZWRMaW5lcyAmJiB0aGlzLmVuZFVzZXIuc2luZ2xlTnVtYmVyUmVhY2guYXNzb2NpYXRlZExpbmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZW5kVXNlci5zaW5nbGVOdW1iZXJSZWFjaC5hc3NvY2lhdGVkTGluZXMgJiYgdGhpcy5lbmRVc2VyLnNpbmdsZU51bWJlclJlYWNoLmFzc29jaWF0ZWRMaW5lcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZFVzZXIuc2luZ2xlTnVtYmVyUmVhY2guYXNzb2NpYXRlZExpbmVzLm1hcChsaW5lQXNzb2NpYXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyLnRlbXBsYXRlRGlyZWN0b3J5TnVtYmVyID0gbGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlci5kaXJlY3RvcnlOdW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVBc3NvY2lhdGlvbi5kaXJlY3RvcnlOdW1iZXIucm91dGVQYXJ0aXRpb25OYW1lID0gcm91dGVQYXJ0aXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmRVc2VyLnNpbmdsZU51bWJlclJlYWNoLnJlbW90ZURlc3RpbmF0aW9ucyAmJiB0aGlzLmVuZFVzZXIuc2luZ2xlTnVtYmVyUmVhY2gucmVtb3RlRGVzdGluYXRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kVXNlci5zaW5nbGVOdW1iZXJSZWFjaC5yZW1vdGVEZXN0aW5hdGlvbnMuZm9yRWFjaChyZW1vdGVEZXN0aW5hdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdGVEZXN0aW5hdGlvbi5saW5lQXNzb2NpYXRpb25zICYmIHJlbW90ZURlc3RpbmF0aW9uLmxpbmVBc3NvY2lhdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXN0aW5hdGlvbi5saW5lQXNzb2NpYXRpb25zLm1hcChsaW5lQXNzb2NpYXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVBc3NvY2lhdGlvbi5kaXJlY3RvcnlOdW1iZXIudGVtcGxhdGVEaXJlY3RvcnlOdW1iZXIgPSBsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyLmRpcmVjdG9yeU51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyLnJvdXRlUGFydGl0aW9uTmFtZSA9IHJvdXRlUGFydGl0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBidWlsZFNhdmFibGVFbmRVc2VyKCk6IEVuZFVzZXJJbnRlcmZhY2Uge1xyXG4gICAgICAgIGlmICghdGhpcy5lbmRVc2VyKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdGVtcGxhdGUgdXNlciBsb2FkZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJ1aWxkU2F2YWJsZUVuZFVzZXIoXHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlcixcclxuICAgICAgICAgICAgdGhpcy5saW5lcyxcclxuICAgICAgICAgICAgdGhpcy5kZXZpY2VzLFxyXG4gICAgICAgICAgICB0aGlzLmRldmljZVByb2ZpbGVzLFxyXG4gICAgICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZURldmljZU5hbWU6IChpbmRleCwgZGV2aWNlKSA9PiB0aGlzLnJlc29sdmVEZXZpY2VOYW1lRm9yU2F2ZShpbmRleCwgZGV2aWNlKSxcclxuICAgICAgICAgICAgICAgIHJlc29sdmVEZXZpY2VQcm9maWxlTmFtZTogKGluZGV4LCBwcm9maWxlKSA9PiB0aGlzLnJlc29sdmVEZXZpY2VOYW1lRm9yU2F2ZShpbmRleCwgcHJvZmlsZSksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVzb2x2ZURldmljZU5hbWVGb3JTYXZlKF9pbmRleDogbnVtYmVyLCBkZXZpY2U6IERldmljZUludGVyZmFjZSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgcmF3TmFtZSA9IChkZXZpY2UubmFtZSB8fCBkZXZpY2UubmV3TmFtZSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgIGlmICghcmF3TmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGRldmljZS5wcmVmaXg/LnRyaW0oKTtcclxuICAgICAgICBpZiAocHJlZml4ICYmICFyYXdOYW1lLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChwcmVmaXgudG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke3Jhd05hbWV9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJhd05hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNhdmVOZXdVc2VyKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IHRoaXMuYnVpbGRTYXZhYmxlRW5kVXNlcigpO1xyXG4gICAgICAgIGNvbnN0IHNpdGVJZCA9IFN0cmluZyh0aGlzLnNlbGVjdGVkU2l0ZSA/PyAnJyk7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVJZCA9IFN0cmluZyh0aGlzLnNlbGVjdGVkVGVtcGxhdGVJZCA/PyAnJyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckNyZWF0aW9uQXBpU2VydmljZS5zYXZlVGVtcGxhdGVVc2VyKHVzZXIsIHRlbXBsYXRlSWQsIHNpdGVJZCk7XHJcbiAgICB9XHJcbn0iXX0=
|