stream-chat-angular 6.3.1 → 6.4.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/assets/version.d.ts +1 -1
- package/esm2020/assets/version.mjs +2 -2
- package/esm2020/lib/channel.service.mjs +12 -1
- package/esm2020/lib/message-input/message-input.component.mjs +101 -4
- package/fesm2015/stream-chat-angular.mjs +116 -6
- package/fesm2015/stream-chat-angular.mjs.map +1 -1
- package/fesm2020/stream-chat-angular.mjs +114 -6
- package/fesm2020/stream-chat-angular.mjs.map +1 -1
- package/lib/channel.service.d.ts +8 -1
- package/lib/message-input/message-input.component.d.ts +29 -2
- package/package.json +1 -1
- package/src/assets/version.ts +1 -1
|
@@ -39,6 +39,7 @@ export class ChannelService {
|
|
|
39
39
|
this._shouldMarkActiveChannelAsRead = true;
|
|
40
40
|
this.isStateRecoveryInProgress = false;
|
|
41
41
|
this.channelQueryStateSubject = new BehaviorSubject(undefined);
|
|
42
|
+
this.channelSwitchStateSubject = new BehaviorSubject('end');
|
|
42
43
|
this.channelListSetter = (channels, shouldStopWatchingRemovedChannels = true) => {
|
|
43
44
|
const currentChannels = this.channelsSubject.getValue() || [];
|
|
44
45
|
const deletedChannels = currentChannels.filter((c) => !channels?.find((channel) => channel.cid === c.cid));
|
|
@@ -140,6 +141,9 @@ export class ChannelService {
|
|
|
140
141
|
this.channelQueryState$ = this.channelQueryStateSubject
|
|
141
142
|
.asObservable()
|
|
142
143
|
.pipe(shareReplay(1));
|
|
144
|
+
this.channelSwitchState$ = this.channelSwitchStateSubject
|
|
145
|
+
.asObservable()
|
|
146
|
+
.pipe(shareReplay(1));
|
|
143
147
|
}
|
|
144
148
|
/**
|
|
145
149
|
* If set to false, read events won't be sent as new messages are received. If set to true active channel (if any) will immediately be marked as read.
|
|
@@ -178,6 +182,7 @@ export class ChannelService {
|
|
|
178
182
|
* @param channel
|
|
179
183
|
*/
|
|
180
184
|
setAsActiveChannel(channel) {
|
|
185
|
+
this.channelSwitchStateSubject.next('start');
|
|
181
186
|
const prevActiveChannel = this.activeChannelSubject.getValue();
|
|
182
187
|
if (prevActiveChannel?.cid === channel.cid) {
|
|
183
188
|
return;
|
|
@@ -201,11 +206,13 @@ export class ChannelService {
|
|
|
201
206
|
channel.state.latestMessages = channel.state.latestMessages.slice(channelStateLength - 2 * this.messagePageSize);
|
|
202
207
|
}
|
|
203
208
|
this.setChannelState(channel);
|
|
209
|
+
this.channelSwitchStateSubject.next('end');
|
|
204
210
|
}
|
|
205
211
|
/**
|
|
206
212
|
* Deselects the currently active (if any) channel
|
|
207
213
|
*/
|
|
208
214
|
deselectActiveChannel() {
|
|
215
|
+
this.channelSwitchStateSubject.next('start');
|
|
209
216
|
const activeChannel = this.activeChannelSubject.getValue();
|
|
210
217
|
if (!activeChannel) {
|
|
211
218
|
return;
|
|
@@ -226,6 +233,7 @@ export class ChannelService {
|
|
|
226
233
|
this.activeChannelUnreadCount = undefined;
|
|
227
234
|
this.areReadEventsPaused = false;
|
|
228
235
|
this.isMessageLoadingInProgress = false;
|
|
236
|
+
this.channelSwitchStateSubject.next('end');
|
|
229
237
|
}
|
|
230
238
|
/**
|
|
231
239
|
* Sets the given `message` as an active parent message. If `undefined` is provided, it will deleselect the current parent message.
|
|
@@ -653,6 +661,9 @@ export class ChannelService {
|
|
|
653
661
|
* @param message The message to select, if called with `undefined`, it deselects the message
|
|
654
662
|
*/
|
|
655
663
|
selectMessageToQuote(message) {
|
|
664
|
+
if (message && !this.isStreamMessage(message)) {
|
|
665
|
+
message = this.transformToStreamMessage(message);
|
|
666
|
+
}
|
|
656
667
|
this.messageToQuoteSubject.next(message);
|
|
657
668
|
}
|
|
658
669
|
/**
|
|
@@ -1561,4 +1572,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
|
|
|
1561
1572
|
providedIn: 'root',
|
|
1562
1573
|
}]
|
|
1563
1574
|
}], ctorParameters: function () { return [{ type: i1.ChatClientService }, { type: i0.NgZone }, { type: i2.NotificationService }]; } });
|
|
1564
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2NoYW5uZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUViLGFBQWEsR0FFZCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFxQnZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXpELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFZdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBRS9DOztHQUVHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUEwWHpCLFlBQ1UsaUJBQW9DLEVBQ3BDLE1BQWMsRUFDZCxtQkFBd0M7UUFGeEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Qsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQXhIbEQ7O1dBRUc7UUFDSCwrQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFDbkMsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDYixvQkFBZSxHQUFHLElBQUksZUFBZSxDQUMzQyxTQUFTLENBQ1YsQ0FBQztRQUNNLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUNoRCxTQUFTLENBQ1YsQ0FBQztRQUNNLGlDQUE0QixHQUFHLElBQUksZUFBZSxDQUV4RCxFQUFFLENBQUMsQ0FBQztRQUNF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QUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3RFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FDN0QsQ0FBQztRQUNGLElBQUk7WUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQ3JDLElBQUksQ0FBQyxzQkFBc0IsRUFDM0IsWUFBWSxDQUNiLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsd0JBQXdCO2dCQUMzQixJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQy9DLG1DQUFtQyxFQUNuQyxPQUFPLENBQ1IsQ0FBQztZQUNKLE1BQU0sS0FBSyxDQUFDO1NBQ2I7SUFDSCxDQUFDOztBQXQ5REQ7O0dBRUc7QUFDYSw2Q0FBOEIsR0FBRyxJQUFJLENBQUM7MkdBcFEzQyxjQUFjOytHQUFkLGNBQWMsY0FGYixNQUFNOzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIE9ic2VydmFibGUsXG4gIFJlcGxheVN1YmplY3QsXG4gIFN1YnNjcmlwdGlvbixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBtYXAsIHNoYXJlUmVwbGF5LCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQXR0YWNobWVudCxcbiAgQ2hhbm5lbCxcbiAgQ2hhbm5lbEZpbHRlcnMsXG4gIENoYW5uZWxPcHRpb25zLFxuICBDaGFubmVsUmVzcG9uc2UsXG4gIENoYW5uZWxTb3J0LFxuICBDdXN0b21NZXNzYWdlRGF0YSxcbiAgQ3VzdG9tUmVhY3Rpb25EYXRhLFxuICBFdmVudCxcbiAgRXZlbnRUeXBlcyxcbiAgRm9ybWF0TWVzc2FnZVJlc3BvbnNlLFxuICBMb2NhbE1lc3NhZ2UsXG4gIE1lbWJlckZpbHRlcnMsXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VSZXNwb25zZSxcbiAgUmVhY3Rpb25SZXNwb25zZSxcbiAgVXNlclJlc3BvbnNlLFxufSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQgeyBDaGF0Q2xpZW50U2VydmljZSwgQ2xpZW50RXZlbnQgfSBmcm9tICcuL2NoYXQtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi9nZXQtbWVzc2FnZS10cmFuc2xhdGlvbic7XG5pbXBvcnQgeyBjcmVhdGVNZXNzYWdlUHJldmlldyB9IGZyb20gJy4vbWVzc2FnZS1wcmV2aWV3JztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGdldFJlYWRCeSB9IGZyb20gJy4vcmVhZC1ieSc7XG5pbXBvcnQge1xuICBBdHRhY2htZW50VXBsb2FkLFxuICBBdHRhY2htZW50VXBsb2FkRXJyb3JSZWFzb24sXG4gIENoYW5uZWxRdWVyeVJlc3VsdCxcbiAgQ2hhbm5lbFF1ZXJ5U3RhdGUsXG4gIENoYW5uZWxRdWVyeVR5cGUsXG4gIE1lc3NhZ2VJbnB1dCxcbiAgTWVzc2FnZVJlYWN0aW9uVHlwZSxcbiAgTmV4dFBhZ2VDb25maWd1cmF0aW9uLFxuICBTdHJlYW1NZXNzYWdlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IENoYW5uZWxRdWVyeSB9IGZyb20gJy4vY2hhbm5lbC1xdWVyeSc7XG5cbi8qKlxuICogVGhlIGBDaGFubmVsU2VydmljZWAgcHJvdmlkZXMgZGF0YSBhbmQgaW50ZXJhY3Rpb24gZm9yIHRoZSBjaGFubmVsIGxpc3QgYW5kIG1lc3NhZ2UgbGlzdC5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIENoYW5uZWxTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEVtaXRzIGBmYWxzZWAgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcGFnZXMgb2YgY2hhbm5lbHMgdGhhdCBjYW4gYmUgbG9hZGVkLlxuICAgKi9cbiAgaGFzTW9yZUNoYW5uZWxzJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50bHkgbG9hZGVkIGFuZCBbd2F0Y2hlZF0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3dhdGNoX2NoYW5uZWwvKSBjaGFubmVsIGxpc3QuXG4gICAqXG4gICAqIDo6OmltcG9ydGFudFxuICAgKiBJZiB5b3Ugd2FudCB0byBzdWJzY3JpYmUgdG8gY2hhbm5lbCBldmVudHMsIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlZW50ZXIgQW5ndWxhcidzIGNoYW5nZSBkZXRlY3Rpb24gem9uZSwgb3VyIFtDaGFuZ2UgZGV0ZWN0aW9uIGd1aWRlXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL2NvbmNlcHRzL2NoYW5nZS1kZXRlY3Rpb24vKSBleHBsYWlucyB0aGlzIGluIGRldGFpbC5cbiAgICogOjo6XG4gICAqL1xuICBjaGFubmVscyQ6IE9ic2VydmFibGU8Q2hhbm5lbFtdIHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIFRoZSByZXN1bHQgb2YgdGhlIGxhdGVzdCBjaGFubmVsIHF1ZXJ5IHJlcXVlc3QuXG4gICAqL1xuICBjaGFubmVsUXVlcnlTdGF0ZSQ6IE9ic2VydmFibGU8Q2hhbm5lbFF1ZXJ5U3RhdGUgfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2hhbm5lbC5cbiAgICpcbiAgICogOjo6aW1wb3J0YW50XG4gICAqIElmIHlvdSB3YW50IHRvIHN1YnNjcmliZSB0byBjaGFubmVsIGV2ZW50cywgeW91IG5lZWQgdG8gbWFudWFsbHkgcmVlbnRlciBBbmd1bGFyJ3MgY2hhbmdlIGRldGVjdGlvbiB6b25lLCBvdXIgW0NoYW5nZSBkZXRlY3Rpb24gZ3VpZGVdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvY29uY2VwdHMvY2hhbmdlLWRldGVjdGlvbi8pIGV4cGxhaW5zIHRoaXMgaW4gZGV0YWlsLlxuICAgKiA6OjpcbiAgICpcbiAgICogVGhlIGFjdGl2ZSBjaGFubmVsIHdpbGwgYWx3YXlzIGJlIG1hcmtlZCBhcyByZWFkIHdoZW4gYSBuZXcgbWVzc2FnZSBpcyByZWNlaXZlZFxuICAgKi9cbiAgYWN0aXZlQ2hhbm5lbCQ6IE9ic2VydmFibGU8Q2hhbm5lbCB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiBjdXJyZW50bHkgbG9hZGVkIG1lc3NhZ2VzIG9mIHRoZSBhY3RpdmUgY2hhbm5lbC5cbiAgICovXG4gIGFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQ6IE9ic2VydmFibGU8U3RyZWFtTWVzc2FnZVtdPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBsaXN0IG9mIHBpbm5lZCBtZXNzYWdlcyBvZiB0aGUgYWN0aXZlIGNoYW5uZWwuXG4gICAqL1xuICBhY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXMkOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2VbXT47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgaWQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXJlbnQgbWVzc2FnZS4gSWYgbm8gbWVzc2FnZSBpcyBzZWxlY3RlZCwgaXQgZW1pdHMgdW5kZWZpbmVkLlxuICAgKi9cbiAgYWN0aXZlUGFyZW50TWVzc2FnZUlkJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGxvYWRlZCB0aHJlYWQgcmVwbGllcyBiZWxvbmdpbmcgdG8gdGhlIHNlbGVjdGVkIHBhcmVudCBtZXNzYWdlLiBJZiB0aGVyZSBpcyBubyBjdXJyZW50bHkgYWN0aXZlIHRocmVhZCBpdCBlbWl0cyBhbiBlbXB0eSBhcnJheS5cbiAgICovXG4gIGFjdGl2ZVRocmVhZE1lc3NhZ2VzJDogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlW10+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXJlbnQgbWVzc2FnZS4gSWYgbm8gbWVzc2FnZSBpcyBzZWxlY3RlZCwgaXQgZW1pdHMgdW5kZWZpbmVkLlxuICAgKi9cbiAgYWN0aXZlUGFyZW50TWVzc2FnZSQ6IE9ic2VydmFibGU8U3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1lc3NhZ2UgdG8gcXVvdGVcbiAgICovXG4gIG1lc3NhZ2VUb1F1b3RlJDogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0aGUgbWVzc2FnZSBsaXN0IHNob3VsZCBqdW1wIHRvIChjYW4gYmUgYSBjaGFubmVsIG1lc3NhZ2Ugb3IgdGhyZWFkIG1lc3NhZ2UpXG4gICAqL1xuICBqdW1wVG9NZXNzYWdlJDogT2JzZXJ2YWJsZTx7IGlkPzogc3RyaW5nOyBwYXJlbnRJZD86IHN0cmluZyB9PjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBsaXN0IG9mIHVzZXJzIHRoYXQgYXJlIGN1cnJlbnRseSB0eXBpbmcgaW4gdGhlIGNoYW5uZWwgKGN1cnJlbnQgdXNlciBpcyBub3QgaW5jbHVkZWQpXG4gICAqL1xuICB1c2Vyc1R5cGluZ0luQ2hhbm5lbCQ6IE9ic2VydmFibGU8VXNlclJlc3BvbnNlW10+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGxpc3Qgb2YgdXNlcnMgdGhhdCBhcmUgY3VycmVudGx5IHR5cGluZyBpbiB0aGUgYWN0aXZlIHRocmVhZCAoY3VycmVudCB1c2VyIGlzIG5vdCBpbmNsdWRlZClcbiAgICovXG4gIHVzZXJzVHlwaW5nSW5UaHJlYWQkOiBPYnNlcnZhYmxlPFVzZXJSZXNwb25zZVtdPjtcbiAgLyoqXG4gICAqIEVtaXRzIGEgbWFwIHRoYXQgY29udGFpbnMgdGhlIGRhdGUgb2YgdGhlIGxhdGVzdCBtZXNzYWdlIHNlbnQgYnkgdGhlIGN1cnJlbnQgdXNlciBieSBjaGFubmVscyAodGhpcyBpcyB1c2VkIHRvIGRldGVjdCBpZiBzbG93IG1vZGUgY291bnRkb3duIHNob3VsZCBiZSBzdGFydGVkKVxuICAgKi9cbiAgbGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzJDogT2JzZXJ2YWJsZTx7IFtrZXk6IHN0cmluZ106IERhdGUgfT47XG4gIC8qKlxuICAgKiBJZiB5b3UncmUgdXNpbmcgW3NlbWFudGljIGZpbHRlcnMgZm9yIG1vZGVyYXRpb25dKC9tb2RlcmF0aW9uL2RvY3MvKSB5b3UgY2FuIHNldCB1cCBydWxlcyBmb3IgYm91bmNpbmcgbWVzc2FnZXMuXG4gICAqXG4gICAqIElmIGEgbWVzc2FnZSBpcyBib3VuY2VkLCBpdCB3aWxsIGJlIGVtaXR0ZWQgdmlhIHRoaXMgYE9ic2VydmFibGVgLiBUaGUgYnVpbHQtaW4gW2BNZXNzYWdlQm91bmNlUHJvbXB0YCBjb21wb25lbnRdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvY29tcG9uZW50cy9NZXNzYWdlQm91bmNlUHJvbXB0Q29tcG9uZW50Lykgd2lsbCBkaXNwbGF5IHRoZSBib3VuY2Ugb3B0aW9uIHRvIHRoZSB1c2VyIGlmIGEgYm91bmNlZCBtZXNzYWdlIGlzIGNsaWNrZWQuXG4gICAqL1xuICBib3VuY2VkTWVzc2FnZSQ6IEJlaGF2aW9yU3ViamVjdDxTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIFRoZSBsYXN0IHJlYWQgbWVzc2FnZSBpZCBvZiB0aGUgYWN0aXZlIGNoYW5uZWwsIGl0J3MgdXNlZCBieSB0aGUgbWVzc2FnZSBsaXN0IGNvbXBvbmVudCB0byBkaXNwbGF5IHVucmVhZCBVSSwgYW5kIGp1bXAgdG8gbGF0ZXN0IHJlYWQgbWVzc2FnZVxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzbid0IGFsd2F5cyB1cGRhdGVkLCBwbGVhc2UgdXNlIGBjaGFubmVsLnJlYWRgIHRvIGRpc3BsYXkgdXAtdG8tZGF0ZSByZWFkIGluZm9ybWF0aW9uXG4gICAqL1xuICBhY3RpdmVDaGFubmVsTGFzdFJlYWRNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdW5yZWFkIGNvdW50IG9mIHRoZSBhY3RpdmUgY2hhbm5lbCwgaXQncyB1c2VkIGJ5IHRoZSBtZXNzYWdlIGxpc3QgY29tcG9uZW50IHRvIGRpc3BsYXkgdW5yZWFkIFVJXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgaXNuJ3QgYWx3YXlzIHVwZGF0ZWQsIHBsZWFzZSB1c2UgYGNoYW5uZWwucmVhZGAgdG8gZGlzcGxheSB1cC10by1kYXRlIHJlYWQgaW5mb3JtYXRpb25cbiAgICovXG4gIGFjdGl2ZUNoYW5uZWxVbnJlYWRDb3VudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgaWYgYSBuZXcgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgY2hhbm5lbCB0aGF0IGlzIG5vdCBiZWluZyB3YXRjaGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9DaGFubmVsU2VydmljZS8jY2hhbm5lbHMvKVxuICAgKlxuICAgKiBJZiB5b3UncmUgYWRkaW5nIGEgbmV3IGNoYW5uZWwsIG1ha2Ugc3VyZSB0aGF0IGl0J3MgYSBbd2F0Y2hlZF0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3dhdGNoX2NoYW5uZWwvKSBjaGFubmVsLlxuICAgKi9cbiAgY3VzdG9tTmV3TWVzc2FnZU5vdGlmaWNhdGlvbkhhbmRsZXI/OiAoXG4gICAgY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogQ2hhbm5lbFtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gdGhlIHVzZXIgaXMgYWRkZWQgdG8gYSBjaGFubmVsLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9DaGFubmVsU2VydmljZS8jY2hhbm5lbHMvKS5cbiAgICpcbiAgICogSWYgeW91J3JlIGFkZGluZyBhIG5ldyBjaGFubmVsLCBtYWtlIHN1cmUgdGhhdCBpdCdzIGEgW3dhdGNoZWRdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC93YXRjaF9jaGFubmVsLykgY2hhbm5lbC5cbiAgICovXG4gIGN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcj86IChcbiAgICBjbGllbnRFdmVudDogQ2xpZW50RXZlbnQsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChcbiAgICAgIGNoYW5uZWxzOiBDaGFubmVsW10sXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHM/OiBib29sZWFuXG4gICAgKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiB0aGUgdXNlciBpcyByZW1vdmVkIGZyb20gYSBjaGFubmVsLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9DaGFubmVsU2VydmljZS8jY2hhbm5lbHMvKS5cbiAgICpcbiAgICogSWYgeW91J3JlIGFkZGluZyBhIG5ldyBjaGFubmVsLCBtYWtlIHN1cmUgdGhhdCBpdCdzIGEgW3dhdGNoZWRdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC93YXRjaF9jaGFubmVsLykgY2hhbm5lbC5cbiAgICovXG4gIGN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXI/OiAoXG4gICAgY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50LFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogQ2hhbm5lbFtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGlzIGRlbGV0ZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL0NoYW5uZWxTZXJ2aWNlLyNjaGFubmVscy8pLlxuICAgKlxuICAgKiBJZiB5b3UncmUgYWRkaW5nIGEgbmV3IGNoYW5uZWwsIG1ha2Ugc3VyZSB0aGF0IGl0J3MgYSBbd2F0Y2hlZF0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3dhdGNoX2NoYW5uZWwvKSBjaGFubmVsLlxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbERlbGV0ZWRIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsLFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogQ2hhbm5lbFtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBpcyB1cGRhdGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9DaGFubmVsU2VydmljZS8jY2hhbm5lbHMvKS5cbiAgICpcbiAgICogSWYgeW91J3JlIGFkZGluZyBhIG5ldyBjaGFubmVsLCBtYWtlIHN1cmUgdGhhdCBpdCdzIGEgW3dhdGNoZWRdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC93YXRjaF9jaGFubmVsLykgY2hhbm5lbC5cbiAgICovXG4gIGN1c3RvbUNoYW5uZWxVcGRhdGVkSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbCxcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKFxuICAgICAgY2hhbm5lbHM6IENoYW5uZWxbXSxcbiAgICAgIHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVscz86IGJvb2xlYW5cbiAgICApID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgaXMgdHJ1bmNhdGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9DaGFubmVsU2VydmljZS8jY2hhbm5lbHMvKS5cbiAgICpcbiAgICogSWYgeW91J3JlIGFkZGluZyBhIG5ldyBjaGFubmVsLCBtYWtlIHN1cmUgdGhhdCBpdCdzIGEgW3dhdGNoZWRdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC93YXRjaF9jaGFubmVsLykgY2hhbm5lbC5cbiAgICovXG4gIGN1c3RvbUNoYW5uZWxUcnVuY2F0ZWRIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsLFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogQ2hhbm5lbFtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBiZWNvbWVzIGhpZGRlbiwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvQ2hhbm5lbFNlcnZpY2UvI2NoYW5uZWxzLykuXG4gICAqXG4gICAqIElmIHlvdSdyZSBhZGRpbmcgYSBuZXcgY2hhbm5lbCwgbWFrZSBzdXJlIHRoYXQgaXQncyBhIFt3YXRjaGVkXSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvd2F0Y2hfY2hhbm5lbC8pIGNoYW5uZWwuXG4gICAqL1xuICBjdXN0b21DaGFubmVsSGlkZGVuSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbCxcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKFxuICAgICAgY2hhbm5lbHM6IENoYW5uZWxbXSxcbiAgICAgIHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVscz86IGJvb2xlYW5cbiAgICApID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgYmVjb21lcyB2aXNpYmxlLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9DaGFubmVsU2VydmljZS8jY2hhbm5lbHMvKS5cbiAgICpcbiAgICogSWYgeW91J3JlIGFkZGluZyBhIG5ldyBjaGFubmVsLCBtYWtlIHN1cmUgdGhhdCBpdCdzIGEgW3dhdGNoZWRdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC93YXRjaF9jaGFubmVsLykgY2hhbm5lbC5cbiAgICovXG4gIGN1c3RvbUNoYW5uZWxWaXNpYmxlSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbCxcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKFxuICAgICAgY2hhbm5lbHM6IENoYW5uZWxbXSxcbiAgICAgIHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVscz86IGJvb2xlYW5cbiAgICApID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgaWYgYSBuZXcgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgY2hhbm5lbCB0aGF0IGlzIGJlaW5nIHdhdGNoZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL0NoYW5uZWxTZXJ2aWNlLyNjaGFubmVscy8pLlxuICAgKlxuICAgKiBJZiB5b3UncmUgYWRkaW5nIGEgbmV3IGNoYW5uZWwsIG1ha2Ugc3VyZSB0aGF0IGl0J3MgYSBbd2F0Y2hlZF0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3dhdGNoX2NoYW5uZWwvKSBjaGFubmVsLlxuICAgKi9cbiAgY3VzdG9tTmV3TWVzc2FnZUhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWwsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChcbiAgICAgIGNoYW5uZWxzOiBDaGFubmVsW10sXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHM/OiBib29sZWFuXG4gICAgKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZpbGUgdXBsb2FkIHJlcXVlc3QgLSB5b3UgY2FuIHVzZSB0aGlzIHRvIHVwbG9hZCBmaWxlcyB0byB5b3VyIG93biBDRE5cbiAgICovXG4gIGN1c3RvbUZpbGVVcGxvYWRSZXF1ZXN0PzogKFxuICAgIGZpbGU6IEZpbGUsXG4gICAgY2hhbm5lbDogQ2hhbm5lbFxuICApID0+IFByb21pc2U8eyBmaWxlOiBzdHJpbmcgfT47XG4gIC8qKlxuICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltYWdlIHVwbG9hZCByZXF1ZXN0IC0geW91IGNhbiB1c2UgdGhpcyB0byB1cGxvYWQgaW1hZ2VzIHRvIHlvdXIgb3duIENETlxuICAgKi9cbiAgY3VzdG9tSW1hZ2VVcGxvYWRSZXF1ZXN0PzogKFxuICAgIGZpbGU6IEZpbGUsXG4gICAgY2hhbm5lbDogQ2hhbm5lbFxuICApID0+IFByb21pc2U8eyBmaWxlOiBzdHJpbmcgfT47XG4gIC8qKlxuICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZpbGUgZGVsZXRlIHJlcXVlc3QgLSBvdmVycmlkZSB0aGlzIGlmIHlvdSB1c2UgeW91ciBvd24gQ0ROXG4gICAqL1xuICBjdXN0b21GaWxlRGVsZXRlUmVxdWVzdD86ICh1cmw6IHN0cmluZywgY2hhbm5lbDogQ2hhbm5lbCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1hZ2UgZGVsZXRlIHJlcXVlc3QgLSBvdmVycmlkZSB0aGlzIGlmIHlvdSB1c2UgeW91ciBvd24gQ0ROXG4gICAqL1xuICBjdXN0b21JbWFnZURlbGV0ZVJlcXVlc3Q/OiAodXJsOiBzdHJpbmcsIGNoYW5uZWw6IENoYW5uZWwpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgcHJvdmlkZWQgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBkZWxldGluZyBhIG1lc3NhZ2UuIElmIHRoZSByZXR1cm5lZCBQcm9taXNlIHJlc29sdmVzIHRvIGB0cnVlYCB0byBkZWxldGlvbiB3aWxsIGdvIGFoZWFkLiBJZiBgZmFsc2VgIGlzIHJldHVybmVkLCB0aGUgbWVzc2FnZSB3b24ndCBiZSBkZWxldGVkLlxuICAgKi9cbiAgbWVzc2FnZURlbGV0ZUNvbmZpcm1hdGlvbkhhbmRsZXI/OiAoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZVxuICApID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIC8qKlxuICAgKiBUaGUgcHJvdmlkZWQgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhIG5ldyBtZXNzYWdlIGlzIHNlbnQgdG8gU3RyZWFtJ3MgQVBJLiBZb3UgY2FuIHVzZSB0aGlzIGhvb2sgdG8gdHJhbmZyb20gb3IgZW5yaWNoIHRoZSBtZXNzYWdlIGJlaW5nIHNlbnQuXG4gICAqL1xuICBiZWZvcmVTZW5kTWVzc2FnZT86IChcbiAgICBpbnB1dDogTWVzc2FnZUlucHV0XG4gICkgPT4gTWVzc2FnZUlucHV0IHwgUHJvbWlzZTxNZXNzYWdlSW5wdXQ+O1xuICAvKipcbiAgICogVGhlIHByb3ZpZGVkIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYSBtZXNzYWdlIGlzIHNlbnQgdG8gU3RyZWFtJ3MgQVBJIGZvciB1cGRhdGUuIFlvdSBjYW4gdXNlIHRoaXMgaG9vayB0byB0cmFuZnJvbSBvciBlbnJpY2ggdGhlIG1lc3NhZ2UgYmVpbmcgdXBkYXRlZC5cbiAgICovXG4gIGJlZm9yZVVwZGF0ZU1lc3NhZ2U/OiAoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZVxuICApID0+IFN0cmVhbU1lc3NhZ2UgfCBQcm9taXNlPFN0cmVhbU1lc3NhZ2U+O1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgTUFYX01FU1NBR0VfUkVBQ1RJT05TX1RPX0ZFVENIID0gMTIwMDtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgaXNNZXNzYWdlTG9hZGluZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgbWVzc2FnZVBhZ2VTaXplID0gMjU7XG4gIHByaXZhdGUgY2hhbm5lbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFubmVsW10gfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBwcml2YXRlIGFjdGl2ZUNoYW5uZWxTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFubmVsIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICAoU3RyZWFtTWVzc2FnZSB8IE1lc3NhZ2VSZXNwb25zZSB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZSlbXVxuICA+KFtdKTtcbiAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBTdHJlYW1NZXNzYWdlW11cbiAgPihbXSk7XG4gIHByaXZhdGUgaGFzTW9yZUNoYW5uZWxzU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICBwcml2YXRlIGFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zOiB7IHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkIH1bXSA9IFtdO1xuICBwcml2YXRlIGNoYW5uZWxTdWJzY3JpcHRpb25zOiB7IFtrZXk6IHN0cmluZ106ICgpID0+IHZvaWQgfSA9IHt9O1xuICBwcml2YXRlIGFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIHN0cmluZyB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICAoU3RyZWFtTWVzc2FnZSB8IE1lc3NhZ2VSZXNwb25zZSB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZSlbXVxuICA+KFtdKTtcbiAgcHJpdmF0ZSBqdW1wVG9NZXNzYWdlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIGlkPzogc3RyaW5nO1xuICAgIHBhcmVudElkPzogc3RyaW5nO1xuICB9Pih7IGlkOiB1bmRlZmluZWQsIHBhcmVudElkOiB1bmRlZmluZWQgfSk7XG4gIHByaXZhdGUgbGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIFtrZXk6IHN0cmluZ106IERhdGU7XG4gIH0+KHt9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdHRhY2htZW50TWF4U2l6ZUZhbGxiYWNrSW5NQiA9IDEwMDtcbiAgcHJpdmF0ZSBtZXNzYWdlVG9RdW90ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlclJlc3BvbnNlW10+KFtdKTtcbiAgcHJpdmF0ZSB1c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlclJlc3BvbnNlW10+KFtdKTtcbiAgcHJpdmF0ZSBfc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQgPSB0cnVlO1xuICBwcml2YXRlIHNob3VsZFNldEFjdGl2ZUNoYW5uZWw6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY2xpZW50RXZlbnRzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IGZhbHNlO1xuICBwcml2YXRlIGNoYW5uZWxRdWVyeVN0YXRlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgQ2hhbm5lbFF1ZXJ5U3RhdGUgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGNoYW5uZWxRdWVyeT86XG4gICAgfCBDaGFubmVsUXVlcnlcbiAgICB8ICgocXVlcnlUeXBlOiBDaGFubmVsUXVlcnlUeXBlKSA9PiBQcm9taXNlPENoYW5uZWxRdWVyeVJlc3VsdD4pO1xuICBwcml2YXRlIF9jdXN0b21QYWdpbmF0b3I6XG4gICAgfCAoKGNoYW5uZWxRdWVyeVJlc3VsdDogQ2hhbm5lbFtdKSA9PiBOZXh0UGFnZUNvbmZpZ3VyYXRpb24pXG4gICAgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBjaGFubmVsTGlzdFNldHRlciA9IChcbiAgICBjaGFubmVsczogQ2hhbm5lbFtdLFxuICAgIHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVscyA9IHRydWVcbiAgKSA9PiB7XG4gICAgY29uc3QgY3VycmVudENoYW5uZWxzID0gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXTtcbiAgICBjb25zdCBkZWxldGVkQ2hhbm5lbHMgPSBjdXJyZW50Q2hhbm5lbHMuZmlsdGVyKFxuICAgICAgKGMpID0+ICFjaGFubmVscz8uZmluZCgoY2hhbm5lbCkgPT4gY2hhbm5lbC5jaWQgPT09IGMuY2lkKVxuICAgICk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5uZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbHNbaV07XG4gICAgICBpZiAoIXRoaXMuY2hhbm5lbFN1YnNjcmlwdGlvbnNbY2hhbm5lbC5jaWRdKSB7XG4gICAgICAgIHRoaXMud2F0Y2hGb3JDaGFubmVsRXZlbnRzKGNoYW5uZWwpO1xuICAgICAgfVxuICAgICAgaWYgKGRlbGV0ZWRDaGFubmVscy5pbmNsdWRlcyhjaGFubmVsKSkge1xuICAgICAgICBpZiAoc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY2hhbm5lbFN1YnNjcmlwdGlvbnNbY2hhbm5lbC5jaWRdKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zW2NoYW5uZWwuY2lkXSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hhbm5lbFN1YnNjcmlwdGlvbnMuY2lkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2b2lkIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC5hY3RpdmVDaGFubmVsc1tjaGFubmVsLmNpZF1cbiAgICAgICAgICAgID8uc3RvcFdhdGNoaW5nKClcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PlxuICAgICAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQubG9nZ2VyKFxuICAgICAgICAgICAgICAgICd3YXJuJyxcbiAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHVud2F0Y2ggY2hhbm5lbCcsXG4gICAgICAgICAgICAgICAgZXJyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV4dENoYW5uZWxzID0gY2hhbm5lbHM7XG4gICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChuZXh0Q2hhbm5lbHMpO1xuICAgIGlmIChcbiAgICAgICFuZXh0Q2hhbm5lbHMuZmluZChcbiAgICAgICAgKGMpID0+IGMuY2lkID09PSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmNpZFxuICAgICAgKVxuICAgICkge1xuICAgICAgaWYgKG5leHRDaGFubmVscy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2V0QXNBY3RpdmVDaGFubmVsKG5leHRDaGFubmVsc1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtZXNzYWdlTGlzdFNldHRlciA9IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQobWVzc2FnZXMpO1xuICB9O1xuXG4gIHByaXZhdGUgdGhyZWFkTGlzdFNldHRlciA9IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChtZXNzYWdlcyk7XG4gIH07XG5cbiAgcHJpdmF0ZSBwYXJlbnRNZXNzYWdlU2V0dGVyID0gKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpID0+IHtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dChtZXNzYWdlPy5pZCk7XG4gIH07XG4gIHByaXZhdGUgZGlzbWlzc0Vycm9yTm90aWZpY2F0aW9uPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBhcmVSZWFkRXZlbnRzUGF1c2VkID0gZmFsc2U7XG4gIHByaXZhdGUgbWFya1JlYWRUaHJvdHRsZVRpbWUgPSAxMDUwO1xuICBwcml2YXRlIG1hcmtSZWFkVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIHNjaGVkdWxlZE1hcmtSZWFkUmVxdWVzdD86ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGF0Q2xpZW50U2VydmljZTogQ2hhdENsaWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5jaGFubmVscyQgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWwkID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkID0gdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0LnBpcGUoXG4gICAgICBtYXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgICAgICByZXR1cm4gbWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PlxuICAgICAgICAgIHRoaXMudHJhbnNmb3JtVG9TdHJlYW1NZXNzYWdlKG1lc3NhZ2UsIGNoYW5uZWwpXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgICB0aGlzLmJvdW5jZWRNZXNzYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZD4oXG4gICAgICB1bmRlZmluZWRcbiAgICApO1xuICAgIHRoaXMuaGFzTW9yZUNoYW5uZWxzJCA9IHRoaXMuaGFzTW9yZUNoYW5uZWxzU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWQkID0gdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzJCA9IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0LnBpcGUoXG4gICAgICBtYXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgICAgICByZXR1cm4gbWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PlxuICAgICAgICAgIHRoaXMudHJhbnNmb3JtVG9TdHJlYW1NZXNzYWdlKG1lc3NhZ2UsIGNoYW5uZWwpXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2UkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQsXG4gICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZCQsXG4gICAgXSkucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKFttZXNzYWdlcywgcGFyZW50TWVzc2FnZUlkXTogW1xuICAgICAgICAgIFN0cmVhbU1lc3NhZ2VbXSxcbiAgICAgICAgICBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgICAgXSkgPT4ge1xuICAgICAgICAgIGlmICghcGFyZW50TWVzc2FnZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXMuZmluZCgobSkgPT4gbS5pZCA9PT0gcGFyZW50TWVzc2FnZUlkKTtcbiAgICAgICAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICAgICAgICB2b2lkIHRoaXMuc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gICAgdGhpcy5tZXNzYWdlVG9RdW90ZSQgPSB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5qdW1wVG9NZXNzYWdlJCA9IHRoaXMuanVtcFRvTWVzc2FnZVN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuXG4gICAgdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbCQgPSB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkJCA9IHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzJCA9XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVsc1N1YmplY3RcbiAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxQaW5uZWRNZXNzYWdlcyQgPSB0aGlzLmFjdGl2ZUNoYW5uZWxQaW5uZWRNZXNzYWdlc1N1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMuY2hhbm5lbFF1ZXJ5U3RhdGUkID0gdGhpcy5jaGFubmVsUXVlcnlTdGF0ZVN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHNldCB0byBmYWxzZSwgcmVhZCBldmVudHMgd29uJ3QgYmUgc2VudCBhcyBuZXcgbWVzc2FnZXMgYXJlIHJlY2VpdmVkLiBJZiBzZXQgdG8gdHJ1ZSBhY3RpdmUgY2hhbm5lbCAoaWYgYW55KSB3aWxsIGltbWVkaWF0ZWx5IGJlIG1hcmtlZCBhcyByZWFkLlxuICAgKi9cbiAgZ2V0IHNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gZmFsc2UsIHJlYWQgZXZlbnRzIHdvbid0IGJlIHNlbnQgYXMgbmV3IG1lc3NhZ2VzIGFyZSByZWNlaXZlZC4gSWYgc2V0IHRvIHRydWUgYWN0aXZlIGNoYW5uZWwgKGlmIGFueSkgd2lsbCBpbW1lZGlhdGVseSBiZSBtYXJrZWQgYXMgcmVhZC5cbiAgICovXG4gIHNldCBzaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZChzaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5fc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQgJiYgc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBpZiAoYWN0aXZlQ2hhbm5lbCAmJiB0aGlzLmNhblNlbmRSZWFkRXZlbnRzKSB7XG4gICAgICAgIHZvaWQgYWN0aXZlQ2hhbm5lbC5tYXJrUmVhZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCA9IHNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIFNESyB1c2VzIGFuIG9mZnNldCBiYXNlZCBwYWdpbmF0aW9uLCB5b3UgY2FuIGNoYW5nZS9leHRlbmQgdGhpcyBieSBwcm92aWRpbmcgeW91ciBvd24gY3VzdG9tIHBhZ2luYXRvciBtZXRob2QuXG4gICAqXG4gICAqIFRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBsYXRlc3QgY2hhbm5lbCBxdWVyeS5cbiAgICpcbiAgICogWW91IGNhbiByZXR1cm4gZWl0aGVyIGFuIG9mZnNldCwgb3IgYSBmaWx0ZXIgdXNpbmcgdGhlIFtgJGx0ZWAvYCRndGVgIG9wZXJhdG9yXSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfc3ludGF4X29wZXJhdG9ycy8pLiBJZiB5b3UgcmV0dXJuIGEgZmlsdGVyLCBpdCB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoZSBmaWx0ZXIgcHJvdmlkZWQgZm9yIHRoZSBgaW5pdGAgbWV0aG9kLlxuICAgKi9cbiAgc2V0IGN1c3RvbVBhZ2luYXRvcihcbiAgICBwYWdpbmF0b3I6XG4gICAgICB8ICgoY2hhbm5lbFF1ZXJ5UmVzdWx0OiBDaGFubmVsW10pID0+IE5leHRQYWdlQ29uZmlndXJhdGlvbilcbiAgICAgIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuX2N1c3RvbVBhZ2luYXRvciA9IHBhZ2luYXRvcjtcbiAgICBpZiAodGhpcy5jaGFubmVsUXVlcnkgJiYgJ2N1c3RvbVBhZ2luYXRvcicgaW4gdGhpcy5jaGFubmVsUXVlcnkpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFF1ZXJ5LmN1c3RvbVBhZ2luYXRvciA9IHRoaXMuX2N1c3RvbVBhZ2luYXRvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ2l2ZW4gYGNoYW5uZWxgIGFzIGFjdGl2ZSBhbmQgbWFya3MgaXQgYXMgcmVhZC5cbiAgICogSWYgdGhlIGNoYW5uZWwgd2Fzbid0IHByZXZpb3VzbHkgcGFydCBvZiB0aGUgY2hhbm5lbCwgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LlxuICAgKiBAcGFyYW0gY2hhbm5lbFxuICAgKi9cbiAgc2V0QXNBY3RpdmVDaGFubmVsKGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICBjb25zdCBwcmV2QWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAocHJldkFjdGl2ZUNoYW5uZWw/LmNpZCA9PT0gY2hhbm5lbC5jaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdG9wV2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKHByZXZBY3RpdmVDaGFubmVsKTtcbiAgICB0aGlzLmZsdXNoTWFya1JlYWRRdWV1ZSgpO1xuICAgIHRoaXMuYXJlUmVhZEV2ZW50c1BhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNNZXNzYWdlTG9hZGluZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICBjb25zdCByZWFkU3RhdGUgPVxuICAgICAgY2hhbm5lbC5zdGF0ZS5yZWFkW3RoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyPy5pZCB8fCAnJ107XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTGFzdFJlYWRNZXNzYWdlSWQgPSByZWFkU3RhdGU/Lmxhc3RfcmVhZF9tZXNzYWdlX2lkO1xuICAgIGlmIChcbiAgICAgIGNoYW5uZWwuc3RhdGUubGF0ZXN0TWVzc2FnZXNbY2hhbm5lbC5zdGF0ZS5sYXRlc3RNZXNzYWdlcy5sZW5ndGggLSAxXVxuICAgICAgICA/LmlkID09PSB0aGlzLmFjdGl2ZUNoYW5uZWxMYXN0UmVhZE1lc3NhZ2VJZFxuICAgICkge1xuICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTGFzdFJlYWRNZXNzYWdlSWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFVucmVhZENvdW50ID0gcmVhZFN0YXRlPy51bnJlYWRfbWVzc2FnZXMgfHwgMDtcbiAgICB0aGlzLndhdGNoRm9yQWN0aXZlQ2hhbm5lbEV2ZW50cyhjaGFubmVsKTtcbiAgICB0aGlzLmFkZENoYW5uZWwoY2hhbm5lbCk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KGNoYW5uZWwpO1xuICAgIGNvbnN0IGNoYW5uZWxTdGF0ZUxlbmd0aCA9IGNoYW5uZWwuc3RhdGUubGF0ZXN0TWVzc2FnZXMubGVuZ3RoO1xuICAgIGlmIChjaGFubmVsU3RhdGVMZW5ndGggPiAyICogdGhpcy5tZXNzYWdlUGFnZVNpemUpIHtcbiAgICAgIGNoYW5uZWwuc3RhdGUubGF0ZXN0TWVzc2FnZXMgPSBjaGFubmVsLnN0YXRlLmxhdGVzdE1lc3NhZ2VzLnNsaWNlKFxuICAgICAgICBjaGFubmVsU3RhdGVMZW5ndGggLSAyICogdGhpcy5tZXNzYWdlUGFnZVNpemVcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuc2V0Q2hhbm5lbFN0YXRlKGNoYW5uZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VsZWN0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSAoaWYgYW55KSBjaGFubmVsXG4gICAqL1xuICBkZXNlbGVjdEFjdGl2ZUNoYW5uZWwoKSB7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIWFjdGl2ZUNoYW5uZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdG9wV2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKGFjdGl2ZUNoYW5uZWwpO1xuICAgIHRoaXMuZmx1c2hNYXJrUmVhZFF1ZXVlKCk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0Lm5leHQoe30pO1xuICAgIHRoaXMuc2VsZWN0TWVzc2FnZVRvUXVvdGUodW5kZWZpbmVkKTtcbiAgICB0aGlzLmp1bXBUb01lc3NhZ2VTdWJqZWN0Lm5leHQoeyBpZDogdW5kZWZpbmVkLCBwYXJlbnRJZDogdW5kZWZpbmVkIH0pO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFBpbm5lZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbExhc3RSZWFkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFVucmVhZENvdW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYXJlUmVhZEV2ZW50c1BhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNNZXNzYWdlTG9hZGluZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBnaXZlbiBgbWVzc2FnZWAgYXMgYW4gYWN0aXZlIHBhcmVudCBtZXNzYWdlLiBJZiBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgaXQgd2lsbCBkZWxlc2VsZWN0IHRoZSBjdXJyZW50IHBhcmVudCBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKiBAcGFyYW0gbG9hZE1lc3NhZ2VzRm9ybVxuICAgKi9cbiAgYXN5bmMgc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKFxuICAgIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQsXG4gICAgbG9hZE1lc3NhZ2VzRm9ybTogJ3JlcXVlc3QnIHwgJ3N0YXRlJyA9ICdyZXF1ZXN0J1xuICApIHtcbiAgICBjb25zdCBtZXNzYWdlVG9RdW90ZSA9IHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKG1lc3NhZ2VUb1F1b3RlICYmICEhbWVzc2FnZVRvUXVvdGUucGFyZW50X2lkKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgICAgY29uc3QgbWVzc2FnZVRvSnVtcFRvID0gdGhpcy5qdW1wVG9NZXNzYWdlU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgaWYgKG1lc3NhZ2VUb0p1bXBUbyAmJiAhIW1lc3NhZ2VUb0p1bXBUby5wYXJlbnRJZCkge1xuICAgICAgICB0aGlzLmp1bXBUb01lc3NhZ2VTdWJqZWN0Lm5leHQoeyBpZDogdW5kZWZpbmVkLCBwYXJlbnRJZDogdW5kZWZpbmVkIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dChtZXNzYWdlLmlkKTtcbiAgICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBpZiAobG9hZE1lc3NhZ2VzRm9ybSA9PT0gJ3JlcXVlc3QnKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGl2ZUNoYW5uZWw/LmdldFJlcGxpZXMobWVzc2FnZS5pZCwge1xuICAgICAgICAgIGxpbWl0OiB0aGlzLm1lc3NhZ2VQYWdlU2l6ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQocmVzdWx0Py5tZXNzYWdlcyB8fCBbXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFxuICAgICAgICAgIGFjdGl2ZUNoYW5uZWw/LnN0YXRlLnRocmVhZHNbbWVzc2FnZS5pZF0gfHwgW11cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIG5leHQgcGFnZSBvZiBtZXNzYWdlcyBvZiB0aGUgYWN0aXZlIGNoYW5uZWwuIFRoZSBwYWdlIHNpemUgY2FuIGJlIHNldCBpbiB0aGUgW3F1ZXJ5IG9wdGlvbl0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLyNxdWVyeS1vcHRpb25zKSBvYmplY3QuXG4gICAqIEBwYXJhbSBkaXJlY3Rpb25cbiAgICovXG4gIGxvYWRNb3JlTWVzc2FnZXMoZGlyZWN0aW9uOiAnb2xkZXInIHwgJ25ld2VyJyA9ICdvbGRlcicpIHtcbiAgICBjb25zdCBhY3RpdmVDaG5hbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IGxhc3RNZXNzYWdlSWQgPVxuICAgICAgbWVzc2FnZXNbZGlyZWN0aW9uID09PSAnb2xkZXInID8gMCA6IG1lc3NhZ2VzLmxlbmd0aCAtIDFdPy5pZDtcbiAgICBpZiAoXG4gICAgICBkaXJlY3Rpb24gPT09ICduZXdlcicgJiZcbiAgICAgIGFjdGl2ZUNobmFubmVsPy5zdGF0ZT8ubGF0ZXN0TWVzc2FnZXMgPT09IGFjdGl2ZUNobmFubmVsPy5zdGF0ZT8ubWVzc2FnZXNcbiAgICApIHtcbiAgICAgIC8vIElmIHdlIGFyZSBvbiBsYXRlc3QgbWVzc2FnZSBzZXQsIGFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQgd2lsbCBiZSByZWZyZXNoZWQgYnkgV1MgZXZlbnRzLCBubyBuZWVkIGZvciBhIHJlcXVlc3RcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGFjdGl2ZUNobmFubmVsXG4gICAgICA/LnF1ZXJ5KHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICBsaW1pdDogdGhpcy5tZXNzYWdlUGFnZVNpemUsXG4gICAgICAgICAgW2RpcmVjdGlvbiA9PT0gJ29sZGVyJyA/ICdpZF9sdCcgOiAnaWRfZ3QnXTogbGFzdE1lc3NhZ2VJZCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyczogeyBsaW1pdDogMCB9LFxuICAgICAgICB3YXRjaGVyczogeyBsaW1pdDogMCB9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFjdGl2ZUNobmFubmVsPy5kYXRhPy5pZCA9PT1cbiAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmRhdGE/LmlkXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgIC4uLmFjdGl2ZUNobmFubmVsLnN0YXRlLm1lc3NhZ2VzLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBuZXh0IHBhZ2Ugb2YgbWVzc2FnZXMgb2YgdGhlIGFjdGl2ZSB0aHJlYWQuIFRoZSBwYWdlIHNpemUgY2FuIGJlIHNldCBpbiB0aGUgW3F1ZXJ5IG9wdGlvbl0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLyNxdWVyeS1vcHRpb25zKSBvYmplY3QuXG4gICAqIEBwYXJhbSBkaXJlY3Rpb25cbiAgICovXG4gIGxvYWRNb3JlVGhyZWFkUmVwbGllcyhkaXJlY3Rpb246ICdvbGRlcicgfCAnbmV3ZXInID0gJ29sZGVyJykge1xuICAgIGlmIChkaXJlY3Rpb24gPT09ICduZXdlcicpIHtcbiAgICAgIC8vIFRocmVhZCByZXBsaWVzIGFyZW4ndCBicm9rZSBpbnRvIGRpZmZlcmVudCBtZXNzYWdlIHNldHMsIGFjdGl2ZVRocmVhZE1lc3NhZ2VzJCB3aWxsIGJlIHJlZnJlc2hlZCBieSBXUyBldmVudHMsIG5vIG5lZWQgZm9yIGEgcmVxdWVzdFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmVDaG5hbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBwYXJlbnRNZXNzYWdlSWQgPSB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIXBhcmVudE1lc3NhZ2VJZCB8fCAhYWN0aXZlQ2huYW5uZWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdGhyZWFkTWVzc2FnZXMgPSB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IGxhc3RNZXNzYWdlSWQgPVxuICAgICAgdGhyZWFkTWVzc2FnZXNbZGlyZWN0aW9uID09PSAnb2xkZXInID8gMCA6IHRocmVhZE1lc3NhZ2VzLmxlbmd0aCAtIDFdPy5pZDtcbiAgICByZXR1cm4gYWN0aXZlQ2huYW5uZWxcbiAgICAgIC5nZXRSZXBsaWVzKHBhcmVudE1lc3NhZ2VJZCwge1xuICAgICAgICBsaW1pdDogdGhpcy5tZXNzYWdlUGFnZVNpemUsXG4gICAgICAgIFtkaXJlY3Rpb24gPT09ICdvbGRlcicgPyAnaWRfbHQnIDogJ2lkX2d0J106IGxhc3RNZXNzYWdlSWQsXG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFxuICAgICAgICAgIGFjdGl2ZUNobmFubmVsPy5zdGF0ZS50aHJlYWRzW3BhcmVudE1lc3NhZ2VJZF0gfHwgW11cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJpZXMgdGhlIGNoYW5uZWxzIHdpdGggdGhlIGdpdmVuIGZpbHRlcnMsIHNvcnRzIGFuZCBvcHRpb25zLiBNb3JlIGluZm8gYWJvdXQgW2NoYW5uZWwgcXVlcnlpbmddKC9jaGF0L2RvY3MvamF2YXNjcmlwdC9xdWVyeV9jaGFubmVscy8pIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGxhdGZvcm0gZG9jdW1lbnRhdGlvbi4gQnkgZGVmYXVsdCB0aGUgZmlyc3QgY2hhbm5lbCBpbiB0aGUgbGlzdCB3aWxsIGJlIHNldCBhcyBhY3RpdmUgY2hhbm5lbCBhbmQgd2lsbCBiZSBtYXJrZWQgYXMgcmVhZC5cbiAgICogQHBhcmFtIGZpbHRlcnNcbiAgICogQHBhcmFtIHNvcnRcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHBhcmFtIHNob3VsZFNldEFjdGl2ZUNoYW5uZWwgRGVjaWRlcyBpZiB0aGUgZmlyc3QgY2hhbm5lbCBpbiB0aGUgcmVzdWx0IHNob3VsZCBiZSBtYWRlIGFzIGFuIGFjdGl2ZSBjaGFubmVsIG9yIG5vdC5cbiAgICogQHJldHVybnMgdGhlIGxpc3Qgb2YgY2hhbm5lbHMgZm91bmQgYnkgdGhlIHF1ZXJ5XG4gICAqL1xuICBpbml0KFxuICAgIGZpbHRlcnM6IENoYW5uZWxGaWx0ZXJzLFxuICAgIHNvcnQ/OiBDaGFubmVsU29ydCxcbiAgICBvcHRpb25zPzogQ2hhbm5lbE9wdGlvbnMsXG4gICAgc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbDogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy5jaGFubmVsUXVlcnkgPSBuZXcgQ2hhbm5lbFF1ZXJ5KFxuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZSxcbiAgICAgIHRoaXMsXG4gICAgICBmaWx0ZXJzLFxuICAgICAgc29ydCB8fCB7IGxhc3RfbWVzc2FnZV9hdDogLTEgfSxcbiAgICAgIHtcbiAgICAgICAgbGltaXQ6IDI1LFxuICAgICAgICBzdGF0ZTogdHJ1ZSxcbiAgICAgICAgcHJlc2VuY2U6IHRydWUsXG4gICAgICAgIHdhdGNoOiB0cnVlLFxuICAgICAgICBtZXNzYWdlX2xpbWl0OiB0aGlzLm1lc3NhZ2VQYWdlU2l6ZSxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuY2hhbm5lbFF1ZXJ5LmN1c3RvbVBhZ2luYXRvciA9IHRoaXMuX2N1c3RvbVBhZ2luYXRvcjtcblxuICAgIHJldHVybiB0aGlzLl9pbml0KHtcbiAgICAgIHNob3VsZFNldEFjdGl2ZUNoYW5uZWwsXG4gICAgICBtZXNzYWdlUGFnZVNpemU6IG9wdGlvbnM/Lm1lc3NhZ2VfbGltaXQgPz8gdGhpcy5tZXNzYWdlUGFnZVNpemUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUXVlcmllcyB0aGUgY2hhbm5lbHMgd2l0aCB0aGUgZ2l2ZW4gcXVlcnkgZnVuY3Rpb24uIE1vcmUgaW5mbyBhYm91dCBbY2hhbm5lbCBxdWVyeWluZ10oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLykgY2FuIGJlIGZvdW5kIGluIHRoZSBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uLlxuICAgKiBAcGFyYW0gcXVlcnlcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHBhcmFtIG9wdGlvbnMuc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbCBUaGUgYHNob3VsZFNldEFjdGl2ZUNoYW5uZWxgIHNwZWNpZmllcyBpZiB0aGUgZmlyc3QgY2hhbm5lbCBpbiB0aGUgcmVzdWx0IHNob3VsZCBiZSBzZWxlY3RlZCBhcyB0aGUgYWN0aXZlIGNoYW5uZWwgb3Igbm90LiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgICogQHBhcmFtIG9wdGlvbnMubWVzc2FnZVBhZ2VTaXplIEhvdyBtYW55IG1lc3NhZ2VzIHNob3VsZCB3ZSBsb2FkPyBUaGUgZGVmYXVsdCBpcyAyNVxuICAgKiBAcmV0dXJucyB0aGUgY2hhbm5lbHMgdGhhdCB3ZXJlIGxvYWRlZFxuICAgKi9cbiAgaW5pdFdpdGhDdXN0b21RdWVyeShcbiAgICBxdWVyeTogKHF1ZXJ5VHlwZTogQ2hhbm5lbFF1ZXJ5VHlwZSkgPT4gUHJvbWlzZTxDaGFubmVsUXVlcnlSZXN1bHQ+LFxuICAgIG9wdGlvbnM6IHsgc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbDogYm9vbGVhbjsgbWVzc2FnZVBhZ2VTaXplOiBudW1iZXIgfSA9IHtcbiAgICAgIHNob3VsZFNldEFjdGl2ZUNoYW5uZWw6IHRydWUsXG4gICAgICBtZXNzYWdlUGFnZVNpemU6IHRoaXMubWVzc2FnZVBhZ2VTaXplLFxuICAgIH1cbiAgKSB7XG4gICAgdGhpcy5jaGFubmVsUXVlcnkgPSBxdWVyeTtcbiAgICByZXR1cm4gdGhpcy5faW5pdChvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGBhY3RpdmVDaGFubmVsJGAsIGBjaGFubmVscyRgIGFuZCBgYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJGAgT2JzZXJ2YWJsZXMuIFVzZWZ1bCB3aGVuIGRpc2Nvbm5lY3RpbmcgYSBjaGF0IHVzZXIsIHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIFtgZGlzY29ubmVjdFVzZXJgXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL0NoYXRDbGllbnRTZXJ2aWNlLyNkaXNjb25uZWN0dXNlci8pLlxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5kZXNlbGVjdEFjdGl2ZUNoYW5uZWwoKTtcbiAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5jaGFubmVsUXVlcnlTdGF0ZVN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuY2xpZW50RXZlbnRzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzbWlzc0Vycm9yTm90aWZpY2F0aW9uPy4oKTtcbiAgICB0aGlzLmRpc21pc3NFcnJvck5vdGlmaWNhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zKS5mb3JFYWNoKChjaWQpID0+IHtcbiAgICAgIHRoaXMuY2hhbm5lbFN1YnNjcmlwdGlvbnNbY2lkXSgpO1xuICAgIH0pO1xuICAgIHRoaXMuY2hhbm5lbFN1YnNjcmlwdGlvbnMgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbmV4dCBwYWdlIG9mIGNoYW5uZWxzLiBUaGUgcGFnZSBzaXplIGNhbiBiZSBzZXQgaW4gdGhlIFtxdWVyeSBvcHRpb25dKC9jaGF0L2RvY3MvamF2YXNjcmlwdC9xdWVyeV9jaGFubmVscy8jcXVlcnktb3B0aW9ucykgb2JqZWN0LlxuICAgKi9cbiAgYXN5bmMgbG9hZE1vcmVDaGFubmVscygpIHtcbiAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2hhbm5lbHMoZmFsc2UsICduZXh0LXBhZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVhY3Rpb24gdG8gYSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBpZCBvZiB0aGUgbWVzc2FnZSB0byBhZGQgdGhlIHJlYWN0aW9uIHRvXG4gICAqIEBwYXJhbSByZWFjdGlvblR5cGUgVGhlIHR5cGUgb2YgdGhlIHJlYWN0aW9uXG4gICAqIEBwYXJhbSBjdXN0b21EYXRhXG4gICAqL1xuICBhc3luYyBhZGRSZWFjdGlvbihcbiAgICBtZXNzYWdlSWQ6IHN0cmluZyxcbiAgICByZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUsXG4gICAgY3VzdG9tRGF0YT86IEN1c3RvbVJlYWN0aW9uRGF0YVxuICApIHtcbiAgICBhd2FpdCB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LnNlbmRSZWFjdGlvbihtZXNzYWdlSWQsIHtcbiAgICAgIHR5cGU6IHJlYWN0aW9uVHlwZSxcbiAgICAgIC4uLmN1c3RvbURhdGEsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHJlYWN0aW9uIGZyb20gYSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBpZCBvZiB0aGUgbWVzc2FnZSB0byByZW1vdmUgdGhlIHJlYWN0aW9uIGZyb21cbiAgICogQHBhcmFtIHJlYWN0aW9uVHlwZSBUaHIgdHlwZSBvZiByZWFjdGlvbiB0byByZW1vdmVcbiAgICovXG4gIGFzeW5jIHJlbW92ZVJlYWN0aW9uKG1lc3NhZ2VJZDogc3RyaW5nLCByZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUpIHtcbiAgICBhd2FpdCB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0XG4gICAgICAuZ2V0VmFsdWUoKVxuICAgICAgPy5kZWxldGVSZWFjdGlvbihtZXNzYWdlSWQsIHJlYWN0aW9uVHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBhY3RpdmUgY2hhbm5lbC4gVGhlIG1lc3NhZ2UgaXMgaW1tZWRpYXRlbHkgYWRkZWQgdG8gdGhlIG1lc3NhZ2UgbGlzdCwgaWYgYW4gZXJyb3Igb2NjdXJzIGFuZCB0aGUgbWVzc2FnZSBjYW4ndCBiZSBzZW50LCB0aGUgZXJyb3IgaXMgaW5kaWNhdGVkIGluIGBzdGF0ZWAgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBhdHRhY2htZW50cyBUaGUgYXR0YWNobWVudHNcbiAgICogQHBhcmFtIG1lbnRpb25lZFVzZXJzIE1lbnRpb25lZCB1c2Vyc1xuICAgKiBAcGFyYW0gcGFyZW50SWQgSWQgb2YgdGhlIHBhcmVudCBtZXNzYWdlIChpZiBzZW5kaW5nIGEgdGhyZWFkIHJlcGx5KVxuICAgKiBAcGFyYW0gcXVvdGVkTWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIHRvIHF1b3RlIChpZiBzZW5kaW5nIGEgcXVvdGUgcmVwbHkpXG4gICAqIEBwYXJhbSBjdXN0b21EYXRhXG4gICAqIEBwYXJhbSBwb2xsSWQgSWQgb2YgdGhlIHBvbGwgKGlmIHNlbmRpbmcgYSBwb2xsIG1lc3NhZ2UpXG4gICAqL1xuICBhc3luYyBzZW5kTWVzc2FnZShcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgYXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSA9IFtdLFxuICAgIG1lbnRpb25lZFVzZXJzOiBVc2VyUmVzcG9uc2VbXSA9IFtdLFxuICAgIHBhcmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgcXVvdGVkTWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgY3VzdG9tRGF0YTogdW5kZWZpbmVkIHwgQ3VzdG9tTWVzc2FnZURhdGEgPSB1bmRlZmluZWQsXG4gICAgcG9sbElkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKSB7XG4gICAgbGV0IGlucHV0OiBNZXNzYWdlSW5wdXQgPSB7XG4gICAgICB0ZXh0LFxuICAgICAgYXR0YWNobWVudHMsXG4gICAgICBtZW50aW9uZWRVc2VycyxcbiAgICAgIHBhcmVudElkLFxuICAgICAgcXVvdGVkTWVzc2FnZUlkLFxuICAgICAgY3VzdG9tRGF0YSxcbiAgICAgIHBvbGxJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLmJlZm9yZVNlbmRNZXNzYWdlKSB7XG4gICAgICBpbnB1dCA9IGF3YWl0IHRoaXMuYmVmb3JlU2VuZE1lc3NhZ2UoaW5wdXQpO1xuICAgIH1cbiAgICBjb25zdCBwcmV2aWV3ID0gY3JlYXRlTWVzc2FnZVByZXZpZXcoXG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlciEsXG4gICAgICBpbnB1dC50ZXh0LFxuICAgICAgaW5wdXQuYXR0YWNobWVudHMsXG4gICAgICBpbnB1dC5tZW50aW9uZWRVc2VycyxcbiAgICAgIGlucHV0LnBhcmVudElkLFxuICAgICAgaW5wdXQucXVvdGVkTWVzc2FnZUlkLFxuICAgICAgaW5wdXQuY3VzdG9tRGF0YSxcbiAgICAgIGlucHV0LnBvbGxJZFxuICAgICk7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKHByZXZpZXcsIHRydWUpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kTWVzc2FnZVJlcXVlc3QocHJldmlldywgaW5wdXQuY3VzdG9tRGF0YSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VuZHMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gdGhlIGFjdGl2ZSBjaGFubmVsXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHJlc2VuZFxuICAgKi9cbiAgYXN5bmMgcmVzZW5kTWVzc2FnZShtZXNzYWdlOiBTdHJlYW1NZXNzYWdlKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKFxuICAgICAge1xuICAgICAgICAuLi4obWVzc2FnZSBhcyB1bmtub3duIGFzIE1lc3NhZ2VSZXNwb25zZSksXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc3RyZWFtLWNoYXQgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgcHJvcGVydHlcbiAgICAgICAgZXJyb3JTdGF0dXNDb2RlOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogJ3NlbmRpbmcnLFxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnNlbmRNZXNzYWdlUmVxdWVzdChtZXNzYWdlLCB1bmRlZmluZWQsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIG1lc3NhZ2UgaW4gdGhlIGFjdGl2ZSBjaGFubmVsXG4gICAqIEBwYXJhbSBtZXNzYWdlIE1lc2FnZSB0byBiZSB1cGRhdGVkXG4gICAqL1xuICBhc3luYyB1cGRhdGVNZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICBsZXQgbWVzc2FnZVRvVXBkYXRlOiBTdHJlYW1NZXNzYWdlID0ge1xuICAgICAgLi4ubWVzc2FnZSxcbiAgICB9O1xuICAgIGlmIChtZXNzYWdlVG9VcGRhdGUucXVvdGVkX21lc3NhZ2UpIHtcbiAgICAgIG1lc3NhZ2VUb1VwZGF0ZS5xdW90ZWRfbWVzc2FnZSA9IHtcbiAgICAgICAgLi4ubWVzc2FnZVRvVXBkYXRlLnF1b3RlZF9tZXNzYWdlLFxuICAgICAgfTtcbiAgICB9XG4gICAgZGVsZXRlIG1lc3NhZ2VUb1VwZGF0ZS5pMThuO1xuICAgIGlmICh0aGlzLmJlZm9yZVVwZGF0ZU1lc3NhZ2UpIHtcbiAgICAgIG1lc3NhZ2VUb1VwZGF0ZSA9IGF3YWl0IHRoaXMuYmVmb3JlVXBkYXRlTWVzc2FnZShtZXNzYWdlVG9VcGRhdGUpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZVRvVXBkYXRlLnJlYWRCeSkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGlzIGlzIG9ubHkgYSBydW4gdGltZSBwcm9wYXJ0eSBmb3IgdGhlIFNES1xuICAgICAgZGVsZXRlIG1lc3NhZ2VUb1VwZGF0ZS5yZWFkQnk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlVG9VcGRhdGUudHJhbnNsYXRpb24pIHtcbiAgICAgIGRlbGV0ZSBtZXNzYWdlVG9VcGRhdGUudHJhbnNsYXRpb247XG4gICAgfVxuICAgIGlmIChtZXNzYWdlVG9VcGRhdGUucXVvdGVkX21lc3NhZ2U/LnRyYW5zbGF0aW9uKSB7XG4gICAgICBkZWxldGUgbWVzc2FnZVRvVXBkYXRlLnF1b3RlZF9tZXNzYWdlLnRyYW5zbGF0aW9uO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5tb2RlcmF0aW9uX2RldGFpbHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVwZGF0ZU1lc3NhZ2UoXG4gICAgICBtZXNzYWdlVG9VcGRhdGUgYXMgdW5rbm93biBhcyBMb2NhbE1lc3NhZ2VcbiAgICApO1xuXG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHNTdWJqZWN0XG4gICAgICAuZ2V0VmFsdWUoKVxuICAgICAgPy5maW5kKChjKSA9PiBjLmNpZCA9PT0gbWVzc2FnZS5jaWQpO1xuXG4gICAgaWYgKFxuICAgICAgcmVzcG9uc2UubWVzc2FnZS50eXBlID09PSAnZXJyb3InICYmXG4gICAgICByZXNwb25zZS5tZXNzYWdlLm1vZGVyYXRpb25fZGV0YWlsc1xuICAgICkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgJ3N0cmVhbUNoYXQuVGhpcyBtZXNzYWdlIGRpZCBub3QgbWVldCBvdXIgY29udGVudCBndWlkZWxpbmVzJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVRvU3RyZWFtTWVzc2FnZShyZXNwb25zZS5tZXNzYWdlLCBjaGFubmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSBtZXNzYWdlIGZyb20gdGhlIGFjdGl2ZSBjaGFubmVsXG4gICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgdG8gYmUgZGVsZXRlZFxuICAgKiBAcGFyYW0gaXNMb2NhbERlbGV0ZSBzZXQgdGhpcyBgdHJ1ZWAgaWYgeW91IHdhbnQgdG8gZGVsZXRlIGEgbWVzc2FnZSB0aGF0J3Mgb25seSBwYXJ0IG9mIHRoZSBsb2NhbCBzdGF0ZSwgbm90IHlldCBzYXZlZCBvbiB0aGUgYmFja2VuZFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlTWVzc2FnZShtZXNzYWdlOiBTdHJlYW1NZXNzYWdlLCBpc0xvY2FsRGVsZXRlID0gZmFsc2UpIHtcbiAgICBpZiAoaXNMb2NhbERlbGV0ZSAmJiB0aGlzLmFjdGl2ZUNoYW5uZWwpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYWN0aXZlQ2hhbm5lbC5zdGF0ZS5yZW1vdmVNZXNzYWdlKHtcbiAgICAgICAgaWQ6IG1lc3NhZ2UuaWQsXG4gICAgICAgIHBhcmVudF9pZDogbWVzc2FnZS5wYXJlbnRfaWQsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgbWVzc2FnZS5wYXJlbnRfaWRcbiAgICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbC5zdGF0ZS50aHJlYWRzW21lc3NhZ2UucGFyZW50X2lkXVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbC5zdGF0ZS5tZXNzYWdlc1xuICAgICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWVzc2FnZURlbGV0ZUNvbmZpcm1hdGlvbkhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWVzc2FnZURlbGV0ZUNvbmZpcm1hdGlvbkhhbmRsZXIobWVzc2FnZSk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC5kZWxldGVNZXNzYWdlKG1lc3NhZ2UuaWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQuZGVsZXRlTWVzc2FnZShtZXNzYWdlLmlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkcyBmaWxlcyB0byB0aGUgY2hhbm5lbC4gSWYgeW91IHdhbnQgdG8ga25vdyBtb3JlIGFib3V0IFtmaWxlIHVwbG9hZHNdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC9maWxlX3VwbG9hZHMvKSBjaGVjayBvdXQgdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb24uXG4gICAqIEBwYXJhbSB1cGxvYWRzIHRoZSBhdHRhY2htZW50cyB0byB1cGxvYWQgKG91dHB1dCBvZiB0aGUgW2BBdHRhY2htZW50U2VydmljZWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvQXR0YWNobWVudFNlcnZpY2UvKSlcbiAgICogQHJldHVybnMgdGhlIHJlc3VsdCBvZiBmaWxlIHVwbG9hZCByZXF1ZXN0c1xuICAgKi9cbiAgYXN5bmMgdXBsb2FkQXR0YWNobWVudHMoXG4gICAgdXBsb2FkczogQXR0YWNobWVudFVwbG9hZFtdXG4gICk6IFByb21pc2U8QXR0YWNobWVudFVwbG9hZFtdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBBdHRhY2htZW50VXBsb2FkW10gPSBbXTtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICBjb25zdCB1cGxvYWRSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdXBsb2Fkcy5tYXAoKHVwbG9hZCkgPT5cbiAgICAgICAgdXBsb2FkLnR5cGUgPT09ICdpbWFnZSdcbiAgICAgICAgICA/IHRoaXMuY3VzdG9tSW1hZ2VVcGxvYWRSZXF1ZXN0XG4gICAgICAgICAgICA/IHRoaXMuY3VzdG9tSW1hZ2VVcGxvYWRSZXF1ZXN0KHVwbG9hZC5maWxlLCBjaGFubmVsKVxuICAgICAgICAgICAgOiBjaGFubmVsLnNlbmRJbWFnZSh1cGxvYWQuZmlsZSwgdXBsb2FkLmZpbGUubmFtZSwgdXBsb2FkLmZpbGUudHlwZSlcbiAgICAgICAgICA6IHRoaXMuY3VzdG9tRmlsZVVwbG9hZFJlcXVlc3RcbiAgICAgICAgICA/IHRoaXMuY3VzdG9tRmlsZVVwbG9hZFJlcXVlc3QodXBsb2FkLmZpbGUsIGNoYW5uZWwpXG4gICAgICAgICAgOiBjaGFubmVsLnNlbmRGaWxlKHVwbG9hZC5maWxlLCB1cGxvYWQuZmlsZS5uYW1lLCB1cGxvYWQuZmlsZS50eXBlKVxuICAgICAgKVxuICAgICk7XG4gICAgdXBsb2FkUmVzdWx0cy5mb3JFYWNoKCh1cGxvYWRSZXN1bHQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSB1cGxvYWRzW2ldLmZpbGU7XG4gICAgICBjb25zdCB0eXBlID0gdXBsb2Fkc1tpXS50eXBlO1xuICAgICAgaWYgKHVwbG9hZFJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgc3RhdGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICB1cmw6IHVwbG9hZFJlc3VsdC52YWx1ZS5maWxlLFxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICAgICAgICAgIHRodW1iX3VybDogKHVwbG9hZFJlc3VsdC52YWx1ZSBhcyBhbnkpLnRodW1iX3VybCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcmVhc29uOiBBdHRhY2htZW50VXBsb2FkRXJyb3JSZWFzb24gPSAndW5rbm93bic7XG4gICAgICAgIGxldCBleHRyYURhdGE6IHsgcGFyYW06IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50ICovXG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuICAgICAgICAgIHVwbG9hZFJlc3VsdC5yZWFzb24ucmVzcG9uc2U/LmRhdGE/Lm1lc3NhZ2U7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQgKi9cbiAgICAgICAgY29uc3QgY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkID1cbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gICAgICAgICAgdXBsb2FkUmVzdWx0LnJlYXNvbi5yZXNwb25zZT8uZGF0YT8uY29kZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvZGUgPT09IDIyIHx8XG4gICAgICAgICAgKGNvZGUgPT09IDQgJiYgbWVzc2FnZT8udG9Mb3dlckNhc2UoKT8uaW5jbHVkZXMoJ2J5dGVzJykpXG4gICAgICAgICkge1xuICAgICAgICAgIHJlYXNvbiA9ICdmaWxlLXNpemUnO1xuICAgICAgICAgIGV4dHJhRGF0YSA9IHtcbiAgICAgICAgICAgIHBhcmFtOlxuICAgICAgICAgICAgICAvXFxkK01CfFxcZCtcXHM/Ynl0ZXMvLmV4ZWMobWVzc2FnZSB8fCAnJyk/LlswXSB8fFxuICAgICAgICAgICAgICBgJHt0aGlzLmF0dGFjaG1lbnRNYXhTaXplRmFsbGJhY2tJbk1CfU1CYCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChleHRyYURhdGEucGFyYW0uaW5jbHVkZXMoJ2J5dGVzJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbWl0SW5CeXRlcyA9ICsoXG4gICAgICAgICAgICAgIC9cXGQrLy5leGVjKGV4dHJhRGF0YS5wYXJhbSk/LlswXSB8fFxuICAgICAgICAgICAgICB0aGlzLmF0dGFjaG1lbnRNYXhTaXplRmFsbGJhY2tJbk1CICogMTAyNCAqIDEwMjRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBleHRyYURhdGEucGFyYW0gPSBgJHtsaW1pdEluQnl0ZXMgLyAoMTAyNCAqIDEwMjQpfU1CYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY29kZSA9PT0gNCAmJlxuICAgICAgICAgIG1lc3NhZ2U/LnRvTG93ZXJDYXNlKCk/LmluY2x1ZGVzKCdmaWxlIGV4dGVuc2lvbicpXG4gICAgICAgICkge1xuICAgICAgICAgIHJlYXNvbiA9ICdmaWxlLWV4dGVuc2lvbic7XG4gICAgICAgICAgZXh0cmFEYXRhID0geyBwYXJhbTogL1xcLlxcdysvLmV4ZWMobWVzc2FnZSk/LlswXSB8fCAnJyB9O1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgc3RhdGU6ICdlcnJvcicsXG4gICAgICAgICAgZXJyb3JSZWFzb246IHJlYXNvbixcbiAgICAgICAgICBlcnJvckV4dHJhSW5mbzogZXh0cmFEYXRhID8gW2V4dHJhRGF0YV0gOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIHVwbG9hZGVkIGZpbGUgYnkgVVJMLiBJZiB5b3Ugd2FudCB0byBrbm93IG1vcmUgYWJvdXQgW2ZpbGUgdXBsb2Fkc10oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2ZpbGVfdXBsb2Fkcy8pIGNoZWNrIG91dCB0aGUgcGxhdGZvcm0gZG9jdW1lbnRhdGlvblxuICAgKiBAcGFyYW0gYXR0YWNobWVudFVwbG9hZCBBdHRhY2htZW50IHRvIGJlIGRlbGV0ZWQgKG91dHB1dCBvZiB0aGUgW2BBdHRhY2htZW50U2VydmljZWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvQXR0YWNobWVudFNlcnZpY2UvKSlcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUF0dGFjaG1lbnQoYXR0YWNobWVudFVwbG9hZDogQXR0YWNobWVudFVwbG9hZCkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGF3YWl0IChhdHRhY2htZW50VXBsb2FkLnR5cGUgPT09ICdpbWFnZSdcbiAgICAgID8gdGhpcy5jdXN0b21JbWFnZURlbGV0ZVJlcXVlc3RcbiAgICAgICAgPyB0aGlzLmN1c3RvbUltYWdlRGVsZXRlUmVxdWVzdChhdHRhY2htZW50VXBsb2FkLnVybCEsIGNoYW5uZWwpXG4gICAgICAgIDogY2hhbm5lbC5kZWxldGVJbWFnZShhdHRhY2htZW50VXBsb2FkLnVybCEpXG4gICAgICA6IHRoaXMuY3VzdG9tRmlsZURlbGV0ZVJlcXVlc3RcbiAgICAgID8gdGhpcy5jdXN0b21GaWxlRGVsZXRlUmVxdWVzdChhdHRhY2htZW50VXBsb2FkLnVybCEsIGNoYW5uZWwpXG4gICAgICA6IGNoYW5uZWwuZGVsZXRlRmlsZShhdHRhY2htZW50VXBsb2FkLnVybCEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRvY29tcGxldGUgb3B0aW9ucyBmb3IgY3VycmVudCBjaGFubmVsIG1lbWJlcnMuIElmIHRoZSBjaGFubmVsIGhhcyBsZXNzIHRoYW4gMTAwIG1lbWJlcnMsIGl0IHJldHVybnMgdGhlIGNoYW5uZWwgbWVtYmVycywgb3RoZXJ3aXNlIHNlbmRzIGEgW3NlYXJjaCByZXF1ZXN0XSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfbWVtYmVycy8jcGFnaW5hdGlvbi1hbmQtb3JkZXJpbmcpIHdpdGggdGhlIGdpdmVuIHNlYXJjaCB0ZXJtLlxuICAgKiBAcGFyYW0gc2VhcmNoVGVybSBUZXh0IHRvIHNlYXJjaCBmb3IgaW4gdGhlIG5hbWVzIG9mIG1lbWJlcnNcbiAgICogQHJldHVybnMgVGhlIGxpc3Qgb2YgbWVtYmVycyBtYXRjaGluZyB0aGUgc2VhcmNoIGZpbHRlclxuICAgKi9cbiAgYXN5bmMgYXV0b2NvbXBsZXRlTWVtYmVycyhzZWFyY2hUZXJtOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghYWN0aXZlQ2hhbm5lbCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMoYWN0aXZlQ2hhbm5lbC5zdGF0ZS5tZW1iZXJzKS5sZW5ndGggPCAxMDApIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGFjdGl2ZUNoYW5uZWwuc3RhdGUubWVtYmVycykuZmlsdGVyKFxuICAgICAgICAobSkgPT4gbS51c2VyPy5pZCAhPT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJJRCFcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghc2VhcmNoVGVybSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3RpdmVDaGFubmVsLnF1ZXJ5TWVtYmVycyh7XG4gICAgICAgIG5hbWU6IHsgJGF1dG9jb21wbGV0ZTogc2VhcmNoVGVybSB9LFxuICAgICAgfSBhcyBNZW1iZXJGaWx0ZXJzKTsgLy8gVE9ETzogZmluZCBvdXQgd2h5IHdlIG5lZWQgdHlwZWNhc3QgaGVyZVxuXG4gICAgICByZXR1cm4gcmVzdWx0Lm1lbWJlcnMuZmlsdGVyKFxuICAgICAgICAobSkgPT4gbS51c2VyX2lkICE9PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LnVzZXI/LmlkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbUnVucyBhIG1lc3NhZ2UgYWN0aW9uXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvcmVzdC8jbWVzc2FnZXMtcnVubWVzc2FnZWFjdGlvbikgaW4gdGhlIGN1cnJlbnQgY2hhbm5lbC4gVXBkYXRlcyB0aGUgbWVzc2FnZSBsaXN0IGJhc2VkIG9uIHRoZSBhY3Rpb24gcmVzdWx0IChpZiBubyBtZXNzYWdlIGlzIHJldHVybmVkLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWVzc2FnZSBsaXN0KS5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZFxuICAgKiBAcGFyYW0gZm9ybURhdGFcbiAgICogQHBhcmFtIHBhcmVudE1lc3NhZ2VJZFxuICAgKi9cbiAgYXN5bmMgc2VuZEFjdGlvbihcbiAgICBtZXNzYWdlSWQ6IHN0cmluZyxcbiAgICBmb3JtRGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBwYXJlbnRNZXNzYWdlSWQ/OiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaGFubmVsLnNlbmRBY3Rpb24obWVzc2FnZUlkLCBmb3JtRGF0YSk7XG4gICAgaWYgKHJlc3BvbnNlPy5tZXNzYWdlKSB7XG4gICAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQoe1xuICAgICAgICAuLi5yZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICBzdGF0dXM6ICdyZWNlaXZlZCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGlzVGhyZWFkUmVwbHkgPSAhIXJlc3BvbnNlLm1lc3NhZ2UucGFyZW50X2lkO1xuICAgICAgaXNUaHJlYWRSZXBseVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3Jlc3BvbnNlLm1lc3NhZ2UucGFyZW50X2lkIV0sXG4gICAgICAgICAgXSlcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFubmVsLnN0YXRlLnJlbW92ZU1lc3NhZ2Uoe1xuICAgICAgICBpZDogbWVzc2FnZUlkLFxuICAgICAgICBwYXJlbnRfaWQ6IHBhcmVudE1lc3NhZ2VJZCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFxuICAgICAgICAgIGNoYW5uZWwuc3RhdGUudGhyZWFkc1t0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuZ2V0VmFsdWUoKSFdXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIG9yIGRlc2VsZWN0cyB0aGUgY3VycmVudCBtZXNzYWdlIHRvIHF1b3RlIHJlcGx5IHRvXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHNlbGVjdCwgaWYgY2FsbGVkIHdpdGggYHVuZGVmaW5lZGAsIGl0IGRlc2VsZWN0cyB0aGUgbWVzc2FnZVxuICAgKi9cbiAgc2VsZWN0TWVzc2FnZVRvUXVvdGUobWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0Lm5leHQobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGNoYW5uZWwgdG8gdGhlIGNoYW5uZWwgbGlzdFxuICAgKiBUaGUgY2hhbm5lbCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNoYW5uZWwgbGlzdFxuICAgKiBAcGFyYW0gY2hhbm5lbFxuICAgKi9cbiAgYWRkQ2hhbm5lbChjaGFubmVsOiBDaGFubmVsKSB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWxzLmZpbmQoKGMpID0+IGMuY2lkID09PSBjaGFubmVsLmNpZCkpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoW2NoYW5uZWwsIC4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgICAgIHRoaXMud2F0Y2hGb3JDaGFubmVsRXZlbnRzKGNoYW5uZWwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY2lkXG4gICAqIEBwYXJhbSBzaG91bGRTdG9wV2F0Y2hpbmdcbiAgICovXG4gIHJlbW92ZUNoYW5uZWwoY2lkOiBzdHJpbmcsIHNob3VsZFN0b3BXYXRjaGluZyA9IHRydWUpIHtcbiAgICBjb25zdCByZW1haW5pbmdDaGFubmVscyA9IHRoaXMuY2hhbm5lbHMuZmlsdGVyKChjKSA9PiBjLmNpZCAhPT0gY2lkKTtcblxuICAgIGlmIChzaG91bGRTdG9wV2F0Y2hpbmcpIHtcbiAgICAgIGlmICh0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zW2NpZF0pIHtcbiAgICAgICAgdGhpcy5jaGFubmVsU3Vic2NyaXB0aW9uc1tjaWRdKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zLmNpZDtcbiAgICAgIH1cbiAgICAgIHZvaWQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmFjdGl2ZUNoYW5uZWxzW2NpZF1cbiAgICAgICAgPy5zdG9wV2F0Y2hpbmcoKVxuICAgICAgICAuY2F0Y2goKGVycikgPT5cbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQubG9nZ2VyKFxuICAgICAgICAgICAgJ3dhcm4nLFxuICAgICAgICAgICAgJ0ZhaWxlZCB0byB1bndhdGNoIGNoYW5uZWwnLFxuICAgICAgICAgICAgZXJyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZW1haW5pbmdDaGFubmVscy5sZW5ndGggPCB0aGlzLmNoYW5uZWxzLmxlbmd0aCkge1xuICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChyZW1haW5pbmdDaGFubmVscyk7XG4gICAgICBpZiAoY2lkID09PSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmNpZCkge1xuICAgICAgICBpZiAocmVtYWluaW5nQ2hhbm5lbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuc2V0QXNBY3RpdmVDaGFubmVsKHJlbWFpbmluZ0NoYW5uZWxzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZE1lc3NhZ2VSZXF1ZXN0KFxuICAgIHByZXZpZXc6IE1lc3NhZ2VSZXNwb25zZSB8IFN0cmVhbU1lc3NhZ2UsXG4gICAgY3VzdG9tRGF0YT86IEN1c3RvbU1lc3NhZ2VEYXRhLFxuICAgIGlzUmVzZW5kID0gZmFsc2VcbiAgKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY29uc3QgaXNUaHJlYWRSZXBseSA9ICEhcHJldmlldy5wYXJlbnRfaWQ7XG4gICAgaXNUaHJlYWRSZXBseVxuICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbcHJldmlldy5wYXJlbnRfaWQhXSxcbiAgICAgICAgXSlcbiAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaGFubmVsLnNlbmRNZXNzYWdlKHtcbiAgICAgICAgaWQ6IHByZXZpZXcuaWQsXG4gICAgICAgIHRleHQ6IHByZXZpZXcudGV4dCxcbiAgICAgICAgYXR0YWNobWVudHM6IHByZXZpZXcuYXR0YWNobWVudHMsXG4gICAgICAgIG1lbnRpb25lZF91c2VyczogcHJldmlldy5tZW50aW9uZWRfdXNlcnM/Lm1hcCgodSkgPT4gdS5pZCksXG4gICAgICAgIHBhcmVudF9pZDogcHJldmlldy5wYXJlbnRfaWQsXG4gICAgICAgIHF1b3RlZF9tZXNzYWdlX2lkOiBwcmV2aWV3LnF1b3RlZF9tZXNzYWdlX2lkLFxuICAgICAgICBwb2xsX2lkOiBwcmV2aWV3LnBvbGxfaWQsXG4gICAgICAgIC4uLmN1c3RvbURhdGEsXG4gICAgICB9IGFzIE1lc3NhZ2UpOyAvLyBUT0RPOiBmaW5kIG91dCB3aHkgd2UgbmVlZCB0eXBlY2FzdCBoZXJlXG4gICAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5yZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICAgIHN0YXR1czogJ3JlY2VpdmVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgIC4uLmNoYW5uZWwuc3RhdGUudGhyZWFkc1twcmV2aWV3LnBhcmVudF9pZCFdLFxuICAgICAgICAgIF0pXG4gICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICAgIGxldCBtZXNzYWdlcyE6IFN0cmVhbU1lc3NhZ2VbXTtcbiAgICAgIChpc1RocmVhZFJlcGx5ID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlcyQgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQpXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKG0pID0+IChtZXNzYWdlcyA9IG0pKTtcbiAgICAgIGNvbnN0IG5ld01lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgICAgIHJldHVybiBuZXdNZXNzYWdlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBzdHJpbmdFcnJvciA9IEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgICAgIGNvbnN0IHBhcnNlZEVycm9yOiB7XG4gICAgICAgIHN0YXR1cz86IG51bWJlcjtcbiAgICAgICAgY29kZT86IG51bWJlcjtcbiAgICAgICAgcmVzcG9uc2U/OiB7IGRhdGE/OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSB9O1xuICAgICAgfSA9IHN0cmluZ0Vycm9yID8gKEpTT04ucGFyc2Uoc3RyaW5nRXJyb3IpIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pIDoge307XG5cbiAgICAgIGxldCBpc0FscmVhZHlFeGlzdHMgPSBmYWxzZTtcbiAgICAgIGlmIChpc1Jlc2VuZCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcGFyc2VkRXJyb3Iuc3RhdHVzID09PSA0MDAgJiZcbiAgICAgICAgICBwYXJzZWRFcnJvci5jb2RlID09PSA0ICYmXG4gICAgICAgICAgcGFyc2VkRXJyb3I/LnJlc3BvbnNlPy5kYXRhPy5tZXNzYWdlPy5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICApIHtcbiAgICAgICAgICBpc0FscmVhZHlFeGlzdHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNoYW5uZWwuc3RhdGUuYWRkTWVzc2FnZVNvcnRlZChcbiAgICAgICAge1xuICAgICAgICAgIC4uLihwcmV2aWV3IGFzIE1lc3NhZ2VSZXNwb25zZSksXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzdHJlYW0tY2hhdCBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyBwcm9wZXJ0eVxuICAgICAgICAgIGVycm9yU3RhdHVzQ29kZTogaXNBbHJlYWR5RXhpc3RzXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBwYXJzZWRFcnJvci5zdGF0dXMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHN0YXR1czogaXNBbHJlYWR5RXhpc3RzID8gJ3JlY2VpdmVkJyA6ICdmYWlsZWQnLFxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgaXNUaHJlYWRSZXBseVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3ByZXZpZXcucGFyZW50X2lkIV0sXG4gICAgICAgICAgXSlcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgICAgbGV0IG1lc3NhZ2VzITogU3RyZWFtTWVzc2FnZVtdO1xuICAgICAgKGlzVGhyZWFkUmVwbHkgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzJCA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJClcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgobSkgPT4gKG1lc3NhZ2VzID0gbSkpO1xuICAgICAgY29uc3QgbmV3TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgcmV0dXJuIG5ld01lc3NhZ2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEp1bXBzIHRvIHRoZSBzZWxlY3RlZCBtZXNzYWdlIGluc2lkZSB0aGUgbWVzc2FnZSBsaXN0LCBpZiB0aGUgbWVzc2FnZSBpcyBub3QgeWV0IGxvYWRlZCwgaXQnbGwgbG9hZCB0aGUgbWVzc2FnZSAoYW5kIGl0J3Mgc3Vycm91bmRpbmdzKSBmcm9tIHRoZSBBUEkuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGxvYWRlZCwgJ2xhdGVzdCcgbWVhbnMganVtcCB0byB0aGUgbGF0ZXN0IG1lc3NhZ2VzXG4gICAqIEBwYXJhbSBwYXJlbnRNZXNzYWdlSWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbWVzc2FnZSBpZiB3ZSB3YW50IHRvIGxvYWQgYSB0aHJlYWQgbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMganVtcFRvTWVzc2FnZShtZXNzYWdlSWQ6IHN0cmluZywgcGFyZW50TWVzc2FnZUlkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5pc01lc3NhZ2VMb2FkaW5nSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWN0aXZlQ2hhbm5lbD8uc3RhdGUubG9hZE1lc3NhZ2VJbnRvU3RhdGUoXG4gICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgcGFyZW50TWVzc2FnZUlkXG4gICAgICApO1xuICAgICAgY29uc3QgbWVzc2FnZXMgPSBhY3RpdmVDaGFubmVsPy5zdGF0ZS5tZXNzYWdlcyB8fCBbXTtcbiAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgICAgaWYgKHBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgICBjb25zdCBwYXJlbnRNZXNzYWdlID0gbWVzc2FnZXMuZmluZCgobSkgPT4gbS5pZCA9PT0gcGFyZW50TWVzc2FnZUlkKTtcbiAgICAgICAgdm9pZCB0aGlzLnNldEFzQWN0aXZlUGFyZW50TWVzc2FnZShcbiAgICAgICAgICBwYXJlbnRNZXNzYWdlIGFzIFN0cmVhbU1lc3NhZ2UsXG4gICAgICAgICAgJ3N0YXRlJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5qdW1wVG9NZXNzYWdlU3ViamVjdC5uZXh0KHtcbiAgICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgcGFyZW50SWQ6IHBhcmVudE1lc3NhZ2VJZCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAnc3RyZWFtQ2hhdC5NZXNzYWdlIG5vdCBmb3VuZCdcbiAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc01lc3NhZ2VMb2FkaW5nSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtZXNzYWdlIHRvIGp1bXBcbiAgICovXG4gIGNsZWFyTWVzc2FnZUp1bXAoKSB7XG4gICAgdGhpcy5qdW1wVG9NZXNzYWdlU3ViamVjdC5uZXh0KHsgaWQ6IHVuZGVmaW5lZCwgcGFyZW50SWQ6IHVuZGVmaW5lZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSBnaXZlbiBtZXNzYWdlIGluIHRoZSBjaGFubmVsXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBwaW5NZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5waW5NZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgJ3N0cmVhbUNoYXQuTWVzc2FnZSBwaW5uZWQnLFxuICAgICAgICAnc3VjY2VzcydcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRUZW1wb3JhcnlOb3RpZmljYXRpb24oXG4gICAgICAgICdzdHJlYW1DaGF0LkVycm9yIHBpbm5pbmcgbWVzc2FnZSdcbiAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbWVzc2FnZSBmcm9tIHBpbm5lZCBtZXNzYWdlc1xuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgdW5waW5NZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51bnBpbk1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAnc3RyZWFtQ2hhdC5NZXNzYWdlIHVucGlubmVkJyxcbiAgICAgICAgJ3N1Y2Nlc3MnXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAnc3RyZWFtQ2hhdC5FcnJvciByZW1vdmluZyBtZXNzYWdlIHBpbidcbiAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5vdGlmaWNhdGlvbihjbGllbnRFdmVudDogQ2xpZW50RXZlbnQpIHtcbiAgICBzd2l0Y2ggKGNsaWVudEV2ZW50LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSAnY29ubmVjdGlvbi5yZWNvdmVyZWQnOiB7XG4gICAgICAgIHZvaWQgdGhpcy5uZ1pvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc1N0YXRlUmVjb3ZlcnlJblByb2dyZXNzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIElmIGNoYW5uZWwgbGlzdCBpcyBub3QgaW5pdGVkLCB3ZSBzZXQgdGhlIGFjdGl2ZSBjaGFubmVsXG4gICAgICAgICAgICBjb25zdCBzaG91bFNldEFjdGl2ZUNoYW5uZWwgPVxuICAgICAgICAgICAgICB0aGlzLnNob3VsZFNldEFjdGl2ZUNoYW5uZWwgJiZcbiAgICAgICAgICAgICAgIXRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVlcnlDaGFubmVscyhcbiAgICAgICAgICAgICAgc2hvdWxTZXRBY3RpdmVDaGFubmVsIHx8IGZhbHNlLFxuICAgICAgICAgICAgICAncmVjb3Zlci1zdGF0ZSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpKSB7XG4gICAgICAgICAgICAgIC8vIFRocmVhZCBtZXNzYWdlcyBhcmUgbm90IHJlZmV0Y2hlZCBzbyBhY3RpdmUgdGhyZWFkIGdldHMgZGVzZWxlY3RlZCB0byBhdm9pZCBkaXNwbGF5aW5nIHN0YWxlIG1lc3NhZ2VzXG4gICAgICAgICAgICAgIHZvaWQgdGhpcy5zZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIGFuZCByZXNlbGVjdCBtZXNzYWdlIHRvIHF1b3RlXG4gICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VUb1F1b3RlID0gdGhpcy5tZXNzYWdlVG9RdW90ZVN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgdGhpcy5zZXRDaGFubmVsU3RhdGUodGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpISk7XG4gICAgICAgICAgICAgIGxldCBtZXNzYWdlcyE6IFN0cmVhbU1lc3NhZ2VbXTtcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChtKSA9PiAobWVzc2FnZXMgPSBtKSk7XG4gICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRNZXNzYWdlVG9RdW90ZSA9IG1lc3NhZ2VzLmZpbmQoXG4gICAgICAgICAgICAgICAgKG0pID0+IG0uaWQgPT09IG1lc3NhZ2VUb1F1b3RlPy5pZFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAodXBkYXRlZE1lc3NhZ2VUb1F1b3RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RNZXNzYWdlVG9RdW90ZSh1cGRhdGVkTWVzc2FnZVRvUXVvdGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzU3RhdGVSZWNvdmVyeUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMuaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbm90aWZpY2F0aW9uLm1lc3NhZ2VfbmV3Jzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbU5ld01lc3NhZ2VOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbU5ld01lc3NhZ2VOb3RpZmljYXRpb25IYW5kbGVyKFxuICAgICAgICAgICAgICBjbGllbnRFdmVudCxcbiAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVOZXdNZXNzYWdlTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbi5hZGRlZF90b19jaGFubmVsJzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21BZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICAgIGNsaWVudEV2ZW50LFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbi5yZW1vdmVkX2Zyb21fY2hhbm5lbCc6IHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jdXN0b21SZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICAgIGNsaWVudEV2ZW50LFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbihjbGllbnRFdmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd1c2VyLnVwZGF0ZWQnOiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZENoYW5uZWxzID0gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKT8ubWFwKChjKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmFjdGl2ZUNoYW5uZWxzW2MuY2lkXSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmFjdGl2ZUNoYW5uZWxzW2MuY2lkXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQodXBkYXRlZENoYW5uZWxzKTtcbiAgICAgICAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgIGlmIChhY3RpdmVDaGFubmVsKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC5hY3RpdmVDaGFubmVsc1tcbiAgICAgICAgICAgICAgICBhY3RpdmVDaGFubmVsLmNpZFxuICAgICAgICAgICAgICBdIHx8IGFjdGl2ZUNoYW5uZWxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChcbiAgICAgICAgICAgICAgYWN0aXZlQ2hhbm5lbC5zdGF0ZS5tZXNzYWdlcy5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgICAgICAobSBhcyBTdHJlYW1NZXNzYWdlKS5yZWFkQnkgPSBnZXRSZWFkQnkobSwgYWN0aXZlQ2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4ubSB9O1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVBhcmVudE1lc3NhZ2UgPVxuICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGlmIChhY3RpdmVQYXJlbnRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYWN0aXZlQ2hhbm5lbC5zdGF0ZS50aHJlYWRzW2FjdGl2ZVBhcmVudE1lc3NhZ2VdO1xuICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgICAuLi4oYWN0aXZlQ2hhbm5lbC5zdGF0ZS5waW5uZWRNZXNzYWdlcyBhcyBTdHJlYW1NZXNzYWdlW10pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb24oY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50KSB7XG4gICAgY29uc3QgY2hhbm5lbElkVG9CZVJlbW92ZWQgPSBjbGllbnRFdmVudC5ldmVudC5jaGFubmVsIS5jaWQ7XG4gICAgdGhpcy5yZW1vdmVDaGFubmVsKGNoYW5uZWxJZFRvQmVSZW1vdmVkLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTmV3TWVzc2FnZU5vdGlmaWNhdGlvbihjbGllbnRFdmVudDogQ2xpZW50RXZlbnQpIHtcbiAgICBpZiAoY2xpZW50RXZlbnQuZXZlbnQuY2hhbm5lbCkge1xuICAgICAgdm9pZCB0aGlzLmFkZENoYW5uZWxGcm9tTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50LmV2ZW50LmNoYW5uZWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQWRkZWRUb0NoYW5uZWxOb3RpZmljYXRpb24oY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50KSB7XG4gICAgaWYgKGNsaWVudEV2ZW50LmV2ZW50LmNoYW5uZWwpIHtcbiAgICAgIHZvaWQgdGhpcy5hZGRDaGFubmVsRnJvbU5vdGlmaWNhdGlvbihjbGllbnRFdmVudC5ldmVudC5jaGFubmVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZENoYW5uZWxGcm9tTm90aWZpY2F0aW9uKGNoYW5uZWxSZXNwb25zZTogQ2hhbm5lbFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbmV3Q2hhbm5lbCA9IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC5jaGFubmVsKFxuICAgICAgY2hhbm5lbFJlc3BvbnNlLnR5cGUsXG4gICAgICBjaGFubmVsUmVzcG9uc2UuaWRcbiAgICApO1xuICAgIGxldCBjdXJyZW50Q2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICAgIGlmIChjdXJyZW50Q2hhbm5lbHMuZmluZCgoYykgPT4gYy5jaWQgPT09IG5ld0NoYW5uZWwuY2lkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBuZXdDaGFubmVsLndhdGNoKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmxvZ2dlcihcbiAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgJ0ZhaWxlZCB0byBhZGQgY2hhbm5lbCB0byBjaGFubmVsIGxpc3QgYmVjYXVzZSB3YXRjaCByZXF1ZXN0IGZhaWxlZCcsXG4gICAgICAgIGVyciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjdXJyZW50Q2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICAgIGlmIChjdXJyZW50Q2hhbm5lbHMuZmluZCgoYykgPT4gYy5jaWQgPT09IG5ld0NoYW5uZWwuY2lkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLndhdGNoRm9yQ2hhbm5lbEV2ZW50cyhuZXdDaGFubmVsKTtcbiAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFtuZXdDaGFubmVsLCAuLi5jdXJyZW50Q2hhbm5lbHNdKTtcbiAgfVxuXG4gIHByaXZhdGUgd2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdtZXNzYWdlLm5ldycsIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGV2ZW50Lm1lc3NhZ2UgJiYgZXZlbnQubWVzc2FnZS5wYXJlbnRfaWRcbiAgICAgICAgICAgID8gZXZlbnQubWVzc2FnZS5wYXJlbnRfaWQgPT09XG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5nZXRWYWx1ZSgpXG4gICAgICAgICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbZXZlbnQubWVzc2FnZS5wYXJlbnRfaWRdLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgdGhpcy5tYXJrUmVhZChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUxhdGVzdE1lc3NhZ2VzKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbignbWVzc2FnZS51cGRhdGVkJywgKGV2ZW50KSA9PiB0aGlzLm1lc3NhZ2VVcGRhdGVkKGV2ZW50KSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UuZGVsZXRlZCcsIChldmVudCkgPT4gdGhpcy5tZXNzYWdlVXBkYXRlZChldmVudCkpXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdyZWFjdGlvbi5uZXcnLCAoZSkgPT4gdGhpcy5tZXNzYWdlUmVhY3Rpb25FdmVudFJlY2VpdmVkKGUpKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbigncmVhY3Rpb24uZGVsZXRlZCcsIChlKSA9PlxuICAgICAgICB0aGlzLm1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3JlYWN0aW9uLnVwZGF0ZWQnLCAoZSkgPT5cbiAgICAgICAgdGhpcy5tZXNzYWdlUmVhY3Rpb25FdmVudFJlY2VpdmVkKGUpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdtZXNzYWdlLnJlYWQnLCAoZSkgPT4ge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGxldCBsYXRlc3RNZXNzYWdlITogU3RyZWFtTWVzc2FnZTtcbiAgICAgICAgICBsZXQgbWVzc2FnZXMhOiBTdHJlYW1NZXNzYWdlW107XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChtKSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlcyA9IG07XG4gICAgICAgICAgICBsYXRlc3RNZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFsYXRlc3RNZXNzYWdlIHx8ICFlLnVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGxhdGVzdE1lc3NhZ2UucmVhZEJ5KSB7XG4gICAgICAgICAgICBsYXRlc3RNZXNzYWdlLnJlYWRCeS5zcGxpY2UoMCwgbGF0ZXN0TWVzc2FnZS5yZWFkQnkubGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGF0ZXN0TWVzc2FnZS5yZWFkQnkgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGF0ZXN0TWVzc2FnZS5yZWFkQnkucHVzaCguLi5nZXRSZWFkQnkobGF0ZXN0TWVzc2FnZSwgY2hhbm5lbCkpO1xuICAgICAgICAgIG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdID0geyAuLi5sYXRlc3RNZXNzYWdlIH07XG5cbiAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5ldmVudHMkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ25vdGlmaWNhdGlvbi5tYXJrX3VucmVhZCcgJiZcbiAgICAgICAgICAgICAgZS5ldmVudC5jaGFubmVsX2lkID09PSBjaGFubmVsLmlkXG4gICAgICAgICAgKSxcbiAgICAgICAgICBtYXAoKGUpID0+IGUuZXZlbnQpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxMYXN0UmVhZE1lc3NhZ2VJZCA9IGUubGFzdF9yZWFkX21lc3NhZ2VfaWQ7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxVbnJlYWRDb3VudCA9IGUudW5yZWFkX21lc3NhZ2VzO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KHRoaXMuYWN0aXZlQ2hhbm5lbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCd0eXBpbmcuc3RhcnQnLCAoZSkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlVHlwaW5nU3RhcnRFdmVudChlKSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3R5cGluZy5zdG9wJywgKGUpID0+XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmhhbmRsZVR5cGluZ1N0b3BFdmVudChlKSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgaWYgdXNlciBzdGFydGVkIHR5cGluZyBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UsIGlmIHVzZXIgaXMgdHlwaW5nIGluIGEgdGhyZWFkXG4gICAqL1xuICBhc3luYyB0eXBpbmdTdGFydGVkKHBhcmVudElkPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBhd2FpdCBhY3RpdmVDaGFubmVsPy5rZXlzdHJva2UocGFyZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgaWYgdXNlciBzdG9wcGVkIHR5cGluZyBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UsIGlmIHVzZXIgd2VyZSB0eXBpbmcgaW4gYSB0aHJlYWRcbiAgICovXG4gIGFzeW5jIHR5cGluZ1N0b3BwZWQocGFyZW50SWQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGF3YWl0IGFjdGl2ZUNoYW5uZWw/LnN0b3BUeXBpbmcocGFyZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGxpc3Qgb2YgY2hhbm5lbHNcbiAgICovXG4gIGdldCBjaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBhY3RpdmUgY2hhbm5lbFxuICAgKi9cbiAgZ2V0IGFjdGl2ZUNoYW5uZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgYWN0aXZlIGNoYW5uZWwgbWVzc2FnZXNcbiAgICovXG4gIGdldCBhY3RpdmVDaGFubmVsTWVzc2FnZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHRocmVhZCByZXBsaWVzXG4gICAqL1xuICBnZXQgYWN0aXZlQ2hhbm5lbFRocmVhZFJlcGxpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKCkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXN0IDEyMDAgcmVhY3Rpb25zIG9mIGEgbWVzc2FnZSBpbiB0aGUgY3VycmVudCBhY3RpdmUgY2hhbm5lbC4gSWYgeW91IG5lZWQgdG8gZmV0Y2ggbW9yZSByZWFjdGlvbnMgcGxlYXNlIHVzZSB0aGUgW2ZvbGxvd2luZyBlbmRwb2ludF0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3NlbmRfcmVhY3Rpb24vI3BhZ2luYXRpbmctcmVhY3Rpb25zKS5cbiAgICogQGRlcHJlY2F0ZWQgdXNlIFtgbWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UucXVlcnlSZWFjdGlvbnMoKWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvTWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UvI3F1ZXJ5cmVhY3Rpb25zKSBpbnN0ZWFkXG4gICAqIEBwYXJhbSBtZXNzYWdlSWRcbiAgICogQHJldHVybnMgYWxsIHJlYWN0aW9ucyBvZiBhIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIGdldE1lc3NhZ2VSZWFjdGlvbnMobWVzc2FnZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWFjdGlvbnM6IFJlYWN0aW9uUmVzcG9uc2VbXSA9IFtdO1xuICAgIGNvbnN0IGxpbWl0ID0gMzAwO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGNvbnN0IHJlYWN0aW9uc0xpbWl0ID0gQ2hhbm5lbFNlcnZpY2UuTUFYX01FU1NBR0VfUkVBQ1RJT05TX1RPX0ZFVENIO1xuICAgIGxldCBsYXN0UGFnZVNpemUgPSBsaW1pdDtcblxuICAgIHdoaWxlIChsYXN0UGFnZVNpemUgPT09IGxpbWl0ICYmIHJlYWN0aW9ucy5sZW5ndGggPCByZWFjdGlvbnNMaW1pdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFjdGl2ZUNoYW5uZWw/LmdldFJlYWN0aW9ucyhtZXNzYWdlSWQsIHtcbiAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgbGltaXQsXG4gICAgICAgIH0pO1xuICAgICAgICBsYXN0UGFnZVNpemUgPSByZXNwb25zZT8ucmVhY3Rpb25zPy5sZW5ndGggfHwgMDtcbiAgICAgICAgaWYgKGxhc3RQYWdlU2l6ZSA+IDApIHtcbiAgICAgICAgICByZWFjdGlvbnMucHVzaCguLi5yZXNwb25zZSEucmVhY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBvZmZzZXQgKz0gbGFzdFBhZ2VTaXplO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICdzdHJlYW1DaGF0LkVycm9yIGxvYWRpbmcgcmVhY3Rpb25zJ1xuICAgICAgICApO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVhY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIHRoZSBjaGFubmVsIGZyb20gdGhlIGdpdmVuIG1lc3NhZ2UgYXMgdW5yZWFkXG4gICAqIEBwYXJhbSBtZXNzYWdlSWRcbiAgICogQHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgcmVxdWVzdFxuICAgKi9cbiAgYXN5bmMgbWFya01lc3NhZ2VVbnJlYWQobWVzc2FnZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlQ2hhbm5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYWN0aXZlQ2hhbm5lbC5tYXJrVW5yZWFkKHtcbiAgICAgICAgbWVzc2FnZV9pZDogbWVzc2FnZUlkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmFyZVJlYWRFdmVudHNQYXVzZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnN0IGVycm9yOiB7XG4gICAgICAgIHJlc3BvbnNlPzoge1xuICAgICAgICAgIGRhdGE/OiB7IGNvZGU/OiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmc7IFN0YXR1c0NvZGU/OiBudW1iZXIgfTtcbiAgICAgICAgfTtcbiAgICAgIH0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKSBhcyB7XG4gICAgICAgIHJlc3BvbnNlPzoge1xuICAgICAgICAgIGRhdGE/OiB7IGNvZGU/OiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmc7IFN0YXR1c0NvZGU/OiBudW1iZXIgfTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkYXRhID0gZXJyb3I/LnJlc3BvbnNlPy5kYXRhO1xuICAgICAgaWYgKFxuICAgICAgICBkYXRhICYmXG4gICAgICAgIGRhdGEuY29kZSA9PT0gNCAmJlxuICAgICAgICBkYXRhLlN0YXR1c0NvZGUgPT09IDQwMCAmJlxuICAgICAgICBkYXRhLm1lc3NhZ2U/LmluY2x1ZGVzKCdpdCBpcyBvbGRlciB0aGFuIGxhc3QnKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gL1xcZCsgY2hhbm5lbCBtZXNzYWdlcy9cbiAgICAgICAgICAuZXhlYyhkYXRhLm1lc3NhZ2UpPy5bMF1cbiAgICAgICAgICAubWF0Y2goL1xcZCsvKT8uWzBdO1xuICAgICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgJ3N0cmVhbUNoYXQuRXJyb3IsIG9ubHkgdGhlIGZpcnN0IHt7Y291bnR9fSBtZXNzYWdlIGNhbiBiZSBtYXJrZWQgYXMgdW5yZWFkJyxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHsgY291bnQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgJ3N0cmVhbUNoYXQuRXJyb3IgbWFya2luZyBtZXNzYWdlIGFzIHVucmVhZCdcbiAgICAgICk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWVzc2FnZVVwZGF0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGlzVGhyZWFkUmVwbHkgPSBldmVudC5tZXNzYWdlICYmIGV2ZW50Lm1lc3NhZ2UucGFyZW50X2lkO1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgIGlmICghY2hhbm5lbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBHZXQgbWVzc2FnZXMgZnJvbSBzdGF0ZSBhcyBtZXNzYWdlIG9yZGVyIGNvdWxkIGNoYW5nZSwgYW5kIG1lc3NhZ2UgY291bGQndmUgYmVlbiBkZWxldGVkXG4gICAgICBjb25zdCBtZXNzYWdlczogRm9ybWF0TWVzc2FnZVJlc3BvbnNlW10gPSBpc1RocmVhZFJlcGx5XG4gICAgICAgID8gY2hhbm5lbC5zdGF0ZS50aHJlYWRzW2V2ZW50Py5tZXNzYWdlPy5wYXJlbnRfaWQgfHwgJyddXG4gICAgICAgIDogY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcztcbiAgICAgIGlmICghbWVzc2FnZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZUluZGV4ID0gbWVzc2FnZXMuZmluZEluZGV4KFxuICAgICAgICAobSkgPT4gbS5pZCA9PT0gZXZlbnQ/Lm1lc3NhZ2U/LmlkXG4gICAgICApO1xuICAgICAgaWYgKG1lc3NhZ2VJbmRleCAhPT0gLTEgfHwgZXZlbnQudHlwZSA9PT0gJ21lc3NhZ2UuZGVsZXRlZCcpIHtcbiAgICAgICAgaXNUaHJlYWRSZXBseVxuICAgICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKVxuICAgICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLm1lc3NhZ2VzXSk7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFBpbm5lZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAuLi4oY2hhbm5lbC5zdGF0ZS5waW5uZWRNZXNzYWdlcyBhcyBTdHJlYW1NZXNzYWdlW10pLFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWVzc2FnZVJlYWN0aW9uRXZlbnRSZWNlaXZlZChlOiBFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICBjb25zdCBpc1RocmVhZE1lc3NhZ2UgPSBlLm1lc3NhZ2UgJiYgZS5tZXNzYWdlLnBhcmVudF9pZDtcbiAgICAgIGxldCBtZXNzYWdlcyE6IFN0cmVhbU1lc3NhZ2VbXTtcbiAgICAgIChpc1RocmVhZE1lc3NhZ2VcbiAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzJFxuICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJFxuICAgICAgKVxuICAgICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgICAuc3Vic2NyaWJlKChtKSA9PiAobWVzc2FnZXMgPSBtKSk7XG4gICAgICBjb25zdCBtZXNzYWdlSW5kZXggPSBtZXNzYWdlcy5maW5kSW5kZXgoKG0pID0+IG0uaWQgPT09IGU/Lm1lc3NhZ2U/LmlkKTtcbiAgICAgIGlmIChtZXNzYWdlSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlSW5kZXhdO1xuICAgICAgbWVzc2FnZS5yZWFjdGlvbl9jb3VudHMgPSB7IC4uLmUubWVzc2FnZT8ucmVhY3Rpb25fY291bnRzIH07XG4gICAgICBtZXNzYWdlLnJlYWN0aW9uX3Njb3JlcyA9IHsgLi4uZS5tZXNzYWdlPy5yZWFjdGlvbl9zY29yZXMgfTtcbiAgICAgIG1lc3NhZ2UubGF0ZXN0X3JlYWN0aW9ucyA9IFsuLi4oZS5tZXNzYWdlPy5sYXRlc3RfcmVhY3Rpb25zIHx8IFtdKV07XG4gICAgICBtZXNzYWdlLm93bl9yZWFjdGlvbnMgPSBbLi4uKGUubWVzc2FnZT8ub3duX3JlYWN0aW9ucyB8fCBbXSldO1xuICAgICAgbWVzc2FnZS5yZWFjdGlvbl9ncm91cHMgPSB7IC4uLmUubWVzc2FnZT8ucmVhY3Rpb25fZ3JvdXBzIH07XG5cbiAgICAgIG1lc3NhZ2VzW21lc3NhZ2VJbmRleF0gPSB7IC4uLm1lc3NhZ2UgfTtcbiAgICAgIGlzVGhyZWFkTWVzc2FnZVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLm1lc3NhZ2VzXSlcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TWVzc2FnZShtZXNzYWdlOiBNZXNzYWdlUmVzcG9uc2UpIHtcbiAgICBjb25zdCBtID0gbWVzc2FnZSBhcyB1bmtub3duIGFzIEZvcm1hdE1lc3NhZ2VSZXNwb25zZTtcbiAgICBtLnBpbm5lZF9hdCA9IG1lc3NhZ2UucGlubmVkX2F0ID8gbmV3IERhdGUobWVzc2FnZS5waW5uZWRfYXQpIDogbnVsbDtcbiAgICBtLmNyZWF0ZWRfYXQgPSBtZXNzYWdlLmNyZWF0ZWRfYXRcbiAgICAgID8gbmV3IERhdGUobWVzc2FnZS5jcmVhdGVkX2F0KVxuICAgICAgOiBuZXcgRGF0ZSgpO1xuICAgIG0udXBkYXRlZF9hdCA9IG1lc3NhZ2UudXBkYXRlZF9hdFxuICAgICAgPyBuZXcgRGF0ZShtZXNzYWdlLnVwZGF0ZWRfYXQpXG4gICAgICA6IG5ldyBEYXRlKCk7XG4gICAgbWVzc2FnZS5zdGF0dXMgPSBtZXNzYWdlLnN0YXR1cyB8fCAncmVjZWl2ZWQnO1xuXG4gICAgcmV0dXJuIG07XG4gIH1cblxuICBwcml2YXRlIGlzU3RyZWFtTWVzc2FnZShcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlIHwgTWVzc2FnZVJlc3BvbnNlXG4gICk6IG1lc3NhZ2UgaXMgU3RyZWFtTWVzc2FnZSB7XG4gICAgcmV0dXJuICdyZWFkQnknIGluIG1lc3NhZ2U7XG4gIH1cblxuICBwcml2YXRlIGlzRm9ybWF0TWVzc2FnZVJlc3BvbnNlKFxuICAgIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCBGb3JtYXRNZXNzYWdlUmVzcG9uc2UgfCBNZXNzYWdlUmVzcG9uc2VcbiAgKTogbWVzc2FnZSBpcyBGb3JtYXRNZXNzYWdlUmVzcG9uc2Uge1xuICAgIHJldHVybiBtZXNzYWdlLmNyZWF0ZWRfYXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wV2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKGNoYW5uZWw6IENoYW5uZWwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcXVlcnlDaGFubmVscyhcbiAgICBzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuLFxuICAgIHF1ZXJ5VHlwZTogQ2hhbm5lbFF1ZXJ5VHlwZVxuICApIHtcbiAgICBpZiAoIXRoaXMuY2hhbm5lbFF1ZXJ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdRdWVyeSBjaGFubmVscyBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBDaGFubmVsUXVlcnkgaW5zdGFuY2UnXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5jaGFubmVsUXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiAnaW4tcHJvZ3Jlc3MnIH0pO1xuXG4gICAgICBjb25zdCB7IGNoYW5uZWxzLCBoYXNNb3JlUGFnZSB9ID0gYXdhaXQgKCdxdWVyeScgaW4gdGhpcy5jaGFubmVsUXVlcnlcbiAgICAgICAgPyB0aGlzLmNoYW5uZWxRdWVyeS5xdWVyeShxdWVyeVR5cGUpXG4gICAgICAgIDogdGhpcy5jaGFubmVsUXVlcnkocXVlcnlUeXBlKSk7XG4gICAgICBjb25zdCBmaWx0ZXJlZENoYW5uZWxzID0gY2hhbm5lbHMuZmlsdGVyKFxuICAgICAgICAoY2hhbm5lbCwgaW5kZXgpID0+XG4gICAgICAgICAgIWNoYW5uZWxzLnNsaWNlKDAsIGluZGV4KS5maW5kKChjKSA9PiBjLmNpZCA9PT0gY2hhbm5lbC5jaWQpXG4gICAgICApO1xuICAgICAgZmlsdGVyZWRDaGFubmVscy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5jaGFubmVsU3Vic2NyaXB0aW9uc1tjLmNpZF0pIHtcbiAgICAgICAgICB0aGlzLndhdGNoRm9yQ2hhbm5lbEV2ZW50cyhjKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoZmlsdGVyZWRDaGFubmVscyk7XG4gICAgICBjb25zdCBjdXJyZW50QWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgIGlmIChcbiAgICAgICAgY3VycmVudEFjdGl2ZUNoYW5uZWwgJiZcbiAgICAgICAgIWZpbHRlcmVkQ2hhbm5lbHMuZmluZCgoYykgPT4gYy5jaWQgPT09IGN1cnJlbnRBY3RpdmVDaGFubmVsPy5jaWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kZXNlbGVjdEFjdGl2ZUNoYW5uZWwoKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGZpbHRlcmVkQ2hhbm5lbHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAhY3VycmVudEFjdGl2ZUNoYW5uZWwgJiZcbiAgICAgICAgc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2V0QXNBY3RpdmVDaGFubmVsKGZpbHRlcmVkQ2hhbm5lbHNbMF0pO1xuICAgICAgfVxuICAgICAgdGhpcy5oYXNNb3JlQ2hhbm5lbHNTdWJqZWN0Lm5leHQoaGFzTW9yZVBhZ2UpO1xuICAgICAgdGhpcy5jaGFubmVsUXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiAnc3VjY2VzcycgfSk7XG4gICAgICB0aGlzLmRpc21pc3NFcnJvck5vdGlmaWNhdGlvbj8uKCk7XG4gICAgICByZXR1cm4gY2hhbm5lbHM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFF1ZXJ5U3RhdGVTdWJqZWN0Lm5leHQoe1xuICAgICAgICBzdGF0ZTogJ2Vycm9yJyxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckNoYW5uZWxFdmVudHMoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGlmICh0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zW2NoYW5uZWwuY2lkXSkge1xuICAgICAgdGhpcy5jaGFubmVsU3Vic2NyaXB0aW9uc1tjaGFubmVsLmNpZF0oKTtcbiAgICB9XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBjaGFubmVsLm9uKChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgIGNvbnN0IHR5cGUgPSBldmVudC50eXBlIGFzIEV2ZW50VHlwZXMgfCAnY2FwYWJpbGl0aWVzLmNoYW5nZWQnO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ21lc3NhZ2UubmV3Jzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21OZXdNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbU5ld01lc3NhZ2VIYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlTmV3TWVzc2FnZShldmVudCwgY2hhbm5lbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC5oaWRkZW4nOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxIaWRkZW5IYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhbm5lbEhpZGRlbkhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsSGlkZGVuKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLmRlbGV0ZWQnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxEZWxldGVkSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxEZWxldGVkSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxEZWxldGVkKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLnZpc2libGUnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxWaXNpYmxlSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxWaXNpYmxlSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxWaXNpYmxlKGV2ZW50LCBjaGFubmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLnVwZGF0ZWQnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxVcGRhdGVkSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxVcGRhdGVkSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxVcGRhdGUoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoYW5uZWwudHJ1bmNhdGVkJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsVHJ1bmNhdGVkSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxUcnVuY2F0ZWRIYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbm5lbFRydW5jYXRlKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjYXBhYmlsaXRpZXMuY2hhbmdlZCc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2lkID0gZXZlbnQuY2lkO1xuICAgICAgICAgICAgaWYgKGNpZCkge1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRDaGFubmVscz8uZmluZEluZGV4KChjKSA9PiBjLmNpZCA9PT0gY2lkKTtcbiAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSAmJiBpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbLi4uY3VycmVudENoYW5uZWxzIV0pO1xuICAgICAgICAgICAgICAgIGlmIChjaWQgPT09IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uY2lkKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY2hhbm5lbFN1YnNjcmlwdGlvbnNbY2hhbm5lbC5jaWRdID0gdW5zdWJzY3JpYmUudW5zdWJzY3JpYmU7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5ld01lc3NhZ2UoXzogRXZlbnQsIGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICBjb25zdCBjaGFubmVsSW5kZXggPSB0aGlzLmNoYW5uZWxzLmZpbmRJbmRleCgoYykgPT4gYy5jaWQgPT09IGNoYW5uZWwuY2lkKTtcbiAgICB0aGlzLmNoYW5uZWxzLnNwbGljZShjaGFubmVsSW5kZXgsIDEpO1xuICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoW2NoYW5uZWwsIC4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbEhpZGRlbihldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnJlbW92ZUNoYW5uZWwoZXZlbnQuY2hhbm5lbCEuY2lkLCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxEZWxldGVkKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMucmVtb3ZlQ2hhbm5lbChldmVudC5jaGFubmVsIS5jaWQsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbFZpc2libGUoZXZlbnQ6IEV2ZW50LCBjaGFubmVsOiBDaGFubmVsKSB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWxzLmZpbmQoKGMpID0+IGMuY2lkID09PSBldmVudC5jaWQpKSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT5cbiAgICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbLi4udGhpcy5jaGFubmVscywgY2hhbm5lbF0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbFVwZGF0ZShldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBjaGFubmVsSW5kZXggPSB0aGlzLmNoYW5uZWxzLmZpbmRJbmRleChcbiAgICAgIChjKSA9PiBjLmNpZCA9PT0gZXZlbnQuY2hhbm5lbCEuY2lkXG4gICAgKTtcbiAgICBpZiAoY2hhbm5lbEluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHNbY2hhbm5lbEluZGV4XTtcbiAgICAgIGNvbnN0IG5vdEluY2x1ZGVkUHJvcGVyaWVzID0ge1xuICAgICAgICBoaWRkZW46IGNoYW5uZWwuZGF0YT8uaGlkZGVuIHx8IGZhbHNlLFxuICAgICAgICBvd25fY2FwYWJpbGl0aWVzOiBjaGFubmVsLmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgfHwgW10sXG4gICAgICB9O1xuICAgICAgY2hhbm5lbC5kYXRhID0ge1xuICAgICAgICAuLi5ldmVudC5jaGFubmVsISxcbiAgICAgICAgLi4ubm90SW5jbHVkZWRQcm9wZXJpZXMsXG4gICAgICB9O1xuICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbLi4udGhpcy5jaGFubmVsc10pO1xuICAgICAgaWYgKGV2ZW50LmNoYW5uZWw/LmNpZCA9PT0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5jaWQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KGNoYW5uZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbFRydW5jYXRlKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGNoYW5uZWxJbmRleCA9IHRoaXMuY2hhbm5lbHMuZmluZEluZGV4KFxuICAgICAgKGMpID0+IGMuY2lkID09PSBldmVudC5jaGFubmVsIS5jaWRcbiAgICApO1xuICAgIGlmIChjaGFubmVsSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxJbmRleF0uc3RhdGUubWVzc2FnZXMgPSBbXTtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgICAgIGlmIChldmVudC5jaGFubmVsPy5jaWQgPT09IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uY2lkKSB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgICAgICBjaGFubmVsLnN0YXRlLm1lc3NhZ2VzID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dChjaGFubmVsKTtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBjYW5TZW5kUmVhZEV2ZW50cygpIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghY2hhbm5lbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjYXBhYmlsaXRlcyA9IGNoYW5uZWwuZGF0YT8ub3duX2NhcGFiaWxpdGllcyBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gY2FwYWJpbGl0ZXMuaW5kZXhPZigncmVhZC1ldmVudHMnKSAhPT0gLTE7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybVRvU3RyZWFtTWVzc2FnZShcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgTWVzc2FnZVJlc3BvbnNlIHwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlLFxuICAgIGNoYW5uZWw/OiBDaGFubmVsXG4gICkge1xuICAgIGNvbnN0IGlzVGhyZWFkTWVzc2FnZSA9ICEhbWVzc2FnZS5wYXJlbnRfaWQ7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1N0cmVhbU1lc3NhZ2UobWVzc2FnZSkgJiZcbiAgICAgIHRoaXMuaXNGb3JtYXRNZXNzYWdlUmVzcG9uc2UobWVzc2FnZSlcbiAgICApIHtcbiAgICAgIGlmIChtZXNzYWdlLnF1b3RlZF9tZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UucXVvdGVkX21lc3NhZ2UudHJhbnNsYXRpb24gPSBnZXRNZXNzYWdlVHJhbnNsYXRpb24oXG4gICAgICAgICAgbWVzc2FnZS5xdW90ZWRfbWVzc2FnZSxcbiAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBtZXNzYWdlLnRyYW5zbGF0aW9uID0gZ2V0TWVzc2FnZVRyYW5zbGF0aW9uKFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlclxuICAgICAgKTtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWVzc2FnZS5xdW90ZWRfbWVzc2FnZSkge1xuICAgICAgICAobWVzc2FnZSBhcyBTdHJlYW1NZXNzYWdlKS5xdW90ZWRfbWVzc2FnZSEudHJhbnNsYXRpb24gPVxuICAgICAgICAgIGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIG1lc3NhZ2UucXVvdGVkX21lc3NhZ2UsXG4gICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNGb3JtYXRNZXNzYWdlUmVzcG9uc2UobWVzc2FnZSkpIHtcbiAgICAgICAgKG1lc3NhZ2UgYXMgU3RyZWFtTWVzc2FnZSkucmVhZEJ5ID0gaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogY2hhbm5lbFxuICAgICAgICAgID8gZ2V0UmVhZEJ5KG1lc3NhZ2UsIGNoYW5uZWwpXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgKG1lc3NhZ2UgYXMgU3RyZWFtTWVzc2FnZSkudHJhbnNsYXRpb24gPSBnZXRNZXNzYWdlVHJhbnNsYXRpb24oXG4gICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UgYXMgU3RyZWFtTWVzc2FnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgPSB0aGlzLmZvcm1hdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIChtZXNzYWdlIGFzIFN0cmVhbU1lc3NhZ2UpLnJlYWRCeSA9IGlzVGhyZWFkTWVzc2FnZVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IGNoYW5uZWxcbiAgICAgICAgICA/IGdldFJlYWRCeShtZXNzYWdlLCBjaGFubmVsKVxuICAgICAgICAgIDogW107XG4gICAgICAgIChtZXNzYWdlIGFzIFN0cmVhbU1lc3NhZ2UpLnRyYW5zbGF0aW9uID0gZ2V0TWVzc2FnZVRyYW5zbGF0aW9uKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlclxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbWVzc2FnZSBhcyBTdHJlYW1NZXNzYWdlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVHlwaW5nU3RhcnRFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudXNlcj8uaWQgPT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyPy5pZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc1R5cGluZ0luVGhyZWFkID0gISFldmVudC5wYXJlbnRfaWQ7XG4gICAgaWYgKFxuICAgICAgaXNUeXBpbmdJblRocmVhZCAmJlxuICAgICAgZXZlbnQucGFyZW50X2lkICE9PSB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuZ2V0VmFsdWUoKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdWJqZWN0ID0gaXNUeXBpbmdJblRocmVhZFxuICAgICAgPyB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0XG4gICAgICA6IHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0O1xuICAgIGNvbnN0IHVzZXJzOiBVc2VyUmVzcG9uc2VbXSA9IHN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCB1c2VyID0gZXZlbnQudXNlcjtcbiAgICBpZiAodXNlciAmJiAhdXNlcnMuZmluZCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCkpIHtcbiAgICAgIHVzZXJzLnB1c2godXNlcik7XG4gICAgICBzdWJqZWN0Lm5leHQoWy4uLnVzZXJzXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUeXBpbmdTdG9wRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdXNlcnNUeXBpbmdJbkNoYW5uZWwgPSB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHVzZXJzVHlwaW5nSW5UaHJlYWQgPSB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgdXNlciA9IGV2ZW50LnVzZXI7XG4gICAgaWYgKHVzZXIgJiYgdXNlcnNUeXBpbmdJbkNoYW5uZWwuZmluZCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCkpIHtcbiAgICAgIHVzZXJzVHlwaW5nSW5DaGFubmVsLnNwbGljZShcbiAgICAgICAgdXNlcnNUeXBpbmdJbkNoYW5uZWwuZmluZEluZGV4KCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0Lm5leHQoWy4uLnVzZXJzVHlwaW5nSW5DaGFubmVsXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh1c2VyICYmIHVzZXJzVHlwaW5nSW5UaHJlYWQuZmluZCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCkpIHtcbiAgICAgIHVzZXJzVHlwaW5nSW5UaHJlYWQuc3BsaWNlKFxuICAgICAgICB1c2Vyc1R5cGluZ0luVGhyZWFkLmZpbmRJbmRleCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCksXG4gICAgICAgIDFcbiAgICAgICk7XG4gICAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0Lm5leHQoWy4uLnVzZXJzVHlwaW5nSW5UaHJlYWRdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUxhdGVzdE1lc3NhZ2VzKGV2ZW50OiBFdmVudCkge1xuICAgIGlmIChcbiAgICAgIGV2ZW50Lm1lc3NhZ2U/LnVzZXI/LmlkICE9PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlPy5jaGF0Q2xpZW50LnVzZXI/LmlkXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhdGVzdE1lc3NhZ2VzID1cbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghZXZlbnQubWVzc2FnZT8uY3JlYXRlZF9hdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaGFubmVsSWQgPSBldmVudD8ubWVzc2FnZT8uY2lkO1xuICAgIGlmICghY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VEYXRlID0gbmV3IERhdGUoZXZlbnQubWVzc2FnZS5jcmVhdGVkX2F0KTtcbiAgICBpZiAoXG4gICAgICAhbGF0ZXN0TWVzc2FnZXNbY2hhbm5lbElkXSB8fFxuICAgICAgbGF0ZXN0TWVzc2FnZXNbY2hhbm5lbElkXT8uZ2V0VGltZSgpIDwgbWVzc2FnZURhdGUuZ2V0VGltZSgpXG4gICAgKSB7XG4gICAgICBsYXRlc3RNZXNzYWdlc1tjaGFubmVsSWRdID0gbWVzc2FnZURhdGU7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVsc1N1YmplY3QubmV4dCh7XG4gICAgICAgIC4uLmxhdGVzdE1lc3NhZ2VzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGFubmVsU3RhdGUoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwuc3RhdGUubWVzc2FnZXMuZm9yRWFjaCgobSkgPT4ge1xuICAgICAgKG0gYXMgU3RyZWFtTWVzc2FnZSkucmVhZEJ5ID0gZ2V0UmVhZEJ5KG0sIGNoYW5uZWwpO1xuICAgICAgKG0gYXMgU3RyZWFtTWVzc2FnZSkudHJhbnNsYXRpb24gPSBnZXRNZXNzYWdlVHJhbnNsYXRpb24oXG4gICAgICAgIG0sXG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyXG4gICAgICApO1xuICAgICAgaWYgKG0ucXVvdGVkX21lc3NhZ2UpIHtcbiAgICAgICAgKG0gYXMgU3RyZWFtTWVzc2FnZSkucXVvdGVkX21lc3NhZ2UhLnRyYW5zbGF0aW9uID1cbiAgICAgICAgICBnZXRNZXNzYWdlVHJhbnNsYXRpb24oXG4gICAgICAgICAgICBtLnF1b3RlZF9tZXNzYWdlLFxuICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm1hcmtSZWFkKGNoYW5uZWwpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgLi4uKGNoYW5uZWwuc3RhdGUucGlubmVkTWVzc2FnZXMgYXMgU3RyZWFtTWVzc2FnZVtdKSxcbiAgICBdKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0Lm5leHQoW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrUmVhZChjaGFubmVsOiBDaGFubmVsLCBpc1Rocm90dGxlZCA9IHRydWUpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNhblNlbmRSZWFkRXZlbnRzICYmXG4gICAgICB0aGlzLnNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkICYmXG4gICAgICAhdGhpcy5hcmVSZWFkRXZlbnRzUGF1c2VkXG4gICAgKSB7XG4gICAgICBpZiAoaXNUaHJvdHRsZWQpIHtcbiAgICAgICAgdGhpcy5tYXJrUmVhZFRocm90dGxlZChjaGFubmVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZvaWQgY2hhbm5lbC5tYXJrUmVhZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWFya1JlYWRUaHJvdHRsZWQoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGlmICghdGhpcy5tYXJrUmVhZFRpbWVvdXQpIHtcbiAgICAgIHRoaXMubWFya1JlYWQoY2hhbm5lbCwgZmFsc2UpO1xuICAgICAgdGhpcy5tYXJrUmVhZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5mbHVzaE1hcmtSZWFkUXVldWUoKTtcbiAgICAgIH0sIHRoaXMubWFya1JlYWRUaHJvdHRsZVRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5tYXJrUmVhZFRpbWVvdXQpO1xuICAgICAgdGhpcy5zY2hlZHVsZWRNYXJrUmVhZFJlcXVlc3QgPSAoKSA9PiB0aGlzLm1hcmtSZWFkKGNoYW5uZWwsIGZhbHNlKTtcbiAgICAgIHRoaXMubWFya1JlYWRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmx1c2hNYXJrUmVhZFF1ZXVlKCk7XG4gICAgICB9LCB0aGlzLm1hcmtSZWFkVGhyb3R0bGVUaW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZsdXNoTWFya1JlYWRRdWV1ZSgpIHtcbiAgICB0aGlzLnNjaGVkdWxlZE1hcmtSZWFkUmVxdWVzdD8uKCk7XG4gICAgdGhpcy5zY2hlZHVsZWRNYXJrUmVhZFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubWFya1JlYWRUaW1lb3V0KTtcbiAgICB0aGlzLm1hcmtSZWFkVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoc2V0dGluZ3M6IHtcbiAgICBzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuO1xuICAgIG1lc3NhZ2VQYWdlU2l6ZTogbnVtYmVyO1xuICB9KSB7XG4gICAgdGhpcy5zaG91bGRTZXRBY3RpdmVDaGFubmVsID0gc2V0dGluZ3Muc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbDtcbiAgICB0aGlzLm1lc3NhZ2VQYWdlU2l6ZSA9IHNldHRpbmdzLm1lc3NhZ2VQYWdlU2l6ZTtcbiAgICB0aGlzLmNsaWVudEV2ZW50c1N1YnNjcmlwdGlvbiA9IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuZXZlbnRzJC5zdWJzY3JpYmUoXG4gICAgICAobm90aWZpY2F0aW9uKSA9PiB2b2lkIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbilcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5Q2hhbm5lbHMoXG4gICAgICAgIHRoaXMuc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbCxcbiAgICAgICAgJ2ZpcnN0LXBhZ2UnXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5kaXNtaXNzRXJyb3JOb3RpZmljYXRpb24gPVxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkUGVybWFuZW50Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICdzdHJlYW1DaGF0LkVycm9yIGxvYWRpbmcgY2hhbm5lbHMnLFxuICAgICAgICAgICdlcnJvcidcbiAgICAgICAgKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
1575
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2NoYW5uZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUViLGFBQWEsR0FFZCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFxQnZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXpELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFZdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBRS9DOztHQUVHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUFtWXpCLFlBQ1UsaUJBQW9DLEVBQ3BDLE1BQWMsRUFDZCxtQkFBd0M7UUFGeEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Qsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQTNIbEQ7O1dBRUc7UUFDSCwrQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFDbkMsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDYixvQkFBZSxHQUFHLElBQUksZUFBZSxDQUMzQyxTQUFTLENBQ1YsQ0FBQztRQUNNLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUNoRCxTQUFTLENBQ1YsQ0FBQztRQUNNLGlDQUE0QixHQUFHLElBQUksZUFBZSxDQUV4RCxFQUFFLENBQUMsQ0FBQztRQUNFLHVDQUFrQyxHQUFHLElBQUksZUFBZSxDQUU5RCxFQUFFLENBQUMsQ0FBQztRQUNFLDJCQUFzQixHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELCtCQUEwQixHQUFrQyxFQUFFLENBQUM7UUFDL0QseUJBQW9CLEdBQWtDLEVBQUUsQ0FBQztRQUN6RCxpQ0FBNEIsR0FBRyxJQUFJLGVBQWUsQ0FFeEQsU0FBUyxDQUFDLENBQUM7UUFDTCxnQ0FBMkIsR0FBRyxJQUFJLGVBQWUsQ0FFdkQsRUFBRSxDQUFDLENBQUM7UUFDRSx5QkFBb0IsR0FBRyxJQUFJLGVBQWUsQ0FHL0MsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLDZDQUF3QyxHQUFHLElBQUksZUFBZSxDQUVuRSxFQUFFLENBQUMsQ0FBQztRQUNVLGtDQUE2QixHQUFHLEdBQUcsQ0FBQztRQUM3QywwQkFBcUIsR0FBRyxJQUFJLGVBQWUsQ0FFakQsU0FBUyxDQUFDLENBQUM7UUFDTCxnQ0FBMkIsR0FBRyxJQUFJLGVBQWUsQ0FBaUIsRUFBRSxDQUFDLENBQUM7UUFDdEUsK0JBQTBCLEdBQUcsSUFBSSxlQUFlLENBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLG1DQUE4QixHQUFHLElBQUksQ0FBQztRQUd0Qyw4QkFBeUIsR0FBRyxLQUFLLENBQUM7UUFDbEMsNkJBQXdCLEdBQUcsSUFBSSxlQUFlLENBRXBELFNBQVMsQ0FBQyxDQUFDO1FBQ0wsOEJBQXlCLEdBQUcsSUFBSSxlQUFlLENBQ3JELEtBQUssQ0FDTixDQUFDO1FBUU0sc0JBQWlCLEdBQUcsQ0FDMUIsUUFBbUIsRUFDbkIsaUNBQWlDLEdBQUcsSUFBSSxFQUN4QyxFQUFFO1lBQ0YsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDOUQsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FDNUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQzNELENBQUM7WUFFRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDM0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNyQztnQkFDRCxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3JDLElBQUksaUNBQWlDLEVBQUU7d0JBQ3JDLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTs0QkFDMUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUN6QyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUM7eUJBQ3RDO3dCQUNELEtBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQzs0QkFDaEUsRUFBRSxZQUFZLEVBQUU7NkJBQ2YsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDdEMsTUFBTSxFQUNOLDJCQUEyQixFQUMzQixHQUE4QixDQUMvQixDQUNGLENBQUM7cUJBQ0w7aUJBQ0Y7YUFDRjtZQUNELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQztZQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN4QyxJQUNFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDaEIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsQ0FDM0QsRUFDRDtnQkFDQSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzFDO3FCQUFNO29CQUNMLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzNDO2FBQ0Y7UUFDSCxDQUFDLENBQUM7UUFFTSxzQkFBaUIsR0FBRyxDQUFDLFFBQXlCLEVBQUUsRUFBRTtZQUN4RCxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQztRQUVNLHFCQUFnQixHQUFHLENBQUMsUUFBeUIsRUFBRSxFQUFFO1lBQ3ZELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDO1FBRU0sd0JBQW1CLEdBQUcsQ0FBQyxPQUFrQyxFQUFFLEVBQUU7WUFDbkUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDO1FBRU0sd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzVCLHlCQUFvQixHQUFHLElBQUksQ0FBQztRQVNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQjthQUM1QyxZQUFZLEVBQUU7YUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQ2xFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRyxDQUFDO1lBQ3RELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQzlCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQ2hELENBQUM7UUFDSixDQUFDLENBQUMsRUFDRixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQ2YsQ0FBQztRQUNGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQ3hDLFNBQVMsQ0FDVixDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0I7YUFDaEQsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsNEJBQTRCO2FBQzVELFlBQVksRUFBRTthQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FDaEUsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDZixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFHLENBQUM7WUFDdEQsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDOUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FDaEQsQ0FBQztRQUNKLENBQUMsQ0FBQyxFQUNGLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGFBQWEsQ0FBQztZQUN4QyxJQUFJLENBQUMsc0JBQXNCO1lBQzNCLElBQUksQ0FBQyxzQkFBc0I7U0FDNUIsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQ0QsQ0FBQyxDQUFDLFFBQVEsRUFBRSxlQUFlLENBRzFCLEVBQUUsRUFBRTtZQUNILElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3BCLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO2lCQUFNO2dCQUNMLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssZUFBZSxDQUFDLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ1osS0FBSyxJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQzlDLE9BQU8sU0FBUyxDQUFDO2lCQUNsQjtxQkFBTTtvQkFDTCxPQUFPLE9BQU8sQ0FBQztpQkFDaEI7YUFDRjtRQUNILENBQUMsQ0FDRixFQUNELFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMscUJBQXFCO2FBQzlDLFlBQVksRUFBRTthQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0I7YUFDNUMsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCO2FBQzFELFlBQVksRUFBRTthQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQjthQUN4RCxZQUFZLEVBQUU7YUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGtDQUFrQztZQUNyQyxJQUFJLENBQUMsd0NBQXdDO2lCQUMxQyxZQUFZLEVBQUU7aUJBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsa0NBQWtDO2FBQ3hFLFlBQVksRUFBRTthQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QjthQUNwRCxZQUFZLEVBQUU7YUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyx5QkFBeUI7YUFDdEQsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksNkJBQTZCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLDhCQUE4QixDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksNkJBQTZCLENBQUMsNkJBQXNDO1FBQ3RFLElBQUksQ0FBQyxJQUFJLENBQUMsOEJBQThCLElBQUksNkJBQTZCLEVBQUU7WUFDekUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzNELElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDM0MsS0FBSyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDL0I7U0FDRjtRQUNELElBQUksQ0FBQyw4QkFBOEIsR0FBRyw2QkFBNkIsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFBSSxlQUFlLENBQ2pCLFNBRWE7UUFFYixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxpQkFBaUIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztTQUMzRDtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQUMsT0FBZ0I7UUFDakMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvRCxJQUFJLGlCQUFpQixFQUFFLEdBQUcsS0FBSyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQzFDLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQywrQkFBK0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztRQUN4QyxNQUFNLFNBQVMsR0FDYixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLDhCQUE4QixHQUFHLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQztRQUN0RSxJQUNFLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDbkUsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLDhCQUE4QixFQUM5QztZQUNBLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLENBQUM7U0FDakQ7UUFDRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsU0FBUyxFQUFFLGVBQWUsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUMvRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ2pELE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FDL0Qsa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQzlDLENBQUM7U0FDSDtRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsK0JBQStCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsa0NBQWtDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsOEJBQThCLEdBQUcsU0FBUyxDQUFDO1FBQ2hELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLENBQUM7UUFDMUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsd0JBQXdCLENBQzVCLE9BQWtDLEVBQ2xDLG1CQUF3QyxTQUFTO1FBRWpELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3RCxJQUFJLGNBQWMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRTtZQUNoRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzVDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDN0QsSUFBSSxlQUFlLElBQUksQ0FBQyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2FBQ3hFO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzRCxJQUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtnQkFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxhQUFhLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUU7b0JBQ3pELEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZTtpQkFDNUIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUMvRDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUNuQyxhQUFhLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUMvQyxDQUFDO2FBQ0g7U0FDRjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0IsQ0FBQyxZQUErQixPQUFPO1FBQ3JELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUQsTUFBTSxhQUFhLEdBQ2pCLFFBQVEsQ0FBQyxTQUFTLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hFLElBQ0UsU0FBUyxLQUFLLE9BQU87WUFDckIsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEtBQUssY0FBYyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQ3pFO1lBQ0EsZ0hBQWdIO1lBQ2hILE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLGNBQWM7WUFDbkIsRUFBRSxLQUFLLENBQUM7WUFDTixRQUFRLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUMzQixDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsYUFBYTthQUMzRDtZQUNELE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7WUFDckIsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtTQUN2QixDQUFDO2FBQ0QsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDWixJQUNFLGNBQWMsRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQzlDO2dCQUNBLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUM7b0JBQ3JDLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxRQUFRO2lCQUNqQyxDQUFDLENBQUM7YUFDSjtZQUVELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gscUJBQXFCLENBQUMsWUFBK0IsT0FBTztRQUMxRCxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUU7WUFDekIsdUlBQXVJO1lBQ3ZJLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuRSxNQUFNLGFBQWEsR0FDakIsY0FBYyxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDNUUsT0FBTyxjQUFjO2FBQ2xCLFVBQVUsQ0FBQyxlQUFlLEVBQUU7WUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQzNCLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxhQUFhO1NBQzNELENBQUM7YUFDRCxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1QsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FDbkMsY0FBYyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUNyRCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQUksQ0FDRixPQUF1QixFQUN2QixJQUFrQixFQUNsQixPQUF3QixFQUN4Qix5QkFBa0MsSUFBSTtRQUV0QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxDQUNsQyxJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksRUFDSixPQUFPLEVBQ1AsSUFBSSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQy9CO1lBQ0UsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLElBQUk7WUFDWCxhQUFhLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDbkMsR0FBRyxPQUFPO1NBQ1gsQ0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBRTFELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNoQixzQkFBc0I7WUFDdEIsZUFBZSxFQUFFLE9BQU8sRUFBRSxhQUFhLElBQUksSUFBSSxDQUFDLGVBQWU7U0FDaEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxtQkFBbUIsQ0FDakIsS0FBbUUsRUFDbkUsVUFBd0U7UUFDdEUsc0JBQXNCLEVBQUUsSUFBSTtRQUM1QixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7S0FDdEM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSztRQUNILElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFNBQVMsQ0FBQztRQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3JELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FDZixTQUFpQixFQUNqQixZQUFpQyxFQUNqQyxVQUErQjtRQUUvQixNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFO1lBQ2xFLElBQUksRUFBRSxZQUFZO1lBQ2xCLEdBQUcsVUFBVTtTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFpQixFQUFFLFlBQWlDO1FBQ3ZFLE1BQU0sSUFBSSxDQUFDLG9CQUFvQjthQUM1QixRQUFRLEVBQUU7WUFDWCxFQUFFLGNBQWMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQ2YsSUFBWSxFQUNaLGNBQTRCLEVBQUUsRUFDOUIsaUJBQWlDLEVBQUUsRUFDbkMsV0FBK0IsU0FBUyxFQUN4QyxrQkFBc0MsU0FBUyxFQUMvQyxhQUE0QyxTQUFTLEVBQ3JELFNBQTZCLFNBQVM7UUFFdEMsSUFBSSxLQUFLLEdBQWlCO1lBQ3hCLElBQUk7WUFDSixXQUFXO1lBQ1gsY0FBYztZQUNkLFFBQVE7WUFDUixlQUFlO1lBQ2YsVUFBVTtZQUNWLE1BQU07U0FDUCxDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQ2xDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSyxFQUN2QyxLQUFLLENBQUMsSUFBSSxFQUNWLEtBQUssQ0FBQyxXQUFXLEVBQ2pCLEtBQUssQ0FBQyxjQUFjLEVBQ3BCLEtBQUssQ0FBQyxRQUFRLEVBQ2QsS0FBSyxDQUFDLGVBQWUsRUFDckIsS0FBSyxDQUFDLFVBQVUsRUFDaEIsS0FBSyxDQUFDLE1BQU0sQ0FDYixDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRyxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUUsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBc0I7UUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRyxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQzVCO1lBQ0UsR0FBSSxPQUFzQztZQUMxQyxnRUFBZ0U7WUFDaEUsZUFBZSxFQUFFLFNBQVM7WUFDMUIsTUFBTSxFQUFFLFNBQVM7U0FDbEIsRUFDRCxJQUFJLENBQ0wsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBc0I7UUFDeEMsSUFBSSxlQUFlLEdBQWtCO1lBQ25DLEdBQUcsT0FBTztTQUNYLENBQUM7UUFDRixJQUFJLGVBQWUsQ0FBQyxjQUFjLEVBQUU7WUFDbEMsZUFBZSxDQUFDLGNBQWMsR0FBRztnQkFDL0IsR0FBRyxlQUFlLENBQUMsY0FBYzthQUNsQyxDQUFDO1NBQ0g7UUFDRCxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDNUIsZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFO1lBQzFCLGdFQUFnRTtZQUNoRSxPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQUM7U0FDL0I7UUFDRCxJQUFJLGVBQWUsQ0FBQyxXQUFXLEVBQUU7WUFDL0IsT0FBTyxlQUFlLENBQUMsV0FBVyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxlQUFlLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRTtZQUMvQyxPQUFPLGVBQWUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEVBQUU7WUFDOUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FDcEUsZUFBMEMsQ0FDM0MsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlO2FBQ2pDLFFBQVEsRUFBRTtZQUNYLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV2QyxJQUNFLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU87WUFDakMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFDbkM7WUFDQSxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQy9DLDZEQUE2RCxDQUM5RCxDQUFDO1lBQ0YsT0FBTyxPQUFPLENBQUM7U0FDaEI7UUFFRCxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFzQixFQUFFLGFBQWEsR0FBRyxLQUFLO1FBQy9ELElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO2dCQUNwRCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ2QsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2FBQzdCLENBQUMsQ0FBQztZQUNILElBQUksTUFBTSxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxTQUFTO29CQUNmLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUNwRDtvQkFDSCxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUNsQyxDQUFDO2FBQ1A7WUFDRCxPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRTtZQUN6QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwRSxJQUFJLE1BQU0sRUFBRTtnQkFDVixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNuRTtTQUNGO2FBQU07WUFDTCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNuRTtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQixDQUNyQixPQUEyQjtRQUUzQixNQUFNLE1BQU0sR0FBdUIsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUcsQ0FBQztRQUN0RCxNQUFNLGFBQWEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNyQixNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU87WUFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyx3QkFBd0I7Z0JBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7Z0JBQ3JELENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdEUsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUI7Z0JBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7Z0JBQ3BELENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDdEUsQ0FDRixDQUFDO1FBQ0YsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDN0IsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBRTtnQkFDdkMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixJQUFJO29CQUNKLElBQUk7b0JBQ0osS0FBSyxFQUFFLFNBQVM7b0JBQ2hCLEdBQUcsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUk7b0JBQzVCLHNKQUFzSjtvQkFDdEosU0FBUyxFQUFHLFlBQVksQ0FBQyxLQUFhLENBQUMsU0FBUztpQkFDakQsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsSUFBSSxNQUFNLEdBQWdDLFNBQVMsQ0FBQztnQkFDcEQsSUFBSSxTQUF3QyxDQUFDO2dCQUM3QyxzRUFBc0U7Z0JBQ3RFLE1BQU0sT0FBTztnQkFDWCx5RUFBeUU7Z0JBQ3pFLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7Z0JBQzlDLHNFQUFzRTtnQkFDdEUsTUFBTSxJQUFJO2dCQUNSLHlFQUF5RTtnQkFDekUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztnQkFDM0MsSUFDRSxJQUFJLEtBQUssRUFBRTtvQkFDWCxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUN6RDtvQkFDQSxNQUFNLEdBQUcsV0FBVyxDQUFDO29CQUNyQixTQUFTLEdBQUc7d0JBQ1YsS0FBSyxFQUNILG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzVDLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixJQUFJO3FCQUM1QyxDQUFDO29CQUNGLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQ3JDLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQ2hDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUNqRCxDQUFDO3dCQUNGLFNBQVMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxZQUFZLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDdkQ7aUJBQ0Y7cUJBQU0sSUFDTCxJQUFJLEtBQUssQ0FBQztvQkFDVixPQUFPLEVBQUUsV0FBVyxFQUFFLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQ2xEO29CQUNBLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQztvQkFDMUIsU0FBUyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztpQkFDekQ7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixJQUFJO29CQUNKLElBQUk7b0JBQ0osS0FBSyxFQUFFLE9BQU87b0JBQ2QsV0FBVyxFQUFFLE1BQU07b0JBQ25CLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7aUJBQ3BELENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGdCQUFrQztRQUN2RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFHLENBQUM7UUFDdEQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksS0FBSyxPQUFPO1lBQ3RDLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCO2dCQUM3QixDQUFDLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLEdBQUksRUFBRSxPQUFPLENBQUM7Z0JBQy9ELENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEdBQUksQ0FBQztZQUM5QyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QjtnQkFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFJLEVBQUUsT0FBTyxDQUFDO2dCQUM5RCxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFVBQWtCO1FBQzFDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2xCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO1lBQ3pELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDdEQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsTUFBTyxDQUNoRSxDQUFDO1NBQ0g7YUFBTTtZQUNMLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsT0FBTyxFQUFFLENBQUM7YUFDWDtZQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLFlBQVksQ0FBQztnQkFDOUMsSUFBSSxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRTthQUNuQixDQUFDLENBQUMsQ0FBQywyQ0FBMkM7WUFFaEUsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDMUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUNqRSxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUNkLFNBQWlCLEVBQ2pCLFFBQWdDLEVBQ2hDLGVBQXdCO1FBRXhCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUcsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9ELElBQUksUUFBUSxFQUFFLE9BQU8sRUFBRTtZQUNyQixPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDO2dCQUM3QixHQUFHLFFBQVEsQ0FBQyxPQUFPO2dCQUNuQixNQUFNLEVBQUUsVUFBVTthQUNuQixDQUFDLENBQUM7WUFDSCxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDbkQsYUFBYTtnQkFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQztvQkFDcEMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVUsQ0FBQztpQkFDdEQsQ0FBQztnQkFDSixDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ3pFO2FBQU07WUFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztnQkFDMUIsRUFBRSxFQUFFLFNBQVM7Z0JBQ2IsU0FBUyxFQUFFLGVBQWU7YUFDM0IsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLEVBQUcsQ0FBQyxDQUNyRSxDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQ3JFO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsb0JBQW9CLENBQUMsT0FBb0Q7UUFDdkUsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzdDLE9BQU8sR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLE9BQWdCO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxHQUFXLEVBQUUsa0JBQWtCLEdBQUcsSUFBSTtRQUNsRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBRXJFLElBQUksa0JBQWtCLEVBQUU7WUFDdEIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUM7YUFDdEM7WUFDRCxLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztnQkFDeEQsRUFBRSxZQUFZLEVBQUU7aUJBQ2YsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDdEMsTUFBTSxFQUNOLDJCQUEyQixFQUMzQixHQUE4QixDQUMvQixDQUNGLENBQUM7U0FDTDtRQUVELElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ25ELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDN0MsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDckQsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0M7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDM0M7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FDOUIsT0FBd0MsRUFDeEMsVUFBOEIsRUFDOUIsUUFBUSxHQUFHLEtBQUs7UUFFaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRyxDQUFDO1FBQ3RELE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQzFDLGFBQWE7WUFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQztnQkFDcEMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBVSxDQUFDO2FBQzdDLENBQUM7WUFDSixDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUk7WUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQ3pDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7Z0JBQ2xCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztnQkFDaEMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQzVCLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUI7Z0JBQzVDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztnQkFDeEIsR0FBRyxVQUFVO2FBQ0gsQ0FBQyxDQUFDLENBQUMsMkNBQTJDO1lBQzFELE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQzVCO2dCQUNFLEdBQUcsUUFBUSxDQUFDLE9BQU87Z0JBQ25CLE1BQU0sRUFBRSxVQUFVO2FBQ25CLEVBQ0QsSUFBSSxDQUNMLENBQUM7WUFDRixhQUFhO2dCQUNYLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDO29CQUNwQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFVLENBQUM7aUJBQzdDLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN4RSxJQUFJLFFBQTBCLENBQUM7WUFDL0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO2lCQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNiLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPLFVBQVUsQ0FBQztZQUNsQiw4REFBOEQ7U0FDL0Q7UUFBQyxPQUFPLEtBQVUsRUFBRTtZQUNuQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFDLE1BQU0sV0FBVyxHQUliLFdBQVcsQ0FBQyxDQUFDLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQXlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUV4RSxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDNUIsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osSUFDRSxXQUFXLENBQUMsTUFBTSxLQUFLLEdBQUc7b0JBQzFCLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQztvQkFDdEIsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUNoRTtvQkFDQSxlQUFlLEdBQUcsSUFBSSxDQUFDO2lCQUN4QjthQUNGO1lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDNUI7Z0JBQ0UsR0FBSSxPQUEyQjtnQkFDL0IsZ0VBQWdFO2dCQUNoRSxlQUFlLEVBQUUsZUFBZTtvQkFDOUIsQ0FBQyxDQUFDLFNBQVM7b0JBQ1gsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksU0FBUztnQkFDbkMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRO2FBQ2hELEVBQ0QsSUFBSSxDQUNMLENBQUM7WUFDRixhQUFhO2dCQUNYLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDO29CQUNwQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFVLENBQUM7aUJBQzdDLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN4RSxJQUFJLFFBQTBCLENBQUM7WUFDL0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO2lCQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNiLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPLFVBQVUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFpQixFQUFFLGVBQXdCO1FBQzdELElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFDdkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNELElBQUk7WUFDRixNQUFNLGFBQWEsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQzdDLFNBQVMsRUFDVCxlQUFlLENBQ2hCLENBQUM7WUFDRixNQUFNLFFBQVEsR0FBRyxhQUFhLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN0RCxJQUFJLGVBQWUsRUFBRTtnQkFDbkIsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxlQUFlLENBQUMsQ0FBQztnQkFDckUsS0FBSyxJQUFJLENBQUMsd0JBQXdCLENBQ2hDLGFBQThCLEVBQzlCLE9BQU8sQ0FDUixDQUFDO2FBQ0g7WUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDO2dCQUM3QixFQUFFLEVBQUUsU0FBUztnQkFDYixRQUFRLEVBQUUsZUFBZTthQUMxQixDQUFDLENBQUM7U0FDSjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixDQUMvQyw4QkFBOEIsQ0FDL0IsQ0FBQztZQUNGLE1BQU0sS0FBSyxDQUFDO1NBQ2I7Z0JBQVM7WUFDUixJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBc0I7UUFDckMsSUFBSTtZQUNGLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixDQUMvQywyQkFBMkIsRUFDM0IsU0FBUyxDQUNWLENBQUM7U0FDSDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixDQUMvQyxrQ0FBa0MsQ0FDbkMsQ0FBQztZQUNGLE1BQU0sS0FBSyxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFzQjtRQUN2QyxJQUFJO1lBQ0YsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQy9DLDZCQUE2QixFQUM3QixTQUFTLENBQ1YsQ0FBQztTQUNIO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQy9DLHVDQUF1QyxDQUN4QyxDQUFDO1lBQ0YsTUFBTSxLQUFLLENBQUM7U0FDYjtJQUNILENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxXQUF3QjtRQUNqRCxRQUFRLFdBQVcsQ0FBQyxTQUFTLEVBQUU7WUFDN0IsS0FBSyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUMzQixLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO29CQUM5QixJQUFJLElBQUksQ0FBQyx5QkFBeUIsRUFBRTt3QkFDbEMsT0FBTztxQkFDUjtvQkFDRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO29CQUN0QyxJQUFJO3dCQUNGLDJEQUEyRDt3QkFDM0QsTUFBTSxxQkFBcUIsR0FDekIsSUFBSSxDQUFDLHNCQUFzQjs0QkFDM0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3hDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FDdEIscUJBQXFCLElBQUksS0FBSyxFQUM5QixlQUFlLENBQ2hCLENBQUM7d0JBQ0YsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLEVBQUU7NEJBQ3hDLHdHQUF3Rzs0QkFDeEcsS0FBSyxJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQzlDLHVDQUF1Qzs0QkFDdkMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxDQUFDOzRCQUM3RCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUcsQ0FBQyxDQUFDOzRCQUM1RCxJQUFJLFFBQTBCLENBQUM7NEJBQy9CLElBQUksQ0FBQyxzQkFBc0I7aUNBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUNBQ2IsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNwQyxNQUFNLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQ3pDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLGNBQWMsRUFBRSxFQUFFLENBQ25DLENBQUM7NEJBQ0YsSUFBSSxxQkFBcUIsRUFBRTtnQ0FDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLENBQUM7NkJBQ2xEO3lCQUNGO3dCQUNELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7cUJBQ3hDO29CQUFDLE1BQU07d0JBQ04sSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztxQkFDeEM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTTthQUNQO1lBQ0QsS0FBSywwQkFBMEIsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ25CLElBQUksSUFBSSxDQUFDLG1DQUFtQyxFQUFFO3dCQUM1QyxJQUFJLENBQUMsbUNBQW1DLENBQ3RDLFdBQVcsRUFDWCxJQUFJLENBQUMsaUJBQWlCLENBQ3ZCLENBQUM7cUJBQ0g7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsQ0FBQyxDQUFDO3FCQUNoRDtnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDSCxNQUFNO2FBQ1A7WUFDRCxLQUFLLCtCQUErQixDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtvQkFDbkIsSUFBSSxJQUFJLENBQUMsdUNBQXVDLEVBQUU7d0JBQ2hELElBQUksQ0FBQyx1Q0FBdUMsQ0FDMUMsV0FBVyxFQUNYLElBQUksQ0FBQyxpQkFBaUIsQ0FDdkIsQ0FBQztxQkFDSDt5QkFBTTt3QkFDTCxJQUFJLENBQUMsZ0NBQWdDLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQ3BEO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNILE1BQU07YUFDUDtZQUNELEtBQUssbUNBQW1DLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO29CQUNuQixJQUFJLElBQUksQ0FBQywyQ0FBMkMsRUFBRTt3QkFDcEQsSUFBSSxDQUFDLDJDQUEyQyxDQUM5QyxXQUFXLEVBQ1gsSUFBSSxDQUFDLGlCQUFpQixDQUN2QixDQUFDO3FCQUNIO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDeEQ7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTTthQUNQO1lBQ0QsS0FBSyxjQUFjLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO29CQUNuQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNqRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTs0QkFDM0QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7eUJBQ2hFOzZCQUFNOzRCQUNMLE9BQU8sQ0FBQyxDQUFDO3lCQUNWO29CQUNILENBQUMsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUMzQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzNELElBQUksYUFBYSxFQUFFO3dCQUNqQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FDOUMsYUFBYSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxhQUFhLENBQ25CLENBQUM7d0JBQ0YsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FDcEMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7NEJBQ3BDLENBQW1CLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7NEJBQzFELE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUNsQixDQUFDLENBQUMsQ0FDSCxDQUFDO3dCQUNGLE1BQU0sbUJBQW1CLEdBQ3ZCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDL0MsSUFBSSxtQkFBbUIsRUFBRTs0QkFDdkIsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQzs0QkFDbEUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQzt5QkFDdEQ7d0JBQ0QsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLElBQUksQ0FBQzs0QkFDM0MsR0FBSSxhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWtDO3lCQUMzRCxDQUFDLENBQUM7cUJBQ0o7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTTthQUNQO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sb0NBQW9DLENBQUMsV0FBd0I7UUFDbkUsTUFBTSxvQkFBb0IsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQVEsQ0FBQyxHQUFHLENBQUM7UUFDNUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8sNEJBQTRCLENBQUMsV0FBd0I7UUFDM0QsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUM3QixLQUFLLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pFO0lBQ0gsQ0FBQztJQUVPLGdDQUFnQyxDQUFDLFdBQXdCO1FBQy9ELElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDN0IsS0FBSyxJQUFJLENBQUMsMEJBQTBCLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNqRTtJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsMEJBQTBCLENBQUMsZUFBZ0M7UUFDdkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQzFELGVBQWUsQ0FBQyxJQUFJLEVBQ3BCLGVBQWUsQ0FBQyxFQUFFLENBQ25CLENBQUM7UUFDRixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM1RCxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pELE9BQU87U0FDUjtRQUNELE1BQU0sVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUN0QyxPQUFPLEVBQ1Asb0VBQW9FLEVBQ3BFLEdBQThCLENBQy9CLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN4RCxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pELE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVPLDJCQUEyQixDQUFDLE9BQWdCO1FBQ2xELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQ2xDLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNuQixLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUztvQkFDdEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUzt3QkFDdkIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsRUFBRTt3QkFDNUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUM7NEJBQ3BDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7eUJBQ2xELENBQUM7d0JBQ0osQ0FBQyxDQUFDLElBQUk7b0JBQ1IsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUM7d0JBQ3JDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRO3FCQUMxQixDQUFDLENBQUM7Z0JBQ1AsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDaEQsSUFBSSxDQUFDLEVBQUU7d0JBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbEI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQ2xDLE9BQU8sQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDckUsQ0FBQztRQUNGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQ2xDLE9BQU8sQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDckUsQ0FBQztRQUNGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQ2xDLE9BQU8sQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDeEUsQ0FBQztRQUNGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQ2xDLE9BQU8sQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNuQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQ3JDLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQ2xDLE9BQU8sQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNuQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQ3JDLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQ2xDLE9BQU8sQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNuQixJQUFJLGFBQTZCLENBQUM7Z0JBQ2xDLElBQUksUUFBMEIsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUN4RCxRQUFRLEdBQUcsQ0FBQyxDQUFDO29CQUNiLGFBQWEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDaEQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQzdCLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO29CQUN4QixhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDN0Q7cUJBQU07b0JBQ0wsYUFBYSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7aUJBQzNCO2dCQUNELGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUM7Z0JBRXJELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FDbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU87YUFDM0IsSUFBSSxDQUNILE1BQU0sQ0FDSixDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osQ0FBQyxDQUFDLFNBQVMsS0FBSywwQkFBMEI7WUFDMUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLEtBQUssT0FBTyxDQUFDLEVBQUUsQ0FDcEMsRUFDRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FDcEI7YUFDQSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLDhCQUE4QixHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLHdCQUF3QixHQUFHLENBQUMsQ0FBQyxlQUFlLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUNGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQ2xDLE9BQU8sQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3RELENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQ2xDLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JELENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQWlCO1FBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzRCxNQUFNLGFBQWEsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBaUI7UUFDbkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNELE1BQU0sYUFBYSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxJQUFJLFNBQVMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLHFCQUFxQjtRQUN2QixPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSwwQkFBMEI7UUFDNUIsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFpQjtRQUN6QyxNQUFNLFNBQVMsR0FBdUIsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNsQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsOEJBQThCLENBQUM7UUFDckUsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXpCLE9BQU8sWUFBWSxLQUFLLEtBQUssSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLGNBQWMsRUFBRTtZQUNsRSxJQUFJO2dCQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFO29CQUNqRSxNQUFNO29CQUNOLEtBQUs7aUJBQ04sQ0FBQyxDQUFDO2dCQUNILFlBQVksR0FBRyxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUM7Z0JBQ2hELElBQUksWUFBWSxHQUFHLENBQUMsRUFBRTtvQkFDcEIsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDeEM7Z0JBQ0QsTUFBTSxJQUFJLFlBQVksQ0FBQzthQUN4QjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FDL0Msb0NBQW9DLENBQ3JDLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLENBQUM7YUFDVDtTQUNGO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBaUI7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkIsT0FBTztTQUNSO1FBRUQsSUFBSTtZQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7Z0JBQ25ELFVBQVUsRUFBRSxTQUFTO2FBQ3RCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7WUFDaEMsT0FBTyxRQUFRLENBQUM7WUFDaEIsOERBQThEO1NBQy9EO1FBQUMsT0FBTyxDQUFNLEVBQUU7WUFDZixNQUFNLEtBQUssR0FJUCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBSS9CLENBQUM7WUFDRixNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQztZQUNuQyxJQUNFLElBQUk7Z0JBQ0osSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDO2dCQUNmLElBQUksQ0FBQyxVQUFVLEtBQUssR0FBRztnQkFDdkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsdUJBQXVCLENBQUMsRUFDL0M7Z0JBQ0EsTUFBTSxLQUFLLEdBQUcsc0JBQXNCO3FCQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUN2QixLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckIsSUFBSSxLQUFLLEVBQUU7b0JBQ1QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixDQUMvQyw0RUFBNEUsRUFDNUUsU0FBUyxFQUNULFNBQVMsRUFDVCxFQUFFLEtBQUssRUFBRSxDQUNWLENBQUM7b0JBQ0YsTUFBTSxDQUFDLENBQUM7aUJBQ1Q7YUFDRjtZQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FDL0MsNENBQTRDLENBQzdDLENBQUM7WUFDRixNQUFNLENBQUMsQ0FBQztTQUNUO0lBQ0gsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFZO1FBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQy9ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNaLE9BQU87YUFDUjtZQUNELDJGQUEyRjtZQUMzRixNQUFNLFFBQVEsR0FBNEIsYUFBYTtnQkFDckQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQztnQkFDeEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2IsT0FBTzthQUNSO1lBQ0QsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FDckMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQ25DLENBQUM7WUFDRixJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLGlCQUFpQixFQUFFO2dCQUMzRCxhQUFhO29CQUNYLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztvQkFDdEQsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUM7b0JBQzNDLEdBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFrQztpQkFDckQsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyw0QkFBNEIsQ0FBQyxDQUFRO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQ3pELElBQUksUUFBMEIsQ0FBQztZQUMvQixDQUFDLGVBQWU7Z0JBQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUI7Z0JBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQzlCO2lCQUNFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDYixTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUN2QixPQUFPO2FBQ1I7WUFDRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkMsT0FBTyxDQUFDLGVBQWUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUM1RCxPQUFPLENBQUMsZUFBZSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxDQUFDO1lBQzVELE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLGdCQUFnQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEUsT0FBTyxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlELE9BQU8sQ0FBQyxlQUFlLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUM7WUFFNUQsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztZQUN4QyxlQUFlO2dCQUNiLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztnQkFDdEQsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sYUFBYSxDQUFDLE9BQXdCO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLE9BQTJDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNyRSxDQUFDLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVO1lBQy9CLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBQzlCLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2YsQ0FBQyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVTtZQUMvQixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUM5QixDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUM7UUFFOUMsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU8sZUFBZSxDQUNyQixPQUFnRTtRQUVoRSxPQUFPLFFBQVEsSUFBSSxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUVPLHVCQUF1QixDQUM3QixPQUFnRTtRQUVoRSxPQUFPLE9BQU8sQ0FBQyxVQUFVLFlBQVksSUFBSSxDQUFDO0lBQzVDLENBQUM7SUFFTywrQkFBK0IsQ0FBQyxPQUE0QjtRQUNsRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FDekIsc0JBQStCLEVBQy9CLFNBQTJCO1FBRTNCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQ2IsaUVBQWlFLENBQ2xFLENBQUM7U0FDSDtRQUNELElBQUk7WUFDRixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFFN0QsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxZQUFZO2dCQUNuRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO2dCQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDakIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUMvRCxDQUFDO1lBQ0YsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNyQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQy9CO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xFLElBQ0Usb0JBQW9CO2dCQUNwQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsRUFDbEU7Z0JBQ0EsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7YUFDOUI7aUJBQU0sSUFDTCxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDM0IsQ0FBQyxvQkFBb0I7Z0JBQ3JCLHNCQUFzQixFQUN0QjtnQkFDQSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM5QztZQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUM7WUFDbEMsT0FBTyxRQUFRLENBQUM7U0FDakI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUM7Z0JBQ2pDLEtBQUssRUFBRSxPQUFPO2dCQUNkLG1FQUFtRTtnQkFDbkUsS0FBSzthQUNOLENBQUMsQ0FBQztZQUNILE1BQU0sS0FBSyxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsT0FBZ0I7UUFDNUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUMxQztRQUNELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUM5Qyw0RUFBNEU7WUFDNUUsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQTJDLENBQUM7WUFDL0QsUUFBUSxJQUFJLEVBQUU7Z0JBQ1osS0FBSyxhQUFhLENBQUMsQ0FBQztvQkFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO3dCQUNuQixJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRTs0QkFDaEMsSUFBSSxDQUFDLHVCQUF1QixDQUMxQixLQUFLLEVBQ0wsT0FBTyxFQUNQLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxtQkFBbUIsQ0FDekIsQ0FBQzt5QkFDSDs2QkFBTTs0QkFDTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3lCQUN2QztvQkFDSCxDQUFDLENBQUMsQ0FBQztvQkFDSCxNQUFNO2lCQUNQO2dCQUNELEtBQUssZ0JBQWdCLENBQUMsQ0FBQztvQkFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO3dCQUNuQixJQUFJLElBQUksQ0FBQywwQkFBMEIsRUFBRTs0QkFDbkMsSUFBSSxDQUFDLDBCQUEwQixDQUM3QixLQUFLLEVBQ0wsT0FBTyxFQUNQLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxtQkFBbUIsQ0FDekIsQ0FBQzt5QkFDSDs2QkFBTTs0QkFDTCxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ2pDO29CQUNILENBQUMsQ0FBQyxDQUFDO29CQUNILE1BQU07aUJBQ1A7Z0JBQ0QsS0FBSyxpQkFBaUIsQ0FBQyxDQUFDO29CQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7d0JBQ25CLElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFOzRCQUNwQyxJQUFJLENBQUMsMkJBQTJCLENBQzlCLEtBQUssRUFDTCxPQUFPLEVBQ1AsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsSUFBSSxDQUFDLG1CQUFtQixDQUN6QixDQUFDO3lCQUNIOzZCQUFNOzRCQUNMLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDbEM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsTUFBTTtpQkFDUDtnQkFDRCxLQUFLLGlCQUFpQixDQUFDLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTt3QkFDbkIsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEVBQUU7NEJBQ3BDLElBQUksQ0FBQywyQkFBMkIsQ0FDOUIsS0FBSyxFQUNMLE9BQU8sRUFDUCxJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixJQUFJLENBQUMsbUJBQW1CLENBQ3pCLENBQUM7eUJBQ0g7NkJBQU07NEJBQ0wsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQzt5QkFDM0M7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsTUFBTTtpQkFDUDtnQkFDRCxLQUFLLGlCQUFpQixDQUFDLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTt3QkFDbkIsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEVBQUU7NEJBQ3BDLElBQUksQ0FBQywyQkFBMkIsQ0FDOUIsS0FBSyxFQUNMLE9BQU8sRUFDUCxJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixJQUFJLENBQUMsbUJBQW1CLENBQ3pCLENBQUM7eUJBQ0g7NkJBQU07NEJBQ0wsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUNqQztvQkFDSCxDQUFDLENBQUMsQ0FBQztvQkFDSCxNQUFNO2lCQUNQO2dCQUNELEtBQUssbUJBQW1CLENBQUMsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO3dCQUNuQixJQUFJLElBQUksQ0FBQyw2QkFBNkIsRUFBRTs0QkFDdEMsSUFBSSxDQUFDLDZCQUE2QixDQUNoQyxLQUFLLEVBQ0wsT0FBTyxFQUNQLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxtQkFBbUIsQ0FDekIsQ0FBQzt5QkFDSDs2QkFBTTs0QkFDTCxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ25DO29CQUNILENBQUMsQ0FBQyxDQUFDO29CQUNILE1BQU07aUJBQ1A7Z0JBQ0QsS0FBSyxzQkFBc0IsQ0FBQyxDQUFDO29CQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7d0JBQ25CLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7d0JBQ3RCLElBQUksR0FBRyxFQUFFOzRCQUNQLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7NEJBQ3hELE1BQU0sS0FBSyxHQUFHLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7NEJBQy9ELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7Z0NBQ3ZDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxlQUFnQixDQUFDLENBQUMsQ0FBQztnQ0FDakQsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRTtvQ0FDckQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FDNUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUNyQyxDQUFDO2lDQUNIOzZCQUNGO3lCQUNGO29CQUNILENBQUMsQ0FBQyxDQUFDO29CQUNILE1BQU07aUJBQ1A7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDO0lBQ25FLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxDQUFRLEVBQUUsT0FBZ0I7UUFDakQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxLQUFZO1FBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEtBQVk7UUFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsS0FBWSxFQUFFLE9BQWdCO1FBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQ3ZELENBQUM7U0FDSDtJQUNILENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxLQUFZO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUMxQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsT0FBUSxDQUFDLEdBQUcsQ0FDcEMsQ0FBQztRQUNGLElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3ZCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDNUMsTUFBTSxvQkFBb0IsR0FBRztnQkFDM0IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLEtBQUs7Z0JBQ3JDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLElBQUksRUFBRTthQUN2RCxDQUFDO1lBQ0YsT0FBTyxDQUFDLElBQUksR0FBRztnQkFDYixHQUFHLEtBQUssQ0FBQyxPQUFRO2dCQUNqQixHQUFHLG9CQUFvQjthQUN4QixDQUFDO1lBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDcEUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN6QztTQUNGO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLEtBQVk7UUFDeEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQzFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxPQUFRLENBQUMsR0FBRyxDQUNwQyxDQUFDO1FBQ0YsSUFBSSxZQUFZLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFO2dCQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFHLENBQUM7Z0JBQ3RELE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzQztTQUNGO0lBQ0gsQ0FBQztJQUVELElBQVksaUJBQWlCO1FBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0JBQTRCLENBQUM7UUFDL0QsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTyx3QkFBd0IsQ0FDOUIsT0FBZ0UsRUFDaEUsT0FBaUI7UUFFakIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDNUMsSUFDRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztZQUM3QixJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEVBQ3JDO1lBQ0EsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFO2dCQUMxQixPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsR0FBRyxxQkFBcUIsQ0FDeEQsT0FBTyxDQUFDLGNBQWMsRUFDdEIsT0FBTyxFQUNQLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUN2QyxDQUFDO2FBQ0g7WUFDRCxPQUFPLENBQUMsV0FBVyxHQUFHLHFCQUFxQixDQUN6QyxPQUFPLEVBQ1AsT0FBTyxFQUNQLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUN2QyxDQUFDO1lBQ0YsT0FBTyxPQUFPLENBQUM7U0FDaEI7YUFBTTtZQUNMLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRTtnQkFDekIsT0FBeUIsQ0FBQyxjQUFlLENBQUMsV0FBVztvQkFDcEQscUJBQXFCLENBQ25CLE9BQU8sQ0FBQyxjQUFjLEVBQ3RCLE9BQU8sRUFDUCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDdkMsQ0FBQzthQUNMO1lBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3hDLE9BQXlCLENBQUMsTUFBTSxHQUFHLGVBQWU7b0JBQ2pELENBQUMsQ0FBQyxFQUFFO29CQUNKLENBQUMsQ0FBQyxPQUFPO3dCQUNULENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQzt3QkFDN0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDTixPQUF5QixDQUFDLFdBQVcsR0FBRyxxQkFBcUIsQ0FDNUQsT0FBTyxFQUNQLE9BQU8sRUFDUCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDdkMsQ0FBQztnQkFFRixPQUFPLE9BQXdCLENBQUM7YUFDakM7aUJBQU07Z0JBQ0wsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JDLE9BQXlCLENBQUMsTUFBTSxHQUFHLGVBQWU7b0JBQ2pELENBQUMsQ0FBQyxFQUFFO29CQUNKLENBQUMsQ0FBQyxPQUFPO3dCQUNULENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQzt3QkFDN0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDTixPQUF5QixDQUFDLFdBQVcsR0FBRyxxQkFBcUIsQ0FDNUQsT0FBTyxFQUNQLE9BQU8sRUFDUCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDdkMsQ0FBQztnQkFDRixPQUFPLE9BQXdCLENBQUM7YUFDakM7U0FDRjtJQUNILENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxLQUFZO1FBQ3pDLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO1lBQ2pFLE9BQU87U0FDUjtRQUNELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDM0MsSUFDRSxnQkFBZ0I7WUFDaEIsS0FBSyxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsNEJBQTRCLENBQUMsUUFBUSxFQUFFLEVBQ2hFO1lBQ0EsT0FBTztTQUNSO1FBQ0QsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCO1lBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCO1lBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUM7UUFDckMsTUFBTSxLQUFLLEdBQW1CLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDaEQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLEtBQVk7UUFDeEMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkUsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN4QixJQUFJLElBQUksSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQzlELG9CQUFvQixDQUFDLE1BQU0sQ0FDekIsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsRUFDdkQsQ0FBQyxDQUNGLENBQUM7WUFDRixJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDakUsT0FBTztTQUNSO1FBQ0QsSUFBSSxJQUFJLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUM3RCxtQkFBbUIsQ0FBQyxNQUFNLENBQ3hCLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQ3RELENBQUMsQ0FDRixDQUFDO1lBQ0YsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE9BQU87U0FDUjtJQUNILENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxLQUFZO1FBQ3ZDLElBQ0UsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFDdkU7WUFDQSxPQUFPO1NBQ1I7UUFDRCxNQUFNLGNBQWMsR0FDbEIsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRTtZQUM5QixPQUFPO1NBQ1I7UUFDRCxNQUFNLFNBQVMsR0FBRyxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQztRQUN0QyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsT0FBTztTQUNSO1FBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RCxJQUNFLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztZQUMxQixjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUM1RDtZQUNBLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxXQUFXLENBQUM7WUFDeEMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLElBQUksQ0FBQztnQkFDakQsR0FBRyxjQUFjO2FBQ2xCLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUFnQjtRQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNsQyxDQUFtQixDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ25ELENBQW1CLENBQUMsV0FBVyxHQUFHLHFCQUFxQixDQUN0RCxDQUFDLEVBQ0QsT0FBTyxFQUNQLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUN2QyxDQUFDO1lBQ0YsSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFO2dCQUNuQixDQUFtQixDQUFDLGNBQWUsQ0FBQyxXQUFXO29CQUM5QyxxQkFBcUIsQ0FDbkIsQ0FBQyxDQUFDLGNBQWMsRUFDaEIsT0FBTyxFQUNQLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUN2QyxDQUFDO2FBQ0w7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUM7WUFDM0MsR0FBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWtDO1NBQ3JELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sUUFBUSxDQUFDLE9BQWdCLEVBQUUsV0FBVyxHQUFHLElBQUk7UUFDbkQsSUFDRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3RCLElBQUksQ0FBQyw2QkFBNkI7WUFDbEMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQ3pCO1lBQ0EsSUFBSSxXQUFXLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2pDO2lCQUFNO2dCQUNMLEtBQUssT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ3pCO1NBQ0Y7SUFDSCxDQUFDO0lBRU8saUJBQWlCLENBQUMsT0FBZ0I7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNyQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixDQUFDLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7U0FDL0I7YUFBTTtZQUNMLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDckMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLENBQUM7UUFDMUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztJQUNuQyxDQUFDO0lBRU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUduQjtRQUNDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUM7UUFDOUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2hELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDdEUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUM3RCxDQUFDO1FBQ0YsSUFBSTtZQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FDckMsSUFBSSxDQUFDLHNCQUFzQixFQUMzQixZQUFZLENBQ2IsQ0FBQztZQUNGLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyx3QkFBd0I7Z0JBQzNCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FDL0MsbUNBQW1DLEVBQ25DLE9BQU8sQ0FDUixDQUFDO1lBQ0osTUFBTSxLQUFLLENBQUM7U0FDYjtJQUNILENBQUM7O0FBbitERDs7R0FFRztBQUNhLDZDQUE4QixHQUFHLElBQUksQ0FBQzsyR0ExUTNDLGNBQWM7K0dBQWQsY0FBYyxjQUZiLE1BQU07MkZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgZmlyc3QsIG1hcCwgc2hhcmVSZXBsYXksIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBBdHRhY2htZW50LFxuICBDaGFubmVsLFxuICBDaGFubmVsRmlsdGVycyxcbiAgQ2hhbm5lbE9wdGlvbnMsXG4gIENoYW5uZWxSZXNwb25zZSxcbiAgQ2hhbm5lbFNvcnQsXG4gIEN1c3RvbU1lc3NhZ2VEYXRhLFxuICBDdXN0b21SZWFjdGlvbkRhdGEsXG4gIEV2ZW50LFxuICBFdmVudFR5cGVzLFxuICBGb3JtYXRNZXNzYWdlUmVzcG9uc2UsXG4gIExvY2FsTWVzc2FnZSxcbiAgTWVtYmVyRmlsdGVycyxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVJlc3BvbnNlLFxuICBSZWFjdGlvblJlc3BvbnNlLFxuICBVc2VyUmVzcG9uc2UsXG59IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IENoYXRDbGllbnRTZXJ2aWNlLCBDbGllbnRFdmVudCB9IGZyb20gJy4vY2hhdC1jbGllbnQuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRNZXNzYWdlVHJhbnNsYXRpb24gfSBmcm9tICcuL2dldC1tZXNzYWdlLXRyYW5zbGF0aW9uJztcbmltcG9ydCB7IGNyZWF0ZU1lc3NhZ2VQcmV2aWV3IH0gZnJvbSAnLi9tZXNzYWdlLXByZXZpZXcnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0UmVhZEJ5IH0gZnJvbSAnLi9yZWFkLWJ5JztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRVcGxvYWQsXG4gIEF0dGFjaG1lbnRVcGxvYWRFcnJvclJlYXNvbixcbiAgQ2hhbm5lbFF1ZXJ5UmVzdWx0LFxuICBDaGFubmVsUXVlcnlTdGF0ZSxcbiAgQ2hhbm5lbFF1ZXJ5VHlwZSxcbiAgTWVzc2FnZUlucHV0LFxuICBNZXNzYWdlUmVhY3Rpb25UeXBlLFxuICBOZXh0UGFnZUNvbmZpZ3VyYXRpb24sXG4gIFN0cmVhbU1lc3NhZ2UsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhbm5lbFF1ZXJ5IH0gZnJvbSAnLi9jaGFubmVsLXF1ZXJ5JztcblxuLyoqXG4gKiBUaGUgYENoYW5uZWxTZXJ2aWNlYCBwcm92aWRlcyBkYXRhIGFuZCBpbnRlcmFjdGlvbiBmb3IgdGhlIGNoYW5uZWwgbGlzdCBhbmQgbWVzc2FnZSBsaXN0LlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFNlcnZpY2Uge1xuICAvKipcbiAgICogRW1pdHMgYGZhbHNlYCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBwYWdlcyBvZiBjaGFubmVscyB0aGF0IGNhbiBiZSBsb2FkZWQuXG4gICAqL1xuICBoYXNNb3JlQ2hhbm5lbHMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGN1cnJlbnRseSBsb2FkZWQgYW5kIFt3YXRjaGVkXSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvd2F0Y2hfY2hhbm5lbC8pIGNoYW5uZWwgbGlzdC5cbiAgICpcbiAgICogOjo6aW1wb3J0YW50XG4gICAqIElmIHlvdSB3YW50IHRvIHN1YnNjcmliZSB0byBjaGFubmVsIGV2ZW50cywgeW91IG5lZWQgdG8gbWFudWFsbHkgcmVlbnRlciBBbmd1bGFyJ3MgY2hhbmdlIGRldGVjdGlvbiB6b25lLCBvdXIgW0NoYW5nZSBkZXRlY3Rpb24gZ3VpZGVdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvY29uY2VwdHMvY2hhbmdlLWRldGVjdGlvbi8pIGV4cGxhaW5zIHRoaXMgaW4gZGV0YWlsLlxuICAgKiA6OjpcbiAgICovXG4gIGNoYW5uZWxzJDogT2JzZXJ2YWJsZTxDaGFubmVsW10gfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogVGhlIHJlc3VsdCBvZiB0aGUgbGF0ZXN0IGNoYW5uZWwgcXVlcnkgcmVxdWVzdC5cbiAgICovXG4gIGNoYW5uZWxRdWVyeVN0YXRlJDogT2JzZXJ2YWJsZTxDaGFubmVsUXVlcnlTdGF0ZSB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBjaGFubmVsLlxuICAgKlxuICAgKiA6OjppbXBvcnRhbnRcbiAgICogSWYgeW91IHdhbnQgdG8gc3Vic2NyaWJlIHRvIGNoYW5uZWwgZXZlbnRzLCB5b3UgbmVlZCB0byBtYW51YWxseSByZWVudGVyIEFuZ3VsYXIncyBjaGFuZ2UgZGV0ZWN0aW9uIHpvbmUsIG91ciBbQ2hhbmdlIGRldGVjdGlvbiBndWlkZV0oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9jb25jZXB0cy9jaGFuZ2UtZGV0ZWN0aW9uLykgZXhwbGFpbnMgdGhpcyBpbiBkZXRhaWwuXG4gICAqIDo6OlxuICAgKlxuICAgKiBUaGUgYWN0aXZlIGNoYW5uZWwgd2lsbCBhbHdheXMgYmUgbWFya2VkIGFzIHJlYWQgd2hlbiBhIG5ldyBtZXNzYWdlIGlzIHJlY2VpdmVkXG4gICAqL1xuICBhY3RpdmVDaGFubmVsJDogT2JzZXJ2YWJsZTxDaGFubmVsIHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBsb2FkZWQgbWVzc2FnZXMgb2YgdGhlIGFjdGl2ZSBjaGFubmVsLlxuICAgKi9cbiAgYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJDogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlW10+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGxpc3Qgb2YgcGlubmVkIG1lc3NhZ2VzIG9mIHRoZSBhY3RpdmUgY2hhbm5lbC5cbiAgICovXG4gIGFjdGl2ZUNoYW5uZWxQaW5uZWRNZXNzYWdlcyQ6IE9ic2VydmFibGU8U3RyZWFtTWVzc2FnZVtdPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBpZCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhcmVudCBtZXNzYWdlLiBJZiBubyBtZXNzYWdlIGlzIHNlbGVjdGVkLCBpdCBlbWl0cyB1bmRlZmluZWQuXG4gICAqL1xuICBhY3RpdmVQYXJlbnRNZXNzYWdlSWQkOiBPYnNlcnZhYmxlPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiBjdXJyZW50bHkgbG9hZGVkIHRocmVhZCByZXBsaWVzIGJlbG9uZ2luZyB0byB0aGUgc2VsZWN0ZWQgcGFyZW50IG1lc3NhZ2UuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnRseSBhY3RpdmUgdGhyZWFkIGl0IGVtaXRzIGFuIGVtcHR5IGFycmF5LlxuICAgKi9cbiAgYWN0aXZlVGhyZWFkTWVzc2FnZXMkOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2VbXT47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhcmVudCBtZXNzYWdlLiBJZiBubyBtZXNzYWdlIGlzIHNlbGVjdGVkLCBpdCBlbWl0cyB1bmRlZmluZWQuXG4gICAqL1xuICBhY3RpdmVQYXJlbnRNZXNzYWdlJDogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWVzc2FnZSB0byBxdW90ZVxuICAgKi9cbiAgbWVzc2FnZVRvUXVvdGUkOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIElEIG9mIHRoZSBtZXNzYWdlIHRoZSBtZXNzYWdlIGxpc3Qgc2hvdWxkIGp1bXAgdG8gKGNhbiBiZSBhIGNoYW5uZWwgbWVzc2FnZSBvciB0aHJlYWQgbWVzc2FnZSlcbiAgICovXG4gIGp1bXBUb01lc3NhZ2UkOiBPYnNlcnZhYmxlPHsgaWQ/OiBzdHJpbmc7IHBhcmVudElkPzogc3RyaW5nIH0+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGxpc3Qgb2YgdXNlcnMgdGhhdCBhcmUgY3VycmVudGx5IHR5cGluZyBpbiB0aGUgY2hhbm5lbCAoY3VycmVudCB1c2VyIGlzIG5vdCBpbmNsdWRlZClcbiAgICovXG4gIHVzZXJzVHlwaW5nSW5DaGFubmVsJDogT2JzZXJ2YWJsZTxVc2VyUmVzcG9uc2VbXT47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiB1c2VycyB0aGF0IGFyZSBjdXJyZW50bHkgdHlwaW5nIGluIHRoZSBhY3RpdmUgdGhyZWFkIChjdXJyZW50IHVzZXIgaXMgbm90IGluY2x1ZGVkKVxuICAgKi9cbiAgdXNlcnNUeXBpbmdJblRocmVhZCQ6IE9ic2VydmFibGU8VXNlclJlc3BvbnNlW10+O1xuICAvKipcbiAgICogRW1pdHMgYSBtYXAgdGhhdCBjb250YWlucyB0aGUgZGF0ZSBvZiB0aGUgbGF0ZXN0IG1lc3NhZ2Ugc2VudCBieSB0aGUgY3VycmVudCB1c2VyIGJ5IGNoYW5uZWxzICh0aGlzIGlzIHVzZWQgdG8gZGV0ZWN0IGlmIHNsb3cgbW9kZSBjb3VudGRvd24gc2hvdWxkIGJlIHN0YXJ0ZWQpXG4gICAqL1xuICBsYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHMkOiBPYnNlcnZhYmxlPHsgW2tleTogc3RyaW5nXTogRGF0ZSB9PjtcbiAgLyoqXG4gICAqIElmIHlvdSdyZSB1c2luZyBbc2VtYW50aWMgZmlsdGVycyBmb3IgbW9kZXJhdGlvbl0oL21vZGVyYXRpb24vZG9jcy8pIHlvdSBjYW4gc2V0IHVwIHJ1bGVzIGZvciBib3VuY2luZyBtZXNzYWdlcy5cbiAgICpcbiAgICogSWYgYSBtZXNzYWdlIGlzIGJvdW5jZWQsIGl0IHdpbGwgYmUgZW1pdHRlZCB2aWEgdGhpcyBgT2JzZXJ2YWJsZWAuIFRoZSBidWlsdC1pbiBbYE1lc3NhZ2VCb3VuY2VQcm9tcHRgIGNvbXBvbmVudF0oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9jb21wb25lbnRzL01lc3NhZ2VCb3VuY2VQcm9tcHRDb21wb25lbnQvKSB3aWxsIGRpc3BsYXkgdGhlIGJvdW5jZSBvcHRpb24gdG8gdGhlIHVzZXIgaWYgYSBib3VuY2VkIG1lc3NhZ2UgaXMgY2xpY2tlZC5cbiAgICovXG4gIGJvdW5jZWRNZXNzYWdlJDogQmVoYXZpb3JTdWJqZWN0PFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogVGhlIGxhc3QgcmVhZCBtZXNzYWdlIGlkIG9mIHRoZSBhY3RpdmUgY2hhbm5lbCwgaXQncyB1c2VkIGJ5IHRoZSBtZXNzYWdlIGxpc3QgY29tcG9uZW50IHRvIGRpc3BsYXkgdW5yZWFkIFVJLCBhbmQganVtcCB0byBsYXRlc3QgcmVhZCBtZXNzYWdlXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgaXNuJ3QgYWx3YXlzIHVwZGF0ZWQsIHBsZWFzZSB1c2UgYGNoYW5uZWwucmVhZGAgdG8gZGlzcGxheSB1cC10by1kYXRlIHJlYWQgaW5mb3JtYXRpb25cbiAgICovXG4gIGFjdGl2ZUNoYW5uZWxMYXN0UmVhZE1lc3NhZ2VJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1bnJlYWQgY291bnQgb2YgdGhlIGFjdGl2ZSBjaGFubmVsLCBpdCdzIHVzZWQgYnkgdGhlIG1lc3NhZ2UgbGlzdCBjb21wb25lbnQgdG8gZGlzcGxheSB1bnJlYWQgVUlcbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBpc24ndCBhbHdheXMgdXBkYXRlZCwgcGxlYXNlIHVzZSBgY2hhbm5lbC5yZWFkYCB0byBkaXNwbGF5IHVwLXRvLWRhdGUgcmVhZCBpbmZvcm1hdGlvblxuICAgKi9cbiAgYWN0aXZlQ2hhbm5lbFVucmVhZENvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCBpZiBhIG5ldyBtZXNzYWdlIHJlY2VpdmVkIGZyb20gYSBjaGFubmVsIHRoYXQgaXMgbm90IGJlaW5nIHdhdGNoZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL0NoYW5uZWxTZXJ2aWNlLyNjaGFubmVscy8pXG4gICAqXG4gICAqIElmIHlvdSdyZSBhZGRpbmcgYSBuZXcgY2hhbm5lbCwgbWFrZSBzdXJlIHRoYXQgaXQncyBhIFt3YXRjaGVkXSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvd2F0Y2hfY2hhbm5lbC8pIGNoYW5uZWwuXG4gICAqL1xuICBjdXN0b21OZXdNZXNzYWdlTm90aWZpY2F0aW9uSGFuZGxlcj86IChcbiAgICBjbGllbnRFdmVudDogQ2xpZW50RXZlbnQsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChcbiAgICAgIGNoYW5uZWxzOiBDaGFubmVsW10sXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHM/OiBib29sZWFuXG4gICAgKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiB0aGUgdXNlciBpcyBhZGRlZCB0byBhIGNoYW5uZWwsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL0NoYW5uZWxTZXJ2aWNlLyNjaGFubmVscy8pLlxuICAgKlxuICAgKiBJZiB5b3UncmUgYWRkaW5nIGEgbmV3IGNoYW5uZWwsIG1ha2Ugc3VyZSB0aGF0IGl0J3MgYSBbd2F0Y2hlZF0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3dhdGNoX2NoYW5uZWwvKSBjaGFubmVsLlxuICAgKi9cbiAgY3VzdG9tQWRkZWRUb0NoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyPzogKFxuICAgIGNsaWVudEV2ZW50OiBDbGllbnRFdmVudCxcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKFxuICAgICAgY2hhbm5lbHM6IENoYW5uZWxbXSxcbiAgICAgIHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVscz86IGJvb2xlYW5cbiAgICApID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIHRoZSB1c2VyIGlzIHJlbW92ZWQgZnJvbSBhIGNoYW5uZWwsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL0NoYW5uZWxTZXJ2aWNlLyNjaGFubmVscy8pLlxuICAgKlxuICAgKiBJZiB5b3UncmUgYWRkaW5nIGEgbmV3IGNoYW5uZWwsIG1ha2Ugc3VyZSB0aGF0IGl0J3MgYSBbd2F0Y2hlZF0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3dhdGNoX2NoYW5uZWwvKSBjaGFubmVsLlxuICAgKi9cbiAgY3VzdG9tUmVtb3ZlZEZyb21DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcj86IChcbiAgICBjbGllbnRFdmVudDogQ2xpZW50RXZlbnQsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChcbiAgICAgIGNoYW5uZWxzOiBDaGFubmVsW10sXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHM/OiBib29sZWFuXG4gICAgKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgaXMgZGVsZXRlZCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvQ2hhbm5lbFNlcnZpY2UvI2NoYW5uZWxzLykuXG4gICAqXG4gICAqIElmIHlvdSdyZSBhZGRpbmcgYSBuZXcgY2hhbm5lbCwgbWFrZSBzdXJlIHRoYXQgaXQncyBhIFt3YXRjaGVkXSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvd2F0Y2hfY2hhbm5lbC8pIGNoYW5uZWwuXG4gICAqL1xuICBjdXN0b21DaGFubmVsRGVsZXRlZEhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWwsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChcbiAgICAgIGNoYW5uZWxzOiBDaGFubmVsW10sXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHM/OiBib29sZWFuXG4gICAgKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGlzIHVwZGF0ZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL0NoYW5uZWxTZXJ2aWNlLyNjaGFubmVscy8pLlxuICAgKlxuICAgKiBJZiB5b3UncmUgYWRkaW5nIGEgbmV3IGNoYW5uZWwsIG1ha2Ugc3VyZSB0aGF0IGl0J3MgYSBbd2F0Y2hlZF0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3dhdGNoX2NoYW5uZWwvKSBjaGFubmVsLlxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbFVwZGF0ZWRIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsLFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogQ2hhbm5lbFtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBpcyB0cnVuY2F0ZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL0NoYW5uZWxTZXJ2aWNlLyNjaGFubmVscy8pLlxuICAgKlxuICAgKiBJZiB5b3UncmUgYWRkaW5nIGEgbmV3IGNoYW5uZWwsIG1ha2Ugc3VyZSB0aGF0IGl0J3MgYSBbd2F0Y2hlZF0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3dhdGNoX2NoYW5uZWwvKSBjaGFubmVsLlxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbFRydW5jYXRlZEhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWwsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChcbiAgICAgIGNoYW5uZWxzOiBDaGFubmVsW10sXG4gICAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHM/OiBib29sZWFuXG4gICAgKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGJlY29tZXMgaGlkZGVuLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9DaGFubmVsU2VydmljZS8jY2hhbm5lbHMvKS5cbiAgICpcbiAgICogSWYgeW91J3JlIGFkZGluZyBhIG5ldyBjaGFubmVsLCBtYWtlIHN1cmUgdGhhdCBpdCdzIGEgW3dhdGNoZWRdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC93YXRjaF9jaGFubmVsLykgY2hhbm5lbC5cbiAgICovXG4gIGN1c3RvbUNoYW5uZWxIaWRkZW5IYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsLFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogQ2hhbm5lbFtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBiZWNvbWVzIHZpc2libGUsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL0NoYW5uZWxTZXJ2aWNlLyNjaGFubmVscy8pLlxuICAgKlxuICAgKiBJZiB5b3UncmUgYWRkaW5nIGEgbmV3IGNoYW5uZWwsIG1ha2Ugc3VyZSB0aGF0IGl0J3MgYSBbd2F0Y2hlZF0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3dhdGNoX2NoYW5uZWwvKSBjaGFubmVsLlxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbFZpc2libGVIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsLFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoXG4gICAgICBjaGFubmVsczogQ2hhbm5lbFtdLFxuICAgICAgc2hvdWxkU3RvcFdhdGNoaW5nUmVtb3ZlZENoYW5uZWxzPzogYm9vbGVhblxuICAgICkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCBpZiBhIG5ldyBtZXNzYWdlIHJlY2VpdmVkIGZyb20gYSBjaGFubmVsIHRoYXQgaXMgYmVpbmcgd2F0Y2hlZCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvQ2hhbm5lbFNlcnZpY2UvI2NoYW5uZWxzLykuXG4gICAqXG4gICAqIElmIHlvdSdyZSBhZGRpbmcgYSBuZXcgY2hhbm5lbCwgbWFrZSBzdXJlIHRoYXQgaXQncyBhIFt3YXRjaGVkXSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvd2F0Y2hfY2hhbm5lbC8pIGNoYW5uZWwuXG4gICAqL1xuICBjdXN0b21OZXdNZXNzYWdlSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbCxcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKFxuICAgICAgY2hhbm5lbHM6IENoYW5uZWxbXSxcbiAgICAgIHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVscz86IGJvb2xlYW5cbiAgICApID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZmlsZSB1cGxvYWQgcmVxdWVzdCAtIHlvdSBjYW4gdXNlIHRoaXMgdG8gdXBsb2FkIGZpbGVzIHRvIHlvdXIgb3duIENETlxuICAgKi9cbiAgY3VzdG9tRmlsZVVwbG9hZFJlcXVlc3Q/OiAoXG4gICAgZmlsZTogRmlsZSxcbiAgICBjaGFubmVsOiBDaGFubmVsXG4gICkgPT4gUHJvbWlzZTx7IGZpbGU6IHN0cmluZyB9PjtcbiAgLyoqXG4gICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1hZ2UgdXBsb2FkIHJlcXVlc3QgLSB5b3UgY2FuIHVzZSB0aGlzIHRvIHVwbG9hZCBpbWFnZXMgdG8geW91ciBvd24gQ0ROXG4gICAqL1xuICBjdXN0b21JbWFnZVVwbG9hZFJlcXVlc3Q/OiAoXG4gICAgZmlsZTogRmlsZSxcbiAgICBjaGFubmVsOiBDaGFubmVsXG4gICkgPT4gUHJvbWlzZTx7IGZpbGU6IHN0cmluZyB9PjtcbiAgLyoqXG4gICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZmlsZSBkZWxldGUgcmVxdWVzdCAtIG92ZXJyaWRlIHRoaXMgaWYgeW91IHVzZSB5b3VyIG93biBDRE5cbiAgICovXG4gIGN1c3RvbUZpbGVEZWxldGVSZXF1ZXN0PzogKHVybDogc3RyaW5nLCBjaGFubmVsOiBDaGFubmVsKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogWW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBpbWFnZSBkZWxldGUgcmVxdWVzdCAtIG92ZXJyaWRlIHRoaXMgaWYgeW91IHVzZSB5b3VyIG93biBDRE5cbiAgICovXG4gIGN1c3RvbUltYWdlRGVsZXRlUmVxdWVzdD86ICh1cmw6IHN0cmluZywgY2hhbm5lbDogQ2hhbm5lbCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBwcm92aWRlZCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGRlbGV0aW5nIGEgbWVzc2FnZS4gSWYgdGhlIHJldHVybmVkIFByb21pc2UgcmVzb2x2ZXMgdG8gYHRydWVgIHRvIGRlbGV0aW9uIHdpbGwgZ28gYWhlYWQuIElmIGBmYWxzZWAgaXMgcmV0dXJuZWQsIHRoZSBtZXNzYWdlIHdvbid0IGJlIGRlbGV0ZWQuXG4gICAqL1xuICBtZXNzYWdlRGVsZXRlQ29uZmlybWF0aW9uSGFuZGxlcj86IChcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlXG4gICkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIFRoZSBwcm92aWRlZCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGEgbmV3IG1lc3NhZ2UgaXMgc2VudCB0byBTdHJlYW0ncyBBUEkuIFlvdSBjYW4gdXNlIHRoaXMgaG9vayB0byB0cmFuZnJvbSBvciBlbnJpY2ggdGhlIG1lc3NhZ2UgYmVpbmcgc2VudC5cbiAgICovXG4gIGJlZm9yZVNlbmRNZXNzYWdlPzogKFxuICAgIGlucHV0OiBNZXNzYWdlSW5wdXRcbiAgKSA9PiBNZXNzYWdlSW5wdXQgfCBQcm9taXNlPE1lc3NhZ2VJbnB1dD47XG4gIC8qKlxuICAgKiBUaGUgcHJvdmlkZWQgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhIG1lc3NhZ2UgaXMgc2VudCB0byBTdHJlYW0ncyBBUEkgZm9yIHVwZGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBob29rIHRvIHRyYW5mcm9tIG9yIGVucmljaCB0aGUgbWVzc2FnZSBiZWluZyB1cGRhdGVkLlxuICAgKi9cbiAgYmVmb3JlVXBkYXRlTWVzc2FnZT86IChcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlXG4gICkgPT4gU3RyZWFtTWVzc2FnZSB8IFByb21pc2U8U3RyZWFtTWVzc2FnZT47XG4gIC8qKlxuICAgKiBTaW5jZSBzd2l0Y2hpbmcgY2hhbm5lbHMgY2hhbmdlcyB0aGUgc3RhdGUgb2YgbXVsdGlwbGUgb2JzZXJhYmxlcywgdGhpcyBvYnNlcnZhYmxlIGNhbiBiZSB1c2VkIHRvIGNoZWNrIGlmIGFsbCBvYnNlcnZhYmxlcyBhcmUgdXBkYXRlZC5cbiAgICogLSBgZW5kYCBtZWFucyBhbGwgb2JzZXJ2YWJsZXMgYXJlIGluIHN0YWJsZSBzdGF0ZVxuICAgKiAtIGBzdGFydGAgbWVhbnMgYWxsIG9ic2VydmFibGVzIGFyZSBpbiB1bnN0YWJsZSBzdGF0ZVxuICAgKi9cbiAgY2hhbm5lbFN3aXRjaFN0YXRlJDogT2JzZXJ2YWJsZTwnc3RhcnQnIHwgJ2VuZCc+O1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgTUFYX01FU1NBR0VfUkVBQ1RJT05TX1RPX0ZFVENIID0gMTIwMDtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgaXNNZXNzYWdlTG9hZGluZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgbWVzc2FnZVBhZ2VTaXplID0gMjU7XG4gIHByaXZhdGUgY2hhbm5lbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFubmVsW10gfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBwcml2YXRlIGFjdGl2ZUNoYW5uZWxTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFubmVsIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICAoU3RyZWFtTWVzc2FnZSB8IE1lc3NhZ2VSZXNwb25zZSB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZSlbXVxuICA+KFtdKTtcbiAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBTdHJlYW1NZXNzYWdlW11cbiAgPihbXSk7XG4gIHByaXZhdGUgaGFzTW9yZUNoYW5uZWxzU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICBwcml2YXRlIGFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zOiB7IHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkIH1bXSA9IFtdO1xuICBwcml2YXRlIGNoYW5uZWxTdWJzY3JpcHRpb25zOiB7IFtrZXk6IHN0cmluZ106ICgpID0+IHZvaWQgfSA9IHt9O1xuICBwcml2YXRlIGFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIHN0cmluZyB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICAoU3RyZWFtTWVzc2FnZSB8IE1lc3NhZ2VSZXNwb25zZSB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZSlbXVxuICA+KFtdKTtcbiAgcHJpdmF0ZSBqdW1wVG9NZXNzYWdlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIGlkPzogc3RyaW5nO1xuICAgIHBhcmVudElkPzogc3RyaW5nO1xuICB9Pih7IGlkOiB1bmRlZmluZWQsIHBhcmVudElkOiB1bmRlZmluZWQgfSk7XG4gIHByaXZhdGUgbGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIFtrZXk6IHN0cmluZ106IERhdGU7XG4gIH0+KHt9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdHRhY2htZW50TWF4U2l6ZUZhbGxiYWNrSW5NQiA9IDEwMDtcbiAgcHJpdmF0ZSBtZXNzYWdlVG9RdW90ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlclJlc3BvbnNlW10+KFtdKTtcbiAgcHJpdmF0ZSB1c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlclJlc3BvbnNlW10+KFtdKTtcbiAgcHJpdmF0ZSBfc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQgPSB0cnVlO1xuICBwcml2YXRlIHNob3VsZFNldEFjdGl2ZUNoYW5uZWw6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY2xpZW50RXZlbnRzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IGZhbHNlO1xuICBwcml2YXRlIGNoYW5uZWxRdWVyeVN0YXRlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgQ2hhbm5lbFF1ZXJ5U3RhdGUgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGNoYW5uZWxTd2l0Y2hTdGF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PCdzdGFydCcgfCAnZW5kJz4oXG4gICAgJ2VuZCdcbiAgKTtcbiAgcHJpdmF0ZSBjaGFubmVsUXVlcnk/OlxuICAgIHwgQ2hhbm5lbFF1ZXJ5XG4gICAgfCAoKHF1ZXJ5VHlwZTogQ2hhbm5lbFF1ZXJ5VHlwZSkgPT4gUHJvbWlzZTxDaGFubmVsUXVlcnlSZXN1bHQ+KTtcbiAgcHJpdmF0ZSBfY3VzdG9tUGFnaW5hdG9yOlxuICAgIHwgKChjaGFubmVsUXVlcnlSZXN1bHQ6IENoYW5uZWxbXSkgPT4gTmV4dFBhZ2VDb25maWd1cmF0aW9uKVxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgY2hhbm5lbExpc3RTZXR0ZXIgPSAoXG4gICAgY2hhbm5lbHM6IENoYW5uZWxbXSxcbiAgICBzaG91bGRTdG9wV2F0Y2hpbmdSZW1vdmVkQ2hhbm5lbHMgPSB0cnVlXG4gICkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRDaGFubmVscyA9IHRoaXMuY2hhbm5lbHNTdWJqZWN0LmdldFZhbHVlKCkgfHwgW107XG4gICAgY29uc3QgZGVsZXRlZENoYW5uZWxzID0gY3VycmVudENoYW5uZWxzLmZpbHRlcihcbiAgICAgIChjKSA9PiAhY2hhbm5lbHM/LmZpbmQoKGNoYW5uZWwpID0+IGNoYW5uZWwuY2lkID09PSBjLmNpZClcbiAgICApO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFubmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IGNoYW5uZWxzW2ldO1xuICAgICAgaWYgKCF0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zW2NoYW5uZWwuY2lkXSkge1xuICAgICAgICB0aGlzLndhdGNoRm9yQ2hhbm5lbEV2ZW50cyhjaGFubmVsKTtcbiAgICAgIH1cbiAgICAgIGlmIChkZWxldGVkQ2hhbm5lbHMuaW5jbHVkZXMoY2hhbm5lbCkpIHtcbiAgICAgICAgaWYgKHNob3VsZFN0b3BXYXRjaGluZ1JlbW92ZWRDaGFubmVscykge1xuICAgICAgICAgIGlmICh0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zW2NoYW5uZWwuY2lkXSkge1xuICAgICAgICAgICAgdGhpcy5jaGFubmVsU3Vic2NyaXB0aW9uc1tjaGFubmVsLmNpZF0oKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zLmNpZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdm9pZCB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQuYWN0aXZlQ2hhbm5lbHNbY2hhbm5lbC5jaWRdXG4gICAgICAgICAgICA/LnN0b3BXYXRjaGluZygpXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT5cbiAgICAgICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmxvZ2dlcihcbiAgICAgICAgICAgICAgICAnd2FybicsXG4gICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byB1bndhdGNoIGNoYW5uZWwnLFxuICAgICAgICAgICAgICAgIGVyciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5leHRDaGFubmVscyA9IGNoYW5uZWxzO1xuICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQobmV4dENoYW5uZWxzKTtcbiAgICBpZiAoXG4gICAgICAhbmV4dENoYW5uZWxzLmZpbmQoXG4gICAgICAgIChjKSA9PiBjLmNpZCA9PT0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5jaWRcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGlmIChuZXh0Q2hhbm5lbHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnNldEFzQWN0aXZlQ2hhbm5lbChuZXh0Q2hhbm5lbHNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWVzc2FnZUxpc3RTZXR0ZXIgPSAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4ge1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KG1lc3NhZ2VzKTtcbiAgfTtcblxuICBwcml2YXRlIHRocmVhZExpc3RTZXR0ZXIgPSAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4ge1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQobWVzc2FnZXMpO1xuICB9O1xuXG4gIHByaXZhdGUgcGFyZW50TWVzc2FnZVNldHRlciA9IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQobWVzc2FnZT8uaWQpO1xuICB9O1xuICBwcml2YXRlIGRpc21pc3NFcnJvck5vdGlmaWNhdGlvbj86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgYXJlUmVhZEV2ZW50c1BhdXNlZCA9IGZhbHNlO1xuICBwcml2YXRlIG1hcmtSZWFkVGhyb3R0bGVUaW1lID0gMTA1MDtcbiAgcHJpdmF0ZSBtYXJrUmVhZFRpbWVvdXQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBzY2hlZHVsZWRNYXJrUmVhZFJlcXVlc3Q/OiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuY2hhbm5lbHMkID0gdGhpcy5jaGFubmVsc1N1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsJCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCA9IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5waXBlKFxuICAgICAgbWFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT5cbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybVRvU3RyZWFtTWVzc2FnZShtZXNzYWdlLCBjaGFubmVsKVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gICAgdGhpcy5ib3VuY2VkTWVzc2FnZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ+KFxuICAgICAgdW5kZWZpbmVkXG4gICAgKTtcbiAgICB0aGlzLmhhc01vcmVDaGFubmVscyQgPSB0aGlzLmhhc01vcmVDaGFubmVsc1N1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkJCA9IHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlcyQgPSB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5waXBlKFxuICAgICAgbWFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT5cbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybVRvU3RyZWFtTWVzc2FnZShtZXNzYWdlLCBjaGFubmVsKVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkLFxuICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWQkLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChbbWVzc2FnZXMsIHBhcmVudE1lc3NhZ2VJZF06IFtcbiAgICAgICAgICBTdHJlYW1NZXNzYWdlW10sXG4gICAgICAgICAgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgIF0pID0+IHtcbiAgICAgICAgICBpZiAoIXBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uaWQgPT09IHBhcmVudE1lc3NhZ2VJZCk7XG4gICAgICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgdm9pZCB0aGlzLnNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICAgIHRoaXMubWVzc2FnZVRvUXVvdGUkID0gdGhpcy5tZXNzYWdlVG9RdW90ZVN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMuanVtcFRvTWVzc2FnZSQgPSB0aGlzLmp1bXBUb01lc3NhZ2VTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcblxuICAgIHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWwkID0gdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbFN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMudXNlcnNUeXBpbmdJblRocmVhZCQgPSB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVscyQgPVxuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0XG4gICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXMkID0gdGhpcy5hY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXNTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICB0aGlzLmNoYW5uZWxRdWVyeVN0YXRlJCA9IHRoaXMuY2hhbm5lbFF1ZXJ5U3RhdGVTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICB0aGlzLmNoYW5uZWxTd2l0Y2hTdGF0ZSQgPSB0aGlzLmNoYW5uZWxTd2l0Y2hTdGF0ZVN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHNldCB0byBmYWxzZSwgcmVhZCBldmVudHMgd29uJ3QgYmUgc2VudCBhcyBuZXcgbWVzc2FnZXMgYXJlIHJlY2VpdmVkLiBJZiBzZXQgdG8gdHJ1ZSBhY3RpdmUgY2hhbm5lbCAoaWYgYW55KSB3aWxsIGltbWVkaWF0ZWx5IGJlIG1hcmtlZCBhcyByZWFkLlxuICAgKi9cbiAgZ2V0IHNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gZmFsc2UsIHJlYWQgZXZlbnRzIHdvbid0IGJlIHNlbnQgYXMgbmV3IG1lc3NhZ2VzIGFyZSByZWNlaXZlZC4gSWYgc2V0IHRvIHRydWUgYWN0aXZlIGNoYW5uZWwgKGlmIGFueSkgd2lsbCBpbW1lZGlhdGVseSBiZSBtYXJrZWQgYXMgcmVhZC5cbiAgICovXG4gIHNldCBzaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZChzaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5fc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQgJiYgc2hvdWxkTWFya0FjdGl2ZUNoYW5uZWxBc1JlYWQpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBpZiAoYWN0aXZlQ2hhbm5lbCAmJiB0aGlzLmNhblNlbmRSZWFkRXZlbnRzKSB7XG4gICAgICAgIHZvaWQgYWN0aXZlQ2hhbm5lbC5tYXJrUmVhZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zaG91bGRNYXJrQWN0aXZlQ2hhbm5lbEFzUmVhZCA9IHNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIFNESyB1c2VzIGFuIG9mZnNldCBiYXNlZCBwYWdpbmF0aW9uLCB5b3UgY2FuIGNoYW5nZS9leHRlbmQgdGhpcyBieSBwcm92aWRpbmcgeW91ciBvd24gY3VzdG9tIHBhZ2luYXRvciBtZXRob2QuXG4gICAqXG4gICAqIFRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBsYXRlc3QgY2hhbm5lbCBxdWVyeS5cbiAgICpcbiAgICogWW91IGNhbiByZXR1cm4gZWl0aGVyIGFuIG9mZnNldCwgb3IgYSBmaWx0ZXIgdXNpbmcgdGhlIFtgJGx0ZWAvYCRndGVgIG9wZXJhdG9yXSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfc3ludGF4X29wZXJhdG9ycy8pLiBJZiB5b3UgcmV0dXJuIGEgZmlsdGVyLCBpdCB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoZSBmaWx0ZXIgcHJvdmlkZWQgZm9yIHRoZSBgaW5pdGAgbWV0aG9kLlxuICAgKi9cbiAgc2V0IGN1c3RvbVBhZ2luYXRvcihcbiAgICBwYWdpbmF0b3I6XG4gICAgICB8ICgoY2hhbm5lbFF1ZXJ5UmVzdWx0OiBDaGFubmVsW10pID0+IE5leHRQYWdlQ29uZmlndXJhdGlvbilcbiAgICAgIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuX2N1c3RvbVBhZ2luYXRvciA9IHBhZ2luYXRvcjtcbiAgICBpZiAodGhpcy5jaGFubmVsUXVlcnkgJiYgJ2N1c3RvbVBhZ2luYXRvcicgaW4gdGhpcy5jaGFubmVsUXVlcnkpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFF1ZXJ5LmN1c3RvbVBhZ2luYXRvciA9IHRoaXMuX2N1c3RvbVBhZ2luYXRvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ2l2ZW4gYGNoYW5uZWxgIGFzIGFjdGl2ZSBhbmQgbWFya3MgaXQgYXMgcmVhZC5cbiAgICogSWYgdGhlIGNoYW5uZWwgd2Fzbid0IHByZXZpb3VzbHkgcGFydCBvZiB0aGUgY2hhbm5lbCwgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LlxuICAgKiBAcGFyYW0gY2hhbm5lbFxuICAgKi9cbiAgc2V0QXNBY3RpdmVDaGFubmVsKGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICB0aGlzLmNoYW5uZWxTd2l0Y2hTdGF0ZVN1YmplY3QubmV4dCgnc3RhcnQnKTtcbiAgICBjb25zdCBwcmV2QWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAocHJldkFjdGl2ZUNoYW5uZWw/LmNpZCA9PT0gY2hhbm5lbC5jaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdG9wV2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKHByZXZBY3RpdmVDaGFubmVsKTtcbiAgICB0aGlzLmZsdXNoTWFya1JlYWRRdWV1ZSgpO1xuICAgIHRoaXMuYXJlUmVhZEV2ZW50c1BhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNNZXNzYWdlTG9hZGluZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICBjb25zdCByZWFkU3RhdGUgPVxuICAgICAgY2hhbm5lbC5zdGF0ZS5yZWFkW3RoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyPy5pZCB8fCAnJ107XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTGFzdFJlYWRNZXNzYWdlSWQgPSByZWFkU3RhdGU/Lmxhc3RfcmVhZF9tZXNzYWdlX2lkO1xuICAgIGlmIChcbiAgICAgIGNoYW5uZWwuc3RhdGUubGF0ZXN0TWVzc2FnZXNbY2hhbm5lbC5zdGF0ZS5sYXRlc3RNZXNzYWdlcy5sZW5ndGggLSAxXVxuICAgICAgICA/LmlkID09PSB0aGlzLmFjdGl2ZUNoYW5uZWxMYXN0UmVhZE1lc3NhZ2VJZFxuICAgICkge1xuICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTGFzdFJlYWRNZXNzYWdlSWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFVucmVhZENvdW50ID0gcmVhZFN0YXRlPy51bnJlYWRfbWVzc2FnZXMgfHwgMDtcbiAgICB0aGlzLndhdGNoRm9yQWN0aXZlQ2hhbm5lbEV2ZW50cyhjaGFubmVsKTtcbiAgICB0aGlzLmFkZENoYW5uZWwoY2hhbm5lbCk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KGNoYW5uZWwpO1xuICAgIGNvbnN0IGNoYW5uZWxTdGF0ZUxlbmd0aCA9IGNoYW5uZWwuc3RhdGUubGF0ZXN0TWVzc2FnZXMubGVuZ3RoO1xuICAgIGlmIChjaGFubmVsU3RhdGVMZW5ndGggPiAyICogdGhpcy5tZXNzYWdlUGFnZVNpemUpIHtcbiAgICAgIGNoYW5uZWwuc3RhdGUubGF0ZXN0TWVzc2FnZXMgPSBjaGFubmVsLnN0YXRlLmxhdGVzdE1lc3NhZ2VzLnNsaWNlKFxuICAgICAgICBjaGFubmVsU3RhdGVMZW5ndGggLSAyICogdGhpcy5tZXNzYWdlUGFnZVNpemVcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuc2V0Q2hhbm5lbFN0YXRlKGNoYW5uZWwpO1xuICAgIHRoaXMuY2hhbm5lbFN3aXRjaFN0YXRlU3ViamVjdC5uZXh0KCdlbmQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgKGlmIGFueSkgY2hhbm5lbFxuICAgKi9cbiAgZGVzZWxlY3RBY3RpdmVDaGFubmVsKCkge1xuICAgIHRoaXMuY2hhbm5lbFN3aXRjaFN0YXRlU3ViamVjdC5uZXh0KCdzdGFydCcpO1xuICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKCFhY3RpdmVDaGFubmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RvcFdhdGNoRm9yQWN0aXZlQ2hhbm5lbEV2ZW50cyhhY3RpdmVDaGFubmVsKTtcbiAgICB0aGlzLmZsdXNoTWFya1JlYWRRdWV1ZSgpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdC5uZXh0KHt9KTtcbiAgICB0aGlzLnNlbGVjdE1lc3NhZ2VUb1F1b3RlKHVuZGVmaW5lZCk7XG4gICAgdGhpcy5qdW1wVG9NZXNzYWdlU3ViamVjdC5uZXh0KHsgaWQ6IHVuZGVmaW5lZCwgcGFyZW50SWQ6IHVuZGVmaW5lZCB9KTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxQaW5uZWRNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbFN1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxMYXN0UmVhZE1lc3NhZ2VJZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxVbnJlYWRDb3VudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFyZVJlYWRFdmVudHNQYXVzZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzTWVzc2FnZUxvYWRpbmdJblByb2dyZXNzID0gZmFsc2U7XG4gICAgdGhpcy5jaGFubmVsU3dpdGNoU3RhdGVTdWJqZWN0Lm5leHQoJ2VuZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGdpdmVuIGBtZXNzYWdlYCBhcyBhbiBhY3RpdmUgcGFyZW50IG1lc3NhZ2UuIElmIGB1bmRlZmluZWRgIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGRlbGVzZWxlY3QgdGhlIGN1cnJlbnQgcGFyZW50IG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqIEBwYXJhbSBsb2FkTWVzc2FnZXNGb3JtXG4gICAqL1xuICBhc3luYyBzZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZCxcbiAgICBsb2FkTWVzc2FnZXNGb3JtOiAncmVxdWVzdCcgfCAnc3RhdGUnID0gJ3JlcXVlc3QnXG4gICkge1xuICAgIGNvbnN0IG1lc3NhZ2VUb1F1b3RlID0gdGhpcy5tZXNzYWdlVG9RdW90ZVN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAobWVzc2FnZVRvUXVvdGUgJiYgISFtZXNzYWdlVG9RdW90ZS5wYXJlbnRfaWQpIHtcbiAgICAgIHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgICBjb25zdCBtZXNzYWdlVG9KdW1wVG8gPSB0aGlzLmp1bXBUb01lc3NhZ2VTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBpZiAobWVzc2FnZVRvSnVtcFRvICYmICEhbWVzc2FnZVRvSnVtcFRvLnBhcmVudElkKSB7XG4gICAgICAgIHRoaXMuanVtcFRvTWVzc2FnZVN1YmplY3QubmV4dCh7IGlkOiB1bmRlZmluZWQsIHBhcmVudElkOiB1bmRlZmluZWQgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KG1lc3NhZ2UuaWQpO1xuICAgICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgIGlmIChsb2FkTWVzc2FnZXNGb3JtID09PSAncmVxdWVzdCcpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWN0aXZlQ2hhbm5lbD8uZ2V0UmVwbGllcyhtZXNzYWdlLmlkLCB7XG4gICAgICAgICAgbGltaXQ6IHRoaXMubWVzc2FnZVBhZ2VTaXplLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChyZXN1bHQ/Lm1lc3NhZ2VzIHx8IFtdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgYWN0aXZlQ2hhbm5lbD8uc3RhdGUudGhyZWFkc1ttZXNzYWdlLmlkXSB8fCBbXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbmV4dCBwYWdlIG9mIG1lc3NhZ2VzIG9mIHRoZSBhY3RpdmUgY2hhbm5lbC4gVGhlIHBhZ2Ugc2l6ZSBjYW4gYmUgc2V0IGluIHRoZSBbcXVlcnkgb3B0aW9uXSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfY2hhbm5lbHMvI3F1ZXJ5LW9wdGlvbnMpIG9iamVjdC5cbiAgICogQHBhcmFtIGRpcmVjdGlvblxuICAgKi9cbiAgbG9hZE1vcmVNZXNzYWdlcyhkaXJlY3Rpb246ICdvbGRlcicgfCAnbmV3ZXInID0gJ29sZGVyJykge1xuICAgIGNvbnN0IGFjdGl2ZUNobmFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgbGFzdE1lc3NhZ2VJZCA9XG4gICAgICBtZXNzYWdlc1tkaXJlY3Rpb24gPT09ICdvbGRlcicgPyAwIDogbWVzc2FnZXMubGVuZ3RoIC0gMV0/LmlkO1xuICAgIGlmIChcbiAgICAgIGRpcmVjdGlvbiA9PT0gJ25ld2VyJyAmJlxuICAgICAgYWN0aXZlQ2huYW5uZWw/LnN0YXRlPy5sYXRlc3RNZXNzYWdlcyA9PT0gYWN0aXZlQ2huYW5uZWw/LnN0YXRlPy5tZXNzYWdlc1xuICAgICkge1xuICAgICAgLy8gSWYgd2UgYXJlIG9uIGxhdGVzdCBtZXNzYWdlIHNldCwgYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCB3aWxsIGJlIHJlZnJlc2hlZCBieSBXUyBldmVudHMsIG5vIG5lZWQgZm9yIGEgcmVxdWVzdFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gYWN0aXZlQ2huYW5uZWxcbiAgICAgID8ucXVlcnkoe1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgIGxpbWl0OiB0aGlzLm1lc3NhZ2VQYWdlU2l6ZSxcbiAgICAgICAgICBbZGlyZWN0aW9uID09PSAnb2xkZXInID8gJ2lkX2x0JyA6ICdpZF9ndCddOiBsYXN0TWVzc2FnZUlkLFxuICAgICAgICB9LFxuICAgICAgICBtZW1iZXJzOiB7IGxpbWl0OiAwIH0sXG4gICAgICAgIHdhdGNoZXJzOiB7IGxpbWl0OiAwIH0sXG4gICAgICB9KVxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYWN0aXZlQ2huYW5uZWw/LmRhdGE/LmlkID09PVxuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uZGF0YT8uaWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgLi4uYWN0aXZlQ2huYW5uZWwuc3RhdGUubWVzc2FnZXMsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIG5leHQgcGFnZSBvZiBtZXNzYWdlcyBvZiB0aGUgYWN0aXZlIHRocmVhZC4gVGhlIHBhZ2Ugc2l6ZSBjYW4gYmUgc2V0IGluIHRoZSBbcXVlcnkgb3B0aW9uXSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfY2hhbm5lbHMvI3F1ZXJ5LW9wdGlvbnMpIG9iamVjdC5cbiAgICogQHBhcmFtIGRpcmVjdGlvblxuICAgKi9cbiAgbG9hZE1vcmVUaHJlYWRSZXBsaWVzKGRpcmVjdGlvbjogJ29sZGVyJyB8ICduZXdlcicgPSAnb2xkZXInKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ25ld2VyJykge1xuICAgICAgLy8gVGhyZWFkIHJlcGxpZXMgYXJlbid0IGJyb2tlIGludG8gZGlmZmVyZW50IG1lc3NhZ2Ugc2V0cywgYWN0aXZlVGhyZWFkTWVzc2FnZXMkIHdpbGwgYmUgcmVmcmVzaGVkIGJ5IFdTIGV2ZW50cywgbm8gbmVlZCBmb3IgYSByZXF1ZXN0XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZUNobmFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHBhcmVudE1lc3NhZ2VJZCA9IHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghcGFyZW50TWVzc2FnZUlkIHx8ICFhY3RpdmVDaG5hbm5lbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0aHJlYWRNZXNzYWdlcyA9IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgbGFzdE1lc3NhZ2VJZCA9XG4gICAgICB0aHJlYWRNZXNzYWdlc1tkaXJlY3Rpb24gPT09ICdvbGRlcicgPyAwIDogdGhyZWFkTWVzc2FnZXMubGVuZ3RoIC0gMV0/LmlkO1xuICAgIHJldHVybiBhY3RpdmVDaG5hbm5lbFxuICAgICAgLmdldFJlcGxpZXMocGFyZW50TWVzc2FnZUlkLCB7XG4gICAgICAgIGxpbWl0OiB0aGlzLm1lc3NhZ2VQYWdlU2l6ZSxcbiAgICAgICAgW2RpcmVjdGlvbiA9PT0gJ29sZGVyJyA/ICdpZF9sdCcgOiAnaWRfZ3QnXTogbGFzdE1lc3NhZ2VJZCxcbiAgICAgIH0pXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgYWN0aXZlQ2huYW5uZWw/LnN0YXRlLnRocmVhZHNbcGFyZW50TWVzc2FnZUlkXSB8fCBbXVxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUXVlcmllcyB0aGUgY2hhbm5lbHMgd2l0aCB0aGUgZ2l2ZW4gZmlsdGVycywgc29ydHMgYW5kIG9wdGlvbnMuIE1vcmUgaW5mbyBhYm91dCBbY2hhbm5lbCBxdWVyeWluZ10oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLykgY2FuIGJlIGZvdW5kIGluIHRoZSBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uLiBCeSBkZWZhdWx0IHRoZSBmaXJzdCBjaGFubmVsIGluIHRoZSBsaXN0IHdpbGwgYmUgc2V0IGFzIGFjdGl2ZSBjaGFubmVsIGFuZCB3aWxsIGJlIG1hcmtlZCBhcyByZWFkLlxuICAgKiBAcGFyYW0gZmlsdGVyc1xuICAgKiBAcGFyYW0gc29ydFxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcGFyYW0gc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbCBEZWNpZGVzIGlmIHRoZSBmaXJzdCBjaGFubmVsIGluIHRoZSByZXN1bHQgc2hvdWxkIGJlIG1hZGUgYXMgYW4gYWN0aXZlIGNoYW5uZWwgb3Igbm90LlxuICAgKiBAcmV0dXJucyB0aGUgbGlzdCBvZiBjaGFubmVscyBmb3VuZCBieSB0aGUgcXVlcnlcbiAgICovXG4gIGluaXQoXG4gICAgZmlsdGVyczogQ2hhbm5lbEZpbHRlcnMsXG4gICAgc29ydD86IENoYW5uZWxTb3J0LFxuICAgIG9wdGlvbnM/OiBDaGFubmVsT3B0aW9ucyxcbiAgICBzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICB0aGlzLmNoYW5uZWxRdWVyeSA9IG5ldyBDaGFubmVsUXVlcnkoXG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLFxuICAgICAgdGhpcyxcbiAgICAgIGZpbHRlcnMsXG4gICAgICBzb3J0IHx8IHsgbGFzdF9tZXNzYWdlX2F0OiAtMSB9LFxuICAgICAge1xuICAgICAgICBsaW1pdDogMjUsXG4gICAgICAgIHN0YXRlOiB0cnVlLFxuICAgICAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICAgICAgd2F0Y2g6IHRydWUsXG4gICAgICAgIG1lc3NhZ2VfbGltaXQ6IHRoaXMubWVzc2FnZVBhZ2VTaXplLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5jaGFubmVsUXVlcnkuY3VzdG9tUGFnaW5hdG9yID0gdGhpcy5fY3VzdG9tUGFnaW5hdG9yO1xuXG4gICAgcmV0dXJuIHRoaXMuX2luaXQoe1xuICAgICAgc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbCxcbiAgICAgIG1lc3NhZ2VQYWdlU2l6ZTogb3B0aW9ucz8ubWVzc2FnZV9saW1pdCA/PyB0aGlzLm1lc3NhZ2VQYWdlU2l6ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyaWVzIHRoZSBjaGFubmVscyB3aXRoIHRoZSBnaXZlbiBxdWVyeSBmdW5jdGlvbi4gTW9yZSBpbmZvIGFib3V0IFtjaGFubmVsIHF1ZXJ5aW5nXSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfY2hhbm5lbHMvKSBjYW4gYmUgZm91bmQgaW4gdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb24uXG4gICAqIEBwYXJhbSBxdWVyeVxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG91bGRTZXRBY3RpdmVDaGFubmVsIFRoZSBgc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbGAgc3BlY2lmaWVzIGlmIHRoZSBmaXJzdCBjaGFubmVsIGluIHRoZSByZXN1bHQgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIHRoZSBhY3RpdmUgY2hhbm5lbCBvciBub3QuIERlZmF1bHQgaXMgYHRydWVgLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlUGFnZVNpemUgSG93IG1hbnkgbWVzc2FnZXMgc2hvdWxkIHdlIGxvYWQ/IFRoZSBkZWZhdWx0IGlzIDI1XG4gICAqIEByZXR1cm5zIHRoZSBjaGFubmVscyB0aGF0IHdlcmUgbG9hZGVkXG4gICAqL1xuICBpbml0V2l0aEN1c3RvbVF1ZXJ5KFxuICAgIHF1ZXJ5OiAocXVlcnlUeXBlOiBDaGFubmVsUXVlcnlUeXBlKSA9PiBQcm9taXNlPENoYW5uZWxRdWVyeVJlc3VsdD4sXG4gICAgb3B0aW9uczogeyBzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuOyBtZXNzYWdlUGFnZVNpemU6IG51bWJlciB9ID0ge1xuICAgICAgc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbDogdHJ1ZSxcbiAgICAgIG1lc3NhZ2VQYWdlU2l6ZTogdGhpcy5tZXNzYWdlUGFnZVNpemUsXG4gICAgfVxuICApIHtcbiAgICB0aGlzLmNoYW5uZWxRdWVyeSA9IHF1ZXJ5O1xuICAgIHJldHVybiB0aGlzLl9pbml0KG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYGFjdGl2ZUNoYW5uZWwkYCwgYGNoYW5uZWxzJGAgYW5kIGBhY3RpdmVDaGFubmVsTWVzc2FnZXMkYCBPYnNlcnZhYmxlcy4gVXNlZnVsIHdoZW4gZGlzY29ubmVjdGluZyBhIGNoYXQgdXNlciwgdXNlIGluIGNvbWJpbmF0aW9uIHdpdGggW2BkaXNjb25uZWN0VXNlcmBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvQ2hhdENsaWVudFNlcnZpY2UvI2Rpc2Nvbm5lY3R1c2VyLykuXG4gICAqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLmRlc2VsZWN0QWN0aXZlQ2hhbm5lbCgpO1xuICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmNoYW5uZWxRdWVyeVN0YXRlU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5jbGllbnRFdmVudHNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNtaXNzRXJyb3JOb3RpZmljYXRpb24/LigpO1xuICAgIHRoaXMuZGlzbWlzc0Vycm9yTm90aWZpY2F0aW9uID0gdW5kZWZpbmVkO1xuICAgIE9iamVjdC5rZXlzKHRoaXMuY2hhbm5lbFN1YnNjcmlwdGlvbnMpLmZvckVhY2goKGNpZCkgPT4ge1xuICAgICAgdGhpcy5jaGFubmVsU3Vic2NyaXB0aW9uc1tjaWRdKCk7XG4gICAgfSk7XG4gICAgdGhpcy5jaGFubmVsU3Vic2NyaXB0aW9ucyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBuZXh0IHBhZ2Ugb2YgY2hhbm5lbHMuIFRoZSBwYWdlIHNpemUgY2FuIGJlIHNldCBpbiB0aGUgW3F1ZXJ5IG9wdGlvbl0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLyNxdWVyeS1vcHRpb25zKSBvYmplY3QuXG4gICAqL1xuICBhc3luYyBsb2FkTW9yZUNoYW5uZWxzKCkge1xuICAgIGF3YWl0IHRoaXMucXVlcnlDaGFubmVscyhmYWxzZSwgJ25leHQtcGFnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZWFjdGlvbiB0byBhIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgVGhlIGlkIG9mIHRoZSBtZXNzYWdlIHRvIGFkZCB0aGUgcmVhY3Rpb24gdG9cbiAgICogQHBhcmFtIHJlYWN0aW9uVHlwZSBUaGUgdHlwZSBvZiB0aGUgcmVhY3Rpb25cbiAgICogQHBhcmFtIGN1c3RvbURhdGFcbiAgICovXG4gIGFzeW5jIGFkZFJlYWN0aW9uKFxuICAgIG1lc3NhZ2VJZDogc3RyaW5nLFxuICAgIHJlYWN0aW9uVHlwZTogTWVzc2FnZVJlYWN0aW9uVHlwZSxcbiAgICBjdXN0b21EYXRhPzogQ3VzdG9tUmVhY3Rpb25EYXRhXG4gICkge1xuICAgIGF3YWl0IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uc2VuZFJlYWN0aW9uKG1lc3NhZ2VJZCwge1xuICAgICAgdHlwZTogcmVhY3Rpb25UeXBlLFxuICAgICAgLi4uY3VzdG9tRGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcmVhY3Rpb24gZnJvbSBhIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgVGhlIGlkIG9mIHRoZSBtZXNzYWdlIHRvIHJlbW92ZSB0aGUgcmVhY3Rpb24gZnJvbVxuICAgKiBAcGFyYW0gcmVhY3Rpb25UeXBlIFRociB0eXBlIG9mIHJlYWN0aW9uIHRvIHJlbW92ZVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlUmVhY3Rpb24obWVzc2FnZUlkOiBzdHJpbmcsIHJlYWN0aW9uVHlwZTogTWVzc2FnZVJlYWN0aW9uVHlwZSkge1xuICAgIGF3YWl0IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3RcbiAgICAgIC5nZXRWYWx1ZSgpXG4gICAgICA/LmRlbGV0ZVJlYWN0aW9uKG1lc3NhZ2VJZCwgcmVhY3Rpb25UeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIGFjdGl2ZSBjaGFubmVsLiBUaGUgbWVzc2FnZSBpcyBpbW1lZGlhdGVseSBhZGRlZCB0byB0aGUgbWVzc2FnZSBsaXN0LCBpZiBhbiBlcnJvciBvY2N1cnMgYW5kIHRoZSBtZXNzYWdlIGNhbid0IGJlIHNlbnQsIHRoZSBlcnJvciBpcyBpbmRpY2F0ZWQgaW4gYHN0YXRlYCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIGF0dGFjaG1lbnRzIFRoZSBhdHRhY2htZW50c1xuICAgKiBAcGFyYW0gbWVudGlvbmVkVXNlcnMgTWVudGlvbmVkIHVzZXJzXG4gICAqIEBwYXJhbSBwYXJlbnRJZCBJZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UgKGlmIHNlbmRpbmcgYSB0aHJlYWQgcmVwbHkpXG4gICAqIEBwYXJhbSBxdW90ZWRNZXNzYWdlSWQgSWQgb2YgdGhlIG1lc3NhZ2UgdG8gcXVvdGUgKGlmIHNlbmRpbmcgYSBxdW90ZSByZXBseSlcbiAgICogQHBhcmFtIGN1c3RvbURhdGFcbiAgICogQHBhcmFtIHBvbGxJZCBJZCBvZiB0aGUgcG9sbCAoaWYgc2VuZGluZyBhIHBvbGwgbWVzc2FnZSlcbiAgICovXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBhdHRhY2htZW50czogQXR0YWNobWVudFtdID0gW10sXG4gICAgbWVudGlvbmVkVXNlcnM6IFVzZXJSZXNwb25zZVtdID0gW10sXG4gICAgcGFyZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBxdW90ZWRNZXNzYWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBjdXN0b21EYXRhOiB1bmRlZmluZWQgfCBDdXN0b21NZXNzYWdlRGF0YSA9IHVuZGVmaW5lZCxcbiAgICBwb2xsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICApIHtcbiAgICBsZXQgaW5wdXQ6IE1lc3NhZ2VJbnB1dCA9IHtcbiAgICAgIHRleHQsXG4gICAgICBhdHRhY2htZW50cyxcbiAgICAgIG1lbnRpb25lZFVzZXJzLFxuICAgICAgcGFyZW50SWQsXG4gICAgICBxdW90ZWRNZXNzYWdlSWQsXG4gICAgICBjdXN0b21EYXRhLFxuICAgICAgcG9sbElkLFxuICAgIH07XG4gICAgaWYgKHRoaXMuYmVmb3JlU2VuZE1lc3NhZ2UpIHtcbiAgICAgIGlucHV0ID0gYXdhaXQgdGhpcy5iZWZvcmVTZW5kTWVzc2FnZShpbnB1dCk7XG4gICAgfVxuICAgIGNvbnN0IHByZXZpZXcgPSBjcmVhdGVNZXNzYWdlUHJldmlldyhcbiAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyISxcbiAgICAgIGlucHV0LnRleHQsXG4gICAgICBpbnB1dC5hdHRhY2htZW50cyxcbiAgICAgIGlucHV0Lm1lbnRpb25lZFVzZXJzLFxuICAgICAgaW5wdXQucGFyZW50SWQsXG4gICAgICBpbnB1dC5xdW90ZWRNZXNzYWdlSWQsXG4gICAgICBpbnB1dC5jdXN0b21EYXRhLFxuICAgICAgaW5wdXQucG9sbElkXG4gICAgKTtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQocHJldmlldywgdHJ1ZSk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlUmVxdWVzdChwcmV2aWV3LCBpbnB1dC5jdXN0b21EYXRhKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVzZW5kcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gcmVzZW5kXG4gICAqL1xuICBhc3luYyByZXNlbmRNZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQoXG4gICAgICB7XG4gICAgICAgIC4uLihtZXNzYWdlIGFzIHVua25vd24gYXMgTWVzc2FnZVJlc3BvbnNlKSxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzdHJlYW0tY2hhdCBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyBwcm9wZXJ0eVxuICAgICAgICBlcnJvclN0YXR1c0NvZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiAnc2VuZGluZycsXG4gICAgICB9LFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2VSZXF1ZXN0KG1lc3NhZ2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgbWVzc2FnZSBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIG1lc3NhZ2UgTWVzYWdlIHRvIGJlIHVwZGF0ZWRcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU1lc3NhZ2UobWVzc2FnZTogU3RyZWFtTWVzc2FnZSkge1xuICAgIGxldCBtZXNzYWdlVG9VcGRhdGU6IFN0cmVhbU1lc3NhZ2UgPSB7XG4gICAgICAuLi5tZXNzYWdlLFxuICAgIH07XG4gICAgaWYgKG1lc3NhZ2VUb1VwZGF0ZS5xdW90ZWRfbWVzc2FnZSkge1xuICAgICAgbWVzc2FnZVRvVXBkYXRlLnF1b3RlZF9tZXNzYWdlID0ge1xuICAgICAgICAuLi5tZXNzYWdlVG9VcGRhdGUucXVvdGVkX21lc3NhZ2UsXG4gICAgICB9O1xuICAgIH1cbiAgICBkZWxldGUgbWVzc2FnZVRvVXBkYXRlLmkxOG47XG4gICAgaWYgKHRoaXMuYmVmb3JlVXBkYXRlTWVzc2FnZSkge1xuICAgICAgbWVzc2FnZVRvVXBkYXRlID0gYXdhaXQgdGhpcy5iZWZvcmVVcGRhdGVNZXNzYWdlKG1lc3NhZ2VUb1VwZGF0ZSk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlVG9VcGRhdGUucmVhZEJ5KSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoaXMgaXMgb25seSBhIHJ1biB0aW1lIHByb3BhcnR5IGZvciB0aGUgU0RLXG4gICAgICBkZWxldGUgbWVzc2FnZVRvVXBkYXRlLnJlYWRCeTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2VUb1VwZGF0ZS50cmFuc2xhdGlvbikge1xuICAgICAgZGVsZXRlIG1lc3NhZ2VUb1VwZGF0ZS50cmFuc2xhdGlvbjtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2VUb1VwZGF0ZS5xdW90ZWRfbWVzc2FnZT8udHJhbnNsYXRpb24pIHtcbiAgICAgIGRlbGV0ZSBtZXNzYWdlVG9VcGRhdGUucXVvdGVkX21lc3NhZ2UudHJhbnNsYXRpb247XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLm1vZGVyYXRpb25fZGV0YWlscykge1xuICAgICAgcmV0dXJuIHRoaXMucmVzZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXBkYXRlTWVzc2FnZShcbiAgICAgIG1lc3NhZ2VUb1VwZGF0ZSBhcyB1bmtub3duIGFzIExvY2FsTWVzc2FnZVxuICAgICk7XG5cbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGFubmVsc1N1YmplY3RcbiAgICAgIC5nZXRWYWx1ZSgpXG4gICAgICA/LmZpbmQoKGMpID0+IGMuY2lkID09PSBtZXNzYWdlLmNpZCk7XG5cbiAgICBpZiAoXG4gICAgICByZXNwb25zZS5tZXNzYWdlLnR5cGUgPT09ICdlcnJvcicgJiZcbiAgICAgIHJlc3BvbnNlLm1lc3NhZ2UubW9kZXJhdGlvbl9kZXRhaWxzXG4gICAgKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAnc3RyZWFtQ2hhdC5UaGlzIG1lc3NhZ2UgZGlkIG5vdCBtZWV0IG91ciBjb250ZW50IGd1aWRlbGluZXMnXG4gICAgICApO1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtVG9TdHJlYW1NZXNzYWdlKHJlc3BvbnNlLm1lc3NhZ2UsIGNoYW5uZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSB0byBiZSBkZWxldGVkXG4gICAqIEBwYXJhbSBpc0xvY2FsRGVsZXRlIHNldCB0aGlzIGB0cnVlYCBpZiB5b3Ugd2FudCB0byBkZWxldGUgYSBtZXNzYWdlIHRoYXQncyBvbmx5IHBhcnQgb2YgdGhlIGxvY2FsIHN0YXRlLCBub3QgeWV0IHNhdmVkIG9uIHRoZSBiYWNrZW5kXG4gICAqL1xuICBhc3luYyBkZWxldGVNZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UsIGlzTG9jYWxEZWxldGUgPSBmYWxzZSkge1xuICAgIGlmIChpc0xvY2FsRGVsZXRlICYmIHRoaXMuYWN0aXZlQ2hhbm5lbCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hY3RpdmVDaGFubmVsLnN0YXRlLnJlbW92ZU1lc3NhZ2Uoe1xuICAgICAgICBpZDogbWVzc2FnZS5pZCxcbiAgICAgICAgcGFyZW50X2lkOiBtZXNzYWdlLnBhcmVudF9pZCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBtZXNzYWdlLnBhcmVudF9pZFxuICAgICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsLnN0YXRlLnRocmVhZHNbbWVzc2FnZS5wYXJlbnRfaWRdXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsLnN0YXRlLm1lc3NhZ2VzXG4gICAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tZXNzYWdlRGVsZXRlQ29uZmlybWF0aW9uSGFuZGxlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5tZXNzYWdlRGVsZXRlQ29uZmlybWF0aW9uSGFuZGxlcihtZXNzYWdlKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmRlbGV0ZU1lc3NhZ2UobWVzc2FnZS5pZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC5kZWxldGVNZXNzYWdlKG1lc3NhZ2UuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWRzIGZpbGVzIHRvIHRoZSBjaGFubmVsLiBJZiB5b3Ugd2FudCB0byBrbm93IG1vcmUgYWJvdXQgW2ZpbGUgdXBsb2Fkc10oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2ZpbGVfdXBsb2Fkcy8pIGNoZWNrIG91dCB0aGUgcGxhdGZvcm0gZG9jdW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHVwbG9hZHMgdGhlIGF0dGFjaG1lbnRzIHRvIHVwbG9hZCAob3V0cHV0IG9mIHRoZSBbYEF0dGFjaG1lbnRTZXJ2aWNlYF0oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9BdHRhY2htZW50U2VydmljZS8pKVxuICAgKiBAcmV0dXJucyB0aGUgcmVzdWx0IG9mIGZpbGUgdXBsb2FkIHJlcXVlc3RzXG4gICAqL1xuICBhc3luYyB1cGxvYWRBdHRhY2htZW50cyhcbiAgICB1cGxvYWRzOiBBdHRhY2htZW50VXBsb2FkW11cbiAgKTogUHJvbWlzZTxBdHRhY2htZW50VXBsb2FkW10+IHtcbiAgICBjb25zdCByZXN1bHQ6IEF0dGFjaG1lbnRVcGxvYWRbXSA9IFtdO1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGNvbnN0IHVwbG9hZFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB1cGxvYWRzLm1hcCgodXBsb2FkKSA9PlxuICAgICAgICB1cGxvYWQudHlwZSA9PT0gJ2ltYWdlJ1xuICAgICAgICAgID8gdGhpcy5jdXN0b21JbWFnZVVwbG9hZFJlcXVlc3RcbiAgICAgICAgICAgID8gdGhpcy5jdXN0b21JbWFnZVVwbG9hZFJlcXVlc3QodXBsb2FkLmZpbGUsIGNoYW5uZWwpXG4gICAgICAgICAgICA6IGNoYW5uZWwuc2VuZEltYWdlKHVwbG9hZC5maWxlLCB1cGxvYWQuZmlsZS5uYW1lLCB1cGxvYWQuZmlsZS50eXBlKVxuICAgICAgICAgIDogdGhpcy5jdXN0b21GaWxlVXBsb2FkUmVxdWVzdFxuICAgICAgICAgID8gdGhpcy5jdXN0b21GaWxlVXBsb2FkUmVxdWVzdCh1cGxvYWQuZmlsZSwgY2hhbm5lbClcbiAgICAgICAgICA6IGNoYW5uZWwuc2VuZEZpbGUodXBsb2FkLmZpbGUsIHVwbG9hZC5maWxlLm5hbWUsIHVwbG9hZC5maWxlLnR5cGUpXG4gICAgICApXG4gICAgKTtcbiAgICB1cGxvYWRSZXN1bHRzLmZvckVhY2goKHVwbG9hZFJlc3VsdCwgaSkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IHVwbG9hZHNbaV0uZmlsZTtcbiAgICAgIGNvbnN0IHR5cGUgPSB1cGxvYWRzW2ldLnR5cGU7XG4gICAgICBpZiAodXBsb2FkUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBzdGF0ZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgIHVybDogdXBsb2FkUmVzdWx0LnZhbHVlLmZpbGUsXG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gICAgICAgICAgdGh1bWJfdXJsOiAodXBsb2FkUmVzdWx0LnZhbHVlIGFzIGFueSkudGh1bWJfdXJsLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZWFzb246IEF0dGFjaG1lbnRVcGxvYWRFcnJvclJlYXNvbiA9ICd1bmtub3duJztcbiAgICAgICAgbGV0IGV4dHJhRGF0YTogeyBwYXJhbTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQgKi9cbiAgICAgICAgY29uc3QgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gICAgICAgICAgdXBsb2FkUmVzdWx0LnJlYXNvbi5yZXNwb25zZT8uZGF0YT8ubWVzc2FnZTtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCAqL1xuICAgICAgICBjb25zdCBjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQgPVxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbiAgICAgICAgICB1cGxvYWRSZXN1bHQucmVhc29uLnJlc3BvbnNlPy5kYXRhPy5jb2RlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY29kZSA9PT0gMjIgfHxcbiAgICAgICAgICAoY29kZSA9PT0gNCAmJiBtZXNzYWdlPy50b0xvd2VyQ2FzZSgpPy5pbmNsdWRlcygnYnl0ZXMnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVhc29uID0gJ2ZpbGUtc2l6ZSc7XG4gICAgICAgICAgZXh0cmFEYXRhID0ge1xuICAgICAgICAgICAgcGFyYW06XG4gICAgICAgICAgICAgIC9cXGQrTUJ8XFxkK1xccz9ieXRlcy8uZXhlYyhtZXNzYWdlIHx8ICcnKT8uWzBdIHx8XG4gICAgICAgICAgICAgIGAke3RoaXMuYXR0YWNobWVudE1heFNpemVGYWxsYmFja0luTUJ9TUJgLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGV4dHJhRGF0YS5wYXJhbS5pbmNsdWRlcygnYnl0ZXMnKSkge1xuICAgICAgICAgICAgY29uc3QgbGltaXRJbkJ5dGVzID0gKyhcbiAgICAgICAgICAgICAgL1xcZCsvLmV4ZWMoZXh0cmFEYXRhLnBhcmFtKT8uWzBdIHx8XG4gICAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudE1heFNpemVGYWxsYmFja0luTUIgKiAxMDI0ICogMTAyNFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGV4dHJhRGF0YS5wYXJhbSA9IGAke2xpbWl0SW5CeXRlcyAvICgxMDI0ICogMTAyNCl9TUJgO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBjb2RlID09PSA0ICYmXG4gICAgICAgICAgbWVzc2FnZT8udG9Mb3dlckNhc2UoKT8uaW5jbHVkZXMoJ2ZpbGUgZXh0ZW5zaW9uJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVhc29uID0gJ2ZpbGUtZXh0ZW5zaW9uJztcbiAgICAgICAgICBleHRyYURhdGEgPSB7IHBhcmFtOiAvXFwuXFx3Ky8uZXhlYyhtZXNzYWdlKT8uWzBdIHx8ICcnIH07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBzdGF0ZTogJ2Vycm9yJyxcbiAgICAgICAgICBlcnJvclJlYXNvbjogcmVhc29uLFxuICAgICAgICAgIGVycm9yRXh0cmFJbmZvOiBleHRyYURhdGEgPyBbZXh0cmFEYXRhXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gdXBsb2FkZWQgZmlsZSBieSBVUkwuIElmIHlvdSB3YW50IHRvIGtub3cgbW9yZSBhYm91dCBbZmlsZSB1cGxvYWRzXSgvY2hhdC9kb2NzL2phdmFzY3JpcHQvZmlsZV91cGxvYWRzLykgY2hlY2sgb3V0IHRoZSBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uXG4gICAqIEBwYXJhbSBhdHRhY2htZW50VXBsb2FkIEF0dGFjaG1lbnQgdG8gYmUgZGVsZXRlZCAob3V0cHV0IG9mIHRoZSBbYEF0dGFjaG1lbnRTZXJ2aWNlYF0oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9BdHRhY2htZW50U2VydmljZS8pKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlQXR0YWNobWVudChhdHRhY2htZW50VXBsb2FkOiBBdHRhY2htZW50VXBsb2FkKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgYXdhaXQgKGF0dGFjaG1lbnRVcGxvYWQudHlwZSA9PT0gJ2ltYWdlJ1xuICAgICAgPyB0aGlzLmN1c3RvbUltYWdlRGVsZXRlUmVxdWVzdFxuICAgICAgICA/IHRoaXMuY3VzdG9tSW1hZ2VEZWxldGVSZXF1ZXN0KGF0dGFjaG1lbnRVcGxvYWQudXJsISwgY2hhbm5lbClcbiAgICAgICAgOiBjaGFubmVsLmRlbGV0ZUltYWdlKGF0dGFjaG1lbnRVcGxvYWQudXJsISlcbiAgICAgIDogdGhpcy5jdXN0b21GaWxlRGVsZXRlUmVxdWVzdFxuICAgICAgPyB0aGlzLmN1c3RvbUZpbGVEZWxldGVSZXF1ZXN0KGF0dGFjaG1lbnRVcGxvYWQudXJsISwgY2hhbm5lbClcbiAgICAgIDogY2hhbm5lbC5kZWxldGVGaWxlKGF0dGFjaG1lbnRVcGxvYWQudXJsISkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGF1dG9jb21wbGV0ZSBvcHRpb25zIGZvciBjdXJyZW50IGNoYW5uZWwgbWVtYmVycy4gSWYgdGhlIGNoYW5uZWwgaGFzIGxlc3MgdGhhbiAxMDAgbWVtYmVycywgaXQgcmV0dXJucyB0aGUgY2hhbm5lbCBtZW1iZXJzLCBvdGhlcndpc2Ugc2VuZHMgYSBbc2VhcmNoIHJlcXVlc3RdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC9xdWVyeV9tZW1iZXJzLyNwYWdpbmF0aW9uLWFuZC1vcmRlcmluZykgd2l0aCB0aGUgZ2l2ZW4gc2VhcmNoIHRlcm0uXG4gICAqIEBwYXJhbSBzZWFyY2hUZXJtIFRleHQgdG8gc2VhcmNoIGZvciBpbiB0aGUgbmFtZXMgb2YgbWVtYmVyc1xuICAgKiBAcmV0dXJucyBUaGUgbGlzdCBvZiBtZW1iZXJzIG1hdGNoaW5nIHRoZSBzZWFyY2ggZmlsdGVyXG4gICAqL1xuICBhc3luYyBhdXRvY29tcGxldGVNZW1iZXJzKHNlYXJjaFRlcm06IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKCFhY3RpdmVDaGFubmVsKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhhY3RpdmVDaGFubmVsLnN0YXRlLm1lbWJlcnMpLmxlbmd0aCA8IDEwMCkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoYWN0aXZlQ2hhbm5lbC5zdGF0ZS5tZW1iZXJzKS5maWx0ZXIoXG4gICAgICAgIChtKSA9PiBtLnVzZXI/LmlkICE9PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcklEIVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFzZWFyY2hUZXJtKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGl2ZUNoYW5uZWwucXVlcnlNZW1iZXJzKHtcbiAgICAgICAgbmFtZTogeyAkYXV0b2NvbXBsZXRlOiBzZWFyY2hUZXJtIH0sXG4gICAgICB9IGFzIE1lbWJlckZpbHRlcnMpOyAvLyBUT0RPOiBmaW5kIG91dCB3aHkgd2UgbmVlZCB0eXBlY2FzdCBoZXJlXG5cbiAgICAgIHJldHVybiByZXN1bHQubWVtYmVycy5maWx0ZXIoXG4gICAgICAgIChtKSA9PiBtLnVzZXJfaWQgIT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8udXNlcj8uaWRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFtSdW5zIGEgbWVzc2FnZSBhY3Rpb25dKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9yZXN0LyNtZXNzYWdlcy1ydW5tZXNzYWdlYWN0aW9uKSBpbiB0aGUgY3VycmVudCBjaGFubmVsLiBVcGRhdGVzIHRoZSBtZXNzYWdlIGxpc3QgYmFzZWQgb24gdGhlIGFjdGlvbiByZXN1bHQgKGlmIG5vIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIHRoZSBtZXNzYWdlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBtZXNzYWdlIGxpc3QpLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkXG4gICAqIEBwYXJhbSBmb3JtRGF0YVxuICAgKiBAcGFyYW0gcGFyZW50TWVzc2FnZUlkXG4gICAqL1xuICBhc3luYyBzZW5kQWN0aW9uKFxuICAgIG1lc3NhZ2VJZDogc3RyaW5nLFxuICAgIGZvcm1EYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIHBhcmVudE1lc3NhZ2VJZD86IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNoYW5uZWwuc2VuZEFjdGlvbihtZXNzYWdlSWQsIGZvcm1EYXRhKTtcbiAgICBpZiAocmVzcG9uc2U/Lm1lc3NhZ2UpIHtcbiAgICAgIGNoYW5uZWwuc3RhdGUuYWRkTWVzc2FnZVNvcnRlZCh7XG4gICAgICAgIC4uLnJlc3BvbnNlLm1lc3NhZ2UsXG4gICAgICAgIHN0YXR1czogJ3JlY2VpdmVkJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaXNUaHJlYWRSZXBseSA9ICEhcmVzcG9uc2UubWVzc2FnZS5wYXJlbnRfaWQ7XG4gICAgICBpc1RocmVhZFJlcGx5XG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbcmVzcG9uc2UubWVzc2FnZS5wYXJlbnRfaWQhXSxcbiAgICAgICAgICBdKVxuICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5uZWwuc3RhdGUucmVtb3ZlTWVzc2FnZSh7XG4gICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgIHBhcmVudF9pZDogcGFyZW50TWVzc2FnZUlkLFxuICAgICAgfSk7XG4gICAgICBpZiAocGFyZW50TWVzc2FnZUlkKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3RoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5nZXRWYWx1ZSgpIV1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgb3IgZGVzZWxlY3RzIHRoZSBjdXJyZW50IG1lc3NhZ2UgdG8gcXVvdGUgcmVwbHkgdG9cbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gc2VsZWN0LCBpZiBjYWxsZWQgd2l0aCBgdW5kZWZpbmVkYCwgaXQgZGVzZWxlY3RzIHRoZSBtZXNzYWdlXG4gICAqL1xuICBzZWxlY3RNZXNzYWdlVG9RdW90ZShtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkIHwgTWVzc2FnZVJlc3BvbnNlKSB7XG4gICAgaWYgKG1lc3NhZ2UgJiYgIXRoaXMuaXNTdHJlYW1NZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICBtZXNzYWdlID0gdGhpcy50cmFuc2Zvcm1Ub1N0cmVhbU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0Lm5leHQobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGNoYW5uZWwgdG8gdGhlIGNoYW5uZWwgbGlzdFxuICAgKiBUaGUgY2hhbm5lbCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNoYW5uZWwgbGlzdFxuICAgKiBAcGFyYW0gY2hhbm5lbFxuICAgKi9cbiAgYWRkQ2hhbm5lbChjaGFubmVsOiBDaGFubmVsKSB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWxzLmZpbmQoKGMpID0+IGMuY2lkID09PSBjaGFubmVsLmNpZCkpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoW2NoYW5uZWwsIC4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgICAgIHRoaXMud2F0Y2hGb3JDaGFubmVsRXZlbnRzKGNoYW5uZWwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY2lkXG4gICAqIEBwYXJhbSBzaG91bGRTdG9wV2F0Y2hpbmdcbiAgICovXG4gIHJlbW92ZUNoYW5uZWwoY2lkOiBzdHJpbmcsIHNob3VsZFN0b3BXYXRjaGluZyA9IHRydWUpIHtcbiAgICBjb25zdCByZW1haW5pbmdDaGFubmVscyA9IHRoaXMuY2hhbm5lbHMuZmlsdGVyKChjKSA9PiBjLmNpZCAhPT0gY2lkKTtcblxuICAgIGlmIChzaG91bGRTdG9wV2F0Y2hpbmcpIHtcbiAgICAgIGlmICh0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zW2NpZF0pIHtcbiAgICAgICAgdGhpcy5jaGFubmVsU3Vic2NyaXB0aW9uc1tjaWRdKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zLmNpZDtcbiAgICAgIH1cbiAgICAgIHZvaWQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmFjdGl2ZUNoYW5uZWxzW2NpZF1cbiAgICAgICAgPy5zdG9wV2F0Y2hpbmcoKVxuICAgICAgICAuY2F0Y2goKGVycikgPT5cbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQubG9nZ2VyKFxuICAgICAgICAgICAgJ3dhcm4nLFxuICAgICAgICAgICAgJ0ZhaWxlZCB0byB1bndhdGNoIGNoYW5uZWwnLFxuICAgICAgICAgICAgZXJyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZW1haW5pbmdDaGFubmVscy5sZW5ndGggPCB0aGlzLmNoYW5uZWxzLmxlbmd0aCkge1xuICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChyZW1haW5pbmdDaGFubmVscyk7XG4gICAgICBpZiAoY2lkID09PSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmNpZCkge1xuICAgICAgICBpZiAocmVtYWluaW5nQ2hhbm5lbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuc2V0QXNBY3RpdmVDaGFubmVsKHJlbWFpbmluZ0NoYW5uZWxzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZE1lc3NhZ2VSZXF1ZXN0KFxuICAgIHByZXZpZXc6IE1lc3NhZ2VSZXNwb25zZSB8IFN0cmVhbU1lc3NhZ2UsXG4gICAgY3VzdG9tRGF0YT86IEN1c3RvbU1lc3NhZ2VEYXRhLFxuICAgIGlzUmVzZW5kID0gZmFsc2VcbiAgKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY29uc3QgaXNUaHJlYWRSZXBseSA9ICEhcHJldmlldy5wYXJlbnRfaWQ7XG4gICAgaXNUaHJlYWRSZXBseVxuICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbcHJldmlldy5wYXJlbnRfaWQhXSxcbiAgICAgICAgXSlcbiAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaGFubmVsLnNlbmRNZXNzYWdlKHtcbiAgICAgICAgaWQ6IHByZXZpZXcuaWQsXG4gICAgICAgIHRleHQ6IHByZXZpZXcudGV4dCxcbiAgICAgICAgYXR0YWNobWVudHM6IHByZXZpZXcuYXR0YWNobWVudHMsXG4gICAgICAgIG1lbnRpb25lZF91c2VyczogcHJldmlldy5tZW50aW9uZWRfdXNlcnM/Lm1hcCgodSkgPT4gdS5pZCksXG4gICAgICAgIHBhcmVudF9pZDogcHJldmlldy5wYXJlbnRfaWQsXG4gICAgICAgIHF1b3RlZF9tZXNzYWdlX2lkOiBwcmV2aWV3LnF1b3RlZF9tZXNzYWdlX2lkLFxuICAgICAgICBwb2xsX2lkOiBwcmV2aWV3LnBvbGxfaWQsXG4gICAgICAgIC4uLmN1c3RvbURhdGEsXG4gICAgICB9IGFzIE1lc3NhZ2UpOyAvLyBUT0RPOiBmaW5kIG91dCB3aHkgd2UgbmVlZCB0eXBlY2FzdCBoZXJlXG4gICAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5yZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICAgIHN0YXR1czogJ3JlY2VpdmVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgIC4uLmNoYW5uZWwuc3RhdGUudGhyZWFkc1twcmV2aWV3LnBhcmVudF9pZCFdLFxuICAgICAgICAgIF0pXG4gICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICAgIGxldCBtZXNzYWdlcyE6IFN0cmVhbU1lc3NhZ2VbXTtcbiAgICAgIChpc1RocmVhZFJlcGx5ID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlcyQgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQpXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKG0pID0+IChtZXNzYWdlcyA9IG0pKTtcbiAgICAgIGNvbnN0IG5ld01lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgICAgIHJldHVybiBuZXdNZXNzYWdlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBzdHJpbmdFcnJvciA9IEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgICAgIGNvbnN0IHBhcnNlZEVycm9yOiB7XG4gICAgICAgIHN0YXR1cz86IG51bWJlcjtcbiAgICAgICAgY29kZT86IG51bWJlcjtcbiAgICAgICAgcmVzcG9uc2U/OiB7IGRhdGE/OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSB9O1xuICAgICAgfSA9IHN0cmluZ0Vycm9yID8gKEpTT04ucGFyc2Uoc3RyaW5nRXJyb3IpIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pIDoge307XG5cbiAgICAgIGxldCBpc0FscmVhZHlFeGlzdHMgPSBmYWxzZTtcbiAgICAgIGlmIChpc1Jlc2VuZCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcGFyc2VkRXJyb3Iuc3RhdHVzID09PSA0MDAgJiZcbiAgICAgICAgICBwYXJzZWRFcnJvci5jb2RlID09PSA0ICYmXG4gICAgICAgICAgcGFyc2VkRXJyb3I/LnJlc3BvbnNlPy5kYXRhPy5tZXNzYWdlPy5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICApIHtcbiAgICAgICAgICBpc0FscmVhZHlFeGlzdHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNoYW5uZWwuc3RhdGUuYWRkTWVzc2FnZVNvcnRlZChcbiAgICAgICAge1xuICAgICAgICAgIC4uLihwcmV2aWV3IGFzIE1lc3NhZ2VSZXNwb25zZSksXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzdHJlYW0tY2hhdCBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyBwcm9wZXJ0eVxuICAgICAgICAgIGVycm9yU3RhdHVzQ29kZTogaXNBbHJlYWR5RXhpc3RzXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBwYXJzZWRFcnJvci5zdGF0dXMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHN0YXR1czogaXNBbHJlYWR5RXhpc3RzID8gJ3JlY2VpdmVkJyA6ICdmYWlsZWQnLFxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgaXNUaHJlYWRSZXBseVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3ByZXZpZXcucGFyZW50X2lkIV0sXG4gICAgICAgICAgXSlcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgICAgbGV0IG1lc3NhZ2VzITogU3RyZWFtTWVzc2FnZVtdO1xuICAgICAgKGlzVGhyZWFkUmVwbHkgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzJCA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJClcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgobSkgPT4gKG1lc3NhZ2VzID0gbSkpO1xuICAgICAgY29uc3QgbmV3TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgcmV0dXJuIG5ld01lc3NhZ2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEp1bXBzIHRvIHRoZSBzZWxlY3RlZCBtZXNzYWdlIGluc2lkZSB0aGUgbWVzc2FnZSBsaXN0LCBpZiB0aGUgbWVzc2FnZSBpcyBub3QgeWV0IGxvYWRlZCwgaXQnbGwgbG9hZCB0aGUgbWVzc2FnZSAoYW5kIGl0J3Mgc3Vycm91bmRpbmdzKSBmcm9tIHRoZSBBUEkuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGxvYWRlZCwgJ2xhdGVzdCcgbWVhbnMganVtcCB0byB0aGUgbGF0ZXN0IG1lc3NhZ2VzXG4gICAqIEBwYXJhbSBwYXJlbnRNZXNzYWdlSWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbWVzc2FnZSBpZiB3ZSB3YW50IHRvIGxvYWQgYSB0aHJlYWQgbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMganVtcFRvTWVzc2FnZShtZXNzYWdlSWQ6IHN0cmluZywgcGFyZW50TWVzc2FnZUlkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5pc01lc3NhZ2VMb2FkaW5nSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWN0aXZlQ2hhbm5lbD8uc3RhdGUubG9hZE1lc3NhZ2VJbnRvU3RhdGUoXG4gICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgcGFyZW50TWVzc2FnZUlkXG4gICAgICApO1xuICAgICAgY29uc3QgbWVzc2FnZXMgPSBhY3RpdmVDaGFubmVsPy5zdGF0ZS5tZXNzYWdlcyB8fCBbXTtcbiAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgICAgaWYgKHBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgICBjb25zdCBwYXJlbnRNZXNzYWdlID0gbWVzc2FnZXMuZmluZCgobSkgPT4gbS5pZCA9PT0gcGFyZW50TWVzc2FnZUlkKTtcbiAgICAgICAgdm9pZCB0aGlzLnNldEFzQWN0aXZlUGFyZW50TWVzc2FnZShcbiAgICAgICAgICBwYXJlbnRNZXNzYWdlIGFzIFN0cmVhbU1lc3NhZ2UsXG4gICAgICAgICAgJ3N0YXRlJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5qdW1wVG9NZXNzYWdlU3ViamVjdC5uZXh0KHtcbiAgICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgcGFyZW50SWQ6IHBhcmVudE1lc3NhZ2VJZCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAnc3RyZWFtQ2hhdC5NZXNzYWdlIG5vdCBmb3VuZCdcbiAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc01lc3NhZ2VMb2FkaW5nSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtZXNzYWdlIHRvIGp1bXBcbiAgICovXG4gIGNsZWFyTWVzc2FnZUp1bXAoKSB7XG4gICAgdGhpcy5qdW1wVG9NZXNzYWdlU3ViamVjdC5uZXh0KHsgaWQ6IHVuZGVmaW5lZCwgcGFyZW50SWQ6IHVuZGVmaW5lZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSBnaXZlbiBtZXNzYWdlIGluIHRoZSBjaGFubmVsXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBwaW5NZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5waW5NZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgJ3N0cmVhbUNoYXQuTWVzc2FnZSBwaW5uZWQnLFxuICAgICAgICAnc3VjY2VzcydcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRUZW1wb3JhcnlOb3RpZmljYXRpb24oXG4gICAgICAgICdzdHJlYW1DaGF0LkVycm9yIHBpbm5pbmcgbWVzc2FnZSdcbiAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbWVzc2FnZSBmcm9tIHBpbm5lZCBtZXNzYWdlc1xuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgdW5waW5NZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51bnBpbk1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAnc3RyZWFtQ2hhdC5NZXNzYWdlIHVucGlubmVkJyxcbiAgICAgICAgJ3N1Y2Nlc3MnXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAnc3RyZWFtQ2hhdC5FcnJvciByZW1vdmluZyBtZXNzYWdlIHBpbidcbiAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5vdGlmaWNhdGlvbihjbGllbnRFdmVudDogQ2xpZW50RXZlbnQpIHtcbiAgICBzd2l0Y2ggKGNsaWVudEV2ZW50LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSAnY29ubmVjdGlvbi5yZWNvdmVyZWQnOiB7XG4gICAgICAgIHZvaWQgdGhpcy5uZ1pvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc1N0YXRlUmVjb3ZlcnlJblByb2dyZXNzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIElmIGNoYW5uZWwgbGlzdCBpcyBub3QgaW5pdGVkLCB3ZSBzZXQgdGhlIGFjdGl2ZSBjaGFubmVsXG4gICAgICAgICAgICBjb25zdCBzaG91bFNldEFjdGl2ZUNoYW5uZWwgPVxuICAgICAgICAgICAgICB0aGlzLnNob3VsZFNldEFjdGl2ZUNoYW5uZWwgJiZcbiAgICAgICAgICAgICAgIXRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVlcnlDaGFubmVscyhcbiAgICAgICAgICAgICAgc2hvdWxTZXRBY3RpdmVDaGFubmVsIHx8IGZhbHNlLFxuICAgICAgICAgICAgICAncmVjb3Zlci1zdGF0ZSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpKSB7XG4gICAgICAgICAgICAgIC8vIFRocmVhZCBtZXNzYWdlcyBhcmUgbm90IHJlZmV0Y2hlZCBzbyBhY3RpdmUgdGhyZWFkIGdldHMgZGVzZWxlY3RlZCB0byBhdm9pZCBkaXNwbGF5aW5nIHN0YWxlIG1lc3NhZ2VzXG4gICAgICAgICAgICAgIHZvaWQgdGhpcy5zZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIGFuZCByZXNlbGVjdCBtZXNzYWdlIHRvIHF1b3RlXG4gICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VUb1F1b3RlID0gdGhpcy5tZXNzYWdlVG9RdW90ZVN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgdGhpcy5zZXRDaGFubmVsU3RhdGUodGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpISk7XG4gICAgICAgICAgICAgIGxldCBtZXNzYWdlcyE6IFN0cmVhbU1lc3NhZ2VbXTtcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChtKSA9PiAobWVzc2FnZXMgPSBtKSk7XG4gICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRNZXNzYWdlVG9RdW90ZSA9IG1lc3NhZ2VzLmZpbmQoXG4gICAgICAgICAgICAgICAgKG0pID0+IG0uaWQgPT09IG1lc3NhZ2VUb1F1b3RlPy5pZFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAodXBkYXRlZE1lc3NhZ2VUb1F1b3RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RNZXNzYWdlVG9RdW90ZSh1cGRhdGVkTWVzc2FnZVRvUXVvdGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzU3RhdGVSZWNvdmVyeUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMuaXNTdGF0ZVJlY292ZXJ5SW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbm90aWZpY2F0aW9uLm1lc3NhZ2VfbmV3Jzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbU5ld01lc3NhZ2VOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbU5ld01lc3NhZ2VOb3RpZmljYXRpb25IYW5kbGVyKFxuICAgICAgICAgICAgICBjbGllbnRFdmVudCxcbiAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVOZXdNZXNzYWdlTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbi5hZGRlZF90b19jaGFubmVsJzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21BZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICAgIGNsaWVudEV2ZW50LFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbi5yZW1vdmVkX2Zyb21fY2hhbm5lbCc6IHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jdXN0b21SZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICAgIGNsaWVudEV2ZW50LFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbihjbGllbnRFdmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd1c2VyLnVwZGF0ZWQnOiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZENoYW5uZWxzID0gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKT8ubWFwKChjKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmFjdGl2ZUNoYW5uZWxzW2MuY2lkXSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmFjdGl2ZUNoYW5uZWxzW2MuY2lkXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQodXBkYXRlZENoYW5uZWxzKTtcbiAgICAgICAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgIGlmIChhY3RpdmVDaGFubmVsKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC5hY3RpdmVDaGFubmVsc1tcbiAgICAgICAgICAgICAgICBhY3RpdmVDaGFubmVsLmNpZFxuICAgICAgICAgICAgICBdIHx8IGFjdGl2ZUNoYW5uZWxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChcbiAgICAgICAgICAgICAgYWN0aXZlQ2hhbm5lbC5zdGF0ZS5tZXNzYWdlcy5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgICAgICAobSBhcyBTdHJlYW1NZXNzYWdlKS5yZWFkQnkgPSBnZXRSZWFkQnkobSwgYWN0aXZlQ2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4ubSB9O1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVBhcmVudE1lc3NhZ2UgPVxuICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGlmIChhY3RpdmVQYXJlbnRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYWN0aXZlQ2hhbm5lbC5zdGF0ZS50aHJlYWRzW2FjdGl2ZVBhcmVudE1lc3NhZ2VdO1xuICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgICAuLi4oYWN0aXZlQ2hhbm5lbC5zdGF0ZS5waW5uZWRNZXNzYWdlcyBhcyBTdHJlYW1NZXNzYWdlW10pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb24oY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50KSB7XG4gICAgY29uc3QgY2hhbm5lbElkVG9CZVJlbW92ZWQgPSBjbGllbnRFdmVudC5ldmVudC5jaGFubmVsIS5jaWQ7XG4gICAgdGhpcy5yZW1vdmVDaGFubmVsKGNoYW5uZWxJZFRvQmVSZW1vdmVkLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTmV3TWVzc2FnZU5vdGlmaWNhdGlvbihjbGllbnRFdmVudDogQ2xpZW50RXZlbnQpIHtcbiAgICBpZiAoY2xpZW50RXZlbnQuZXZlbnQuY2hhbm5lbCkge1xuICAgICAgdm9pZCB0aGlzLmFkZENoYW5uZWxGcm9tTm90aWZpY2F0aW9uKGNsaWVudEV2ZW50LmV2ZW50LmNoYW5uZWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQWRkZWRUb0NoYW5uZWxOb3RpZmljYXRpb24oY2xpZW50RXZlbnQ6IENsaWVudEV2ZW50KSB7XG4gICAgaWYgKGNsaWVudEV2ZW50LmV2ZW50LmNoYW5uZWwpIHtcbiAgICAgIHZvaWQgdGhpcy5hZGRDaGFubmVsRnJvbU5vdGlmaWNhdGlvbihjbGllbnRFdmVudC5ldmVudC5jaGFubmVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZENoYW5uZWxGcm9tTm90aWZpY2F0aW9uKGNoYW5uZWxSZXNwb25zZTogQ2hhbm5lbFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbmV3Q2hhbm5lbCA9IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC5jaGFubmVsKFxuICAgICAgY2hhbm5lbFJlc3BvbnNlLnR5cGUsXG4gICAgICBjaGFubmVsUmVzcG9uc2UuaWRcbiAgICApO1xuICAgIGxldCBjdXJyZW50Q2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICAgIGlmIChjdXJyZW50Q2hhbm5lbHMuZmluZCgoYykgPT4gYy5jaWQgPT09IG5ld0NoYW5uZWwuY2lkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBuZXdDaGFubmVsLndhdGNoKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LmxvZ2dlcihcbiAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgJ0ZhaWxlZCB0byBhZGQgY2hhbm5lbCB0byBjaGFubmVsIGxpc3QgYmVjYXVzZSB3YXRjaCByZXF1ZXN0IGZhaWxlZCcsXG4gICAgICAgIGVyciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjdXJyZW50Q2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICAgIGlmIChjdXJyZW50Q2hhbm5lbHMuZmluZCgoYykgPT4gYy5jaWQgPT09IG5ld0NoYW5uZWwuY2lkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLndhdGNoRm9yQ2hhbm5lbEV2ZW50cyhuZXdDaGFubmVsKTtcbiAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFtuZXdDaGFubmVsLCAuLi5jdXJyZW50Q2hhbm5lbHNdKTtcbiAgfVxuXG4gIHByaXZhdGUgd2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdtZXNzYWdlLm5ldycsIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGV2ZW50Lm1lc3NhZ2UgJiYgZXZlbnQubWVzc2FnZS5wYXJlbnRfaWRcbiAgICAgICAgICAgID8gZXZlbnQubWVzc2FnZS5wYXJlbnRfaWQgPT09XG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5nZXRWYWx1ZSgpXG4gICAgICAgICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbZXZlbnQubWVzc2FnZS5wYXJlbnRfaWRdLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgdGhpcy5tYXJrUmVhZChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUxhdGVzdE1lc3NhZ2VzKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbignbWVzc2FnZS51cGRhdGVkJywgKGV2ZW50KSA9PiB0aGlzLm1lc3NhZ2VVcGRhdGVkKGV2ZW50KSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UuZGVsZXRlZCcsIChldmVudCkgPT4gdGhpcy5tZXNzYWdlVXBkYXRlZChldmVudCkpXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdyZWFjdGlvbi5uZXcnLCAoZSkgPT4gdGhpcy5tZXNzYWdlUmVhY3Rpb25FdmVudFJlY2VpdmVkKGUpKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbigncmVhY3Rpb24uZGVsZXRlZCcsIChlKSA9PlxuICAgICAgICB0aGlzLm1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3JlYWN0aW9uLnVwZGF0ZWQnLCAoZSkgPT5cbiAgICAgICAgdGhpcy5tZXNzYWdlUmVhY3Rpb25FdmVudFJlY2VpdmVkKGUpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdtZXNzYWdlLnJlYWQnLCAoZSkgPT4ge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGxldCBsYXRlc3RNZXNzYWdlITogU3RyZWFtTWVzc2FnZTtcbiAgICAgICAgICBsZXQgbWVzc2FnZXMhOiBTdHJlYW1NZXNzYWdlW107XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChtKSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlcyA9IG07XG4gICAgICAgICAgICBsYXRlc3RNZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFsYXRlc3RNZXNzYWdlIHx8ICFlLnVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGxhdGVzdE1lc3NhZ2UucmVhZEJ5KSB7XG4gICAgICAgICAgICBsYXRlc3RNZXNzYWdlLnJlYWRCeS5zcGxpY2UoMCwgbGF0ZXN0TWVzc2FnZS5yZWFkQnkubGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGF0ZXN0TWVzc2FnZS5yZWFkQnkgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGF0ZXN0TWVzc2FnZS5yZWFkQnkucHVzaCguLi5nZXRSZWFkQnkobGF0ZXN0TWVzc2FnZSwgY2hhbm5lbCkpO1xuICAgICAgICAgIG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdID0geyAuLi5sYXRlc3RNZXNzYWdlIH07XG5cbiAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5ldmVudHMkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ25vdGlmaWNhdGlvbi5tYXJrX3VucmVhZCcgJiZcbiAgICAgICAgICAgICAgZS5ldmVudC5jaGFubmVsX2lkID09PSBjaGFubmVsLmlkXG4gICAgICAgICAgKSxcbiAgICAgICAgICBtYXAoKGUpID0+IGUuZXZlbnQpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxMYXN0UmVhZE1lc3NhZ2VJZCA9IGUubGFzdF9yZWFkX21lc3NhZ2VfaWQ7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxVbnJlYWRDb3VudCA9IGUudW5yZWFkX21lc3NhZ2VzO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KHRoaXMuYWN0aXZlQ2hhbm5lbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCd0eXBpbmcuc3RhcnQnLCAoZSkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlVHlwaW5nU3RhcnRFdmVudChlKSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3R5cGluZy5zdG9wJywgKGUpID0+XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmhhbmRsZVR5cGluZ1N0b3BFdmVudChlKSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgaWYgdXNlciBzdGFydGVkIHR5cGluZyBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UsIGlmIHVzZXIgaXMgdHlwaW5nIGluIGEgdGhyZWFkXG4gICAqL1xuICBhc3luYyB0eXBpbmdTdGFydGVkKHBhcmVudElkPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBhd2FpdCBhY3RpdmVDaGFubmVsPy5rZXlzdHJva2UocGFyZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgaWYgdXNlciBzdG9wcGVkIHR5cGluZyBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UsIGlmIHVzZXIgd2VyZSB0eXBpbmcgaW4gYSB0aHJlYWRcbiAgICovXG4gIGFzeW5jIHR5cGluZ1N0b3BwZWQocGFyZW50SWQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGF3YWl0IGFjdGl2ZUNoYW5uZWw/LnN0b3BUeXBpbmcocGFyZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGxpc3Qgb2YgY2hhbm5lbHNcbiAgICovXG4gIGdldCBjaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBhY3RpdmUgY2hhbm5lbFxuICAgKi9cbiAgZ2V0IGFjdGl2ZUNoYW5uZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgYWN0aXZlIGNoYW5uZWwgbWVzc2FnZXNcbiAgICovXG4gIGdldCBhY3RpdmVDaGFubmVsTWVzc2FnZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHRocmVhZCByZXBsaWVzXG4gICAqL1xuICBnZXQgYWN0aXZlQ2hhbm5lbFRocmVhZFJlcGxpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKCkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXN0IDEyMDAgcmVhY3Rpb25zIG9mIGEgbWVzc2FnZSBpbiB0aGUgY3VycmVudCBhY3RpdmUgY2hhbm5lbC4gSWYgeW91IG5lZWQgdG8gZmV0Y2ggbW9yZSByZWFjdGlvbnMgcGxlYXNlIHVzZSB0aGUgW2ZvbGxvd2luZyBlbmRwb2ludF0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3NlbmRfcmVhY3Rpb24vI3BhZ2luYXRpbmctcmVhY3Rpb25zKS5cbiAgICogQGRlcHJlY2F0ZWQgdXNlIFtgbWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UucXVlcnlSZWFjdGlvbnMoKWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvTWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UvI3F1ZXJ5cmVhY3Rpb25zKSBpbnN0ZWFkXG4gICAqIEBwYXJhbSBtZXNzYWdlSWRcbiAgICogQHJldHVybnMgYWxsIHJlYWN0aW9ucyBvZiBhIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIGdldE1lc3NhZ2VSZWFjdGlvbnMobWVzc2FnZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWFjdGlvbnM6IFJlYWN0aW9uUmVzcG9uc2VbXSA9IFtdO1xuICAgIGNvbnN0IGxpbWl0ID0gMzAwO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGNvbnN0IHJlYWN0aW9uc0xpbWl0ID0gQ2hhbm5lbFNlcnZpY2UuTUFYX01FU1NBR0VfUkVBQ1RJT05TX1RPX0ZFVENIO1xuICAgIGxldCBsYXN0UGFnZVNpemUgPSBsaW1pdDtcblxuICAgIHdoaWxlIChsYXN0UGFnZVNpemUgPT09IGxpbWl0ICYmIHJlYWN0aW9ucy5sZW5ndGggPCByZWFjdGlvbnNMaW1pdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFjdGl2ZUNoYW5uZWw/LmdldFJlYWN0aW9ucyhtZXNzYWdlSWQsIHtcbiAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgbGltaXQsXG4gICAgICAgIH0pO1xuICAgICAgICBsYXN0UGFnZVNpemUgPSByZXNwb25zZT8ucmVhY3Rpb25zPy5sZW5ndGggfHwgMDtcbiAgICAgICAgaWYgKGxhc3RQYWdlU2l6ZSA+IDApIHtcbiAgICAgICAgICByZWFjdGlvbnMucHVzaCguLi5yZXNwb25zZSEucmVhY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBvZmZzZXQgKz0gbGFzdFBhZ2VTaXplO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICdzdHJlYW1DaGF0LkVycm9yIGxvYWRpbmcgcmVhY3Rpb25zJ1xuICAgICAgICApO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVhY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIHRoZSBjaGFubmVsIGZyb20gdGhlIGdpdmVuIG1lc3NhZ2UgYXMgdW5yZWFkXG4gICAqIEBwYXJhbSBtZXNzYWdlSWRcbiAgICogQHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgcmVxdWVzdFxuICAgKi9cbiAgYXN5bmMgbWFya01lc3NhZ2VVbnJlYWQobWVzc2FnZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlQ2hhbm5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYWN0aXZlQ2hhbm5lbC5tYXJrVW5yZWFkKHtcbiAgICAgICAgbWVzc2FnZV9pZDogbWVzc2FnZUlkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmFyZVJlYWRFdmVudHNQYXVzZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnN0IGVycm9yOiB7XG4gICAgICAgIHJlc3BvbnNlPzoge1xuICAgICAgICAgIGRhdGE/OiB7IGNvZGU/OiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmc7IFN0YXR1c0NvZGU/OiBudW1iZXIgfTtcbiAgICAgICAgfTtcbiAgICAgIH0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKSBhcyB7XG4gICAgICAgIHJlc3BvbnNlPzoge1xuICAgICAgICAgIGRhdGE/OiB7IGNvZGU/OiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmc7IFN0YXR1c0NvZGU/OiBudW1iZXIgfTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkYXRhID0gZXJyb3I/LnJlc3BvbnNlPy5kYXRhO1xuICAgICAgaWYgKFxuICAgICAgICBkYXRhICYmXG4gICAgICAgIGRhdGEuY29kZSA9PT0gNCAmJlxuICAgICAgICBkYXRhLlN0YXR1c0NvZGUgPT09IDQwMCAmJlxuICAgICAgICBkYXRhLm1lc3NhZ2U/LmluY2x1ZGVzKCdpdCBpcyBvbGRlciB0aGFuIGxhc3QnKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gL1xcZCsgY2hhbm5lbCBtZXNzYWdlcy9cbiAgICAgICAgICAuZXhlYyhkYXRhLm1lc3NhZ2UpPy5bMF1cbiAgICAgICAgICAubWF0Y2goL1xcZCsvKT8uWzBdO1xuICAgICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkVGVtcG9yYXJ5Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgJ3N0cmVhbUNoYXQuRXJyb3IsIG9ubHkgdGhlIGZpcnN0IHt7Y291bnR9fSBtZXNzYWdlIGNhbiBiZSBtYXJrZWQgYXMgdW5yZWFkJyxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHsgY291bnQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFRlbXBvcmFyeU5vdGlmaWNhdGlvbihcbiAgICAgICAgJ3N0cmVhbUNoYXQuRXJyb3IgbWFya2luZyBtZXNzYWdlIGFzIHVucmVhZCdcbiAgICAgICk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWVzc2FnZVVwZGF0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGlzVGhyZWFkUmVwbHkgPSBldmVudC5tZXNzYWdlICYmIGV2ZW50Lm1lc3NhZ2UucGFyZW50X2lkO1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgIGlmICghY2hhbm5lbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBHZXQgbWVzc2FnZXMgZnJvbSBzdGF0ZSBhcyBtZXNzYWdlIG9yZGVyIGNvdWxkIGNoYW5nZSwgYW5kIG1lc3NhZ2UgY291bGQndmUgYmVlbiBkZWxldGVkXG4gICAgICBjb25zdCBtZXNzYWdlczogRm9ybWF0TWVzc2FnZVJlc3BvbnNlW10gPSBpc1RocmVhZFJlcGx5XG4gICAgICAgID8gY2hhbm5lbC5zdGF0ZS50aHJlYWRzW2V2ZW50Py5tZXNzYWdlPy5wYXJlbnRfaWQgfHwgJyddXG4gICAgICAgIDogY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcztcbiAgICAgIGlmICghbWVzc2FnZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZUluZGV4ID0gbWVzc2FnZXMuZmluZEluZGV4KFxuICAgICAgICAobSkgPT4gbS5pZCA9PT0gZXZlbnQ/Lm1lc3NhZ2U/LmlkXG4gICAgICApO1xuICAgICAgaWYgKG1lc3NhZ2VJbmRleCAhPT0gLTEgfHwgZXZlbnQudHlwZSA9PT0gJ21lc3NhZ2UuZGVsZXRlZCcpIHtcbiAgICAgICAgaXNUaHJlYWRSZXBseVxuICAgICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKVxuICAgICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLm1lc3NhZ2VzXSk7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFBpbm5lZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAuLi4oY2hhbm5lbC5zdGF0ZS5waW5uZWRNZXNzYWdlcyBhcyBTdHJlYW1NZXNzYWdlW10pLFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWVzc2FnZVJlYWN0aW9uRXZlbnRSZWNlaXZlZChlOiBFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICBjb25zdCBpc1RocmVhZE1lc3NhZ2UgPSBlLm1lc3NhZ2UgJiYgZS5tZXNzYWdlLnBhcmVudF9pZDtcbiAgICAgIGxldCBtZXNzYWdlcyE6IFN0cmVhbU1lc3NhZ2VbXTtcbiAgICAgIChpc1RocmVhZE1lc3NhZ2VcbiAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzJFxuICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJFxuICAgICAgKVxuICAgICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgICAuc3Vic2NyaWJlKChtKSA9PiAobWVzc2FnZXMgPSBtKSk7XG4gICAgICBjb25zdCBtZXNzYWdlSW5kZXggPSBtZXNzYWdlcy5maW5kSW5kZXgoKG0pID0+IG0uaWQgPT09IGU/Lm1lc3NhZ2U/LmlkKTtcbiAgICAgIGlmIChtZXNzYWdlSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlSW5kZXhdO1xuICAgICAgbWVzc2FnZS5yZWFjdGlvbl9jb3VudHMgPSB7IC4uLmUubWVzc2FnZT8ucmVhY3Rpb25fY291bnRzIH07XG4gICAgICBtZXNzYWdlLnJlYWN0aW9uX3Njb3JlcyA9IHsgLi4uZS5tZXNzYWdlPy5yZWFjdGlvbl9zY29yZXMgfTtcbiAgICAgIG1lc3NhZ2UubGF0ZXN0X3JlYWN0aW9ucyA9IFsuLi4oZS5tZXNzYWdlPy5sYXRlc3RfcmVhY3Rpb25zIHx8IFtdKV07XG4gICAgICBtZXNzYWdlLm93bl9yZWFjdGlvbnMgPSBbLi4uKGUubWVzc2FnZT8ub3duX3JlYWN0aW9ucyB8fCBbXSldO1xuICAgICAgbWVzc2FnZS5yZWFjdGlvbl9ncm91cHMgPSB7IC4uLmUubWVzc2FnZT8ucmVhY3Rpb25fZ3JvdXBzIH07XG5cbiAgICAgIG1lc3NhZ2VzW21lc3NhZ2VJbmRleF0gPSB7IC4uLm1lc3NhZ2UgfTtcbiAgICAgIGlzVGhyZWFkTWVzc2FnZVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLm1lc3NhZ2VzXSlcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TWVzc2FnZShtZXNzYWdlOiBNZXNzYWdlUmVzcG9uc2UpIHtcbiAgICBjb25zdCBtID0gbWVzc2FnZSBhcyB1bmtub3duIGFzIEZvcm1hdE1lc3NhZ2VSZXNwb25zZTtcbiAgICBtLnBpbm5lZF9hdCA9IG1lc3NhZ2UucGlubmVkX2F0ID8gbmV3IERhdGUobWVzc2FnZS5waW5uZWRfYXQpIDogbnVsbDtcbiAgICBtLmNyZWF0ZWRfYXQgPSBtZXNzYWdlLmNyZWF0ZWRfYXRcbiAgICAgID8gbmV3IERhdGUobWVzc2FnZS5jcmVhdGVkX2F0KVxuICAgICAgOiBuZXcgRGF0ZSgpO1xuICAgIG0udXBkYXRlZF9hdCA9IG1lc3NhZ2UudXBkYXRlZF9hdFxuICAgICAgPyBuZXcgRGF0ZShtZXNzYWdlLnVwZGF0ZWRfYXQpXG4gICAgICA6IG5ldyBEYXRlKCk7XG4gICAgbWVzc2FnZS5zdGF0dXMgPSBtZXNzYWdlLnN0YXR1cyB8fCAncmVjZWl2ZWQnO1xuXG4gICAgcmV0dXJuIG07XG4gIH1cblxuICBwcml2YXRlIGlzU3RyZWFtTWVzc2FnZShcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlIHwgTWVzc2FnZVJlc3BvbnNlXG4gICk6IG1lc3NhZ2UgaXMgU3RyZWFtTWVzc2FnZSB7XG4gICAgcmV0dXJuICdyZWFkQnknIGluIG1lc3NhZ2U7XG4gIH1cblxuICBwcml2YXRlIGlzRm9ybWF0TWVzc2FnZVJlc3BvbnNlKFxuICAgIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCBGb3JtYXRNZXNzYWdlUmVzcG9uc2UgfCBNZXNzYWdlUmVzcG9uc2VcbiAgKTogbWVzc2FnZSBpcyBGb3JtYXRNZXNzYWdlUmVzcG9uc2Uge1xuICAgIHJldHVybiBtZXNzYWdlLmNyZWF0ZWRfYXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wV2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKGNoYW5uZWw6IENoYW5uZWwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcXVlcnlDaGFubmVscyhcbiAgICBzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuLFxuICAgIHF1ZXJ5VHlwZTogQ2hhbm5lbFF1ZXJ5VHlwZVxuICApIHtcbiAgICBpZiAoIXRoaXMuY2hhbm5lbFF1ZXJ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdRdWVyeSBjaGFubmVscyBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBDaGFubmVsUXVlcnkgaW5zdGFuY2UnXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5jaGFubmVsUXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiAnaW4tcHJvZ3Jlc3MnIH0pO1xuXG4gICAgICBjb25zdCB7IGNoYW5uZWxzLCBoYXNNb3JlUGFnZSB9ID0gYXdhaXQgKCdxdWVyeScgaW4gdGhpcy5jaGFubmVsUXVlcnlcbiAgICAgICAgPyB0aGlzLmNoYW5uZWxRdWVyeS5xdWVyeShxdWVyeVR5cGUpXG4gICAgICAgIDogdGhpcy5jaGFubmVsUXVlcnkocXVlcnlUeXBlKSk7XG4gICAgICBjb25zdCBmaWx0ZXJlZENoYW5uZWxzID0gY2hhbm5lbHMuZmlsdGVyKFxuICAgICAgICAoY2hhbm5lbCwgaW5kZXgpID0+XG4gICAgICAgICAgIWNoYW5uZWxzLnNsaWNlKDAsIGluZGV4KS5maW5kKChjKSA9PiBjLmNpZCA9PT0gY2hhbm5lbC5jaWQpXG4gICAgICApO1xuICAgICAgZmlsdGVyZWRDaGFubmVscy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5jaGFubmVsU3Vic2NyaXB0aW9uc1tjLmNpZF0pIHtcbiAgICAgICAgICB0aGlzLndhdGNoRm9yQ2hhbm5lbEV2ZW50cyhjKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoZmlsdGVyZWRDaGFubmVscyk7XG4gICAgICBjb25zdCBjdXJyZW50QWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgIGlmIChcbiAgICAgICAgY3VycmVudEFjdGl2ZUNoYW5uZWwgJiZcbiAgICAgICAgIWZpbHRlcmVkQ2hhbm5lbHMuZmluZCgoYykgPT4gYy5jaWQgPT09IGN1cnJlbnRBY3RpdmVDaGFubmVsPy5jaWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kZXNlbGVjdEFjdGl2ZUNoYW5uZWwoKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGZpbHRlcmVkQ2hhbm5lbHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAhY3VycmVudEFjdGl2ZUNoYW5uZWwgJiZcbiAgICAgICAgc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2V0QXNBY3RpdmVDaGFubmVsKGZpbHRlcmVkQ2hhbm5lbHNbMF0pO1xuICAgICAgfVxuICAgICAgdGhpcy5oYXNNb3JlQ2hhbm5lbHNTdWJqZWN0Lm5leHQoaGFzTW9yZVBhZ2UpO1xuICAgICAgdGhpcy5jaGFubmVsUXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiAnc3VjY2VzcycgfSk7XG4gICAgICB0aGlzLmRpc21pc3NFcnJvck5vdGlmaWNhdGlvbj8uKCk7XG4gICAgICByZXR1cm4gY2hhbm5lbHM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFF1ZXJ5U3RhdGVTdWJqZWN0Lm5leHQoe1xuICAgICAgICBzdGF0ZTogJ2Vycm9yJyxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckNoYW5uZWxFdmVudHMoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGlmICh0aGlzLmNoYW5uZWxTdWJzY3JpcHRpb25zW2NoYW5uZWwuY2lkXSkge1xuICAgICAgdGhpcy5jaGFubmVsU3Vic2NyaXB0aW9uc1tjaGFubmVsLmNpZF0oKTtcbiAgICB9XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBjaGFubmVsLm9uKChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgIGNvbnN0IHR5cGUgPSBldmVudC50eXBlIGFzIEV2ZW50VHlwZXMgfCAnY2FwYWJpbGl0aWVzLmNoYW5nZWQnO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ21lc3NhZ2UubmV3Jzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21OZXdNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbU5ld01lc3NhZ2VIYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlTmV3TWVzc2FnZShldmVudCwgY2hhbm5lbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC5oaWRkZW4nOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxIaWRkZW5IYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhbm5lbEhpZGRlbkhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsSGlkZGVuKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLmRlbGV0ZWQnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxEZWxldGVkSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxEZWxldGVkSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxEZWxldGVkKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLnZpc2libGUnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxWaXNpYmxlSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxWaXNpYmxlSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxWaXNpYmxlKGV2ZW50LCBjaGFubmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLnVwZGF0ZWQnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxVcGRhdGVkSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxVcGRhdGVkSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxVcGRhdGUoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoYW5uZWwudHJ1bmNhdGVkJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsVHJ1bmNhdGVkSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxUcnVuY2F0ZWRIYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbm5lbFRydW5jYXRlKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjYXBhYmlsaXRpZXMuY2hhbmdlZCc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2lkID0gZXZlbnQuY2lkO1xuICAgICAgICAgICAgaWYgKGNpZCkge1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRDaGFubmVscz8uZmluZEluZGV4KChjKSA9PiBjLmNpZCA9PT0gY2lkKTtcbiAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSAmJiBpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbLi4uY3VycmVudENoYW5uZWxzIV0pO1xuICAgICAgICAgICAgICAgIGlmIChjaWQgPT09IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uY2lkKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY2hhbm5lbFN1YnNjcmlwdGlvbnNbY2hhbm5lbC5jaWRdID0gdW5zdWJzY3JpYmUudW5zdWJzY3JpYmU7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5ld01lc3NhZ2UoXzogRXZlbnQsIGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICBjb25zdCBjaGFubmVsSW5kZXggPSB0aGlzLmNoYW5uZWxzLmZpbmRJbmRleCgoYykgPT4gYy5jaWQgPT09IGNoYW5uZWwuY2lkKTtcbiAgICB0aGlzLmNoYW5uZWxzLnNwbGljZShjaGFubmVsSW5kZXgsIDEpO1xuICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoW2NoYW5uZWwsIC4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbEhpZGRlbihldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnJlbW92ZUNoYW5uZWwoZXZlbnQuY2hhbm5lbCEuY2lkLCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxEZWxldGVkKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMucmVtb3ZlQ2hhbm5lbChldmVudC5jaGFubmVsIS5jaWQsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbFZpc2libGUoZXZlbnQ6IEV2ZW50LCBjaGFubmVsOiBDaGFubmVsKSB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWxzLmZpbmQoKGMpID0+IGMuY2lkID09PSBldmVudC5jaWQpKSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT5cbiAgICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbLi4udGhpcy5jaGFubmVscywgY2hhbm5lbF0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbFVwZGF0ZShldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBjaGFubmVsSW5kZXggPSB0aGlzLmNoYW5uZWxzLmZpbmRJbmRleChcbiAgICAgIChjKSA9PiBjLmNpZCA9PT0gZXZlbnQuY2hhbm5lbCEuY2lkXG4gICAgKTtcbiAgICBpZiAoY2hhbm5lbEluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHNbY2hhbm5lbEluZGV4XTtcbiAgICAgIGNvbnN0IG5vdEluY2x1ZGVkUHJvcGVyaWVzID0ge1xuICAgICAgICBoaWRkZW46IGNoYW5uZWwuZGF0YT8uaGlkZGVuIHx8IGZhbHNlLFxuICAgICAgICBvd25fY2FwYWJpbGl0aWVzOiBjaGFubmVsLmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgfHwgW10sXG4gICAgICB9O1xuICAgICAgY2hhbm5lbC5kYXRhID0ge1xuICAgICAgICAuLi5ldmVudC5jaGFubmVsISxcbiAgICAgICAgLi4ubm90SW5jbHVkZWRQcm9wZXJpZXMsXG4gICAgICB9O1xuICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbLi4udGhpcy5jaGFubmVsc10pO1xuICAgICAgaWYgKGV2ZW50LmNoYW5uZWw/LmNpZCA9PT0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5jaWQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KGNoYW5uZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbFRydW5jYXRlKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGNoYW5uZWxJbmRleCA9IHRoaXMuY2hhbm5lbHMuZmluZEluZGV4KFxuICAgICAgKGMpID0+IGMuY2lkID09PSBldmVudC5jaGFubmVsIS5jaWRcbiAgICApO1xuICAgIGlmIChjaGFubmVsSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxJbmRleF0uc3RhdGUubWVzc2FnZXMgPSBbXTtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgICAgIGlmIChldmVudC5jaGFubmVsPy5jaWQgPT09IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uY2lkKSB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgICAgICBjaGFubmVsLnN0YXRlLm1lc3NhZ2VzID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dChjaGFubmVsKTtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBjYW5TZW5kUmVhZEV2ZW50cygpIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghY2hhbm5lbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjYXBhYmlsaXRlcyA9IGNoYW5uZWwuZGF0YT8ub3duX2NhcGFiaWxpdGllcyBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gY2FwYWJpbGl0ZXMuaW5kZXhPZigncmVhZC1ldmVudHMnKSAhPT0gLTE7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybVRvU3RyZWFtTWVzc2FnZShcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgTWVzc2FnZVJlc3BvbnNlIHwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlLFxuICAgIGNoYW5uZWw/OiBDaGFubmVsXG4gICkge1xuICAgIGNvbnN0IGlzVGhyZWFkTWVzc2FnZSA9ICEhbWVzc2FnZS5wYXJlbnRfaWQ7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1N0cmVhbU1lc3NhZ2UobWVzc2FnZSkgJiZcbiAgICAgIHRoaXMuaXNGb3JtYXRNZXNzYWdlUmVzcG9uc2UobWVzc2FnZSlcbiAgICApIHtcbiAgICAgIGlmIChtZXNzYWdlLnF1b3RlZF9tZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UucXVvdGVkX21lc3NhZ2UudHJhbnNsYXRpb24gPSBnZXRNZXNzYWdlVHJhbnNsYXRpb24oXG4gICAgICAgICAgbWVzc2FnZS5xdW90ZWRfbWVzc2FnZSxcbiAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBtZXNzYWdlLnRyYW5zbGF0aW9uID0gZ2V0TWVzc2FnZVRyYW5zbGF0aW9uKFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlclxuICAgICAgKTtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWVzc2FnZS5xdW90ZWRfbWVzc2FnZSkge1xuICAgICAgICAobWVzc2FnZSBhcyBTdHJlYW1NZXNzYWdlKS5xdW90ZWRfbWVzc2FnZSEudHJhbnNsYXRpb24gPVxuICAgICAgICAgIGdldE1lc3NhZ2VUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIG1lc3NhZ2UucXVvdGVkX21lc3NhZ2UsXG4gICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNGb3JtYXRNZXNzYWdlUmVzcG9uc2UobWVzc2FnZSkpIHtcbiAgICAgICAgKG1lc3NhZ2UgYXMgU3RyZWFtTWVzc2FnZSkucmVhZEJ5ID0gaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogY2hhbm5lbFxuICAgICAgICAgID8gZ2V0UmVhZEJ5KG1lc3NhZ2UsIGNoYW5uZWwpXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgKG1lc3NhZ2UgYXMgU3RyZWFtTWVzc2FnZSkudHJhbnNsYXRpb24gPSBnZXRNZXNzYWdlVHJhbnNsYXRpb24oXG4gICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UgYXMgU3RyZWFtTWVzc2FnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgPSB0aGlzLmZvcm1hdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIChtZXNzYWdlIGFzIFN0cmVhbU1lc3NhZ2UpLnJlYWRCeSA9IGlzVGhyZWFkTWVzc2FnZVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IGNoYW5uZWxcbiAgICAgICAgICA/IGdldFJlYWRCeShtZXNzYWdlLCBjaGFubmVsKVxuICAgICAgICAgIDogW107XG4gICAgICAgIChtZXNzYWdlIGFzIFN0cmVhbU1lc3NhZ2UpLnRyYW5zbGF0aW9uID0gZ2V0TWVzc2FnZVRyYW5zbGF0aW9uKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlclxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbWVzc2FnZSBhcyBTdHJlYW1NZXNzYWdlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVHlwaW5nU3RhcnRFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudXNlcj8uaWQgPT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyPy5pZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc1R5cGluZ0luVGhyZWFkID0gISFldmVudC5wYXJlbnRfaWQ7XG4gICAgaWYgKFxuICAgICAgaXNUeXBpbmdJblRocmVhZCAmJlxuICAgICAgZXZlbnQucGFyZW50X2lkICE9PSB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuZ2V0VmFsdWUoKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdWJqZWN0ID0gaXNUeXBpbmdJblRocmVhZFxuICAgICAgPyB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0XG4gICAgICA6IHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0O1xuICAgIGNvbnN0IHVzZXJzOiBVc2VyUmVzcG9uc2VbXSA9IHN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCB1c2VyID0gZXZlbnQudXNlcjtcbiAgICBpZiAodXNlciAmJiAhdXNlcnMuZmluZCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCkpIHtcbiAgICAgIHVzZXJzLnB1c2godXNlcik7XG4gICAgICBzdWJqZWN0Lm5leHQoWy4uLnVzZXJzXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUeXBpbmdTdG9wRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdXNlcnNUeXBpbmdJbkNoYW5uZWwgPSB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHVzZXJzVHlwaW5nSW5UaHJlYWQgPSB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgdXNlciA9IGV2ZW50LnVzZXI7XG4gICAgaWYgKHVzZXIgJiYgdXNlcnNUeXBpbmdJbkNoYW5uZWwuZmluZCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCkpIHtcbiAgICAgIHVzZXJzVHlwaW5nSW5DaGFubmVsLnNwbGljZShcbiAgICAgICAgdXNlcnNUeXBpbmdJbkNoYW5uZWwuZmluZEluZGV4KCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0Lm5leHQoWy4uLnVzZXJzVHlwaW5nSW5DaGFubmVsXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh1c2VyICYmIHVzZXJzVHlwaW5nSW5UaHJlYWQuZmluZCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCkpIHtcbiAgICAgIHVzZXJzVHlwaW5nSW5UaHJlYWQuc3BsaWNlKFxuICAgICAgICB1c2Vyc1R5cGluZ0luVGhyZWFkLmZpbmRJbmRleCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCksXG4gICAgICAgIDFcbiAgICAgICk7XG4gICAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0Lm5leHQoWy4uLnVzZXJzVHlwaW5nSW5UaHJlYWRdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUxhdGVzdE1lc3NhZ2VzKGV2ZW50OiBFdmVudCkge1xuICAgIGlmIChcbiAgICAgIGV2ZW50Lm1lc3NhZ2U/LnVzZXI/LmlkICE9PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlPy5jaGF0Q2xpZW50LnVzZXI/LmlkXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhdGVzdE1lc3NhZ2VzID1cbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGlmICghZXZlbnQubWVzc2FnZT8uY3JlYXRlZF9hdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaGFubmVsSWQgPSBldmVudD8ubWVzc2FnZT8uY2lkO1xuICAgIGlmICghY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VEYXRlID0gbmV3IERhdGUoZXZlbnQubWVzc2FnZS5jcmVhdGVkX2F0KTtcbiAgICBpZiAoXG4gICAgICAhbGF0ZXN0TWVzc2FnZXNbY2hhbm5lbElkXSB8fFxuICAgICAgbGF0ZXN0TWVzc2FnZXNbY2hhbm5lbElkXT8uZ2V0VGltZSgpIDwgbWVzc2FnZURhdGUuZ2V0VGltZSgpXG4gICAgKSB7XG4gICAgICBsYXRlc3RNZXNzYWdlc1tjaGFubmVsSWRdID0gbWVzc2FnZURhdGU7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVsc1N1YmplY3QubmV4dCh7XG4gICAgICAgIC4uLmxhdGVzdE1lc3NhZ2VzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGFubmVsU3RhdGUoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwuc3RhdGUubWVzc2FnZXMuZm9yRWFjaCgobSkgPT4ge1xuICAgICAgKG0gYXMgU3RyZWFtTWVzc2FnZSkucmVhZEJ5ID0gZ2V0UmVhZEJ5KG0sIGNoYW5uZWwpO1xuICAgICAgKG0gYXMgU3RyZWFtTWVzc2FnZSkudHJhbnNsYXRpb24gPSBnZXRNZXNzYWdlVHJhbnNsYXRpb24oXG4gICAgICAgIG0sXG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyXG4gICAgICApO1xuICAgICAgaWYgKG0ucXVvdGVkX21lc3NhZ2UpIHtcbiAgICAgICAgKG0gYXMgU3RyZWFtTWVzc2FnZSkucXVvdGVkX21lc3NhZ2UhLnRyYW5zbGF0aW9uID1cbiAgICAgICAgICBnZXRNZXNzYWdlVHJhbnNsYXRpb24oXG4gICAgICAgICAgICBtLnF1b3RlZF9tZXNzYWdlLFxuICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm1hcmtSZWFkKGNoYW5uZWwpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsUGlubmVkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgLi4uKGNoYW5uZWwuc3RhdGUucGlubmVkTWVzc2FnZXMgYXMgU3RyZWFtTWVzc2FnZVtdKSxcbiAgICBdKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0Lm5leHQoW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrUmVhZChjaGFubmVsOiBDaGFubmVsLCBpc1Rocm90dGxlZCA9IHRydWUpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNhblNlbmRSZWFkRXZlbnRzICYmXG4gICAgICB0aGlzLnNob3VsZE1hcmtBY3RpdmVDaGFubmVsQXNSZWFkICYmXG4gICAgICAhdGhpcy5hcmVSZWFkRXZlbnRzUGF1c2VkXG4gICAgKSB7XG4gICAgICBpZiAoaXNUaHJvdHRsZWQpIHtcbiAgICAgICAgdGhpcy5tYXJrUmVhZFRocm90dGxlZChjaGFubmVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZvaWQgY2hhbm5lbC5tYXJrUmVhZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWFya1JlYWRUaHJvdHRsZWQoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGlmICghdGhpcy5tYXJrUmVhZFRpbWVvdXQpIHtcbiAgICAgIHRoaXMubWFya1JlYWQoY2hhbm5lbCwgZmFsc2UpO1xuICAgICAgdGhpcy5tYXJrUmVhZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5mbHVzaE1hcmtSZWFkUXVldWUoKTtcbiAgICAgIH0sIHRoaXMubWFya1JlYWRUaHJvdHRsZVRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5tYXJrUmVhZFRpbWVvdXQpO1xuICAgICAgdGhpcy5zY2hlZHVsZWRNYXJrUmVhZFJlcXVlc3QgPSAoKSA9PiB0aGlzLm1hcmtSZWFkKGNoYW5uZWwsIGZhbHNlKTtcbiAgICAgIHRoaXMubWFya1JlYWRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmx1c2hNYXJrUmVhZFF1ZXVlKCk7XG4gICAgICB9LCB0aGlzLm1hcmtSZWFkVGhyb3R0bGVUaW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZsdXNoTWFya1JlYWRRdWV1ZSgpIHtcbiAgICB0aGlzLnNjaGVkdWxlZE1hcmtSZWFkUmVxdWVzdD8uKCk7XG4gICAgdGhpcy5zY2hlZHVsZWRNYXJrUmVhZFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubWFya1JlYWRUaW1lb3V0KTtcbiAgICB0aGlzLm1hcmtSZWFkVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoc2V0dGluZ3M6IHtcbiAgICBzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuO1xuICAgIG1lc3NhZ2VQYWdlU2l6ZTogbnVtYmVyO1xuICB9KSB7XG4gICAgdGhpcy5zaG91bGRTZXRBY3RpdmVDaGFubmVsID0gc2V0dGluZ3Muc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbDtcbiAgICB0aGlzLm1lc3NhZ2VQYWdlU2l6ZSA9IHNldHRpbmdzLm1lc3NhZ2VQYWdlU2l6ZTtcbiAgICB0aGlzLmNsaWVudEV2ZW50c1N1YnNjcmlwdGlvbiA9IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuZXZlbnRzJC5zdWJzY3JpYmUoXG4gICAgICAobm90aWZpY2F0aW9uKSA9PiB2b2lkIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbilcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5Q2hhbm5lbHMoXG4gICAgICAgIHRoaXMuc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbCxcbiAgICAgICAgJ2ZpcnN0LXBhZ2UnXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5kaXNtaXNzRXJyb3JOb3RpZmljYXRpb24gPVxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkUGVybWFuZW50Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICdzdHJlYW1DaGF0LkVycm9yIGxvYWRpbmcgY2hhbm5lbHMnLFxuICAgICAgICAgICdlcnJvcidcbiAgICAgICAgKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxufVxuIl19
|