@vendasta/meetings 0.93.5 → 0.95.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/_internal/interfaces/index.mjs +1 -1
- package/esm2020/lib/_internal/interfaces/meeting-host.interface.mjs +1 -1
- package/esm2020/lib/_internal/interfaces/meeting-source.interface.mjs +1 -1
- package/esm2020/lib/_internal/meeting-host.api.service.mjs +7 -2
- package/esm2020/lib/_internal/objects/index.mjs +2 -2
- package/esm2020/lib/_internal/objects/meeting-host.mjs +47 -1
- package/esm2020/lib/_internal/objects/meeting-source.mjs +4 -1
- package/esm2020/lib/host/host.service.mjs +231 -128
- package/esm2020/lib/index.mjs +2 -2
- package/esm2020/lib/meetings.service.mjs +5 -3
- package/esm2020/lib/shared/index.mjs +2 -1
- package/esm2020/lib/shared/origin.mjs +8 -0
- package/fesm2015/vendasta-meetings.mjs +282 -115
- package/fesm2015/vendasta-meetings.mjs.map +1 -1
- package/fesm2020/vendasta-meetings.mjs +290 -123
- package/fesm2020/vendasta-meetings.mjs.map +1 -1
- package/lib/_internal/interfaces/index.d.ts +1 -1
- package/lib/_internal/interfaces/meeting-host.interface.d.ts +8 -0
- package/lib/_internal/interfaces/meeting-source.interface.d.ts +1 -0
- package/lib/_internal/meeting-host.api.service.d.ts +3 -2
- package/lib/_internal/objects/index.d.ts +1 -1
- package/lib/_internal/objects/meeting-host.d.ts +14 -0
- package/lib/_internal/objects/meeting-source.d.ts +1 -0
- package/lib/host/host.service.d.ts +9 -4
- package/lib/index.d.ts +1 -1
- package/lib/meetings.service.d.ts +2 -2
- package/lib/shared/index.d.ts +1 -0
- package/lib/shared/origin.d.ts +6 -0
- package/package.json +1 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Injectable } from
|
|
2
|
-
import { of } from
|
|
3
|
-
import { map, mapTo } from
|
|
4
|
-
import { ListBookedMeetingsRequestFilters, MeetingHostApiService, PagedRequestOptions, TimeRange, TimeZone } from
|
|
5
|
-
import { CalendarFromApi, getFieldMask, GroupFromApi, GroupTypeToAPi, meetingFromApi, MeetingTypeFromApi, MeetingTypeToApi, PagedResponse, PreferencesFromApi, ServiceFromApi, ServiceTypeToApi } from
|
|
6
|
-
import { getBookingUrlImplementation, getGeneralBookingUrlImplementation } from
|
|
7
|
-
import { hostUserFromApi } from
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { of } from "rxjs";
|
|
3
|
+
import { map, mapTo } from "rxjs/operators";
|
|
4
|
+
import { ListBookedMeetingsRequestFilters, MeetingHostApiService, PagedRequestOptions, TimeRange, TimeZone, } from "../_internal";
|
|
5
|
+
import { CalendarFromApi, getFieldMask, GroupFromApi, GroupTypeToAPi, meetingFromApi, MeetingTypeFromApi, MeetingTypeToApi, PagedResponse, PreferencesFromApi, ServiceFromApi, ServiceTypeToApi, } from "../shared";
|
|
6
|
+
import { getBookingUrlImplementation, getGeneralBookingUrlImplementation, } from "./url";
|
|
7
|
+
import { hostUserFromApi } from "../shared/host-user";
|
|
8
8
|
import { Environment, onProductionGlobal } from "../shared/environment";
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
import * as i1 from "../_internal";
|
|
@@ -14,57 +14,75 @@ export class HostService {
|
|
|
14
14
|
}
|
|
15
15
|
// Use buildHostId to get an identifier that can be used in subsequent requests. See vendastaapis for more details
|
|
16
16
|
buildHostId(req) {
|
|
17
|
-
return this.hostAPIService
|
|
17
|
+
return this.hostAPIService
|
|
18
|
+
.buildHostId({
|
|
18
19
|
userId: req.userId,
|
|
19
20
|
// Gross typecast exists because I want to restrict the properties on the map (for now).
|
|
20
|
-
applicationContextProperties: req.applicationContextProperties
|
|
21
|
-
})
|
|
21
|
+
applicationContextProperties: req.applicationContextProperties,
|
|
22
|
+
})
|
|
23
|
+
.pipe(map((res) => res.hostId || ""));
|
|
22
24
|
}
|
|
23
25
|
doesCalendarExist(calendarIdentifier) {
|
|
24
|
-
return this.hostAPIService
|
|
26
|
+
return this.hostAPIService
|
|
27
|
+
.doesCalendarExist({ calendarIdentifier: calendarIdentifier })
|
|
28
|
+
.pipe(map((resp) => resp.exists));
|
|
25
29
|
}
|
|
26
30
|
getCalendar(req) {
|
|
27
|
-
return this.hostAPIService
|
|
31
|
+
return this.hostAPIService
|
|
32
|
+
.getCalendar({ calendarId: req.calendarId })
|
|
33
|
+
.pipe(map((res) => CalendarFromApi(res?.calendar)));
|
|
28
34
|
}
|
|
29
35
|
ensurePersonalCalendarExists(req) {
|
|
30
|
-
return this.hostAPIService
|
|
36
|
+
return this.hostAPIService
|
|
37
|
+
.ensurePersonalCalendarExists({
|
|
31
38
|
userId: req.userId,
|
|
32
39
|
applicationContextProperties: req.applicationContextProperties,
|
|
33
|
-
})
|
|
40
|
+
})
|
|
41
|
+
.pipe(map((res) => (res ? res.calendarId : "")));
|
|
34
42
|
}
|
|
35
43
|
ensureGroupCalendarsExist(req) {
|
|
36
|
-
return this.hostAPIService
|
|
44
|
+
return this.hostAPIService
|
|
45
|
+
.ensureGroupCalendarsExist({ externalIds: req.externalIds })
|
|
46
|
+
.pipe(map((res) => res?.calendarIds || []));
|
|
37
47
|
}
|
|
38
48
|
/*
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
49
|
+
createCalendar creates a calendar which meeting types can be created for and events can be booked on
|
|
50
|
+
The fields of a calendar are documented in https://github.com/vendasta/vendastaapis/blob/master/meetings/v1/shared.proto
|
|
51
|
+
*/
|
|
42
52
|
createCalendar(req) {
|
|
43
53
|
return this.hostAPIService.createCalendar(req);
|
|
44
54
|
}
|
|
45
55
|
updateCalendarSlug(calendarId, newSlug) {
|
|
46
|
-
return this.hostAPIService
|
|
56
|
+
return this.hostAPIService
|
|
57
|
+
.updateCalendar({
|
|
47
58
|
calendarId: calendarId,
|
|
48
59
|
calendarUpdate: { slug: newSlug },
|
|
49
|
-
fieldMask: { paths: [
|
|
50
|
-
})
|
|
60
|
+
fieldMask: { paths: ["slug"] },
|
|
61
|
+
})
|
|
62
|
+
.pipe(mapTo(undefined));
|
|
51
63
|
}
|
|
52
64
|
updateCalendarHostUserIDs(calendarId, replacementHostUserIds) {
|
|
53
|
-
return this.hostAPIService
|
|
65
|
+
return this.hostAPIService
|
|
66
|
+
.updateCalendar({
|
|
54
67
|
calendarId: calendarId,
|
|
55
68
|
calendarUpdate: { hostUserIds: replacementHostUserIds },
|
|
56
|
-
fieldMask: { paths: [
|
|
57
|
-
})
|
|
69
|
+
fieldMask: { paths: ["host_user_ids"] },
|
|
70
|
+
})
|
|
71
|
+
.pipe(mapTo(undefined));
|
|
58
72
|
}
|
|
59
73
|
getMeetingTypesForCalendars(req) {
|
|
60
|
-
return this.hostAPIService
|
|
74
|
+
return this.hostAPIService
|
|
75
|
+
.getMeetingTypesForCalendars({ calendarIds: req.calendarIds })
|
|
76
|
+
.pipe(map((res) => {
|
|
61
77
|
if (!res?.calendarMeetingTypesMap) {
|
|
62
78
|
return {};
|
|
63
79
|
}
|
|
64
80
|
return Object.keys(res.calendarMeetingTypesMap).reduce((calendarToMeetingTypeMap, calendarId) => {
|
|
65
|
-
const meetingTypes = (res.calendarMeetingTypesMap[calendarId]?.meetingTypes || []).map(mt => MeetingTypeFromApi({
|
|
81
|
+
const meetingTypes = (res.calendarMeetingTypesMap[calendarId]?.meetingTypes || []).map((mt) => MeetingTypeFromApi({
|
|
66
82
|
meetingTypeApi: mt,
|
|
67
|
-
environment: onProductionGlobal()
|
|
83
|
+
environment: onProductionGlobal()
|
|
84
|
+
? Environment.PROD
|
|
85
|
+
: Environment.DEMO,
|
|
68
86
|
calendarId,
|
|
69
87
|
metadata: req.metadata,
|
|
70
88
|
}));
|
|
@@ -76,22 +94,24 @@ export class HostService {
|
|
|
76
94
|
}));
|
|
77
95
|
}
|
|
78
96
|
/*
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
97
|
+
listMeetingTypes returns a list of meeting types for a host
|
|
98
|
+
@param hostId: An identifier for an individual host
|
|
99
|
+
@param metadata: optional metadata to include on the meeting type booking link
|
|
100
|
+
@param calendarSlug: used to replace hostId in the url. Use it when you are confident you know the host's slug.
|
|
101
|
+
- calendarSlug IS NOT USED TO RETRIEVE MEETING TYPES, ONLY TO MAKE THE BOOKING URLS
|
|
102
|
+
*/
|
|
85
103
|
listMeetingTypes(req) {
|
|
86
|
-
return this.hostAPIService.listMeetingTypes(req).pipe(map(resp => {
|
|
104
|
+
return this.hostAPIService.listMeetingTypes(req).pipe(map((resp) => {
|
|
87
105
|
if (!resp || !resp.meetingTypes) {
|
|
88
106
|
return [];
|
|
89
107
|
}
|
|
90
|
-
return resp.meetingTypes.map(mt => {
|
|
108
|
+
return resp.meetingTypes.map((mt) => {
|
|
91
109
|
return MeetingTypeFromApi({
|
|
92
110
|
meetingTypeApi: mt,
|
|
93
111
|
calendarId: req.hostId,
|
|
94
|
-
environment: onProductionGlobal()
|
|
112
|
+
environment: onProductionGlobal()
|
|
113
|
+
? Environment.PROD
|
|
114
|
+
: Environment.DEMO,
|
|
95
115
|
metadata: req.metadata,
|
|
96
116
|
calendarSlug: req.calendarSlug,
|
|
97
117
|
});
|
|
@@ -99,15 +119,15 @@ export class HostService {
|
|
|
99
119
|
}));
|
|
100
120
|
}
|
|
101
121
|
/*
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
122
|
+
getBookingUrl returns a link that can be used to book a meeting with this host.
|
|
123
|
+
@param calendarId: An identifier for an individual host or grouping of hosts (i.e., team).
|
|
124
|
+
@param @deprecated hostId: An identifier for an individual host.
|
|
125
|
+
@param meetingTypeId: An optional identifier for the meeting type. Default: 30-minutes.
|
|
126
|
+
@param metadata: optional metadata to include in the url.
|
|
127
|
+
- metadata can be used to pre-fill certain form fields and will be stored during the booking process.
|
|
128
|
+
- metadata can be obtained by subscribing to the booking event.
|
|
129
|
+
@param calendarSlug: used to replace hostId in the url. Use it when you are confident you know the host's slug.
|
|
130
|
+
*/
|
|
111
131
|
getBookingUrl(req) {
|
|
112
132
|
return of(getBookingUrlImplementation({
|
|
113
133
|
...req,
|
|
@@ -117,13 +137,13 @@ export class HostService {
|
|
|
117
137
|
}));
|
|
118
138
|
}
|
|
119
139
|
/*
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
140
|
+
getGeneralBookingUrl returns a link that can be used to select a meeting type to book with the given calendar.
|
|
141
|
+
@param calendarId: An identifier for an individual host or grouping of hosts (i.e., team).
|
|
142
|
+
@param metadata: optional metadata to include in the url.
|
|
143
|
+
- metadata can be used to pre-fill certain form fields and will be stored during the booking process.
|
|
144
|
+
- metadata can be obtained by subscribing to the booking event.
|
|
145
|
+
@param calendarSlug: used to replace hostId in the url. Use it when you are confident you know the host's slug.
|
|
146
|
+
*/
|
|
127
147
|
getGeneralBookingUrl(req) {
|
|
128
148
|
return of(getGeneralBookingUrlImplementation({
|
|
129
149
|
environment: onProductionGlobal() ? Environment.PROD : Environment.DEMO,
|
|
@@ -133,14 +153,14 @@ export class HostService {
|
|
|
133
153
|
}));
|
|
134
154
|
}
|
|
135
155
|
/*
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
156
|
+
getBookingUrlsMulti returns a mapping of hosts -> event types -> booking links.
|
|
157
|
+
@param calendarId: An identifier for an individual host or grouping of hosts.
|
|
158
|
+
@param meetingTypeSlug: meetingTypeSlugs are passed in the form {hostId: [meetingTypeSlug1, meetingTypeSlug2]}
|
|
159
|
+
@param metadata: optional metadata to include in the url.
|
|
160
|
+
- metadata can be used to pre-fill certain form fields and will be stored during the booking process.
|
|
161
|
+
- metadata can be obtained by subscribing to the booking event.
|
|
162
|
+
@param calendarSlug: used to replace hostId in the url. Use it when you are confident you know the host's slug.
|
|
163
|
+
*/
|
|
144
164
|
getBookingUrlsMulti(req, metadata, calendarSlug) {
|
|
145
165
|
return of(Object.keys(req).reduce((hostMap, calendarId) => {
|
|
146
166
|
return {
|
|
@@ -152,16 +172,20 @@ export class HostService {
|
|
|
152
172
|
calendarId,
|
|
153
173
|
meetingTypeSlug,
|
|
154
174
|
metadata,
|
|
155
|
-
environment: onProductionGlobal()
|
|
175
|
+
environment: onProductionGlobal()
|
|
176
|
+
? Environment.PROD
|
|
177
|
+
: Environment.DEMO,
|
|
156
178
|
calendarSlug,
|
|
157
|
-
})
|
|
179
|
+
}),
|
|
158
180
|
};
|
|
159
|
-
}, {})
|
|
181
|
+
}, {}),
|
|
160
182
|
};
|
|
161
183
|
}, {}));
|
|
162
184
|
}
|
|
163
185
|
isHostConfigured(req) {
|
|
164
|
-
return this.hostAPIService
|
|
186
|
+
return this.hostAPIService
|
|
187
|
+
.isHostConfigured(req)
|
|
188
|
+
.pipe(map((resp) => resp.isConfigured));
|
|
165
189
|
}
|
|
166
190
|
setGeneralAvailability(req) {
|
|
167
191
|
const apiReq = {
|
|
@@ -174,32 +198,43 @@ export class HostService {
|
|
|
174
198
|
return this.hostAPIService.setGeneralAvailability(apiReq).pipe(mapTo(null));
|
|
175
199
|
}
|
|
176
200
|
listBookedMeetings(req) {
|
|
177
|
-
return this.hostAPIService
|
|
201
|
+
return this.hostAPIService
|
|
202
|
+
.listBookedMeetings({
|
|
178
203
|
...req,
|
|
179
|
-
pagingOptions: new PagedRequestOptions({
|
|
204
|
+
pagingOptions: new PagedRequestOptions({
|
|
205
|
+
cursor: req.cursor,
|
|
206
|
+
pageSize: req.pageSize,
|
|
207
|
+
}),
|
|
180
208
|
filters: new ListBookedMeetingsRequestFilters(req.filters),
|
|
181
209
|
timeZone: new TimeZone(req.timeZone),
|
|
182
|
-
})
|
|
183
|
-
|
|
210
|
+
})
|
|
211
|
+
.pipe(map((resp) => {
|
|
212
|
+
const meetings = (resp.meetings || []).map((meeting) => meetingFromApi(meeting));
|
|
184
213
|
return new PagedResponse(meetings, resp.pagingMetadata.nextCursor, resp.pagingMetadata.hasMore);
|
|
185
214
|
}));
|
|
186
215
|
}
|
|
187
216
|
cancelMeeting(req) {
|
|
188
|
-
return this.hostAPIService
|
|
189
|
-
|
|
190
|
-
|
|
217
|
+
return this.hostAPIService
|
|
218
|
+
.cancelMeeting({
|
|
219
|
+
...req,
|
|
220
|
+
})
|
|
221
|
+
.pipe(mapTo(null));
|
|
191
222
|
}
|
|
192
223
|
rescheduleMeeting(req) {
|
|
193
|
-
return this.hostAPIService
|
|
194
|
-
|
|
195
|
-
|
|
224
|
+
return this.hostAPIService
|
|
225
|
+
.rescheduleMeeting({
|
|
226
|
+
...req,
|
|
227
|
+
})
|
|
228
|
+
.pipe(mapTo(null));
|
|
196
229
|
}
|
|
197
230
|
listAvailability(req) {
|
|
198
|
-
return this.hostAPIService.listAvailability(req).pipe(map(response => {
|
|
199
|
-
const results = (response.availabilityRules || [])
|
|
231
|
+
return this.hostAPIService.listAvailability(req).pipe(map((response) => {
|
|
232
|
+
const results = (response.availabilityRules || [])
|
|
233
|
+
.filter(Boolean)
|
|
234
|
+
.map((a) => {
|
|
200
235
|
return {
|
|
201
|
-
hostId: a.hostId ||
|
|
202
|
-
meetingTypeId: a.meetingTypeId ||
|
|
236
|
+
hostId: a.hostId || "",
|
|
237
|
+
meetingTypeId: a.meetingTypeId || "",
|
|
203
238
|
day: a.day,
|
|
204
239
|
timeSlot: a.timeSlot,
|
|
205
240
|
timeZone: a.timeZone,
|
|
@@ -224,51 +259,71 @@ export class HostService {
|
|
|
224
259
|
* `Preferences` is an error.
|
|
225
260
|
*/
|
|
226
261
|
updatePreferences(req) {
|
|
227
|
-
const fieldMask = getFieldMask({
|
|
262
|
+
const fieldMask = getFieldMask({
|
|
263
|
+
o: req.preferences,
|
|
264
|
+
updateFields: req.updateFields,
|
|
265
|
+
});
|
|
228
266
|
if (fieldMask.paths.length === 0) {
|
|
229
267
|
return of();
|
|
230
268
|
}
|
|
231
|
-
return this.hostAPIService
|
|
269
|
+
return this.hostAPIService
|
|
270
|
+
.updateHostPreferences({
|
|
232
271
|
hostId: req.hostId,
|
|
233
272
|
preferences: req.preferences,
|
|
234
273
|
fieldMask,
|
|
235
|
-
})
|
|
274
|
+
})
|
|
275
|
+
.pipe(mapTo(undefined));
|
|
236
276
|
}
|
|
237
277
|
getPreferences(req) {
|
|
238
|
-
return this.hostAPIService
|
|
239
|
-
|
|
240
|
-
|
|
278
|
+
return this.hostAPIService
|
|
279
|
+
.getHostPreferences({
|
|
280
|
+
hostId: req.hostId,
|
|
281
|
+
})
|
|
282
|
+
.pipe(map((response) => PreferencesFromApi(response.preferences)));
|
|
241
283
|
}
|
|
242
284
|
getMeeting(meetingId, location) {
|
|
243
|
-
return this.hostAPIService
|
|
244
|
-
|
|
245
|
-
|
|
285
|
+
return this.hostAPIService
|
|
286
|
+
.getHostMeeting({
|
|
287
|
+
meetingId: meetingId,
|
|
288
|
+
location: location,
|
|
289
|
+
})
|
|
290
|
+
.pipe(map((resp) => meetingFromApi(resp.meeting)));
|
|
246
291
|
}
|
|
247
292
|
updateMeetingMetadata(req) {
|
|
248
|
-
return this.hostAPIService
|
|
293
|
+
return this.hostAPIService
|
|
294
|
+
.updateMeetingMetadata({
|
|
249
295
|
meetingId: req.meetingId,
|
|
250
|
-
metadata: req.metadata
|
|
251
|
-
})
|
|
296
|
+
metadata: req.metadata,
|
|
297
|
+
})
|
|
298
|
+
.pipe(mapTo(undefined));
|
|
252
299
|
}
|
|
253
300
|
bookMeeting(req) {
|
|
254
|
-
return this.hostAPIService
|
|
301
|
+
return this.hostAPIService
|
|
302
|
+
.bookMeeting(req)
|
|
303
|
+
.pipe(map((resp) => resp.meetingId));
|
|
255
304
|
}
|
|
256
305
|
// createDefaultMeetingTypes will create what Meeting Scheduler deems to be the default meeting types.
|
|
257
306
|
// If the calendar already has meeting types, this is guaranteed to be a no-op.
|
|
258
307
|
createDefaultMeetingTypes(req) {
|
|
259
|
-
return this.hostAPIService
|
|
308
|
+
return this.hostAPIService
|
|
309
|
+
.createDefaultMeetingTypes({ calendarIds: req.calendarIds })
|
|
310
|
+
.pipe(mapTo(undefined));
|
|
260
311
|
}
|
|
261
312
|
createMeetingType(req) {
|
|
262
|
-
const fieldMask = getFieldMask({
|
|
313
|
+
const fieldMask = getFieldMask({
|
|
314
|
+
o: req.meetingType,
|
|
315
|
+
updateFields: req.updateFields,
|
|
316
|
+
});
|
|
263
317
|
if (fieldMask.paths.length === 0) {
|
|
264
318
|
return of();
|
|
265
319
|
}
|
|
266
|
-
return this.hostAPIService
|
|
320
|
+
return this.hostAPIService
|
|
321
|
+
.createMeetingType({
|
|
267
322
|
meetingType: MeetingTypeToApi({ meetingType: req.meetingType }),
|
|
268
323
|
fieldMask,
|
|
269
|
-
hostId: req.HostId
|
|
324
|
+
hostId: req.HostId,
|
|
270
325
|
})
|
|
271
|
-
.pipe(map(res => res.id));
|
|
326
|
+
.pipe(map((res) => res.id));
|
|
272
327
|
}
|
|
273
328
|
/* updateMeetingType will update the meeting type fields.
|
|
274
329
|
* It is guaranteed to only update the fields provided.
|
|
@@ -286,23 +341,32 @@ export class HostService {
|
|
|
286
341
|
* `MeetingType` is an error.
|
|
287
342
|
*/
|
|
288
343
|
updateMeetingType(req) {
|
|
289
|
-
const fieldMask = getFieldMask({
|
|
344
|
+
const fieldMask = getFieldMask({
|
|
345
|
+
o: req.meetingType,
|
|
346
|
+
updateFields: req.updateFields,
|
|
347
|
+
});
|
|
290
348
|
if (fieldMask.paths.length === 0) {
|
|
291
349
|
return of();
|
|
292
350
|
}
|
|
293
|
-
return this.hostAPIService
|
|
351
|
+
return this.hostAPIService
|
|
352
|
+
.updateMeetingType({
|
|
294
353
|
id: req.id,
|
|
295
354
|
meetingType: MeetingTypeToApi({ meetingType: req.meetingType }),
|
|
296
355
|
fieldMask,
|
|
297
|
-
hostId: req.HostId
|
|
298
|
-
})
|
|
356
|
+
hostId: req.HostId,
|
|
357
|
+
})
|
|
358
|
+
.pipe(mapTo(undefined));
|
|
299
359
|
}
|
|
300
360
|
deleteMeetingType(req) {
|
|
301
|
-
return this.hostAPIService
|
|
361
|
+
return this.hostAPIService
|
|
362
|
+
.deleteMeetingType({ id: req.id })
|
|
363
|
+
.pipe(mapTo(undefined));
|
|
302
364
|
}
|
|
303
365
|
getHostsForCalendar(req) {
|
|
304
|
-
return this.hostAPIService
|
|
305
|
-
|
|
366
|
+
return this.hostAPIService
|
|
367
|
+
.getHostsForCalendar({ calendarId: req.calendarId })
|
|
368
|
+
.pipe(map((res) => {
|
|
369
|
+
return (res.hostUsers || []).map((hostuser) => {
|
|
306
370
|
return hostUserFromApi(hostuser);
|
|
307
371
|
});
|
|
308
372
|
}));
|
|
@@ -314,71 +378,105 @@ export class HostService {
|
|
|
314
378
|
return this.hostAPIService.sendMeetingRequestEmail(req);
|
|
315
379
|
}
|
|
316
380
|
createService(req) {
|
|
317
|
-
const fieldMask = getFieldMask({
|
|
381
|
+
const fieldMask = getFieldMask({
|
|
382
|
+
o: req.service,
|
|
383
|
+
updateFields: req.updateFields,
|
|
384
|
+
});
|
|
318
385
|
if (fieldMask.paths.length === 0) {
|
|
319
386
|
return of();
|
|
320
387
|
}
|
|
321
|
-
return this.hostAPIService
|
|
388
|
+
return this.hostAPIService
|
|
389
|
+
.createService({
|
|
322
390
|
service: ServiceTypeToApi({ service: req.service }),
|
|
323
391
|
fieldMask,
|
|
324
|
-
hostId: req.HostId
|
|
325
|
-
})
|
|
392
|
+
hostId: req.HostId,
|
|
393
|
+
})
|
|
394
|
+
.pipe(map((res) => res.id));
|
|
326
395
|
}
|
|
327
396
|
updateService(req) {
|
|
328
|
-
const fieldMask = getFieldMask({
|
|
397
|
+
const fieldMask = getFieldMask({
|
|
398
|
+
o: req.service,
|
|
399
|
+
updateFields: req.updateFields,
|
|
400
|
+
});
|
|
329
401
|
if (fieldMask.paths.length === 0) {
|
|
330
402
|
return of();
|
|
331
403
|
}
|
|
332
|
-
return this.hostAPIService
|
|
404
|
+
return this.hostAPIService
|
|
405
|
+
.updateService({
|
|
333
406
|
id: req.id,
|
|
334
407
|
service: ServiceTypeToApi({ service: req.service }),
|
|
335
408
|
fieldMask,
|
|
336
|
-
hostId: req.HostId
|
|
337
|
-
})
|
|
409
|
+
hostId: req.HostId,
|
|
410
|
+
})
|
|
411
|
+
.pipe(mapTo(undefined));
|
|
338
412
|
}
|
|
339
413
|
deleteService(req) {
|
|
340
|
-
return this.hostAPIService
|
|
414
|
+
return this.hostAPIService
|
|
415
|
+
.deleteService({ id: req.id, hostId: req.hostId })
|
|
416
|
+
.pipe(mapTo(undefined));
|
|
341
417
|
}
|
|
342
418
|
listServices(req) {
|
|
343
|
-
return this.hostAPIService.listServices({ hostId: req.hostId }).pipe(map(res => {
|
|
419
|
+
return this.hostAPIService.listServices({ hostId: req.hostId }).pipe(map((res) => {
|
|
344
420
|
if (!res || !res.services) {
|
|
345
421
|
return [];
|
|
346
422
|
}
|
|
347
|
-
return res.services.map(service => ServiceFromApi({
|
|
423
|
+
return res.services.map((service) => ServiceFromApi({
|
|
424
|
+
serviceApi: service,
|
|
425
|
+
environment: onProductionGlobal()
|
|
426
|
+
? Environment.PROD
|
|
427
|
+
: Environment.DEMO,
|
|
428
|
+
}));
|
|
348
429
|
}));
|
|
349
430
|
}
|
|
350
431
|
createGroup(req) {
|
|
351
|
-
const fieldMask = getFieldMask({
|
|
432
|
+
const fieldMask = getFieldMask({
|
|
433
|
+
o: req.group,
|
|
434
|
+
updateFields: req.updateFields,
|
|
435
|
+
});
|
|
352
436
|
if (fieldMask.paths.length === 0) {
|
|
353
437
|
return of();
|
|
354
438
|
}
|
|
355
|
-
return this.hostAPIService
|
|
439
|
+
return this.hostAPIService
|
|
440
|
+
.createGroup({
|
|
356
441
|
group: GroupTypeToAPi({ group: req.group }),
|
|
357
442
|
fieldMask,
|
|
358
|
-
hostId: req.HostId
|
|
359
|
-
})
|
|
443
|
+
hostId: req.HostId,
|
|
444
|
+
})
|
|
445
|
+
.pipe(map((res) => res.id));
|
|
360
446
|
}
|
|
361
447
|
updateGroup(req) {
|
|
362
|
-
const fieldMask = getFieldMask({
|
|
448
|
+
const fieldMask = getFieldMask({
|
|
449
|
+
o: req.group,
|
|
450
|
+
updateFields: req.updateFields,
|
|
451
|
+
});
|
|
363
452
|
if (fieldMask.paths.length === 0) {
|
|
364
453
|
return of();
|
|
365
454
|
}
|
|
366
|
-
return this.hostAPIService
|
|
455
|
+
return this.hostAPIService
|
|
456
|
+
.updateGroup({
|
|
367
457
|
id: req.id,
|
|
368
458
|
group: GroupTypeToAPi({ group: req.group }),
|
|
369
459
|
fieldMask,
|
|
370
|
-
hostId: req.HostId
|
|
371
|
-
})
|
|
460
|
+
hostId: req.HostId,
|
|
461
|
+
})
|
|
462
|
+
.pipe(mapTo(undefined));
|
|
372
463
|
}
|
|
373
464
|
deleteGroup(req) {
|
|
374
|
-
return this.hostAPIService
|
|
465
|
+
return this.hostAPIService
|
|
466
|
+
.deleteGroup({ id: req.id, hostId: req.hostId })
|
|
467
|
+
.pipe(mapTo(undefined));
|
|
375
468
|
}
|
|
376
469
|
listGroups(req) {
|
|
377
|
-
return this.hostAPIService.listGroups({ hostId: req.hostId }).pipe(map(res => {
|
|
470
|
+
return this.hostAPIService.listGroups({ hostId: req.hostId }).pipe(map((res) => {
|
|
378
471
|
if (!res || !res.groups) {
|
|
379
472
|
return [];
|
|
380
473
|
}
|
|
381
|
-
return res.groups.map(group => GroupFromApi({
|
|
474
|
+
return res.groups.map((group) => GroupFromApi({
|
|
475
|
+
groupApi: group,
|
|
476
|
+
environment: onProductionGlobal()
|
|
477
|
+
? Environment.PROD
|
|
478
|
+
: Environment.DEMO,
|
|
479
|
+
}));
|
|
382
480
|
}));
|
|
383
481
|
}
|
|
384
482
|
getGroup(req) {
|
|
@@ -387,11 +485,16 @@ export class HostService {
|
|
|
387
485
|
getService(req) {
|
|
388
486
|
return this.hostAPIService.getService(req);
|
|
389
487
|
}
|
|
488
|
+
checkGroupOrServiceSlugExist(req) {
|
|
489
|
+
return this.hostAPIService
|
|
490
|
+
.checkGroupOrServiceSlugExist(req)
|
|
491
|
+
.pipe(map((res) => res.exists));
|
|
492
|
+
}
|
|
390
493
|
}
|
|
391
494
|
HostService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: HostService, deps: [{ token: i1.MeetingHostApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
392
|
-
HostService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: HostService, providedIn:
|
|
495
|
+
HostService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: HostService, providedIn: "root" });
|
|
393
496
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: HostService, decorators: [{
|
|
394
497
|
type: Injectable,
|
|
395
|
-
args: [{ providedIn:
|
|
498
|
+
args: [{ providedIn: "root" }]
|
|
396
499
|
}], ctorParameters: function () { return [{ type: i1.MeetingHostApiService }]; } });
|
|
397
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbWVldGluZ3Nfc2RrL3NyYy9saWIvaG9zdC9ob3N0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFTLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQWEsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxHQUFHLEVBQUUsS0FBSyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQVNILGdDQUFnQyxFQUdoQyxxQkFBcUIsRUFDckIsbUJBQW1CLEVBRW5CLFNBQVMsRUFFVCxRQUFRLEVBR1gsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUlILGVBQWUsRUFDZixZQUFZLEVBQVMsWUFBWSxFQUFFLGNBQWMsRUFHakQsY0FBYyxFQUdkLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsYUFBYSxFQUViLGtCQUFrQixFQUFXLGNBQWMsRUFBRSxnQkFBZ0IsRUFDaEUsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFDLDJCQUEyQixFQUFFLGtDQUFrQyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQ3RGLE9BQU8sRUFBVyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUM3RCxPQUFPLEVBQUMsV0FBVyxFQUFFLGtCQUFrQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7OztBQUt0RSxNQUFNLE9BQU8sV0FBVztJQUNwQixZQUNZLGNBQXFDO1FBQXJDLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtJQUVqRCxDQUFDO0lBRUQsa0hBQWtIO0lBQ2xILFdBQVcsQ0FBQyxHQUFzRjtRQUM5RixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQy9CLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNsQix3RkFBd0Y7WUFDeEYsNEJBQTRCLEVBQUUsR0FBRyxD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Q0FBRSxHQUF1QjtRQUMvQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FDNUQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ04sSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3JCLE9BQU8sRUFBRSxDQUFDO2FBQ2I7WUFDRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUMsUUFBUSxFQUFFLEtBQUssRUFBQyxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQTtRQUMzSSxDQUFDLENBQUMsQ0FDTCxDQUFBO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FBQyxHQUFvRDtRQUN6RCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxVQUFVLENBQUMsR0FBdUQ7UUFDOUQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQyxDQUFDOzt3R0ExZlEsV0FBVzs0R0FBWCxXQUFXLGNBREMsTUFBTTsyRkFDbEIsV0FBVztrQkFEdkIsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7bWFwLCBtYXBUb30gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBDcmVhdGVDYWxlbmRhclJlcXVlc3RJbnRlcmZhY2UsXG4gICAgQ3JlYXRlQ2FsZW5kYXJSZXNwb25zZSxcbiAgICBEYXlPZldlZWssIEdldEdyb3VwUmVzcG9uc2UsXG4gICAgR2V0SG9zdE1lZXRpbmdSZXNwb25zZSwgR2V0U2VydmljZVJlc3BvbnNlLFxuICAgIEhvc3RCb29rTWVldGluZ1JlcXVlc3RJbnRlcmZhY2UsXG4gICAgSG9zdEJvb2tNZWV0aW5nUmVzcG9uc2UsIElzQ2FsZW5kYXJDb25maWd1cmVkUmVxdWVzdEludGVyZmFjZSwgSXNDYWxlbmRhckNvbmZpZ3VyZWRSZXNwb25zZSxcbiAgICBJc0hvc3RDb25maWd1cmVkUmVzcG9uc2UsXG4gICAgTGlzdEF2YWlsYWJpbGl0eVJlcXVlc3RGaWx0ZXJzSW50ZXJmYWNlLFxuICAgIExpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3RGaWx0ZXJzLFxuICAgIExpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3RGaWx0ZXJzSW50ZXJmYWNlLFxuICAgIExpc3RCb29rZWRNZWV0aW5nc1Jlc3BvbnNlLFxuICAgIE1lZXRpbmdIb3N0QXBpU2VydmljZSxcbiAgICBQYWdlZFJlcXVlc3RPcHRpb25zLFxuICAgIFBhZ2VkUmVxdWVzdE9wdGlvbnNJbnRlcmZhY2UsIFNlbmRNZWV0aW5nUmVxdWVzdEVtYWlsUmVxdWVzdEludGVyZmFjZSxcbiAgICBUaW1lUmFuZ2UsXG4gICAgVGltZVJhbmdlSW50ZXJmYWNlLFxuICAgIFRpbWVab25lLFxuICAgIFRpbWVab25lSW50ZXJmYWNlLFxuICAgIFdlZWtkYXlBdmFpbGFiaWxpdHlcbn0gZnJvbSAnLi4vX2ludGVybmFsJztcbmltcG9ydCB7XG4gICAgQXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllc1NldCxcbiAgICBBdmFpbGFiaWxpdHlSdWxlLFxuICAgIENhbGVuZGFyLFxuICAgIENhbGVuZGFyRnJvbUFwaSxcbiAgICBnZXRGaWVsZE1hc2ssIEdyb3VwLCBHcm91cEZyb21BcGksIEdyb3VwVHlwZVRvQVBpLFxuICAgIEhvc3RVcmxNYXAsXG4gICAgTWVldGluZyxcbiAgICBtZWV0aW5nRnJvbUFwaSxcbiAgICBNZWV0aW5nTWV0YWRhdGEsXG4gICAgTWVldGluZ1R5cGUsXG4gICAgTWVldGluZ1R5cGVGcm9tQXBpLFxuICAgIE1lZXRpbmdUeXBlVG9BcGksXG4gICAgUGFnZWRSZXNwb25zZSxcbiAgICBQcmVmZXJlbmNlcyxcbiAgICBQcmVmZXJlbmNlc0Zyb21BcGksIFNlcnZpY2UsIFNlcnZpY2VGcm9tQXBpLCBTZXJ2aWNlVHlwZVRvQXBpXG59IGZyb20gJy4uL3NoYXJlZCc7XG5pbXBvcnQge2dldEJvb2tpbmdVcmxJbXBsZW1lbnRhdGlvbiwgZ2V0R2VuZXJhbEJvb2tpbmdVcmxJbXBsZW1lbnRhdGlvbn0gZnJvbSAnLi91cmwnO1xuaW1wb3J0IHtIb3N0VXNlciwgaG9zdFVzZXJGcm9tQXBpfSBmcm9tICcuLi9zaGFyZWQvaG9zdC11c2VyJ1xuaW1wb3J0IHtFbnZpcm9ubWVudCwgb25Qcm9kdWN0aW9uR2xvYmFsfSBmcm9tIFwiLi4vc2hhcmVkL2Vudmlyb25tZW50XCI7XG5pbXBvcnQgeyBIdHRwUmVzcG9uc2V9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuXG5cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIEhvc3RTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBob3N0QVBJU2VydmljZTogTWVldGluZ0hvc3RBcGlTZXJ2aWNlLFxuICAgICkge1xuICAgIH1cblxuICAgIC8vIFVzZSBidWlsZEhvc3RJZCB0byBnZXQgYW4gaWRlbnRpZmllciB0aGF0IGNhbiBiZSB1c2VkIGluIHN1YnNlcXVlbnQgcmVxdWVzdHMuIFNlZSB2ZW5kYXN0YWFwaXMgZm9yIG1vcmUgZGV0YWlsc1xuICAgIGJ1aWxkSG9zdElkKHJlcTogeyB1c2VySWQ6IHN0cmluZywgYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllczogQXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllc1NldCB9KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UuYnVpbGRIb3N0SWQoe1xuICAgICAgICAgICAgICAgIHVzZXJJZDogcmVxLnVzZXJJZCxcbiAgICAgICAgICAgICAgICAvLyBHcm9zcyB0eXBlY2FzdCBleGlzdHMgYmVjYXVzZSBJIHdhbnQgdG8gcmVzdHJpY3QgdGhlIHByb3BlcnRpZXMgb24gdGhlIG1hcCAoZm9yIG5vdykuXG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllczogcmVxLmFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXMgYXMgYW55IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKS5waXBlKG1hcChyZXMgPT4gcmVzLmhvc3RJZCB8fCAnJykpO1xuICAgIH1cblxuICAgIGRvZXNDYWxlbmRhckV4aXN0KGNhbGVuZGFySWRlbnRpZmllcjogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmRvZXNDYWxlbmRhckV4aXN0KHtjYWxlbmRhcklkZW50aWZpZXI6IGNhbGVuZGFySWRlbnRpZmllcn0pLnBpcGUoXG4gICAgICAgICAgICBtYXAocmVzcCA9PiByZXNwLmV4aXN0cylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRDYWxlbmRhcihyZXE6IHsgY2FsZW5kYXJJZDogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPENhbGVuZGFyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmdldENhbGVuZGFyKHtjYWxlbmRhcklkOiByZXEuY2FsZW5kYXJJZH0pLnBpcGUoXG4gICAgICAgICAgICBtYXAocmVzID0+IENhbGVuZGFyRnJvbUFwaShyZXM/LmNhbGVuZGFyKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBlbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzKHJlcToge1xuICAgICAgICB1c2VySWQ6IHN0cmluZyxcbiAgICAgICAgYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllczogQXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllc1NldFxuICAgIH0pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS5lbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzKHtcbiAgICAgICAgICAgIHVzZXJJZDogcmVxLnVzZXJJZCxcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXM6IHJlcS5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzIGFzIGFueSBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9LFxuICAgICAgICB9KS5waXBlKG1hcChyZXMgPT4gcmVzID8gcmVzLmNhbGVuZGFySWQgOiAnJykpO1xuICAgIH1cblxuICAgIGVuc3VyZUdyb3VwQ2FsZW5kYXJzRXhpc3QocmVxOiB7IGV4dGVybmFsSWRzOiBzdHJpbmdbXSB9KTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS5lbnN1cmVHcm91cENhbGVuZGFyc0V4aXN0KHtleHRlcm5hbElkczogcmVxLmV4dGVybmFsSWRzfSkucGlwZShcbiAgICAgICAgICAgIG1hcChyZXMgPT4gcmVzPy5jYWxlbmRhcklkcyB8fCBbXSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICBjcmVhdGVDYWxlbmRhciBjcmVhdGVzIGEgY2FsZW5kYXIgd2hpY2ggbWVldGluZyB0eXBlcyBjYW4gYmUgY3JlYXRlZCBmb3IgYW5kIGV2ZW50cyBjYW4gYmUgYm9va2VkIG9uXG4gICAgIFRoZSBmaWVsZHMgb2YgYSBjYWxlbmRhciBhcmUgZG9jdW1lbnRlZCBpbiBodHRwczovL2dpdGh1Yi5jb20vdmVuZGFzdGEvdmVuZGFzdGFhcGlzL2Jsb2IvbWFzdGVyL21lZXRpbmdzL3YxL3NoYXJlZC5wcm90b1xuICAgICovXG4gICAgY3JlYXRlQ2FsZW5kYXIocmVxOiBDcmVhdGVDYWxlbmRhclJlcXVlc3RJbnRlcmZhY2UpOiBPYnNlcnZhYmxlPENyZWF0ZUNhbGVuZGFyUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UuY3JlYXRlQ2FsZW5kYXIocmVxKTtcbiAgICB9XG5cbiAgICB1cGRhdGVDYWxlbmRhclNsdWcoY2FsZW5kYXJJZDogc3RyaW5nLCBuZXdTbHVnOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UudXBkYXRlQ2FsZW5kYXIoe1xuICAgICAgICAgICAgY2FsZW5kYXJJZDogY2FsZW5kYXJJZCxcbiAgICAgICAgICAgIGNhbGVuZGFyVXBkYXRlOiB7c2x1ZzogbmV3U2x1Z30sXG4gICAgICAgICAgICBmaWVsZE1hc2s6IHtwYXRoczogWydzbHVnJ119LFxuICAgICAgICB9KS5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICAgIH1cblxuICAgIHVwZGF0ZUNhbGVuZGFySG9zdFVzZXJJRHMoY2FsZW5kYXJJZDogc3RyaW5nLCByZXBsYWNlbWVudEhvc3RVc2VySWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS51cGRhdGVDYWxlbmRhcih7XG4gICAgICAgICAgICBjYWxlbmRhcklkOiBjYWxlbmRhcklkLFxuICAgICAgICAgICAgY2FsZW5kYXJVcGRhdGU6IHtob3N0VXNlcklkczogcmVwbGFjZW1lbnRIb3N0VXNlcklkc30sXG4gICAgICAgICAgICBmaWVsZE1hc2s6IHtwYXRoczogWydob3N0X3VzZXJfaWRzJ119LFxuICAgICAgICB9KS5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICAgIH1cblxuICAgIGdldE1lZXRpbmdUeXBlc0ZvckNhbGVuZGFycyhyZXE6IHtcbiAgICAgICAgY2FsZW5kYXJJZHM6IHN0cmluZ1tdLFxuICAgICAgICBtZXRhZGF0YTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH1cbiAgICB9KTogT2JzZXJ2YWJsZTx7IFtjYWxlbmRhcklkOiBzdHJpbmddOiBNZWV0aW5nVHlwZVtdIH0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UuZ2V0TWVldGluZ1R5cGVzRm9yQ2FsZW5kYXJzKHtjYWxlbmRhcklkczogcmVxLmNhbGVuZGFySWRzfSkucGlwZShcbiAgICAgICAgICAgIG1hcChyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVzPy5jYWxlbmRhck1lZXRpbmdUeXBlc01hcCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXMuY2FsZW5kYXJNZWV0aW5nVHlwZXNNYXApLnJlZHVjZSgoY2FsZW5kYXJUb01lZXRpbmdUeXBlTWFwLCBjYWxlbmRhcklkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZXRpbmdUeXBlcyA9IChyZXMuY2FsZW5kYXJNZWV0aW5nVHlwZXNNYXBbY2FsZW5kYXJJZF0/Lm1lZXRpbmdUeXBlcyB8fCBbXSkubWFwKG10ID0+IE1lZXRpbmdUeXBlRnJvbUFwaSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZWV0aW5nVHlwZUFwaTogbXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudDogb25Qcm9kdWN0aW9uR2xvYmFsKCkgPyBFbnZpcm9ubWVudC5QUk9EIDogRW52aXJvbm1lbnQuREVNTyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVxLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jYWxlbmRhclRvTWVldGluZ1R5cGVNYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2FsZW5kYXJJZF06IG1lZXRpbmdUeXBlcyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LCB7fSBhcyB7IFtjYWxlbmRhcklkOiBzdHJpbmddOiBNZWV0aW5nVHlwZVtdIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgfVxuXG4gICAgLypcbiAgICAgbGlzdE1lZXRpbmdUeXBlcyByZXR1cm5zIGEgbGlzdCBvZiBtZWV0aW5nIHR5cGVzIGZvciBhIGhvc3RcbiAgICAgQHBhcmFtIGhvc3RJZDogQW4gaWRlbnRpZmllciBmb3IgYW4gaW5kaXZpZHVhbCBob3N0XG4gICAgIEBwYXJhbSBtZXRhZGF0YTogb3B0aW9uYWwgbWV0YWRhdGEgdG8gaW5jbHVkZSBvbiB0aGUgbWVldGluZyB0eXBlIGJvb2tpbmcgbGlua1xuICAgICBAcGFyYW0gY2FsZW5kYXJTbHVnOiB1c2VkIHRvIHJlcGxhY2UgaG9zdElkIGluIHRoZSB1cmwuIFVzZSBpdCB3aGVuIHlvdSBhcmUgY29uZmlkZW50IHlvdSBrbm93IHRoZSBob3N0J3Mgc2x1Zy5cbiAgICAgICAgLSBjYWxlbmRhclNsdWcgSVMgTk9UIFVTRUQgVE8gUkVUUklFVkUgTUVFVElORyBUWVBFUywgT05MWSBUTyBNQUtFIFRIRSBCT09LSU5HIFVSTFNcbiAgICAqL1xuICAgIGxpc3RNZWV0aW5nVHlwZXMocmVxOiB7XG4gICAgICAgIGhvc3RJZDogc3RyaW5nLFxuICAgICAgICBtZXRhZGF0YT86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9XG4gICAgICAgIGNhbGVuZGFyU2x1Zz86IHN0cmluZyxcbiAgICB9KTogT2JzZXJ2YWJsZTxNZWV0aW5nVHlwZVtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmxpc3RNZWV0aW5nVHlwZXMocmVxKS5waXBlKFxuICAgICAgICAgICAgbWFwKHJlc3AgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVzcCB8fCAhcmVzcC5tZWV0aW5nVHlwZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcC5tZWV0aW5nVHlwZXMubWFwKG10ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1lZXRpbmdUeXBlRnJvbUFwaSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZWV0aW5nVHlwZUFwaTogbXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhcklkOiByZXEuaG9zdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQ6IG9uUHJvZHVjdGlvbkdsb2JhbCgpID8gRW52aXJvbm1lbnQuUFJPRCA6IEVudmlyb25tZW50LkRFTU8sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVxLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJTbHVnOiByZXEuY2FsZW5kYXJTbHVnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvKlxuICAgICBnZXRCb29raW5nVXJsIHJldHVybnMgYSBsaW5rIHRoYXQgY2FuIGJlIHVzZWQgdG8gYm9vayBhIG1lZXRpbmcgd2l0aCB0aGlzIGhvc3QuXG4gICAgIEBwYXJhbSBjYWxlbmRhcklkOiBBbiBpZGVudGlmaWVyIGZvciBhbiBpbmRpdmlkdWFsIGhvc3Qgb3IgZ3JvdXBpbmcgb2YgaG9zdHMgKGkuZS4sIHRlYW0pLlxuICAgICBAcGFyYW0gQGRlcHJlY2F0ZWQgaG9zdElkOiBBbiBpZGVudGlmaWVyIGZvciBhbiBpbmRpdmlkdWFsIGhvc3QuXG4gICAgIEBwYXJhbSBtZWV0aW5nVHlwZUlkOiBBbiBvcHRpb25hbCBpZGVudGlmaWVyIGZvciB0aGUgbWVldGluZyB0eXBlLiBEZWZhdWx0OiAzMC1taW51dGVzLlxuICAgICBAcGFyYW0gbWV0YWRhdGE6IG9wdGlvbmFsIG1ldGFkYXRhIHRvIGluY2x1ZGUgaW4gdGhlIHVybC5cbiAgICAgLSBtZXRhZGF0YSBjYW4gYmUgdXNlZCB0byBwcmUtZmlsbCBjZXJ0YWluIGZvcm0gZmllbGRzIGFuZCB3aWxsIGJlIHN0b3JlZCBkdXJpbmcgdGhlIGJvb2tpbmcgcHJvY2Vzcy5cbiAgICAgLSBtZXRhZGF0YSBjYW4gYmUgb2J0YWluZWQgYnkgc3Vic2NyaWJpbmcgdG8gdGhlIGJvb2tpbmcgZXZlbnQuXG4gICAgQHBhcmFtIGNhbGVuZGFyU2x1ZzogdXNlZCB0byByZXBsYWNlIGhvc3RJZCBpbiB0aGUgdXJsLiBVc2UgaXQgd2hlbiB5b3UgYXJlIGNvbmZpZGVudCB5b3Uga25vdyB0aGUgaG9zdCdzIHNsdWcuXG4gICAgICovXG4gICAgZ2V0Qm9va2luZ1VybChcbiAgICAgICAgcmVxOiB7XG4gICAgICAgICAgICAvLyBAZGVwcmVjYXRlZDogdXNlIGNhbGVuZGFySWQgaW5zdGVhZC4gY2FsZW5kYXJJZCBub3QgcmVxdWlyZWQgdG8gYXZvaWQgYnJlYWtpbmcgZXhpc3RpbmcgY2xpZW50cy5cbiAgICAgICAgICAgIGhvc3RJZDogc3RyaW5nLFxuICAgICAgICAgICAgY2FsZW5kYXJJZD86IHN0cmluZyxcbiAgICAgICAgICAgIC8vIEBkZXByZWNhdGVkOiB1c2UgbWVldGluZ1R5cGVTbHVnIGluc3RlYWRcbiAgICAgICAgICAgIG1lZXRpbmdUeXBlSWQ/OiBzdHJpbmcsXG4gICAgICAgICAgICBtZWV0aW5nVHlwZVNsdWc/OiBzdHJpbmcsXG4gICAgICAgICAgICBtZXRhZGF0YT86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9LFxuICAgICAgICAgICAgY2FsZW5kYXJTbHVnPzogc3RyaW5nLFxuICAgICAgICB9KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG9mKGdldEJvb2tpbmdVcmxJbXBsZW1lbnRhdGlvbih7XG4gICAgICAgICAgICAgICAgLi4ucmVxLFxuICAgICAgICAgICAgICAgIGNhbGVuZGFySWQ6IHJlcS5jYWxlbmRhcklkIHx8IHJlcS5ob3N0SWQsXG4gICAgICAgICAgICAgICAgZW52aXJvbm1lbnQ6IG9uUHJvZHVjdGlvbkdsb2JhbCgpID8gRW52aXJvbm1lbnQuUFJPRCA6IEVudmlyb25tZW50LkRFTU8sXG4gICAgICAgICAgICAgICAgY2FsZW5kYXJTbHVnOiByZXEuY2FsZW5kYXJTbHVnLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICBnZXRHZW5lcmFsQm9va2luZ1VybCByZXR1cm5zIGEgbGluayB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlbGVjdCBhIG1lZXRpbmcgdHlwZSB0byBib29rIHdpdGggdGhlIGdpdmVuIGNhbGVuZGFyLlxuICAgICBAcGFyYW0gY2FsZW5kYXJJZDogQW4gaWRlbnRpZmllciBmb3IgYW4gaW5kaXZpZHVhbCBob3N0IG9yIGdyb3VwaW5nIG9mIGhvc3RzIChpLmUuLCB0ZWFtKS5cbiAgICAgQHBhcmFtIG1ldGFkYXRhOiBvcHRpb25hbCBtZXRhZGF0YSB0byBpbmNsdWRlIGluIHRoZSB1cmwuXG4gICAgIC0gbWV0YWRhdGEgY2FuIGJlIHVzZWQgdG8gcHJlLWZpbGwgY2VydGFpbiBmb3JtIGZpZWxkcyBhbmQgd2lsbCBiZSBzdG9yZWQgZHVyaW5nIHRoZSBib29raW5nIHByb2Nlc3MuXG4gICAgIC0gbWV0YWRhdGEgY2FuIGJlIG9idGFpbmVkIGJ5IHN1YnNjcmliaW5nIHRvIHRoZSBib29raW5nIGV2ZW50LlxuICAgICBAcGFyYW0gY2FsZW5kYXJTbHVnOiB1c2VkIHRvIHJlcGxhY2UgaG9zdElkIGluIHRoZSB1cmwuIFVzZSBpdCB3aGVuIHlvdSBhcmUgY29uZmlkZW50IHlvdSBrbm93IHRoZSBob3N0J3Mgc2x1Zy5cbiAgICAgKi9cbiAgICBnZXRHZW5lcmFsQm9va2luZ1VybChyZXE6IHtcbiAgICAgICAgY2FsZW5kYXJJZDogc3RyaW5nLFxuICAgICAgICBtZXRhZGF0YT86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9LFxuICAgICAgICBjYWxlbmRhclNsdWc/OiBzdHJpbmcsXG4gICAgfSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBvZihnZXRHZW5lcmFsQm9va2luZ1VybEltcGxlbWVudGF0aW9uKHtcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBvblByb2R1Y3Rpb25HbG9iYWwoKSA/IEVudmlyb25tZW50LlBST0QgOiBFbnZpcm9ubWVudC5ERU1PLFxuICAgICAgICAgICAgY2FsZW5kYXJJZDogcmVxLmNhbGVuZGFySWQsXG4gICAgICAgICAgICBtZXRhZGF0YTogcmVxLm1ldGFkYXRhLFxuICAgICAgICAgICAgY2FsZW5kYXJTbHVnOiByZXEuY2FsZW5kYXJTbHVnLFxuICAgICAgICB9KSlcbiAgICB9XG5cbiAgICAvKlxuICAgICBnZXRCb29raW5nVXJsc011bHRpIHJldHVybnMgYSBtYXBwaW5nIG9mIGhvc3RzIC0+IGV2ZW50IHR5cGVzIC0+IGJvb2tpbmcgbGlua3MuXG4gICAgIEBwYXJhbSBjYWxlbmRhcklkOiBBbiBpZGVudGlmaWVyIGZvciBhbiBpbmRpdmlkdWFsIGhvc3Qgb3IgZ3JvdXBpbmcgb2YgaG9zdHMuXG4gICAgIEBwYXJhbSBtZWV0aW5nVHlwZVNsdWc6IG1lZXRpbmdUeXBlU2x1Z3MgYXJlIHBhc3NlZCBpbiB0aGUgZm9ybSB7aG9zdElkOiBbbWVldGluZ1R5cGVTbHVnMSwgbWVldGluZ1R5cGVTbHVnMl19XG4gICAgIEBwYXJhbSBtZXRhZGF0YTogb3B0aW9uYWwgbWV0YWRhdGEgdG8gaW5jbHVkZSBpbiB0aGUgdXJsLlxuICAgICAtIG1ldGFkYXRhIGNhbiBiZSB1c2VkIHRvIHByZS1maWxsIGNlcnRhaW4gZm9ybSBmaWVsZHMgYW5kIHdpbGwgYmUgc3RvcmVkIGR1cmluZyB0aGUgYm9va2luZyBwcm9jZXNzLlxuICAgICAtIG1ldGFkYXRhIGNhbiBiZSBvYnRhaW5lZCBieSBzdWJzY3JpYmluZyB0byB0aGUgYm9va2luZyBldmVudC5cbiAgICAgQHBhcmFtIGNhbGVuZGFyU2x1ZzogdXNlZCB0byByZXBsYWNlIGhvc3RJZCBpbiB0aGUgdXJsLiBVc2UgaXQgd2hlbiB5b3UgYXJlIGNvbmZpZGVudCB5b3Uga25vdyB0aGUgaG9zdCdzIHNsdWcuXG4gICAgICovXG4gICAgZ2V0Qm9va2luZ1VybHNNdWx0aShcbiAgICAgICAgcmVxOiB7IFtjYWxlbmRhcklkOiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgICAgICBtZXRhZGF0YT86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9LFxuICAgICAgICBjYWxlbmRhclNsdWc/OiBzdHJpbmdcbiAgICApOiBPYnNlcnZhYmxlPEhvc3RVcmxNYXA+IHtcbiAgICAgICAgcmV0dXJuIG9mKE9iamVjdC5rZXlzKHJlcSkucmVkdWNlKChob3N0TWFwLCBjYWxlbmRhcklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmhvc3RNYXAsXG4gICAgICAgICAgICAgICAgW2NhbGVuZGFySWRdOiByZXFbY2FsZW5kYXJJZF0ucmVkdWNlKChtZWV0aW5nVHlwZU1hcCwgbWVldGluZ1R5cGVTbHVnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5tZWV0aW5nVHlwZU1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFttZWV0aW5nVHlwZVNsdWddOiBnZXRCb29raW5nVXJsSW1wbGVtZW50YXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVldGluZ1R5cGVTbHVnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50OiBvblByb2R1Y3Rpb25HbG9iYWwoKSA/IEVudmlyb25tZW50LlBST0QgOiBFbnZpcm9ubWVudC5ERU1PLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyU2x1ZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSwge30gYXMgeyBbbWVldGluZ1R5cGVJZDogc3RyaW5nXTogc3RyaW5nIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCB7fSBhcyBIb3N0VXJsTWFwKSk7XG4gICAgfVxuXG4gICAgaXNIb3N0Q29uZmlndXJlZChyZXE6IHsgaG9zdElkOiBzdHJpbmcgfSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS5pc0hvc3RDb25maWd1cmVkKHJlcSkucGlwZShcbiAgICAgICAgICAgIG1hcCgocmVzcDogSXNIb3N0Q29uZmlndXJlZFJlc3BvbnNlKSA9PiByZXNwLmlzQ29uZmlndXJlZClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZXRHZW5lcmFsQXZhaWxhYmlsaXR5KHJlcToge1xuICAgICAgICBob3N0SWQ6IHN0cmluZyxcbiAgICAgICAgbWVldGluZ1R5cGVJZDogc3RyaW5nLFxuICAgICAgICAvLyBAZGVwcmVjYXRlZDogdXNlIHdlZWtkYXlzQXZhaWxhYmlsaXR5IGluc3RlYWRcbiAgICAgICAgZGF5cz86IERheU9mV2Vla1tdLFxuICAgICAgICAvLyBAZGVwcmVjYXRlZDogdXNlIHdlZWtkYXlzQXZhaWxhYmlsaXR5IGluc3RlYWRcbiAgICAgICAgdGltZVNsb3Q/OiBUaW1lUmFuZ2VJbnRlcmZhY2UsXG4gICAgICAgIHdlZWtkYXlzQXZhaWxhYmlsaXR5PzogV2Vla2RheUF2YWlsYWJpbGl0eVtdLFxuICAgICAgICB0aW1lWm9uZTogVGltZVpvbmVJbnRlcmZhY2UsXG4gICAgfSk6IE9ic2VydmFibGU8bnVsbD4ge1xuICAgICAgICBjb25zdCBhcGlSZXEgPSB7XG4gICAgICAgICAgICAuLi5yZXEsXG4gICAgICAgICAgICB0aW1lWm9uZTogbmV3IFRpbWVab25lKHJlcS50aW1lWm9uZSksXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcS50aW1lU2xvdCkge1xuICAgICAgICAgICAgYXBpUmVxLnRpbWVTbG90ID0gbmV3IFRpbWVSYW5nZShyZXEudGltZVNsb3QpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2Uuc2V0R2VuZXJhbEF2YWlsYWJpbGl0eShhcGlSZXEpLnBpcGUobWFwVG8obnVsbCkpXG4gICAgfVxuXG4gICAgbGlzdEJvb2tlZE1lZXRpbmdzKHJlcToge1xuICAgICAgICBmaWx0ZXJzOiBMaXN0Qm9va2VkTWVldGluZ3NSZXF1ZXN0RmlsdGVyc0ludGVyZmFjZSxcbiAgICAgICAgY3Vyc29yOiBzdHJpbmcsXG4gICAgICAgIHBhZ2VTaXplOiBudW1iZXIsXG4gICAgICAgIHRpbWVab25lOiBUaW1lWm9uZUludGVyZmFjZSxcbiAgICB9KTogT2JzZXJ2YWJsZTxQYWdlZFJlc3BvbnNlPE1lZXRpbmc+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmxpc3RCb29rZWRNZWV0aW5ncyh7XG4gICAgICAgICAgICAuLi5yZXEsXG4gICAgICAgICAgICBwYWdpbmdPcHRpb25zOiBuZXcgUGFnZWRSZXF1ZXN0T3B0aW9ucyh7Y3Vyc29yOiByZXEuY3Vyc29yLCBwYWdlU2l6ZTogcmVxLnBhZ2VTaXplfSksXG4gICAgICAgICAgICBmaWx0ZXJzOiBuZXcgTGlzdEJvb2tlZE1lZXRpbmdzUmVxdWVzdEZpbHRlcnMocmVxLmZpbHRlcnMpLFxuICAgICAgICAgICAgdGltZVpvbmU6IG5ldyBUaW1lWm9uZShyZXEudGltZVpvbmUpLFxuICAgICAgICB9KS5waXBlKFxuICAgICAgICAgICAgbWFwKChyZXNwOiBMaXN0Qm9va2VkTWVldGluZ3NSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lZXRpbmdzID0gKHJlc3AubWVldGluZ3MgfHwgW10pLm1hcChtZWV0aW5nID0+IG1lZXRpbmdGcm9tQXBpKG1lZXRpbmcpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VkUmVzcG9uc2UobWVldGluZ3MsIHJlc3AucGFnaW5nTWV0YWRhdGEubmV4dEN1cnNvciwgcmVzcC5wYWdpbmdNZXRhZGF0YS5oYXNNb3JlKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNhbmNlbE1lZXRpbmcocmVxOiB7XG4gICAgICAgIG1lZXRpbmdJZDogc3RyaW5nLFxuICAgICAgICBjYW5jZWxsYXRpb25SZWFzb246IHN0cmluZ1xuICAgIH0pOiBPYnNlcnZhYmxlPG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UuY2FuY2VsTWVldGluZyh7XG4gICAgICAgICAgICAuLi5yZXFcbiAgICAgICAgfSkucGlwZShtYXBUbyhudWxsKSlcbiAgICB9XG5cbiAgICByZXNjaGVkdWxlTWVldGluZyhyZXE6IHtcbiAgICAgICAgbWVldGluZ0lkOiBzdHJpbmcsXG4gICAgICAgIHN0YXJ0OiBEYXRlXG4gICAgfSk6IE9ic2VydmFibGU8bnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS5yZXNjaGVkdWxlTWVldGluZyh7XG4gICAgICAgICAgICAuLi5yZXFcbiAgICAgICAgfSkucGlwZShtYXBUbyhudWxsKSlcbiAgICB9XG5cbiAgICBsaXN0QXZhaWxhYmlsaXR5KHJlcToge1xuICAgICAgICBmaWx0ZXJzOiBMaXN0QXZhaWxhYmlsaXR5UmVxdWVzdEZpbHRlcnNJbnRlcmZhY2UsXG4gICAgICAgIHBhZ2luZ09wdGlvbnM6IFBhZ2VkUmVxdWVzdE9wdGlvbnNJbnRlcmZhY2UsXG4gICAgICAgIHRpbWVab25lOiBUaW1lWm9uZUludGVyZmFjZSxcbiAgICB9KTogT2JzZXJ2YWJsZTxQYWdlZFJlc3BvbnNlPEF2YWlsYWJpbGl0eVJ1bGU+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmxpc3RBdmFpbGFiaWxpdHkocmVxKS5waXBlKFxuICAgICAgICAgICAgbWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gKHJlc3BvbnNlLmF2YWlsYWJpbGl0eVJ1bGVzIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikubWFwKGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaG9zdElkOiBhLmhvc3RJZCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lZXRpbmdUeXBlSWQ6IGEubWVldGluZ1R5cGVJZCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRheTogYS5kYXksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdDogYS50aW1lU2xvdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVab25lOiBhLnRpbWVab25lLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYWdlZFJlc3BvbnNlKHJlc3VsdHMsIHJlc3BvbnNlLm1ldGFkYXRhLm5leHRDdXJzb3IsIHJlc3BvbnNlLm1ldGFkYXRhLmhhc01vcmUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qIHVwZGF0ZVByZWZlcmVuY2VzIHdpbGwgdXBkYXRlIHRoZSBob3N0J3MgcHJlZmVyZW5jZXMuXG4gICAgICogSXQgaXMgZ3VhcmFudGVlZCB0byBvbmx5IHVwZGF0ZSB0aGUgZmllbGRzIHByb3ZpZGVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqICB1cGRhdGVQcmVmZXJlbmNlcyh7bWVldGluZ0ludGVncmF0aW9uOiBNZWV0aW5nU291cmNlLk1FRVRJTkdfU09VUkNFX0dPT0dMRV9NRUVUfSlcbiAgICAgKiAgd2lsbCBvbmx5IHVwZGF0ZSB0aGUgcHJlZmVyZW5jZSBtZWV0aW5nSW50ZWdyYXRpb24gdG8gR29vZ2xlIE1lZXQuIEtlZXBpbmcgdGhlIG90aGVyIHByZWZlcmVuY2VzIHRoZSBzYW1lLlxuICAgICAqXG4gICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBwcm92aWRlIGEgbGlzdCBvZiBrZXlzIHRvIHVwZGF0ZSBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqICAgdXBkYXRlUHJlZmVyZW5jZXMoey4uLm9iamVjdCB3aXRoIGFsbCBmaWVsZHN9LCBbJ21lZXRpbmdJbnRlZ3JhdGlvbiddKVxuICAgICAqICAgd2lsbCBvbmx5IHVwZGF0ZSB0aGUgZmllbGQgJ21lZXRpbmdJbnRlZ3JhdGlvbicgdG8gdGhlIHZhbHVlIGluIHByZWZlcmVuY2VzLlxuICAgICAqXG4gICAgICogQ2FsbGluZyB3aXRoIGFuIGVtcHR5IG9iamVjdCBhbmQgbm8ga2V5cyBpcyBhIG5vLW9wLCBvciBhbiB1bmRlZmluZWQgb2JqZWN0LlxuICAgICAqIENhbGxpbmcgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyBmaWVsZHMgbm90IGluIGBQcmVmZXJlbmNlc2Agb3Igd2l0aCB1cGRhdGVGaWVsZHMgbm90IGxpbmtlZCB0byBwcm9wZXJ0aWVzIGluXG4gICAgICogYFByZWZlcmVuY2VzYCBpcyBhbiBlcnJvci5cbiAgICAgKi9cbiAgICB1cGRhdGVQcmVmZXJlbmNlcyhyZXE6IHsgaG9zdElkOiBzdHJpbmcsIHByZWZlcmVuY2VzOiBQYXJ0aWFsPFByZWZlcmVuY2VzPiwgdXBkYXRlRmllbGRzPzogKGtleW9mIFByZWZlcmVuY2VzKVtdIH0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZmllbGRNYXNrID0gZ2V0RmllbGRNYXNrKHtvOiByZXEucHJlZmVyZW5jZXMsIHVwZGF0ZUZpZWxkczogcmVxLnVwZGF0ZUZpZWxkc30pO1xuICAgICAgICBpZiAoZmllbGRNYXNrLnBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UudXBkYXRlSG9zdFByZWZlcmVuY2VzKHtcbiAgICAgICAgICAgIGhvc3RJZDogcmVxLmhvc3RJZCxcbiAgICAgICAgICAgIHByZWZlcmVuY2VzOiByZXEucHJlZmVyZW5jZXMsXG4gICAgICAgICAgICBmaWVsZE1hc2ssXG4gICAgICAgIH0pLnBpcGUobWFwVG8odW5kZWZpbmVkKSk7XG4gICAgfVxuXG4gICAgZ2V0UHJlZmVyZW5jZXMocmVxOiB7IGhvc3RJZDogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPFByZWZlcmVuY2VzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmdldEhvc3RQcmVmZXJlbmNlcyh7XG4gICAgICAgICAgICBob3N0SWQ6IHJlcS5ob3N0SWRcbiAgICAgICAgfSkucGlwZShtYXAocmVzcG9uc2UgPT4gUHJlZmVyZW5jZXNGcm9tQXBpKHJlc3BvbnNlLnByZWZlcmVuY2VzKSkpXG4gICAgfVxuXG4gICAgZ2V0TWVldGluZyhtZWV0aW5nSWQ6IHN0cmluZywgbG9jYXRpb246IHN0cmluZyk6IE9ic2VydmFibGU8TWVldGluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS5nZXRIb3N0TWVldGluZyh7XG4gICAgICAgICAgICBtZWV0aW5nSWQ6IG1lZXRpbmdJZCwgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICB9KS5waXBlKFxuICAgICAgICAgICAgbWFwKChyZXNwOiBHZXRIb3N0TWVldGluZ1Jlc3BvbnNlKSA9PiBtZWV0aW5nRnJvbUFwaShyZXNwLm1lZXRpbmcpKVxuICAgICAgICApXG4gICAgfVxuXG4gICAgdXBkYXRlTWVldGluZ01ldGFkYXRhKHJlcTogeyBtZWV0aW5nSWQ6IHN0cmluZywgbWV0YWRhdGE6IE1lZXRpbmdNZXRhZGF0YSB9KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLnVwZGF0ZU1lZXRpbmdNZXRhZGF0YSh7XG4gICAgICAgICAgICBtZWV0aW5nSWQ6IHJlcS5tZWV0aW5nSWQsXG4gICAgICAgICAgICBtZXRhZGF0YTogcmVxLm1ldGFkYXRhXG4gICAgICAgIH0pLnBpcGUobWFwVG8odW5kZWZpbmVkKSk7XG4gICAgfVxuXG4gICAgYm9va01lZXRpbmcocmVxOiBIb3N0Qm9va01lZXRpbmdSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UuYm9va01lZXRpbmcocmVxKS5waXBlKG1hcCgocmVzcDogSG9zdEJvb2tNZWV0aW5nUmVzcG9uc2UpID0+IHJlc3AubWVldGluZ0lkKSk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlRGVmYXVsdE1lZXRpbmdUeXBlcyB3aWxsIGNyZWF0ZSB3aGF0IE1lZXRpbmcgU2NoZWR1bGVyIGRlZW1zIHRvIGJlIHRoZSBkZWZhdWx0IG1lZXRpbmcgdHlwZXMuXG4gICAgLy8gSWYgdGhlIGNhbGVuZGFyIGFscmVhZHkgaGFzIG1lZXRpbmcgdHlwZXMsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSBhIG5vLW9wLlxuICAgIGNyZWF0ZURlZmF1bHRNZWV0aW5nVHlwZXMocmVxOiB7IGNhbGVuZGFySWRzOiBzdHJpbmdbXSwgfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS5jcmVhdGVEZWZhdWx0TWVldGluZ1R5cGVzKHtjYWxlbmRhcklkczogcmVxLmNhbGVuZGFySWRzfSkucGlwZShtYXBUbyh1bmRlZmluZWQpKTtcbiAgICB9XG5cbiAgICBjcmVhdGVNZWV0aW5nVHlwZShyZXE6IHsgbWVldGluZ1R5cGU6IE1lZXRpbmdUeXBlLCB1cGRhdGVGaWVsZHM/OiAoa2V5b2YgTWVldGluZ1R5cGUpW10sIEhvc3RJZD86IHN0cmluZyB9KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZmllbGRNYXNrID0gZ2V0RmllbGRNYXNrKHtvOiByZXEubWVldGluZ1R5cGUsIHVwZGF0ZUZpZWxkczogcmVxLnVwZGF0ZUZpZWxkc30pO1xuICAgICAgICBpZiAoZmllbGRNYXNrLnBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UuY3JlYXRlTWVldGluZ1R5cGUoe1xuICAgICAgICAgICAgbWVldGluZ1R5cGU6IE1lZXRpbmdUeXBlVG9BcGkoe21lZXRpbmdUeXBlOiByZXEubWVldGluZ1R5cGV9KSxcbiAgICAgICAgICAgIGZpZWxkTWFzayxcbiAgICAgICAgICAgIGhvc3RJZDogcmVxLkhvc3RJZH0pXG4gICAgICAgICAgICAucGlwZShtYXAocmVzID0+IHJlcy5pZCkpO1xuICAgIH1cblxuICAgIC8qIHVwZGF0ZU1lZXRpbmdUeXBlIHdpbGwgdXBkYXRlIHRoZSBtZWV0aW5nIHR5cGUgZmllbGRzLlxuICAgICAqIEl0IGlzIGd1YXJhbnRlZWQgdG8gb25seSB1cGRhdGUgdGhlIGZpZWxkcyBwcm92aWRlZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiAgdXBkYXRlTWVldGluZ1R5cGUoe25hbWU6ICdPbmJvYXJkaW5nJ30pXG4gICAgICogIHdpbGwgb25seSB1cGRhdGUgdGhlIGZpZWxkICduYW1lJyB0byAnT25ib2FyZGluZycuIEtlZXBpbmcgdGhlIG90aGVyIGZpZWxkcyB0aGUgc2FtZS5cbiAgICAgKlxuICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcHJvdmlkZSBhIGxpc3Qgb2Yga2V5cyB0byB1cGRhdGUgYXMgdGhlIHNlY29uZCBhcmd1bWVudC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiAgIHVwZGF0ZU1lZXRpbmdUeXBlKHsuLi5vYmplY3Qgd2l0aCBhbGwgZmllbGRzfSwgWyduYW1lJ10pXG4gICAgICogICB3aWxsIG9ubHkgdXBkYXRlIHRoZSBmaWVsZCAnbmFtZScgdG8gdGhlIHZhbHVlIHBhc3NlZCBpbi5cbiAgICAgKlxuICAgICAqIENhbGxpbmcgd2l0aCBhbiBlbXB0eSBvYmplY3QgYW5kIG5vIGtleXMgaXMgYSBuby1vcCwgb3IgYW4gdW5kZWZpbmVkIG9iamVjdC5cbiAgICAgKiBDYWxsaW5nIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgZmllbGRzIG5vdCBpbiBgTWVldGluZ1R5cGVgIG9yIHdpdGggdXBkYXRlRmllbGRzIG5vdCBsaW5rZWQgdG8gcHJvcGVydGllcyBpblxuICAgICAqIGBNZWV0aW5nVHlwZWAgaXMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgdXBkYXRlTWVldGluZ1R5cGUocmVxOiB7IGlkOiBzdHJpbmcsIG1lZXRpbmdUeXBlOiBQYXJ0aWFsPE1lZXRpbmdUeXBlPiwgdXBkYXRlRmllbGRzPzogKGtleW9mIE1lZXRpbmdUeXBlKVtdLCBIb3N0SWQ/OiBzdHJpbmcgfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBmaWVsZE1hc2sgPSBnZXRGaWVsZE1hc2soe286IHJlcS5tZWV0aW5nVHlwZSwgdXBkYXRlRmllbGRzOiByZXEudXBkYXRlRmllbGRzfSk7XG4gICAgICAgIGlmIChmaWVsZE1hc2sucGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS51cGRhdGVNZWV0aW5nVHlwZSh7XG4gICAgICAgICAgICBpZDogcmVxLmlkLFxuICAgICAgICAgICAgbWVldGluZ1R5cGU6IE1lZXRpbmdUeXBlVG9BcGkoe21lZXRpbmdUeXBlOiByZXEubWVldGluZ1R5cGV9KSxcbiAgICAgICAgICAgIGZpZWxkTWFzayxcbiAgICAgICAgICAgIGhvc3RJZDogcmVxLkhvc3RJZFxuICAgICAgICB9KS5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICAgIH1cblxuICAgIGRlbGV0ZU1lZXRpbmdUeXBlKHJlcTogeyBpZDogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UuZGVsZXRlTWVldGluZ1R5cGUoe2lkOiByZXEuaWR9KS5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICAgIH1cblxuICAgIGdldEhvc3RzRm9yQ2FsZW5kYXIocmVxOiB7IGNhbGVuZGFySWQ6IHN0cmluZyB9KTogT2JzZXJ2YWJsZTxIb3N0VXNlcltdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmdldEhvc3RzRm9yQ2FsZW5kYXIoe2NhbGVuZGFySWQ6IHJlcS5jYWxlbmRhcklkfSkucGlwZShcbiAgICAgICAgICAgIG1hcChyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAocmVzLmhvc3RVc2VycyB8fCBbXSkubWFwKGhvc3R1c2VyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvc3RVc2VyRnJvbUFwaShob3N0dXNlcilcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIElzQ2FsZW5kYXJDb25maWd1cmVkKHJlcTogSXNDYWxlbmRhckNvbmZpZ3VyZWRSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxJc0NhbGVuZGFyQ29uZmlndXJlZFJlc3BvbnNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmlzQ2FsZW5kYXJDb25maWd1cmVkKHJlcSk7XG4gICAgfVxuXG4gICAgc2VuZE1lZXRpbmdSZXF1ZXN0RW1haWwocmVxOiBTZW5kTWVldGluZ1JlcXVlc3RFbWFpbFJlcXVlc3RJbnRlcmZhY2UpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxudWxsPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS5zZW5kTWVldGluZ1JlcXVlc3RFbWFpbChyZXEpO1xuICAgIH1cblxuICAgIGNyZWF0ZVNlcnZpY2UocmVxOiB7IHNlcnZpY2U6IFNlcnZpY2UsIHVwZGF0ZUZpZWxkcz86IChrZXlvZiBTZXJ2aWNlKVtdLCBIb3N0SWQ/OiBzdHJpbmcgfSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkTWFzayA9IGdldEZpZWxkTWFzayh7bzogcmVxLnNlcnZpY2UsIHVwZGF0ZUZpZWxkczogcmVxLnVwZGF0ZUZpZWxkc30pO1xuICAgICAgICBpZiAoZmllbGRNYXNrLnBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UuY3JlYXRlU2VydmljZSh7XG4gICAgICAgICAgICBzZXJ2aWNlOiBTZXJ2aWNlVHlwZVRvQXBpKHtzZXJ2aWNlOiByZXEuc2VydmljZX0pLFxuICAgICAgICAgICAgZmllbGRNYXNrLFxuICAgICAgICAgICAgaG9zdElkOiByZXEuSG9zdElkXG4gICAgICAgIH0pLnBpcGUobWFwKHJlcyA9PiByZXMuaWQpKVxuICAgIH1cblxuICAgIHVwZGF0ZVNlcnZpY2UocmVxOiB7XG4gICAgICAgIGlkOiBzdHJpbmcsXG4gICAgICAgIHNlcnZpY2U6IFBhcnRpYWw8U2VydmljZT4sXG4gICAgICAgIHVwZGF0ZUZpZWxkcz86IChrZXlvZiBTZXJ2aWNlKVtdLFxuICAgICAgICBIb3N0SWQ/OiBzdHJpbmdcbiAgICB9KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkTWFzayA9IGdldEZpZWxkTWFzayh7bzogcmVxLnNlcnZpY2UsIHVwZGF0ZUZpZWxkczogcmVxLnVwZGF0ZUZpZWxkc30pO1xuICAgICAgICBpZiAoZmllbGRNYXNrLnBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UudXBkYXRlU2VydmljZSh7XG4gICAgICAgICAgICBpZDogcmVxLmlkLFxuICAgICAgICAgICAgc2VydmljZTogU2VydmljZVR5cGVUb0FwaSh7c2VydmljZTogcmVxLnNlcnZpY2V9KSxcbiAgICAgICAgICAgIGZpZWxkTWFzayxcbiAgICAgICAgICAgIGhvc3RJZDogcmVxLkhvc3RJZFxuICAgICAgICB9KS5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICAgIH1cblxuICAgIGRlbGV0ZVNlcnZpY2UocmVxOiB7IGlkOiBzdHJpbmcsaG9zdElkOiBzdHJpbmcgfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS5kZWxldGVTZXJ2aWNlKHtpZDogcmVxLmlkLGhvc3RJZDogcmVxLmhvc3RJZH0pLnBpcGUobWFwVG8odW5kZWZpbmVkKSk7XG4gICAgfVxuXG4gICAgbGlzdFNlcnZpY2VzKCByZXE6IHsgaG9zdElkOiBzdHJpbmcgfSk6IE9ic2VydmFibGU8U2VydmljZVtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmxpc3RTZXJ2aWNlcyh7aG9zdElkOiByZXEuaG9zdElkfSkucGlwZShcbiAgICAgICAgICAgIG1hcChyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVzIHx8ICFyZXMuc2VydmljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLnNlcnZpY2VzLm1hcChzZXJ2aWNlID0+IFNlcnZpY2VGcm9tQXBpKHtzZXJ2aWNlQXBpOiBzZXJ2aWNlLGVudmlyb25tZW50OiBvblByb2R1Y3Rpb25HbG9iYWwoKSA/IEVudmlyb25tZW50LlBST0QgOiBFbnZpcm9ubWVudC5ERU1PfSkpXG4gICAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgfVxuXG4gICAgY3JlYXRlR3JvdXAocmVxOiB7IGdyb3VwOiBHcm91cCwgdXBkYXRlRmllbGRzPzogKGtleW9mIEdyb3VwKVtdLCBIb3N0SWQ/OiBzdHJpbmcgfSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkTWFzayA9IGdldEZpZWxkTWFzayh7bzogcmVxLmdyb3VwLCB1cGRhdGVGaWVsZHM6IHJlcS51cGRhdGVGaWVsZHN9KTtcbiAgICAgICAgaWYgKGZpZWxkTWFzay5wYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBvZigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmNyZWF0ZUdyb3VwKHtcbiAgICAgICAgICAgIGdyb3VwOiBHcm91cFR5cGVUb0FQaSh7Z3JvdXA6IHJlcS5ncm91cH0pLFxuICAgICAgICAgICAgZmllbGRNYXNrLFxuICAgICAgICAgICAgaG9zdElkOiByZXEuSG9zdElkXG4gICAgICAgIH0pLnBpcGUobWFwKHJlcyA9PiByZXMuaWQpKVxuICAgIH1cblxuICAgIHVwZGF0ZUdyb3VwKHJlcToge1xuICAgICAgICBpZDogc3RyaW5nLFxuICAgICAgICBncm91cDogUGFydGlhbDxHcm91cD4sXG4gICAgICAgIHVwZGF0ZUZpZWxkcz86IChrZXlvZiBHcm91cClbXSxcbiAgICAgICAgSG9zdElkPzogc3RyaW5nXG4gICAgfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBmaWVsZE1hc2sgPSBnZXRGaWVsZE1hc2soe286IHJlcS5ncm91cCwgdXBkYXRlRmllbGRzOiByZXEudXBkYXRlRmllbGRzfSk7XG4gICAgICAgIGlmIChmaWVsZE1hc2sucGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS51cGRhdGVHcm91cCh7XG4gICAgICAgICAgICBpZDogcmVxLmlkLFxuICAgICAgICAgICAgZ3JvdXA6IEdyb3VwVHlwZVRvQVBpKHtncm91cDogcmVxLmdyb3VwfSksXG4gICAgICAgICAgICBmaWVsZE1hc2ssXG4gICAgICAgICAgICBob3N0SWQ6IHJlcS5Ib3N0SWRcbiAgICAgICAgfSkucGlwZShtYXBUbyh1bmRlZmluZWQpKTtcbiAgICB9XG5cbiAgICBkZWxldGVHcm91cChyZXE6IHsgaWQ6IHN0cmluZywgaG9zdElkOiBzdHJpbmcgfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS5kZWxldGVHcm91cCh7aWQ6IHJlcS5pZCxob3N0SWQ6IHJlcS5ob3N0SWR9KS5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICAgIH1cblxuICAgIGxpc3RHcm91cHMoIHJlcTogeyBob3N0SWQ6IHN0cmluZyB9KTogT2JzZXJ2YWJsZTxHcm91cFtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmxpc3RHcm91cHMoe2hvc3RJZDogcmVxLmhvc3RJZH0pLnBpcGUoXG4gICAgICAgICAgICBtYXAocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcyB8fCAhcmVzLmdyb3Vwcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXMuZ3JvdXBzLm1hcChncm91cCA9PiBHcm91cEZyb21BcGkoe2dyb3VwQXBpOiBncm91cCxlbnZpcm9ubWVudDogb25Qcm9kdWN0aW9uR2xvYmFsKCkgPyBFbnZpcm9ubWVudC5QUk9EIDogRW52aXJvbm1lbnQuREVNT30pKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGdldEdyb3VwKHJlcTogeyBncm91cElkOiBzdHJpbmcsc2x1Zzogc3RyaW5nLGhvc3RJZDogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPEdldEdyb3VwUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UuZ2V0R3JvdXAocmVxKTtcbiAgICB9XG4gICAgZ2V0U2VydmljZShyZXE6IHsgc2VydmljZUlkOiBzdHJpbmcsc2x1Zzogc3RyaW5nLGhvc3RJZDogc3RyaW5nICB9KTogT2JzZXJ2YWJsZTxHZXRTZXJ2aWNlUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UuZ2V0U2VydmljZShyZXEpO1xuICAgIH1cblxuXG59XG5cblxuXG4iXX0=
|
|
500
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbWVldGluZ3Nfc2RrL3NyYy9saWIvaG9zdC9ob3N0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQWNMLGdDQUFnQyxFQUdoQyxxQkFBcUIsRUFDckIsbUJBQW1CLEVBR25CLFNBQVMsRUFFVCxRQUFRLEdBR1QsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUlMLGVBQWUsRUFDZixZQUFZLEVBRVosWUFBWSxFQUNaLGNBQWMsRUFHZCxjQUFjLEVBR2Qsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixhQUFhLEVBRWIsa0JBQWtCLEVBRWxCLGNBQWMsRUFDZCxnQkFBZ0IsR0FDakIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixrQ0FBa0MsR0FDbkMsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQVksZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7QUFJeEUsTUFBTSxPQUFPLFdBQVc7SUFDdEIsWUFBb0IsY0FBcUM7UUFBckMsbUJBQWMsR0FBZCxjQUFjLENBQXVCO0lBQUcsQ0FBQztJQUU3RCxrSEFBa0g7SUFDbEgsV0FBVyxDQUFDLEdBR1g7UUFDQyxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLFdBQVcsQ0FBQztZQUNYLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNsQix3RkFBd0Y7WUFDeEYsNEJBQTRCLEVBQzFCLEdBQUcsQ0FBQyw0QkFBZ0U7U0FDdkUsQ0FBQzthQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsa0JBQTBCO1FBQzFDLE9BQU8sSUFBSSxDQUFDLGNBQWM7YUFDdkIsaUJBQWlCLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO2FBQzdELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBMkI7UUFDckMsT0FBTyxJQUFJLENBQUMsY0FBYzthQUN2QixXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCw0QkFBNEIsQ0FBQyxHQUc1QjtRQUNDLE9BQU8sSUFBSSxDQUFDLGNBQWM7YUFDdkIsNEJBQTRCLENBQUM7WUFDNUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1lBQ2xCLDRCQUE0QixFQUMxQixHQUFHLENBQUMsNEJBQWdFO1NBQ3ZFLENBQUM7YUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxHQUV6QjtRQUNDLE9BQU8sSUFBSSxDQUFDLGNBQWM7YUFDdkIseUJBQXlCLENBQUMsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQzNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7OztRQUdJO0lBQ0osY0FBYyxDQUNaLEdBQW1DO1FBRW5DLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQWtCLEVBQUUsT0FBZTtRQUNwRCxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLGNBQWMsQ0FBQztZQUNkLFVBQVUsRUFBRSxVQUFVO1lBQ3RCLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDakMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUU7U0FDL0IsQ0FBQzthQUNELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQseUJBQXlCLENBQ3ZCLFVBQWtCLEVBQ2xCLHNCQUFnQztRQUVoQyxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLGNBQWMsQ0FBQztZQUNkLFVBQVUsRUFBRSxVQUFVO1lBQ3RCLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsRUFBRTtZQUN2RCxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRTtTQUN4QyxDQUFDO2FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxHQUczQjtRQUNDLE9BQU8sSUFBSSxDQUFDLGNBQWM7YUFDdkIsMkJBQTJCLENBQUMsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQzdELElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNWLElBQUksQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLEVBQUU7Z0JBQ2pDLE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUNwRCxDQUFDLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUN2QyxNQUFNLFlBQVksR0FBRyxDQUNuQixHQUFHLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FDNUQsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUNYLGtCQUFrQixDQUFDO29CQUNqQixjQUFjLEVBQUUsRUFBRTtvQkFDbEIsV0FBVyxFQUFFLGtCQUFrQixFQUFFO3dCQUMvQixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUk7d0JBQ2xCLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSTtvQkFDcEIsVUFBVTtvQkFDVixRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVE7aUJBQ3ZCLENBQUMsQ0FDSCxDQUFDO2dCQUNGLE9BQU87b0JBQ0wsR0FBRyx3QkFBd0I7b0JBQzNCLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWTtpQkFDM0IsQ0FBQztZQUNKLENBQUMsRUFDRCxFQUE2QyxDQUM5QyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7O1FBTUk7SUFDSixnQkFBZ0IsQ0FBQyxHQUloQjtRQUNDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQ25ELEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ1gsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQy9CLE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQ2xDLE9BQU8sa0JBQWtCLENBQUM7b0JBQ3hCLGNBQWMsRUFBRSxFQUFFO29CQUNsQixVQUFVLEVBQUUsR0FBRyxDQUFDLE1BQU07b0JBQ3RCLFdBQVcsRUFBRSxrQkFBa0IsRUFBRTt3QkFDL0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJO3dCQUNsQixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUk7b0JBQ3BCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtvQkFDdEIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZO2lCQUMvQixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztTQVNLO0lBQ0wsYUFBYSxDQUFDLEdBU2I7UUFDQyxPQUFPLEVBQUUsQ0FDUCwyQkFBMkIsQ0FBQztZQUMxQixHQUFHLEdBQUc7WUFDTixVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsTUFBTTtZQUN4QyxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUk7WUFDdkUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZO1NBQy9CLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O1NBT0s7SUFDTCxvQkFBb0IsQ0FBQyxHQUlwQjtRQUNDLE9BQU8sRUFBRSxDQUNQLGtDQUFrQyxDQUFDO1lBQ2pDLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSTtZQUN2RSxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVU7WUFDMUIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1lBQ3RCLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWTtTQUMvQixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7U0FRSztJQUNMLG1CQUFtQixDQUNqQixHQUF1QyxFQUN2QyxRQUFxQyxFQUNyQyxZQUFxQjtRQUVyQixPQUFPLEVBQUUsQ0FDUCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRTtZQUM5QyxPQUFPO2dCQUNMLEdBQUcsT0FBTztnQkFDVixDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQ2xDLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxFQUFFO29CQUNsQyxPQUFPO3dCQUNMLEdBQUcsY0FBYzt3QkFDakIsQ0FBQyxlQUFlLENBQUMsRUFBRSwyQkFBMkIsQ0FBQzs0QkFDN0MsVUFBVTs0QkFDVixlQUFlOzRCQUNmLFFBQVE7NEJBQ1IsV0FBVyxFQUFFLGtCQUFrQixFQUFFO2dDQUMvQixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUk7Z0NBQ2xCLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSTs0QkFDcEIsWUFBWTt5QkFDYixDQUFDO3FCQUNILENBQUM7Z0JBQ0osQ0FBQyxFQUNELEVBQXlDLENBQzFDO2FBQ0YsQ0FBQztRQUNKLENBQUMsRUFBRSxFQUFnQixDQUFDLENBQ3JCLENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsR0FBdUI7UUFDdEMsT0FBTyxJQUFJLENBQUMsY0FBYzthQUN2QixnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7YUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQThCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxHQVN0QjtRQUNDLE1BQU0sTUFBTSxHQUFHO1lBQ2IsR0FBRyxHQUFHO1lBQ04sUUFBUSxFQUFFLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7U0FDckMsQ0FBQztRQUNGLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUNoQixNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvQztRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELGtCQUFrQixDQUFDLEdBS2xCO1FBQ0MsT0FBTyxJQUFJLENBQUMsY0FBYzthQUN2QixrQkFBa0IsQ0FBQztZQUNsQixHQUFHLEdBQUc7WUFDTixhQUFhLEVBQUUsSUFBSSxtQkFBbUIsQ0FBQztnQkFDckMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO2dCQUNsQixRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVE7YUFDdkIsQ0FBQztZQUNGLE9BQU8sRUFBRSxJQUFJLGdDQUFnQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDMUQsUUFBUSxFQUFFLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7U0FDckMsQ0FBQzthQUNELElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxJQUFnQyxFQUFFLEVBQUU7WUFDdkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ3JELGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FDeEIsQ0FBQztZQUNGLE9BQU8sSUFBSSxhQUFhLENBQ3RCLFFBQVEsRUFDUixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQzVCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUdiO1FBQ0MsT0FBTyxJQUFJLENBQUMsY0FBYzthQUN2QixhQUFhLENBQUM7WUFDYixHQUFHLEdBQUc7U0FDUCxDQUFDO2FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxHQUF1QztRQUN2RCxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLGlCQUFpQixDQUFDO1lBQ2pCLEdBQUcsR0FBRztTQUNQLENBQUM7YUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELGdCQUFnQixDQUFDLEdBSWhCO1FBQ0MsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDbkQsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDZixNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7aUJBQy9DLE1BQU0sQ0FBQyxPQUFPLENBQUM7aUJBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ1QsT0FBTztvQkFDTCxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxFQUFFO29CQUN0QixhQUFhLEVBQUUsQ0FBQyxDQUFDLGFBQWEsSUFBSSxFQUFFO29CQUNwQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUc7b0JBQ1YsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO29CQUNwQixRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7aUJBQ3JCLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUNMLE9BQU8sSUFBSSxhQUFhLENBQ3RCLE9BQU8sRUFDUCxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFDNUIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQzFCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsaUJBQWlCLENBQUMsR0FJakI7UUFDQyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUM7WUFDN0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxXQUFXO1lBQ2xCLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWTtTQUMvQixDQUFDLENBQUM7UUFDSCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1NBQ2I7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLHFCQUFxQixDQUFDO1lBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNsQixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7WUFDNUIsU0FBUztTQUNWLENBQUM7YUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUF1QjtRQUNwQyxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLGtCQUFrQixDQUFDO1lBQ2xCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtTQUNuQixDQUFDO2FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsVUFBVSxDQUFDLFNBQWlCLEVBQUUsUUFBZ0I7UUFDNUMsT0FBTyxJQUFJLENBQUMsY0FBYzthQUN2QixjQUFjLENBQUM7WUFDZCxTQUFTLEVBQUUsU0FBUztZQUNwQixRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDO2FBQ0QsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLElBQTRCLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FDcEUsQ0FBQztJQUNOLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxHQUdyQjtRQUNDLE9BQU8sSUFBSSxDQUFDLGNBQWM7YUFDdkIscUJBQXFCLENBQUM7WUFDckIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1lBQ3hCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtTQUN2QixDQUFDO2FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBb0M7UUFDOUMsT0FBTyxJQUFJLENBQUMsY0FBYzthQUN2QixXQUFXLENBQUMsR0FBRyxDQUFDO2FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUE2QixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsc0dBQXNHO0lBQ3RHLCtFQUErRTtJQUMvRSx5QkFBeUIsQ0FBQyxHQUE4QjtRQUN0RCxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLHlCQUF5QixDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUMzRCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEdBSWpCO1FBQ0MsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDO1lBQzdCLENBQUMsRUFBRSxHQUFHLENBQUMsV0FBVztZQUNsQixZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVk7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxFQUFFLEVBQUUsQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYzthQUN2QixpQkFBaUIsQ0FBQztZQUNqQixXQUFXLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9ELFNBQVM7WUFDVCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07U0FDbkIsQ0FBQzthQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILGlCQUFpQixDQUFDLEdBS2pCO1FBQ0MsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDO1lBQzdCLENBQUMsRUFBRSxHQUFHLENBQUMsV0FBVztZQUNsQixZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVk7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxFQUFFLEVBQUUsQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYzthQUN2QixpQkFBaUIsQ0FBQztZQUNqQixFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDVixXQUFXLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9ELFNBQVM7WUFDVCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07U0FDbkIsQ0FBQzthQUNELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsR0FBbUI7UUFDbkMsT0FBTyxJQUFJLENBQUMsY0FBYzthQUN2QixpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7YUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxHQUEyQjtRQUM3QyxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLG1CQUFtQixDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUNuRCxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDNUMsT0FBTyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVELG9CQUFvQixDQUNsQixHQUF5QztRQUV6QyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELHVCQUF1QixDQUNyQixHQUE0QztRQUU1QyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUliO1FBQ0MsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDO1lBQzdCLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTztZQUNkLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWTtTQUMvQixDQUFDLENBQUM7UUFDSCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1NBQ2I7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLGFBQWEsQ0FBQztZQUNiLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkQsU0FBUztZQUNULE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtTQUNuQixDQUFDO2FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUtiO1FBQ0MsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDO1lBQzdCLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTztZQUNkLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWTtTQUMvQixDQUFDLENBQUM7UUFDSCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1NBQ2I7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLGFBQWEsQ0FBQztZQUNiLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNWLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkQsU0FBUztZQUNULE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtTQUNuQixDQUFDO2FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxhQUFhLENBQUMsR0FBbUM7UUFDL0MsT0FBTyxJQUFJLENBQUMsY0FBYzthQUN2QixhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQXVCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUNsRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNWLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO2dCQUN6QixPQUFPLEVBQUUsQ0FBQzthQUNYO1lBQ0QsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ2xDLGNBQWMsQ0FBQztnQkFDYixVQUFVLEVBQUUsT0FBTztnQkFDbkIsV0FBVyxFQUFFLGtCQUFrQixFQUFFO29CQUMvQixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUk7b0JBQ2xCLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSTthQUNyQixDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVyxDQUFDLEdBSVg7UUFDQyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUM7WUFDN0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ1osWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZO1NBQy9CLENBQUMsQ0FBQztRQUNILElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sRUFBRSxFQUFFLENBQUM7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWM7YUFDdkIsV0FBVyxDQUFDO1lBQ1gsS0FBSyxFQUFFLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDM0MsU0FBUztZQUNULE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtTQUNuQixDQUFDO2FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUtYO1FBQ0MsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDO1lBQzdCLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSztZQUNaLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWTtTQUMvQixDQUFDLENBQUM7UUFDSCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1NBQ2I7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3ZCLFdBQVcsQ0FBQztZQUNYLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNWLEtBQUssRUFBRSxjQUFjLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNDLFNBQVM7WUFDVCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07U0FDbkIsQ0FBQzthQUNELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQW1DO1FBQzdDLE9BQU8sSUFBSSxDQUFDLGNBQWM7YUFDdkIsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUMvQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUF1QjtRQUNoQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDaEUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDVixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDdkIsT0FBTyxFQUFFLENBQUM7YUFDWDtZQUNELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUM5QixZQUFZLENBQUM7Z0JBQ1gsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsV0FBVyxFQUFFLGtCQUFrQixFQUFFO29CQUMvQixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUk7b0JBQ2xCLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSTthQUNyQixDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsUUFBUSxDQUFDLEdBSVI7UUFDQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxVQUFVLENBQUMsR0FJVjtRQUNDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELDRCQUE0QixDQUFDLEdBSTVCO1FBQ0MsT0FBTyxJQUFJLENBQUMsY0FBYzthQUN2Qiw0QkFBNEIsQ0FBQyxHQUFHLENBQUM7YUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQzs7d0dBcHFCVSxXQUFXOzRHQUFYLFdBQVcsY0FERSxNQUFNOzJGQUNuQixXQUFXO2tCQUR2QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBtYXAsIG1hcFRvIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDaGVja0dyb3VwT3JTZXJ2aWNlU2x1Z0V4aXN0UmVzcG9uc2UsXG4gIENyZWF0ZUNhbGVuZGFyUmVxdWVzdEludGVyZmFjZSxcbiAgQ3JlYXRlQ2FsZW5kYXJSZXNwb25zZSxcbiAgRGF5T2ZXZWVrLFxuICBHZXRHcm91cFJlc3BvbnNlLFxuICBHZXRIb3N0TWVldGluZ1Jlc3BvbnNlLFxuICBHZXRTZXJ2aWNlUmVzcG9uc2UsXG4gIEhvc3RCb29rTWVldGluZ1JlcXVlc3RJbnRlcmZhY2UsXG4gIEhvc3RCb29rTWVldGluZ1Jlc3BvbnNlLFxuICBJc0NhbGVuZGFyQ29uZmlndXJlZFJlcXVlc3RJbnRlcmZhY2UsXG4gIElzQ2FsZW5kYXJDb25maWd1cmVkUmVzcG9uc2UsXG4gIElzSG9zdENvbmZpZ3VyZWRSZXNwb25zZSxcbiAgTGlzdEF2YWlsYWJpbGl0eVJlcXVlc3RGaWx0ZXJzSW50ZXJmYWNlLFxuICBMaXN0Qm9va2VkTWVldGluZ3NSZXF1ZXN0RmlsdGVycyxcbiAgTGlzdEJvb2tlZE1lZXRpbmdzUmVxdWVzdEZpbHRlcnNJbnRlcmZhY2UsXG4gIExpc3RCb29rZWRNZWV0aW5nc1Jlc3BvbnNlLFxuICBNZWV0aW5nSG9zdEFwaVNlcnZpY2UsXG4gIFBhZ2VkUmVxdWVzdE9wdGlvbnMsXG4gIFBhZ2VkUmVxdWVzdE9wdGlvbnNJbnRlcmZhY2UsXG4gIFNlbmRNZWV0aW5nUmVxdWVzdEVtYWlsUmVxdWVzdEludGVyZmFjZSxcbiAgVGltZVJhbmdlLFxuICBUaW1lUmFuZ2VJbnRlcmZhY2UsXG4gIFRpbWVab25lLFxuICBUaW1lWm9uZUludGVyZmFjZSxcbiAgV2Vla2RheUF2YWlsYWJpbGl0eSxcbn0gZnJvbSBcIi4uL19pbnRlcm5hbFwiO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllc1NldCxcbiAgQXZhaWxhYmlsaXR5UnVsZSxcbiAgQ2FsZW5kYXIsXG4gIENhbGVuZGFyRnJvbUFwaSxcbiAgZ2V0RmllbGRNYXNrLFxuICBHcm91cCxcbiAgR3JvdXBGcm9tQXBpLFxuICBHcm91cFR5cGVUb0FQaSxcbiAgSG9zdFVybE1hcCxcbiAgTWVldGluZyxcbiAgbWVldGluZ0Zyb21BcGksXG4gIE1lZXRpbmdNZXRhZGF0YSxcbiAgTWVldGluZ1R5cGUsXG4gIE1lZXRpbmdUeXBlRnJvbUFwaSxcbiAgTWVldGluZ1R5cGVUb0FwaSxcbiAgUGFnZWRSZXNwb25zZSxcbiAgUHJlZmVyZW5jZXMsXG4gIFByZWZlcmVuY2VzRnJvbUFwaSxcbiAgU2VydmljZSxcbiAgU2VydmljZUZyb21BcGksXG4gIFNlcnZpY2VUeXBlVG9BcGksXG59IGZyb20gXCIuLi9zaGFyZWRcIjtcbmltcG9ydCB7XG4gIGdldEJvb2tpbmdVcmxJbXBsZW1lbnRhdGlvbixcbiAgZ2V0R2VuZXJhbEJvb2tpbmdVcmxJbXBsZW1lbnRhdGlvbixcbn0gZnJvbSBcIi4vdXJsXCI7XG5pbXBvcnQgeyBIb3N0VXNlciwgaG9zdFVzZXJGcm9tQXBpIH0gZnJvbSBcIi4uL3NoYXJlZC9ob3N0LXVzZXJcIjtcbmltcG9ydCB7IEVudmlyb25tZW50LCBvblByb2R1Y3Rpb25HbG9iYWwgfSBmcm9tIFwiLi4vc2hhcmVkL2Vudmlyb25tZW50XCI7XG5pbXBvcnQgeyBIdHRwUmVzcG9uc2UgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxuZXhwb3J0IGNsYXNzIEhvc3RTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBob3N0QVBJU2VydmljZTogTWVldGluZ0hvc3RBcGlTZXJ2aWNlKSB7fVxuXG4gIC8vIFVzZSBidWlsZEhvc3RJZCB0byBnZXQgYW4gaWRlbnRpZmllciB0aGF0IGNhbiBiZSB1c2VkIGluIHN1YnNlcXVlbnQgcmVxdWVzdHMuIFNlZSB2ZW5kYXN0YWFwaXMgZm9yIG1vcmUgZGV0YWlsc1xuICBidWlsZEhvc3RJZChyZXE6IHtcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgICBhcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzOiBBcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzU2V0O1xuICB9KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZVxuICAgICAgLmJ1aWxkSG9zdElkKHtcbiAgICAgICAgdXNlcklkOiByZXEudXNlcklkLFxuICAgICAgICAvLyBHcm9zcyB0eXBlY2FzdCBleGlzdHMgYmVjYXVzZSBJIHdhbnQgdG8gcmVzdHJpY3QgdGhlIHByb3BlcnRpZXMgb24gdGhlIG1hcCAoZm9yIG5vdykuXG4gICAgICAgIGFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXM6XG4gICAgICAgICAgcmVxLmFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXMgYXMgYW55IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgICB9KVxuICAgICAgLnBpcGUobWFwKChyZXMpID0+IHJlcy5ob3N0SWQgfHwgXCJcIikpO1xuICB9XG5cbiAgZG9lc0NhbGVuZGFyRXhpc3QoY2FsZW5kYXJJZGVudGlmaWVyOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZVxuICAgICAgLmRvZXNDYWxlbmRhckV4aXN0KHsgY2FsZW5kYXJJZGVudGlmaWVyOiBjYWxlbmRhcklkZW50aWZpZXIgfSlcbiAgICAgIC5waXBlKG1hcCgocmVzcCkgPT4gcmVzcC5leGlzdHMpKTtcbiAgfVxuXG4gIGdldENhbGVuZGFyKHJlcTogeyBjYWxlbmRhcklkOiBzdHJpbmcgfSk6IE9ic2VydmFibGU8Q2FsZW5kYXI+IHtcbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZVxuICAgICAgLmdldENhbGVuZGFyKHsgY2FsZW5kYXJJZDogcmVxLmNhbGVuZGFySWQgfSlcbiAgICAgIC5waXBlKG1hcCgocmVzKSA9PiBDYWxlbmRhckZyb21BcGkocmVzPy5jYWxlbmRhcikpKTtcbiAgfVxuXG4gIGVuc3VyZVBlcnNvbmFsQ2FsZW5kYXJFeGlzdHMocmVxOiB7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllczogQXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllc1NldDtcbiAgfSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2VcbiAgICAgIC5lbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzKHtcbiAgICAgICAgdXNlcklkOiByZXEudXNlcklkLFxuICAgICAgICBhcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzOlxuICAgICAgICAgIHJlcS5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzIGFzIGFueSBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKG1hcCgocmVzKSA9PiAocmVzID8gcmVzLmNhbGVuZGFySWQgOiBcIlwiKSkpO1xuICB9XG5cbiAgZW5zdXJlR3JvdXBDYWxlbmRhcnNFeGlzdChyZXE6IHtcbiAgICBleHRlcm5hbElkczogc3RyaW5nW107XG4gIH0pOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2VcbiAgICAgIC5lbnN1cmVHcm91cENhbGVuZGFyc0V4aXN0KHsgZXh0ZXJuYWxJZHM6IHJlcS5leHRlcm5hbElkcyB9KVxuICAgICAgLnBpcGUobWFwKChyZXMpID0+IHJlcz8uY2FsZW5kYXJJZHMgfHwgW10pKTtcbiAgfVxuXG4gIC8qXG4gICAgIGNyZWF0ZUNhbGVuZGFyIGNyZWF0ZXMgYSBjYWxlbmRhciB3aGljaCBtZWV0aW5nIHR5cGVzIGNhbiBiZSBjcmVhdGVkIGZvciBhbmQgZXZlbnRzIGNhbiBiZSBib29rZWQgb25cbiAgICAgVGhlIGZpZWxkcyBvZiBhIGNhbGVuZGFyIGFyZSBkb2N1bWVudGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS92ZW5kYXN0YS92ZW5kYXN0YWFwaXMvYmxvYi9tYXN0ZXIvbWVldGluZ3MvdjEvc2hhcmVkLnByb3RvXG4gICAgKi9cbiAgY3JlYXRlQ2FsZW5kYXIoXG4gICAgcmVxOiBDcmVhdGVDYWxlbmRhclJlcXVlc3RJbnRlcmZhY2VcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVDYWxlbmRhclJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2UuY3JlYXRlQ2FsZW5kYXIocmVxKTtcbiAgfVxuXG4gIHVwZGF0ZUNhbGVuZGFyU2x1ZyhjYWxlbmRhcklkOiBzdHJpbmcsIG5ld1NsdWc6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlXG4gICAgICAudXBkYXRlQ2FsZW5kYXIoe1xuICAgICAgICBjYWxlbmRhcklkOiBjYWxlbmRhcklkLFxuICAgICAgICBjYWxlbmRhclVwZGF0ZTogeyBzbHVnOiBuZXdTbHVnIH0sXG4gICAgICAgIGZpZWxkTWFzazogeyBwYXRoczogW1wic2x1Z1wiXSB9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICB9XG5cbiAgdXBkYXRlQ2FsZW5kYXJIb3N0VXNlcklEcyhcbiAgICBjYWxlbmRhcklkOiBzdHJpbmcsXG4gICAgcmVwbGFjZW1lbnRIb3N0VXNlcklkczogc3RyaW5nW11cbiAgKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2VcbiAgICAgIC51cGRhdGVDYWxlbmRhcih7XG4gICAgICAgIGNhbGVuZGFySWQ6IGNhbGVuZGFySWQsXG4gICAgICAgIGNhbGVuZGFyVXBkYXRlOiB7IGhvc3RVc2VySWRzOiByZXBsYWNlbWVudEhvc3RVc2VySWRzIH0sXG4gICAgICAgIGZpZWxkTWFzazogeyBwYXRoczogW1wiaG9zdF91c2VyX2lkc1wiXSB9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICB9XG5cbiAgZ2V0TWVldGluZ1R5cGVzRm9yQ2FsZW5kYXJzKHJlcToge1xuICAgIGNhbGVuZGFySWRzOiBzdHJpbmdbXTtcbiAgICBtZXRhZGF0YTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG4gIH0pOiBPYnNlcnZhYmxlPHsgW2NhbGVuZGFySWQ6IHN0cmluZ106IE1lZXRpbmdUeXBlW10gfT4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlXG4gICAgICAuZ2V0TWVldGluZ1R5cGVzRm9yQ2FsZW5kYXJzKHsgY2FsZW5kYXJJZHM6IHJlcS5jYWxlbmRhcklkcyB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKCFyZXM/LmNhbGVuZGFyTWVldGluZ1R5cGVzTWFwKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXMuY2FsZW5kYXJNZWV0aW5nVHlwZXNNYXApLnJlZHVjZShcbiAgICAgICAgICAgIChjYWxlbmRhclRvTWVldGluZ1R5cGVNYXAsIGNhbGVuZGFySWQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbWVldGluZ1R5cGVzID0gKFxuICAgICAgICAgICAgICAgIHJlcy5jYWxlbmRhck1lZXRpbmdUeXBlc01hcFtjYWxlbmRhcklkXT8ubWVldGluZ1R5cGVzIHx8IFtdXG4gICAgICAgICAgICAgICkubWFwKChtdCkgPT5cbiAgICAgICAgICAgICAgICBNZWV0aW5nVHlwZUZyb21BcGkoe1xuICAgICAgICAgICAgICAgICAgbWVldGluZ1R5cGVBcGk6IG10LFxuICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQ6IG9uUHJvZHVjdGlvbkdsb2JhbCgpXG4gICAgICAgICAgICAgICAgICAgID8gRW52aXJvbm1lbnQuUFJPRFxuICAgICAgICAgICAgICAgICAgICA6IEVudmlyb25tZW50LkRFTU8sXG4gICAgICAgICAgICAgICAgICBjYWxlbmRhcklkLFxuICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IHJlcS5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmNhbGVuZGFyVG9NZWV0aW5nVHlwZU1hcCxcbiAgICAgICAgICAgICAgICBbY2FsZW5kYXJJZF06IG1lZXRpbmdUeXBlcyxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7fSBhcyB7IFtjYWxlbmRhcklkOiBzdHJpbmddOiBNZWV0aW5nVHlwZVtdIH1cbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qXG4gICAgIGxpc3RNZWV0aW5nVHlwZXMgcmV0dXJucyBhIGxpc3Qgb2YgbWVldGluZyB0eXBlcyBmb3IgYSBob3N0XG4gICAgIEBwYXJhbSBob3N0SWQ6IEFuIGlkZW50aWZpZXIgZm9yIGFuIGluZGl2aWR1YWwgaG9zdFxuICAgICBAcGFyYW0gbWV0YWRhdGE6IG9wdGlvbmFsIG1ldGFkYXRhIHRvIGluY2x1ZGUgb24gdGhlIG1lZXRpbmcgdHlwZSBib29raW5nIGxpbmtcbiAgICAgQHBhcmFtIGNhbGVuZGFyU2x1ZzogdXNlZCB0byByZXBsYWNlIGhvc3RJZCBpbiB0aGUgdXJsLiBVc2UgaXQgd2hlbiB5b3UgYXJlIGNvbmZpZGVudCB5b3Uga25vdyB0aGUgaG9zdCdzIHNsdWcuXG4gICAgICAgIC0gY2FsZW5kYXJTbHVnIElTIE5PVCBVU0VEIFRPIFJFVFJJRVZFIE1FRVRJTkcgVFlQRVMsIE9OTFkgVE8gTUFLRSBUSEUgQk9PS0lORyBVUkxTXG4gICAgKi9cbiAgbGlzdE1lZXRpbmdUeXBlcyhyZXE6IHtcbiAgICBob3N0SWQ6IHN0cmluZztcbiAgICBtZXRhZGF0YT86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIGNhbGVuZGFyU2x1Zz86IHN0cmluZztcbiAgfSk6IE9ic2VydmFibGU8TWVldGluZ1R5cGVbXT4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmxpc3RNZWV0aW5nVHlwZXMocmVxKS5waXBlKFxuICAgICAgbWFwKChyZXNwKSA9PiB7XG4gICAgICAgIGlmICghcmVzcCB8fCAhcmVzcC5tZWV0aW5nVHlwZXMpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3AubWVldGluZ1R5cGVzLm1hcCgobXQpID0+IHtcbiAgICAgICAgICByZXR1cm4gTWVldGluZ1R5cGVGcm9tQXBpKHtcbiAgICAgICAgICAgIG1lZXRpbmdUeXBlQXBpOiBtdCxcbiAgICAgICAgICAgIGNhbGVuZGFySWQ6IHJlcS5ob3N0SWQsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogb25Qcm9kdWN0aW9uR2xvYmFsKClcbiAgICAgICAgICAgICAgPyBFbnZpcm9ubWVudC5QUk9EXG4gICAgICAgICAgICAgIDogRW52aXJvbm1lbnQuREVNTyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiByZXEubWV0YWRhdGEsXG4gICAgICAgICAgICBjYWxlbmRhclNsdWc6IHJlcS5jYWxlbmRhclNsdWcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLypcbiAgICAgZ2V0Qm9va2luZ1VybCByZXR1cm5zIGEgbGluayB0aGF0IGNhbiBiZSB1c2VkIHRvIGJvb2sgYSBtZWV0aW5nIHdpdGggdGhpcyBob3N0LlxuICAgICBAcGFyYW0gY2FsZW5kYXJJZDogQW4gaWRlbnRpZmllciBmb3IgYW4gaW5kaXZpZHVhbCBob3N0IG9yIGdyb3VwaW5nIG9mIGhvc3RzIChpLmUuLCB0ZWFtKS5cbiAgICAgQHBhcmFtIEBkZXByZWNhdGVkIGhvc3RJZDogQW4gaWRlbnRpZmllciBmb3IgYW4gaW5kaXZpZHVhbCBob3N0LlxuICAgICBAcGFyYW0gbWVldGluZ1R5cGVJZDogQW4gb3B0aW9uYWwgaWRlbnRpZmllciBmb3IgdGhlIG1lZXRpbmcgdHlwZS4gRGVmYXVsdDogMzAtbWludXRlcy5cbiAgICAgQHBhcmFtIG1ldGFkYXRhOiBvcHRpb25hbCBtZXRhZGF0YSB0byBpbmNsdWRlIGluIHRoZSB1cmwuXG4gICAgIC0gbWV0YWRhdGEgY2FuIGJlIHVzZWQgdG8gcHJlLWZpbGwgY2VydGFpbiBmb3JtIGZpZWxkcyBhbmQgd2lsbCBiZSBzdG9yZWQgZHVyaW5nIHRoZSBib29raW5nIHByb2Nlc3MuXG4gICAgIC0gbWV0YWRhdGEgY2FuIGJlIG9idGFpbmVkIGJ5IHN1YnNjcmliaW5nIHRvIHRoZSBib29raW5nIGV2ZW50LlxuICAgIEBwYXJhbSBjYWxlbmRhclNsdWc6IHVzZWQgdG8gcmVwbGFjZSBob3N0SWQgaW4gdGhlIHVybC4gVXNlIGl0IHdoZW4geW91IGFyZSBjb25maWRlbnQgeW91IGtub3cgdGhlIGhvc3QncyBzbHVnLlxuICAgICAqL1xuICBnZXRCb29raW5nVXJsKHJlcToge1xuICAgIC8vIEBkZXByZWNhdGVkOiB1c2UgY2FsZW5kYXJJZCBpbnN0ZWFkLiBjYWxlbmRhcklkIG5vdCByZXF1aXJlZCB0byBhdm9pZCBicmVha2luZyBleGlzdGluZyBjbGllbnRzLlxuICAgIGhvc3RJZDogc3RyaW5nO1xuICAgIGNhbGVuZGFySWQ/OiBzdHJpbmc7XG4gICAgLy8gQGRlcHJlY2F0ZWQ6IHVzZSBtZWV0aW5nVHlwZVNsdWcgaW5zdGVhZFxuICAgIG1lZXRpbmdUeXBlSWQ/OiBzdHJpbmc7XG4gICAgbWVldGluZ1R5cGVTbHVnPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgY2FsZW5kYXJTbHVnPzogc3RyaW5nO1xuICB9KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gb2YoXG4gICAgICBnZXRCb29raW5nVXJsSW1wbGVtZW50YXRpb24oe1xuICAgICAgICAuLi5yZXEsXG4gICAgICAgIGNhbGVuZGFySWQ6IHJlcS5jYWxlbmRhcklkIHx8IHJlcS5ob3N0SWQsXG4gICAgICAgIGVudmlyb25tZW50OiBvblByb2R1Y3Rpb25HbG9iYWwoKSA/IEVudmlyb25tZW50LlBST0QgOiBFbnZpcm9ubWVudC5ERU1PLFxuICAgICAgICBjYWxlbmRhclNsdWc6IHJlcS5jYWxlbmRhclNsdWcsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKlxuICAgICBnZXRHZW5lcmFsQm9va2luZ1VybCByZXR1cm5zIGEgbGluayB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlbGVjdCBhIG1lZXRpbmcgdHlwZSB0byBib29rIHdpdGggdGhlIGdpdmVuIGNhbGVuZGFyLlxuICAgICBAcGFyYW0gY2FsZW5kYXJJZDogQW4gaWRlbnRpZmllciBmb3IgYW4gaW5kaXZpZHVhbCBob3N0IG9yIGdyb3VwaW5nIG9mIGhvc3RzIChpLmUuLCB0ZWFtKS5cbiAgICAgQHBhcmFtIG1ldGFkYXRhOiBvcHRpb25hbCBtZXRhZGF0YSB0byBpbmNsdWRlIGluIHRoZSB1cmwuXG4gICAgIC0gbWV0YWRhdGEgY2FuIGJlIHVzZWQgdG8gcHJlLWZpbGwgY2VydGFpbiBmb3JtIGZpZWxkcyBhbmQgd2lsbCBiZSBzdG9yZWQgZHVyaW5nIHRoZSBib29raW5nIHByb2Nlc3MuXG4gICAgIC0gbWV0YWRhdGEgY2FuIGJlIG9idGFpbmVkIGJ5IHN1YnNjcmliaW5nIHRvIHRoZSBib29raW5nIGV2ZW50LlxuICAgICBAcGFyYW0gY2FsZW5kYXJTbHVnOiB1c2VkIHRvIHJlcGxhY2UgaG9zdElkIGluIHRoZSB1cmwuIFVzZSBpdCB3aGVuIHlvdSBhcmUgY29uZmlkZW50IHlvdSBrbm93IHRoZSBob3N0J3Mgc2x1Zy5cbiAgICAgKi9cbiAgZ2V0R2VuZXJhbEJvb2tpbmdVcmwocmVxOiB7XG4gICAgY2FsZW5kYXJJZDogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgY2FsZW5kYXJTbHVnPzogc3RyaW5nO1xuICB9KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gb2YoXG4gICAgICBnZXRHZW5lcmFsQm9va2luZ1VybEltcGxlbWVudGF0aW9uKHtcbiAgICAgICAgZW52aXJvbm1lbnQ6IG9uUHJvZHVjdGlvbkdsb2JhbCgpID8gRW52aXJvbm1lbnQuUFJPRCA6IEVudmlyb25tZW50LkRFTU8sXG4gICAgICAgIGNhbGVuZGFySWQ6IHJlcS5jYWxlbmRhcklkLFxuICAgICAgICBtZXRhZGF0YTogcmVxLm1ldGFkYXRhLFxuICAgICAgICBjYWxlbmRhclNsdWc6IHJlcS5jYWxlbmRhclNsdWcsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKlxuICAgICBnZXRCb29raW5nVXJsc011bHRpIHJldHVybnMgYSBtYXBwaW5nIG9mIGhvc3RzIC0+IGV2ZW50IHR5cGVzIC0+IGJvb2tpbmcgbGlua3MuXG4gICAgIEBwYXJhbSBjYWxlbmRhcklkOiBBbiBpZGVudGlmaWVyIGZvciBhbiBpbmRpdmlkdWFsIGhvc3Qgb3IgZ3JvdXBpbmcgb2YgaG9zdHMuXG4gICAgIEBwYXJhbSBtZWV0aW5nVHlwZVNsdWc6IG1lZXRpbmdUeXBlU2x1Z3MgYXJlIHBhc3NlZCBpbiB0aGUgZm9ybSB7aG9zdElkOiBbbWVldGluZ1R5cGVTbHVnMSwgbWVldGluZ1R5cGVTbHVnMl19XG4gICAgIEBwYXJhbSBtZXRhZGF0YTogb3B0aW9uYWwgbWV0YWRhdGEgdG8gaW5jbHVkZSBpbiB0aGUgdXJsLlxuICAgICAtIG1ldGFkYXRhIGNhbiBiZSB1c2VkIHRvIHByZS1maWxsIGNlcnRhaW4gZm9ybSBmaWVsZHMgYW5kIHdpbGwgYmUgc3RvcmVkIGR1cmluZyB0aGUgYm9va2luZyBwcm9jZXNzLlxuICAgICAtIG1ldGFkYXRhIGNhbiBiZSBvYnRhaW5lZCBieSBzdWJzY3JpYmluZyB0byB0aGUgYm9va2luZyBldmVudC5cbiAgICAgQHBhcmFtIGNhbGVuZGFyU2x1ZzogdXNlZCB0byByZXBsYWNlIGhvc3RJZCBpbiB0aGUgdXJsLiBVc2UgaXQgd2hlbiB5b3UgYXJlIGNvbmZpZGVudCB5b3Uga25vdyB0aGUgaG9zdCdzIHNsdWcuXG4gICAgICovXG4gIGdldEJvb2tpbmdVcmxzTXVsdGkoXG4gICAgcmVxOiB7IFtjYWxlbmRhcklkOiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIG1ldGFkYXRhPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgY2FsZW5kYXJTbHVnPzogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8SG9zdFVybE1hcD4ge1xuICAgIHJldHVybiBvZihcbiAgICAgIE9iamVjdC5rZXlzKHJlcSkucmVkdWNlKChob3N0TWFwLCBjYWxlbmRhcklkKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaG9zdE1hcCxcbiAgICAgICAgICBbY2FsZW5kYXJJZF06IHJlcVtjYWxlbmRhcklkXS5yZWR1Y2UoXG4gICAgICAgICAgICAobWVldGluZ1R5cGVNYXAsIG1lZXRpbmdUeXBlU2x1ZykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLm1lZXRpbmdUeXBlTWFwLFxuICAgICAgICAgICAgICAgIFttZWV0aW5nVHlwZVNsdWddOiBnZXRCb29raW5nVXJsSW1wbGVtZW50YXRpb24oe1xuICAgICAgICAgICAgICAgICAgY2FsZW5kYXJJZCxcbiAgICAgICAgICAgICAgICAgIG1lZXRpbmdUeXBlU2x1ZyxcbiAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQ6IG9uUHJvZHVjdGlvbkdsb2JhbCgpXG4gICAgICAgICAgICAgICAgICAgID8gRW52aXJvbm1lbnQuUFJPRFxuICAgICAgICAgICAgICAgICAgICA6IEVudmlyb25tZW50LkRFTU8sXG4gICAgICAgICAgICAgICAgICBjYWxlbmRhclNsdWcsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge30gYXMgeyBbbWVldGluZ1R5cGVJZDogc3RyaW5nXTogc3RyaW5nIH1cbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfSwge30gYXMgSG9zdFVybE1hcClcbiAgICApO1xuICB9XG5cbiAgaXNIb3N0Q29uZmlndXJlZChyZXE6IHsgaG9zdElkOiBzdHJpbmcgfSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlXG4gICAgICAuaXNIb3N0Q29uZmlndXJlZChyZXEpXG4gICAgICAucGlwZShtYXAoKHJlc3A6IElzSG9zdENvbmZpZ3VyZWRSZXNwb25zZSkgPT4gcmVzcC5pc0NvbmZpZ3VyZWQpKTtcbiAgfVxuXG4gIHNldEdlbmVyYWxBdmFpbGFiaWxpdHkocmVxOiB7XG4gICAgaG9zdElkOiBzdHJpbmc7XG4gICAgbWVldGluZ1R5cGVJZDogc3RyaW5nO1xuICAgIC8vIEBkZXByZWNhdGVkOiB1c2Ugd2Vla2RheXNBdmFpbGFiaWxpdHkgaW5zdGVhZFxuICAgIGRheXM/OiBEYXlPZldlZWtbXTtcbiAgICAvLyBAZGVwcmVjYXRlZDogdXNlIHdlZWtkYXlzQXZhaWxhYmlsaXR5IGluc3RlYWRcbiAgICB0aW1lU2xvdD86IFRpbWVSYW5nZUludGVyZmFjZTtcbiAgICB3ZWVrZGF5c0F2YWlsYWJpbGl0eT86IFdlZWtkYXlBdmFpbGFiaWxpdHlbXTtcbiAgICB0aW1lWm9uZTogVGltZVpvbmVJbnRlcmZhY2U7XG4gIH0pOiBPYnNlcnZhYmxlPG51bGw+IHtcbiAgICBjb25zdCBhcGlSZXEgPSB7XG4gICAgICAuLi5yZXEsXG4gICAgICB0aW1lWm9uZTogbmV3IFRpbWVab25lKHJlcS50aW1lWm9uZSksXG4gICAgfTtcbiAgICBpZiAocmVxLnRpbWVTbG90KSB7XG4gICAgICBhcGlSZXEudGltZVNsb3QgPSBuZXcgVGltZVJhbmdlKHJlcS50aW1lU2xvdCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLnNldEdlbmVyYWxBdmFpbGFiaWxpdHkoYXBpUmVxKS5waXBlKG1hcFRvKG51bGwpKTtcbiAgfVxuXG4gIGxpc3RCb29rZWRNZWV0aW5ncyhyZXE6IHtcbiAgICBmaWx0ZXJzOiBMaXN0Qm9va2VkTWVldGluZ3NSZXF1ZXN0RmlsdGVyc0ludGVyZmFjZTtcbiAgICBjdXJzb3I6IHN0cmluZztcbiAgICBwYWdlU2l6ZTogbnVtYmVyO1xuICAgIHRpbWVab25lOiBUaW1lWm9uZUludGVyZmFjZTtcbiAgfSk6IE9ic2VydmFibGU8UGFnZWRSZXNwb25zZTxNZWV0aW5nPj4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlXG4gICAgICAubGlzdEJvb2tlZE1lZXRpbmdzKHtcbiAgICAgICAgLi4ucmVxLFxuICAgICAgICBwYWdpbmdPcHRpb25zOiBuZXcgUGFnZWRSZXF1ZXN0T3B0aW9ucyh7XG4gICAgICAgICAgY3Vyc29yOiByZXEuY3Vyc29yLFxuICAgICAgICAgIHBhZ2VTaXplOiByZXEucGFnZVNpemUsXG4gICAgICAgIH0pLFxuICAgICAgICBmaWx0ZXJzOiBuZXcgTGlzdEJvb2tlZE1lZXRpbmdzUmVxdWVzdEZpbHRlcnMocmVxLmZpbHRlcnMpLFxuICAgICAgICB0aW1lWm9uZTogbmV3IFRpbWVab25lKHJlcS50aW1lWm9uZSksXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcDogTGlzdEJvb2tlZE1lZXRpbmdzUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCBtZWV0aW5ncyA9IChyZXNwLm1lZXRpbmdzIHx8IFtdKS5tYXAoKG1lZXRpbmcpID0+XG4gICAgICAgICAgICBtZWV0aW5nRnJvbUFwaShtZWV0aW5nKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlZFJlc3BvbnNlKFxuICAgICAgICAgICAgbWVldGluZ3MsXG4gICAgICAgICAgICByZXNwLnBhZ2luZ01ldGFkYXRhLm5leHRDdXJzb3IsXG4gICAgICAgICAgICByZXNwLnBhZ2luZ01ldGFkYXRhLmhhc01vcmVcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIGNhbmNlbE1lZXRpbmcocmVxOiB7XG4gICAgbWVldGluZ0lkOiBzdHJpbmc7XG4gICAgY2FuY2VsbGF0aW9uUmVhc29uOiBzdHJpbmc7XG4gIH0pOiBPYnNlcnZhYmxlPG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZVxuICAgICAgLmNhbmNlbE1lZXRpbmcoe1xuICAgICAgICAuLi5yZXEsXG4gICAgICB9KVxuICAgICAgLnBpcGUobWFwVG8obnVsbCkpO1xuICB9XG5cbiAgcmVzY2hlZHVsZU1lZXRpbmcocmVxOiB7IG1lZXRpbmdJZDogc3RyaW5nOyBzdGFydDogRGF0ZSB9KTogT2JzZXJ2YWJsZTxudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2VcbiAgICAgIC5yZXNjaGVkdWxlTWVldGluZyh7XG4gICAgICAgIC4uLnJlcSxcbiAgICAgIH0pXG4gICAgICAucGlwZShtYXBUbyhudWxsKSk7XG4gIH1cblxuICBsaXN0QXZhaWxhYmlsaXR5KHJlcToge1xuICAgIGZpbHRlcnM6IExpc3RBdmFpbGFiaWxpdHlSZXF1ZXN0RmlsdGVyc0ludGVyZmFjZTtcbiAgICBwYWdpbmdPcHRpb25zOiBQYWdlZFJlcXVlc3RPcHRpb25zSW50ZXJmYWNlO1xuICAgIHRpbWVab25lOiBUaW1lWm9uZUludGVyZmFjZTtcbiAgfSk6IE9ic2VydmFibGU8UGFnZWRSZXNwb25zZTxBdmFpbGFiaWxpdHlSdWxlPj4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmxpc3RBdmFpbGFiaWxpdHkocmVxKS5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gKHJlc3BvbnNlLmF2YWlsYWJpbGl0eVJ1bGVzIHx8IFtdKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAubWFwKChhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBob3N0SWQ6IGEuaG9zdElkIHx8IFwiXCIsXG4gICAgICAgICAgICAgIG1lZXRpbmdUeXBlSWQ6IGEubWVldGluZ1R5cGVJZCB8fCBcIlwiLFxuICAgICAgICAgICAgICBkYXk6IGEuZGF5LFxuICAgICAgICAgICAgICB0aW1lU2xvdDogYS50aW1lU2xvdCxcbiAgICAgICAgICAgICAgdGltZVpvbmU6IGEudGltZVpvbmUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFBhZ2VkUmVzcG9uc2UoXG4gICAgICAgICAgcmVzdWx0cyxcbiAgICAgICAgICByZXNwb25zZS5tZXRhZGF0YS5uZXh0Q3Vyc29yLFxuICAgICAgICAgIHJlc3BvbnNlLm1ldGFkYXRhLmhhc01vcmVcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qIHVwZGF0ZVByZWZlcmVuY2VzIHdpbGwgdXBkYXRlIHRoZSBob3N0J3MgcHJlZmVyZW5jZXMuXG4gICAqIEl0IGlzIGd1YXJhbnRlZWQgdG8gb25seSB1cGRhdGUgdGhlIGZpZWxkcyBwcm92aWRlZC5cbiAgICogRm9yIGV4YW1wbGU6XG4gICAqICB1cGRhdGVQcmVmZXJlbmNlcyh7bWVldGluZ0ludGVncmF0aW9uOiBNZWV0aW5nU291cmNlLk1FRVRJTkdfU09VUkNFX0dPT0dMRV9NRUVUfSlcbiAgICogIHdpbGwgb25seSB1cGRhdGUgdGhlIHByZWZlcmVuY2UgbWVldGluZ0ludGVncmF0aW9uIHRvIEdvb2dsZSBNZWV0LiBLZWVwaW5nIHRoZSBvdGhlciBwcmVmZXJlbmNlcyB0aGUgc2FtZS5cbiAgICpcbiAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBwcm92aWRlIGEgbGlzdCBvZiBrZXlzIHRvIHVwZGF0ZSBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICAgKiBGb3IgZXhhbXBsZTpcbiAgICogICB1cGRhdGVQcmVmZXJlbmNlcyh7Li4ub2JqZWN0IHdpdGggYWxsIGZpZWxkc30sIFsnbWVldGluZ0ludGVncmF0aW9uJ10pXG4gICAqICAgd2lsbCBvbmx5IHVwZGF0ZSB0aGUgZmllbGQgJ21lZXRpbmdJbnRlZ3JhdGlvbicgdG8gdGhlIHZhbHVlIGluIHByZWZlcmVuY2VzLlxuICAgKlxuICAgKiBDYWxsaW5nIHdpdGggYW4gZW1wdHkgb2JqZWN0IGFuZCBubyBrZXlzIGlzIGEgbm8tb3AsIG9yIGFuIHVuZGVmaW5lZCBvYmplY3QuXG4gICAqIENhbGxpbmcgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyBmaWVsZHMgbm90IGluIGBQcmVmZXJlbmNlc2Agb3Igd2l0aCB1cGRhdGVGaWVsZHMgbm90IGxpbmtlZCB0byBwcm9wZXJ0aWVzIGluXG4gICAqIGBQcmVmZXJlbmNlc2AgaXMgYW4gZXJyb3IuXG4gICAqL1xuICB1cGRhdGVQcmVmZXJlbmNlcyhyZXE6IHtcbiAgICBob3N0SWQ6IHN0cmluZztcbiAgICBwcmVmZXJlbmNlczogUGFydGlhbDxQcmVmZXJlbmNlcz47XG4gICAgdXBkYXRlRmllbGRzPzogKGtleW9mIFByZWZlcmVuY2VzKVtdO1xuICB9KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgZmllbGRNYXNrID0gZ2V0RmllbGRNYXNrKHtcbiAgICAgIG86IHJlcS5wcmVmZXJlbmNlcyxcbiAgICAgIHVwZGF0ZUZpZWxkczogcmVxLnVwZGF0ZUZpZWxkcyxcbiAgICB9KTtcbiAgICBpZiAoZmllbGRNYXNrLnBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG9mKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlXG4gICAgICAudXBkYXRlSG9zdFByZWZlcmVuY2VzKHtcbiAgICAgICAgaG9zdElkOiByZXEuaG9zdElkLFxuICAgICAgICBwcmVmZXJlbmNlczogcmVxLnByZWZlcmVuY2VzLFxuICAgICAgICBmaWVsZE1hc2ssXG4gICAgICB9KVxuICAgICAgLnBpcGUobWFwVG8odW5kZWZpbmVkKSk7XG4gIH1cblxuICBnZXRQcmVmZXJlbmNlcyhyZXE6IHsgaG9zdElkOiBzdHJpbmcgfSk6IE9ic2VydmFibGU8UHJlZmVyZW5jZXM+IHtcbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZVxuICAgICAgLmdldEhvc3RQcmVmZXJlbmNlcyh7XG4gICAgICAgIGhvc3RJZDogcmVxLmhvc3RJZCxcbiAgICAgIH0pXG4gICAgICAucGlwZShtYXAoKHJlc3BvbnNlKSA9PiBQcmVmZXJlbmNlc0Zyb21BcGkocmVzcG9uc2UucHJlZmVyZW5jZXMpKSk7XG4gIH1cblxuICBnZXRNZWV0aW5nKG1lZXRpbmdJZDogc3RyaW5nLCBsb2NhdGlvbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxNZWV0aW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2VcbiAgICAgIC5nZXRIb3N0TWVldGluZyh7XG4gICAgICAgIG1lZXRpbmdJZDogbWVldGluZ0lkLFxuICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcDogR2V0SG9zdE1lZXRpbmdSZXNwb25zZSkgPT4gbWVldGluZ0Zyb21BcGkocmVzcC5tZWV0aW5nKSlcbiAgICAgICk7XG4gIH1cblxuICB1cGRhdGVNZWV0aW5nTWV0YWRhdGEocmVxOiB7XG4gICAgbWVldGluZ0lkOiBzdHJpbmc7XG4gICAgbWV0YWRhdGE6IE1lZXRpbmdNZXRhZGF0YTtcbiAgfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlXG4gICAgICAudXBkYXRlTWVldGluZ01ldGFkYXRhKHtcbiAgICAgICAgbWVldGluZ0lkOiByZXEubWVldGluZ0lkLFxuICAgICAgICBtZXRhZGF0YTogcmVxLm1ldGFkYXRhLFxuICAgICAgfSlcbiAgICAgIC5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICB9XG5cbiAgYm9va01lZXRpbmcocmVxOiBIb3N0Qm9va01lZXRpbmdSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZVxuICAgICAgLmJvb2tNZWV0aW5nKHJlcSlcbiAgICAgIC5waXBlKG1hcCgocmVzcDogSG9zdEJvb2tNZWV0aW5nUmVzcG9uc2UpID0+IHJlc3AubWVldGluZ0lkKSk7XG4gIH1cblxuICAvLyBjcmVhdGVEZWZhdWx0TWVldGluZ1R5cGVzIHdpbGwgY3JlYXRlIHdoYXQgTWVldGluZyBTY2hlZHVsZXIgZGVlbXMgdG8gYmUgdGhlIGRlZmF1bHQgbWVldGluZyB0eXBlcy5cbiAgLy8gSWYgdGhlIGNhbGVuZGFyIGFscmVhZHkgaGFzIG1lZXRpbmcgdHlwZXMsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSBhIG5vLW9wLlxuICBjcmVhdGVEZWZhdWx0TWVldGluZ1R5cGVzKHJlcTogeyBjYWxlbmRhcklkczogc3RyaW5nW10gfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlXG4gICAgICAuY3JlYXRlRGVmYXVsdE1lZXRpbmdUeXBlcyh7IGNhbGVuZGFySWRzOiByZXEuY2FsZW5kYXJJZHMgfSlcbiAgICAgIC5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICB9XG5cbiAgY3JlYXRlTWVldGluZ1R5cGUocmVxOiB7XG4gICAgbWVldGluZ1R5cGU6IE1lZXRpbmdUeXBlO1xuICAgIHVwZGF0ZUZpZWxkcz86IChrZXlvZiBNZWV0aW5nVHlwZSlbXTtcbiAgICBIb3N0SWQ/OiBzdHJpbmc7XG4gIH0pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IGZpZWxkTWFzayA9IGdldEZpZWxkTWFzayh7XG4gICAgICBvOiByZXEubWVldGluZ1R5cGUsXG4gICAgICB1cGRhdGVGaWVsZHM6IHJlcS51cGRhdGVGaWVsZHMsXG4gICAgfSk7XG4gICAgaWYgKGZpZWxkTWFzay5wYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBvZigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZVxuICAgICAgLmNyZWF0ZU1lZXRpbmdUeXBlKHtcbiAgICAgICAgbWVldGluZ1R5cGU6IE1lZXRpbmdUeXBlVG9BcGkoeyBtZWV0aW5nVHlwZTogcmVxLm1lZXRpbmdUeXBlIH0pLFxuICAgICAgICBmaWVsZE1hc2ssXG4gICAgICAgIGhvc3RJZDogcmVxLkhvc3RJZCxcbiAgICAgIH0pXG4gICAgICAucGlwZShtYXAoKHJlcykgPT4gcmVzLmlkKSk7XG4gIH1cblxuICAvKiB1cGRhdGVNZWV0aW5nVHlwZSB3aWxsIHVwZGF0ZSB0aGUgbWVldGluZyB0eXBlIGZpZWxkcy5cbiAgICogSXQgaXMgZ3VhcmFudGVlZCB0byBvbmx5IHVwZGF0ZSB0aGUgZmllbGRzIHByb3ZpZGVkLlxuICAgKiBGb3IgZXhhbXBsZTpcbiAgICogIHVwZGF0ZU1lZXRpbmdUeXBlKHtuYW1lOiAnT25ib2FyZGluZyd9KVxuICAgKiAgd2lsbCBvbmx5IHVwZGF0ZSB0aGUgZmllbGQgJ25hbWUnIHRvICdPbmJvYXJkaW5nJy4gS2VlcGluZyB0aGUgb3RoZXIgZmllbGRzIHRoZSBzYW1lLlxuICAgKlxuICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYSBsaXN0IG9mIGtleXMgdG8gdXBkYXRlIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuXG4gICAqIEZvciBleGFtcGxlOlxuICAgKiAgIHVwZGF0ZU1lZXRpbmdUeXBlKHsuLi5vYmplY3Qgd2l0aCBhbGwgZmllbGRzfSwgWyduYW1lJ10pXG4gICAqICAgd2lsbCBvbmx5IHVwZGF0ZSB0aGUgZmllbGQgJ25hbWUnIHRvIHRoZSB2YWx1ZSBwYXNzZWQgaW4uXG4gICAqXG4gICAqIENhbGxpbmcgd2l0aCBhbiBlbXB0eSBvYmplY3QgYW5kIG5vIGtleXMgaXMgYSBuby1vcCwgb3IgYW4gdW5kZWZpbmVkIG9iamVjdC5cbiAgICogQ2FsbGluZyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIGZpZWxkcyBub3QgaW4gYE1lZXRpbmdUeXBlYCBvciB3aXRoIHVwZGF0ZUZpZWxkcyBub3QgbGlua2VkIHRvIHByb3BlcnRpZXMgaW5cbiAgICogYE1lZXRpbmdUeXBlYCBpcyBhbiBlcnJvci5cbiAgICovXG4gIHVwZGF0ZU1lZXRpbmdUeXBlKHJlcToge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWVldGluZ1R5cGU6IFBhcnRpYWw8TWVldGluZ1R5cGU+O1xuICAgIHVwZGF0ZUZpZWxkcz86IChrZXlvZiBNZWV0aW5nVHlwZSlbXTtcbiAgICBIb3N0SWQ/OiBzdHJpbmc7XG4gIH0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCBmaWVsZE1hc2sgPSBnZXRGaWVsZE1hc2soe1xuICAgICAgbzogcmVxLm1lZXRpbmdUeXBlLFxuICAgICAgdXBkYXRlRmllbGRzOiByZXEudXBkYXRlRmllbGRzLFxuICAgIH0pO1xuICAgIGlmIChmaWVsZE1hc2sucGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gb2YoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2VcbiAgICAgIC51cGRhdGVNZWV0aW5nVHlwZSh7XG4gICAgICAgIGlkOiByZXEuaWQsXG4gICAgICAgIG1lZXRpbmdUeXBlOiBNZWV0aW5nVHlwZVRvQXBpKHsgbWVldGluZ1R5cGU6IHJlcS5tZWV0aW5nVHlwZSB9KSxcbiAgICAgICAgZmllbGRNYXNrLFxuICAgICAgICBob3N0SWQ6IHJlcS5Ib3N0SWQsXG4gICAgICB9KVxuICAgICAgLnBpcGUobWFwVG8odW5kZWZpbmVkKSk7XG4gIH1cblxuICBkZWxldGVNZWV0aW5nVHlwZShyZXE6IHsgaWQ6IHN0cmluZyB9KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2VcbiAgICAgIC5kZWxldGVNZWV0aW5nVHlwZSh7IGlkOiByZXEuaWQgfSlcbiAgICAgIC5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICB9XG5cbiAgZ2V0SG9zdHNGb3JDYWxlbmRhcihyZXE6IHsgY2FsZW5kYXJJZDogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPEhvc3RVc2VyW10+IHtcbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZVxuICAgICAgLmdldEhvc3RzRm9yQ2FsZW5kYXIoeyBjYWxlbmRhcklkOiByZXEuY2FsZW5kYXJJZCB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChyZXMuaG9zdFVzZXJzIHx8IFtdKS5tYXAoKGhvc3R1c2VyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaG9zdFVzZXJGcm9tQXBpKGhvc3R1c2VyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBJc0NhbGVuZGFyQ29uZmlndXJlZChcbiAgICByZXE6IElzQ2FsZW5kYXJDb25maWd1cmVkUmVxdWVzdEludGVyZmFjZVxuICApOiBPYnNlcnZhYmxlPElzQ2FsZW5kYXJDb25maWd1cmVkUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS5pc0NhbGVuZGFyQ29uZmlndXJlZChyZXEpO1xuICB9XG5cbiAgc2VuZE1lZXRpbmdSZXF1ZXN0RW1haWwoXG4gICAgcmVxOiBTZW5kTWVldGluZ1JlcXVlc3RFbWFpbFJlcXVlc3RJbnRlcmZhY2VcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8bnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS5zZW5kTWVldGluZ1JlcXVlc3RFbWFpbChyZXEpO1xuICB9XG5cbiAgY3JlYXRlU2VydmljZShyZXE6IHtcbiAgICBzZXJ2aWNlOiBTZXJ2aWNlO1xuICAgIHVwZGF0ZUZpZWxkcz86IChrZXlvZiBTZXJ2aWNlKVtdO1xuICAgIEhvc3RJZD86IHN0cmluZztcbiAgfSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3QgZmllbGRNYXNrID0gZ2V0RmllbGRNYXNrKHtcbiAgICAgIG86IHJlcS5zZXJ2aWNlLFxuICAgICAgdXBkYXRlRmllbGRzOiByZXEudXBkYXRlRmllbGRzLFxuICAgIH0pO1xuICAgIGlmIChmaWVsZE1hc2sucGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gb2YoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2VcbiAgICAgIC5jcmVhdGVTZXJ2aWNlKHtcbiAgICAgICAgc2VydmljZTogU2VydmljZVR5cGVUb0FwaSh7IHNlcnZpY2U6IHJlcS5zZXJ2aWNlIH0pLFxuICAgICAgICBmaWVsZE1hc2ssXG4gICAgICAgIGhvc3RJZDogcmVxLkhvc3RJZCxcbiAgICAgIH0pXG4gICAgICAucGlwZShtYXAoKHJlcykgPT4gcmVzLmlkKSk7XG4gIH1cblxuICB1cGRhdGVTZXJ2aWNlKHJlcToge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc2VydmljZTogUGFydGlhbDxTZXJ2aWNlPjtcbiAgICB1cGRhdGVGaWVsZHM/OiAoa2V5b2YgU2VydmljZSlbXTtcbiAgICBIb3N0SWQ/OiBzdHJpbmc7XG4gIH0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCBmaWVsZE1hc2sgPSBnZXRGaWVsZE1hc2soe1xuICAgICAgbzogcmVxLnNlcnZpY2UsXG4gICAgICB1cGRhdGVGaWVsZHM6IHJlcS51cGRhdGVGaWVsZHMsXG4gICAgfSk7XG4gICAgaWYgKGZpZWxkTWFzay5wYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBvZigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZVxuICAgICAgLnVwZGF0ZVNlcnZpY2Uoe1xuICAgICAgICBpZDogcmVxLmlkLFxuICAgICAgICBzZXJ2aWNlOiBTZXJ2aWNlVHlwZVRvQXBpKHsgc2VydmljZTogcmVxLnNlcnZpY2UgfSksXG4gICAgICAgIGZpZWxkTWFzayxcbiAgICAgICAgaG9zdElkOiByZXEuSG9zdElkLFxuICAgICAgfSlcbiAgICAgIC5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICB9XG5cbiAgZGVsZXRlU2VydmljZShyZXE6IHsgaWQ6IHN0cmluZzsgaG9zdElkOiBzdHJpbmcgfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlXG4gICAgICAuZGVsZXRlU2VydmljZSh7IGlkOiByZXEuaWQsIGhvc3RJZDogcmVxLmhvc3RJZCB9KVxuICAgICAgLnBpcGUobWFwVG8odW5kZWZpbmVkKSk7XG4gIH1cblxuICBsaXN0U2VydmljZXMocmVxOiB7IGhvc3RJZDogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPFNlcnZpY2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmxpc3RTZXJ2aWNlcyh7IGhvc3RJZDogcmVxLmhvc3RJZCB9KS5waXBlKFxuICAgICAgbWFwKChyZXMpID0+IHtcbiAgICAgICAgaWYgKCFyZXMgfHwgIXJlcy5zZXJ2aWNlcykge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzLnNlcnZpY2VzLm1hcCgoc2VydmljZSkgPT5cbiAgICAgICAgICBTZXJ2aWNlRnJvbUFwaSh7XG4gICAgICAgICAgICBzZXJ2aWNlQXBpOiBzZXJ2aWNlLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IG9uUHJvZHVjdGlvbkdsb2JhbCgpXG4gICAgICAgICAgICAgID8gRW52aXJvbm1lbnQuUFJPRFxuICAgICAgICAgICAgICA6IEVudmlyb25tZW50LkRFTU8sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGNyZWF0ZUdyb3VwKHJlcToge1xuICAgIGdyb3VwOiBHcm91cDtcbiAgICB1cGRhdGVGaWVsZHM/OiAoa2V5b2YgR3JvdXApW107XG4gICAgSG9zdElkPzogc3RyaW5nO1xuICB9KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCBmaWVsZE1hc2sgPSBnZXRGaWVsZE1hc2soe1xuICAgICAgbzogcmVxLmdyb3VwLFxuICAgICAgdXBkYXRlRmllbGRzOiByZXEudXBkYXRlRmllbGRzLFxuICAgIH0pO1xuICAgIGlmIChmaWVsZE1hc2sucGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gb2YoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2VcbiAgICAgIC5jcmVhdGVHcm91cCh7XG4gICAgICAgIGdyb3VwOiBHcm91cFR5cGVUb0FQaSh7IGdyb3VwOiByZXEuZ3JvdXAgfSksXG4gICAgICAgIGZpZWxkTWFzayxcbiAgICAgICAgaG9zdElkOiByZXEuSG9zdElkLFxuICAgICAgfSlcbiAgICAgIC5waXBlKG1hcCgocmVzKSA9PiByZXMuaWQpKTtcbiAgfVxuXG4gIHVwZGF0ZUdyb3VwKHJlcToge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZ3JvdXA6IFBhcnRpYWw8R3JvdXA+O1xuICAgIHVwZGF0ZUZpZWxkcz86IChrZXlvZiBHcm91cClbXTtcbiAgICBIb3N0SWQ/OiBzdHJpbmc7XG4gIH0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCBmaWVsZE1hc2sgPSBnZXRGaWVsZE1hc2soe1xuICAgICAgbzogcmVxLmdyb3VwLFxuICAgICAgdXBkYXRlRmllbGRzOiByZXEudXBkYXRlRmllbGRzLFxuICAgIH0pO1xuICAgIGlmIChmaWVsZE1hc2sucGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gb2YoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2VcbiAgICAgIC51cGRhdGVHcm91cCh7XG4gICAgICAgIGlkOiByZXEuaWQsXG4gICAgICAgIGdyb3VwOiBHcm91cFR5cGVUb0FQaSh7IGdyb3VwOiByZXEuZ3JvdXAgfSksXG4gICAgICAgIGZpZWxkTWFzayxcbiAgICAgICAgaG9zdElkOiByZXEuSG9zdElkLFxuICAgICAgfSlcbiAgICAgIC5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuICB9XG5cbiAgZGVsZXRlR3JvdXAocmVxOiB7IGlkOiBzdHJpbmc7IGhvc3RJZDogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZVxuICAgICAgLmRlbGV0ZUdyb3VwKHsgaWQ6IHJlcS5pZCwgaG9zdElkOiByZXEuaG9zdElkIH0pXG4gICAgICAucGlwZShtYXBUbyh1bmRlZmluZWQpKTtcbiAgfVxuXG4gIGxpc3RHcm91cHMocmVxOiB7IGhvc3RJZDogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPEdyb3VwW10+IHtcbiAgICByZXR1cm4gdGhpcy5ob3N0QVBJU2VydmljZS5saXN0R3JvdXBzKHsgaG9zdElkOiByZXEuaG9zdElkIH0pLnBpcGUoXG4gICAgICBtYXAoKHJlcykgPT4ge1xuICAgICAgICBpZiAoIXJlcyB8fCAhcmVzLmdyb3Vwcykge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzLmdyb3Vwcy5tYXAoKGdyb3VwKSA9PlxuICAgICAgICAgIEdyb3VwRnJvbUFwaSh7XG4gICAgICAgICAgICBncm91cEFwaTogZ3JvdXAsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogb25Qcm9kdWN0aW9uR2xvYmFsKClcbiAgICAgICAgICAgICAgPyBFbnZpcm9ubWVudC5QUk9EXG4gICAgICAgICAgICAgIDogRW52aXJvbm1lbnQuREVNTyxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0R3JvdXAocmVxOiB7XG4gICAgZ3JvdXBJZDogc3RyaW5nO1xuICAgIHNsdWc6IHN0cmluZztcbiAgICBob3N0SWQ6IHN0cmluZztcbiAgfSk6IE9ic2VydmFibGU8R2V0R3JvdXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmdldEdyb3VwKHJlcSk7XG4gIH1cbiAgZ2V0U2VydmljZShyZXE6IHtcbiAgICBzZXJ2aWNlSWQ6IHN0cmluZztcbiAgICBzbHVnOiBzdHJpbmc7XG4gICAgaG9zdElkOiBzdHJpbmc7XG4gIH0pOiBPYnNlcnZhYmxlPEdldFNlcnZpY2VSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RBUElTZXJ2aWNlLmdldFNlcnZpY2UocmVxKTtcbiAgfVxuXG4gIGNoZWNrR3JvdXBPclNlcnZpY2VTbHVnRXhpc3QocmVxOiB7XG4gICAgaG9zdElkOiBzdHJpbmc7XG4gICAgc2x1Z0lkZW50aWZpZXI6IHN0cmluZztcbiAgICBjYXRlZ29yeTogc3RyaW5nO1xuICB9KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdEFQSVNlcnZpY2VcbiAgICAgIC5jaGVja0dyb3VwT3JTZXJ2aWNlU2x1Z0V4aXN0KHJlcSlcbiAgICAgIC5waXBlKG1hcCgocmVzKSA9PiByZXMuZXhpc3RzKSk7XG4gIH1cbn1cbiJdfQ==
|