@vgroup/dialbox 0.7.45 → 0.7.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/call-progress/call-progress.component.mjs +18 -5
- package/esm2020/lib/service/twilio.service.mjs +1 -2
- package/fesm2015/vgroup-dialbox.mjs +25 -12
- package/fesm2015/vgroup-dialbox.mjs.map +1 -1
- package/fesm2020/vgroup-dialbox.mjs +17 -5
- package/fesm2020/vgroup-dialbox.mjs.map +1 -1
- package/lib/components/call-progress/call-progress.component.d.ts +1 -0
- package/package.json +1 -1
|
@@ -736,6 +736,9 @@ export class CallProgressComponent {
|
|
|
736
736
|
}
|
|
737
737
|
async startCall(callData, isNewConference) {
|
|
738
738
|
try {
|
|
739
|
+
if (!this.currentCallList?.length) {
|
|
740
|
+
this.twilioService.setIncomingMuted(false);
|
|
741
|
+
}
|
|
739
742
|
this.showRingAnimation = true;
|
|
740
743
|
const payload = {
|
|
741
744
|
channelId: environment.channelId,
|
|
@@ -1168,6 +1171,8 @@ export class CallProgressComponent {
|
|
|
1168
1171
|
this.showContactsPanel = false;
|
|
1169
1172
|
return false;
|
|
1170
1173
|
}
|
|
1174
|
+
else {
|
|
1175
|
+
}
|
|
1171
1176
|
this.showContactsPanel = !isClose;
|
|
1172
1177
|
this.conferenceCallIDForParticipantList = callInfo?.conferenceId;
|
|
1173
1178
|
this.selectedConfName = this.conferenceCallList.find((resData) => resData?.conferenceId === callInfo?.conferenceId)?.callLabel || '';
|
|
@@ -1181,11 +1186,14 @@ export class CallProgressComponent {
|
|
|
1181
1186
|
toggleC2CInfoPanel(userInfo, isClose) {
|
|
1182
1187
|
if (isClose) {
|
|
1183
1188
|
this.selectedUserInfo = {};
|
|
1189
|
+
this.isClickExpand = false;
|
|
1184
1190
|
return false;
|
|
1185
1191
|
}
|
|
1192
|
+
else {
|
|
1193
|
+
this.isClickExpand = true;
|
|
1194
|
+
}
|
|
1186
1195
|
if (!userInfo?.businessNumber && !userInfo?.isBusinessNumber) {
|
|
1187
1196
|
// Non-C2C item: just mark it as selected for highlight, no API call needed.
|
|
1188
|
-
// this.selectedUserInfo = userInfo;
|
|
1189
1197
|
return;
|
|
1190
1198
|
}
|
|
1191
1199
|
// Set selection immediately so the highlight appears before the API responds.
|
|
@@ -1244,14 +1252,17 @@ export class CallProgressComponent {
|
|
|
1244
1252
|
}
|
|
1245
1253
|
}
|
|
1246
1254
|
async add(data, ourNumberInfo, capturedCall) {
|
|
1255
|
+
if (!this.currentCallList?.length) {
|
|
1256
|
+
this.twilioService.setIncomingMuted(false);
|
|
1257
|
+
}
|
|
1247
1258
|
this.isConnecting = true;
|
|
1259
|
+
this.isConnectingIncomingCallId = data?.id;
|
|
1248
1260
|
this.twilioService.isConnectingIncomingCallId.next(data?.id);
|
|
1249
1261
|
this.isIncomingCallBtnDisable = true;
|
|
1250
1262
|
this.cdr.detectChanges();
|
|
1251
1263
|
let intervalId = setInterval(() => {
|
|
1252
1264
|
const callToAccept = this.twilioService.getIncomingCallById(data?.clientSid);
|
|
1253
1265
|
if (callToAccept?.parameters?.CallSid) {
|
|
1254
|
-
console.log('callToAcceptttttttttttttttttttttttttttttttttt', callToAccept, data?.id);
|
|
1255
1266
|
callToAccept.accept();
|
|
1256
1267
|
const acceptedEntry = {
|
|
1257
1268
|
call: callToAccept,
|
|
@@ -1278,6 +1289,7 @@ export class CallProgressComponent {
|
|
|
1278
1289
|
this.extensionService.setIncomingCallStatus(payload).subscribe(async (res) => {
|
|
1279
1290
|
if (res.status == 200) {
|
|
1280
1291
|
clearInterval(intervalId);
|
|
1292
|
+
this.isConnectingIncomingCallId = '';
|
|
1281
1293
|
this.conferenceCallIDForParticipantList = data?.conferenceId;
|
|
1282
1294
|
this.incomeingCallSocketService.isCurrentIncomingCallList.push(data?.id);
|
|
1283
1295
|
this.twilioService.isShowIncomingCall = false;
|
|
@@ -1325,6 +1337,7 @@ export class CallProgressComponent {
|
|
|
1325
1337
|
else if (this.missCallInfo?.data?.data?.recordId == data?.id && !callToAccept.parameters?.CallSid) {
|
|
1326
1338
|
clearInterval(intervalId);
|
|
1327
1339
|
const sid = callToAccept.parameters?.CallSid;
|
|
1340
|
+
this.isConnectingIncomingCallId = '';
|
|
1328
1341
|
this.acceptedCallList = this.acceptedCallList.filter(c => c.callSid !== sid);
|
|
1329
1342
|
this.twilioService.acceptedCallList = this.twilioService.acceptedCallList.filter((c) => c.parameters?.CallSid !== sid);
|
|
1330
1343
|
let payload = {
|
|
@@ -2185,10 +2198,10 @@ export class CallProgressComponent {
|
|
|
2185
2198
|
}
|
|
2186
2199
|
}
|
|
2187
2200
|
CallProgressComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CallProgressComponent, deps: [{ token: i1.ExtensionService }, { token: i0.ChangeDetectorRef }, { token: i2.TwilioService }, { token: i3.IpAddressService }, { token: i4.IncomeingCallSocketService }], target: i0.ɵɵFactoryTarget.Component });
|
|
2188
|
-
CallProgressComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CallProgressComponent, selector: "lib-call-progress", inputs: { callData: "callData", selectedCallerId: "selectedCallerId", newIncomingCallData: "newIncomingCallData", newIncomingCallsList: "newIncomingCallsList", callerIdList: "callerIdList", newCallConference: "newCallConference", missCallInfo: "missCallInfo", userSettingInfo: "userSettingInfo", deviceId: "deviceId", callAction: "callAction", conferenceCallInfo: "conferenceCallInfo", incomingFromImage: "incomingFromImage", outgoingContactName: "outgoingContactName" }, outputs: { endCallEvent: "endCallEvent", incomingCallsNewInfo: "incomingCallsNewInfo", minimiseEvent: "minimiseEvent", incomingCallInitiated: "incomingCallInitiated", isLoadershown: "isLoadershown", endIncomingCallEvent: "endIncomingCallEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex\">\r\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\r\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\r\n <div class=\"loader-wrapper outgoing-call-loader\"\r\n *ngIf=\"showNewCallLoader\">\r\n <div class=\"active-call\" style=\"display: flex; flex-direction: column; position: relative;\">\r\n <div class=\"call-animation call-animation-play\">\r\n <img class=\"avatar-img\" [src]=\"newCallLoaderData?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 style=\"margin-top: 8px;\">Connecting...</h1>\r\n <p style=\"text-transform: capitalize;\">{{ newCallLoaderData?.name || newCallLoaderData?.phone || 'Unknown' }}</p>\r\n </div>\r\n \r\n <div class=\"call-action-btns\">\r\n <div class=\"d-flex justify-content-center\">\r\n <button class=\"call-btn end-call-btn\" disabled (click)=\"endCall()\" style=\"visibility: hidden;\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\"\r\n [ngClass]=\"{\r\n 'conference-alert': isConference && currentCall?.isConference,\r\n 'normal-call-alert': !isConference\r\n }\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\"\r\n [ngClass]=\"callNumberToast.type\"\r\n role=\"alert\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"flex-grow-1 text-left\">\r\n You'r calling\r\n <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\"> Cancel Call </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- All type Call Hold list -->\r\n <div class=\"held-call-banner\"\r\n *ngIf=\"(currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)) || !isAllAccepted\">\r\n <ng-container *ngFor=\"let conf of currentCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"!conf?.isAcceptCall && currentCallList.length > 1 && deviceNumberList.includes(conf?.to) && conf?.isNotification\"\r\n [ngClass]=\"{'held-call-selected': selectedUserInfo?.participantId && selectedUserInfo?.participantId === conf?.participantId}\"\r\n (click)=\"conf?.businessNumber ? toggleC2CInfoPanel(conf) : null\"\r\n [ngStyle]=\"{'cursor': conf?.businessNumber ? 'pointer' : 'default'}\">\r\n <div class=\"held-info\">\r\n <div class=\"img\">\r\n <img class=\"avatar-img-wrapper border-radius-50\" [src]=\"conf?.img || 'assets/images/user.jpg'\" alt=\"\" width=\"35\" height=\"35\" />\r\n </div>\r\n <div class=\"held-caller\" *ngIf=\"!conf?.businessNumber\">\r\n <span class=\"held-label\">{{conf?.from}}</span>\r\n <span class=\"held-name\">{{conf?.fromName}}</span>\r\n </div>\r\n <div class=\"held-caller\" *ngIf=\"conf?.businessNumber\">\r\n <span class=\"held-main-label\">Call from C2C:</span>\r\n <span class=\"held-label\" ><span [title]=\"conf?.sourceName\">{{ truncateText(conf?.sourceName, 10) }}</span>|\r\n <span [title]=\"conf?.pointName\">{{ truncateText(conf?.pointName, 10) }}</span></span>\r\n <span class=\"held-label\">{{ truncateText(conf?.name, 26) }}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact receive-btn\" (click)=\"waitingCallAccept(conf); $event.stopPropagation();\" [disabled]=\"isConnecting || isIncomingCallBtnDisable\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n <button class=\"conference-contact\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\" (click)=\"onRejectCall(conf); $event.stopPropagation();\"> call_end </span>\r\n </button>\r\n <div *ngIf=\"conf?.businessNumber\" class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleC2CInfoPanel(conf)\">\r\n <i class=\"fa fa-info\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let conf of conferenceCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"conf?.isConferenceHold && conferenceCallList.length > 1\"\r\n [ngClass]=\"{'held-call-selected': conf?.isBusinessNumber && selectedUserInfo?.participantId === conf?.businessParticipantId}\"\r\n (click)=\"conf?.isBusinessNumber ? toggleC2CInfoPanel(conf) : null\"\r\n [ngStyle]=\"{'cursor': conf?.isBusinessNumber ? 'pointer' : 'default'}\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">{{conf?.callLabel}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': conf?.isConferenceHold }\"\r\n (click)=\"swapCalls(conf,true)\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"conf?.isConferenceHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(conf)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- For single incoming call -->\r\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\r\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall\">\r\n <!-- <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown Number'}}</span>\r\n </div> -->\r\n <div class=\"callToNum\">\r\n <ng-container *ngIf=\"currentCallList[0]?.businessNumber; else normalCall\">\r\n C2C CALL\r\n <br />\r\n <span> From : {{ currentCallList[0]?.sourceName }} | {{ currentCallList[0]?.pointName }} </span>\r\n </ng-container>\r\n\r\n <ng-template #normalCall>\r\n Incoming call on\r\n <br />\r\n <span>{{ currentCallList[0]?.to || 'Unknown Number' }}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"incomingFromImage || 'assets/images/user.jpg'\" alt=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\" *ngIf=\"!currentCallList[0]?.businessNumber\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n <div class=\"callerDetails\" *ngIf=\"currentCallList[0]?.businessNumber\">\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ truncateText(currentCallList[0]?.name, 45) }}</p>\r\n <p >{{ currentCallList[0]?.number }}</p>\r\n </div>\r\n <!-- Connecting overlay (shown after accept btn click, hidden on API response) -->\r\n <div class=\"connecting-overlay mt-auto\" *ngIf=\"isConnecting\">\r\n <div class=\"connecting-dots\">\r\n <span></span><span></span><span></span>\r\n </div>\r\n <p class=\"connecting-text\">Connecting...</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\" *ngIf=\"!isConnecting\">\r\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\"\r\n [disabled]=\"isIncomingCallBtnDisable\" (click)=\"add(currentCallList[0])\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n <button class=\"call-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onRejectCall(currentCallList[0])\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For single active call -->\r\n <div *ngIf=\"(!isConference || isConferenceCallHold) && (!!currentCall?.id && !currentCall?.isConference) && currentCall?.isAcceptCall\"\r\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\r\n <div *ngIf=\"selectedUserInfo?.businessNumber;\" class=\"callToNum\">\r\n C2C CALL\r\n <br />\r\n <span> From : {{ selectedUserInfo?.sourceName }} | {{ selectedUserInfo?.pointName }} </span>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" *ngIf=\"!currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.toImage || 'assets/images/user.jpg' : currentCall?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <img class=\"avatar-img\" *ngIf=\"currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.fromImage || 'assets/images/user.jpg' : currentCall?.toImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <!-- C2C Business Call -->\r\n <ng-container *ngIf=\"selectedUserInfo?.businessNumber; else normalCall\">\r\n <h1>{{ selectedUserInfo?.name }}</h1>\r\n <p>{{ selectedUserInfo?.number }}</p>\r\n </ng-container>\r\n\r\n <!-- Normal Call -->\r\n <ng-template #normalCall>\r\n <h1 *ngIf=\"!currentCall?.client\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0':'8px'}\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.toName || outgoingContactName || 'Unknown'\r\n : currentCall?.fromName || 'Unknown' }}\r\n </h1>\r\n <h1 *ngIf=\"currentCall?.client\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0':'8px'}\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.fromName || 'Unknown'\r\n : currentCall?.toName || 'Unknown' }}\r\n </h1>\r\n <p *ngIf=\"!currentCall?.client\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.to\r\n : currentCall?.from }}\r\n </p>\r\n <p *ngIf=\"currentCall?.client\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.from\r\n : currentCall?.to }}\r\n </p>\r\n </ng-template>\r\n <!-- <h1 *ngIf=\"!currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.toName || outgoingContactName || 'Unknown' :\r\n currentCall?.fromName || 'Unknown'}}</h1>\r\n <h1 *ngIf=\"currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.fromName || 'Unknown' :\r\n currentCall?.toName || 'Unknown'}}</h1>\r\n <p *ngIf=\"!currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.to || 'Unknown' : currentCall?.from || 'Unknown'}}</p>\r\n <p *ngIf=\"currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.from || 'Unknown' : currentCall?.to || 'Unknown'}}</p> -->\r\n <h4 style=\"margin-top: 4px\">{{ timer}}</h4>\r\n </div>\r\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording, 'disabled': userSettingInfo?.callRecording == 'N'}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"!currentCall?.isAcceptCall || userSettingInfo?.callRecording == 'N'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\" (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <!-- Mute/unmute incoming call -->\r\n <div class=\"mute-incoming-row\" *ngIf=\"currentCall?.isAcceptCall && !showKeypad\">\r\n <span class=\"mute-incoming-label\">Mute incoming calls</span>\r\n <label class=\"switch mb-0\" title=\"Silence the ringtone of new incoming calls during this call\">\r\n <input type=\"checkbox\" [checked]=\"twilioService.isIncomingMuted\" (change)=\"toggleMuteIncomingCall()\">\r\n <span class=\"switch-slider\"></span>\r\n </label>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\r\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"toggleMute()\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\r\n </span>\r\n </button>\r\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n <div>\r\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- conference call view -->\r\n <div class=\"conference-call-view\" *ngIf=\"isConference\">\r\n <div class=\"conf-heading\">\r\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\r\n <span class=\"conf-title\">Conference Call</span>\r\n </div>\r\n <div class=\"scroll-container\">\r\n <div class=\"scroll-text conf-name\">\r\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\r\n <ng-container *ngIf=\"!call?.isConferenceHold\">\r\n <span *ngIf=\"shouldShowSeparator(i)\"> & </span>\r\n <span *ngIf=\"call?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(call) else selfNumber\">\r\n <span>{{call?.direction == 'outgoing-call' ? call?.fromName || call?.from :\r\n call?.toName || call?.to}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </span>\r\n <span *ngIf=\"!call?.client\">{{call?.direction == \"outgoing-call\" ? call?.toName || call?.to : call?.fromName || call?.from || 'Unknown number'}}</span>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"conf-timer\">{{ currentConferenceCall?.timer || timer }}</div>\r\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\" >\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\" [disabled]=\"userSettingInfo.callRecording == 'N'\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording, 'disabled': userSettingInfo?.callRecording == 'N'}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\" (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <!-- Mute/unmute incoming call -->\r\n <div class=\"mute-incoming-row\" *ngIf=\"currentCall?.isAcceptCall && !showKeypad\">\r\n <span class=\"mute-incoming-label\">Mute incoming calls</span>\r\n <label class=\"switch mb-0\" title=\"Silence the ringtone of new incoming calls during this call\">\r\n <input type=\"checkbox\" [checked]=\"twilioService.isIncomingMuted\" (change)=\"toggleMuteIncomingCall()\">\r\n <span class=\"switch-slider\"></span>\r\n </label>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n <div class=\"conf-actions\">\r\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\r\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\r\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall(currentConferenceCall?.participants[0])\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-- Incoming call user details shown in model -->\r\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\r\n <div class=\"close-info-panel-section\">\r\n <div class=\"d-flex justify-content-between\" *ngIf=\"currentConferenceCall?.conferenceId != selectedUserInfo?.conferenceId && newIncomingCallsList?.length > 1\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn \" (click)=\"onCloseC2CInfoPanel()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#ffffff\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"mb-2 user-info-section\">\r\n <div class=\"text-center my-3\">\r\n <h3 class=\"text-white\">C2C CALL : {{selectedUserInfo?.sourceName}} | {{selectedUserInfo?.pointName}}</h3>\r\n </div>\r\n <div class=\"mb-3\">\r\n <h5 class=\"text-white mb-1\">Name:</h5>\r\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\r\n </div>\r\n <div class=\"f-13\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Extension:</div>\r\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Number:</div>\r\n <div class=\"\">{{selectedUserInfo?.number}}</div>\r\n </div> \r\n </div>\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Email: </div>\r\n <div>{{selectedUserInfo?.email}}</div>\r\n </div>\r\n </div>\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Subject:</div>\r\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">\r\n {{selectedUserInfo?.subject}}</div>\r\n </div>\r\n </div>\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2 mb-1\">Image:</div>\r\n <div class=\"text-ellipsis\">\r\n <ng-container\r\n *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\r\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\" />\r\n </ng-container>\r\n <ng-template #noImage>\r\n <span class=\"ml-2\">No Image Available</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\" mb-4\">\r\n <div class=\"\">\r\n <div class=\"mb-1\">Message:</div>\r\n <div>\r\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}\r\n </div>\r\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See\r\n less' : 'See more' }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- contact list panel -->\r\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel && !showNewCallLoader\">\r\n <div class=\"panel-loader-overlay p-3 text-center\" *ngIf=\"isParticipantPanelLoading\">\r\n <div class=\"spinner-border text-secondary\" role=\"status\">\r\n <span class=\"sr-only\">Loading...</span>\r\n </div>\r\n <p class=\"mt-2\"></p>\r\n </div>\r\n <div class=\"contacts-header\">\r\n <div>Participants</div>\r\n <div class=\"d-flex justify-content-between\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel({}, true)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\r\n <div class=\"search-bar p-3 position-relative\">\r\n <input type=\"text\" placeholder=\"Search by name or phone number\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\r\n <div class=\"search-contacts-list\">\r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"searchText\">\r\n <img class=\"contact-avatar\" [src]=\"c?.image || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number) }}{{ c?.numbersList[0]?.numberLabel ? ' (' + c.numbersList[0].numberLabel + ')' : '' }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(c)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"Add to call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(c?.numbersList[0]?.number, true)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filteredList.length && isDirectCallOptionShow && searchText\">\r\n <div class=\"contact-item\">\r\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-title\">{{ searchText }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"CallToUnsavedNumber(searchText)\"\r\n title=\"Add to call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(searchText, true)\"\r\n title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"contacts-list\">\r\n <div class=\"px-2\">\r\n <h5 class=\"mb-0 title\" *ngIf=\"totalParticipantsCount >= 3\">\r\n {{selectedConfName}}'s active participants ({{activeParticipantsCount}})\r\n </h5>\r\n <h5 class=\"mb-0 title\" *ngIf=\"totalParticipantsCount < 3\">\r\n Active participants ({{activeParticipantsCount}})\r\n </h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"!c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || 'Unknown'}}</div>\r\n\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(c) else selfNumber\">\r\n <span>{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' : c?.toName || 'Unknown'}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"c?.joined && !c?.host\">\r\n <div class=\"connecting-wrapper mr-2\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!c?.joined || c?.host\">\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.isHold\" (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.isHold }\"\r\n (click)=\"onHoldCall(c)\" *ngIf=\"!c?.host\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"!c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Hold'\"> phone_paused</span>\r\n <span *ngIf=\"c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </span>\r\n </button>\r\n </ng-container>\r\n <button class=\"conference-contact\" (click)=\"confirmLeaveParticipant(c)\"\r\n *ngIf=\"!c?.host\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(c)\"\r\n *ngIf=\"c?.host && (deviceNumberList.includes(c?.from) || (deviceNumberList.includes(c?.to) && c?.direction == 'incoming-call'))\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <hr class=\"m-2\">\r\n <div class=\"mt-3 px-2\">\r\n <h5 class=\"mb-0 title\">Participant added to the call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || 'Unknown'}}</div>\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' : c?.toName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <div class=\"connecting-wrapper\" *ngIf=\"c?.joined\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\" *ngIf=\"!c?.host && c?.joined\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"!c?.client && !c?.joined && !c?.businessNumber\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.to : c?.from, false, { skipDuplicateCheck: true })\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"c?.client && !c?.joined && !c?.businessNumber\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.from : c?.to, false, { skipDuplicateCheck: true })\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Conference Warning Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showConferenceWarningModal\">\r\n <div class=\"modal-content warning-modal\">\r\n <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">warning</span>\r\n </div>\r\n <h3>Conference Call Warning</h3>\r\n <p>\r\n Starting a new call will put the current conference on hold\r\n and cannot be merged later.\r\n </p>\r\n <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelNewCall()\">\r\n Cancel\r\n </button>\r\n <button class=\"proceed-btn\" (click)=\"confirmNewCall()\">\r\n Proceed\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n\r\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\r\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\r\n <div style=\"display: flex; width: 100%\">\r\n <div>\r\n <div class=\"min-call-animation\" id=\"call-avatar\">\r\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"min-callerDetails\">\r\n <div class=\"name\">\r\n {{callData.name}}\r\n </div>\r\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"min-btn-container\">\r\n <div class=\"min-timer\">{{timer}}</div>\r\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n</div>\r\n<!-- Call Disconnect Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showDisconnectModal\">\r\n <div class=\"modal-content p-3\">\r\n <div class=\"contacts-header p-0 pb-2\">\r\n <h4 class=\"title mb-0\">{{selectedConf?.conName || 'Call'}} Disconnect</h4>\r\n <div class=\"d-flex justify-content-between\">\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDisconnectModal = false\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"contant-body mb-2\">\r\n <p class=\"mt-2\">\r\n Exiting this call will not end the conference. The session will continue, and charges will incur to\r\n your\r\n account.\r\n </p>\r\n </div>\r\n <div class=\"button-group\">\r\n <div class=\"text-start d-flex align-items-center\">\r\n <label class=\"d-flex align-items-center mb-0 mr-2\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isReasonChecked\" (ngModelChange)=\"onReasonCheckChanged($event)\" class=\"me-2\"/>\r\n </label>\r\n <div class=\"time-picker-24hr\">\r\n <!-- Hour picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleHourDropdown()\">\r\n {{ leaveHour || 'HH' }}\r\n <span class=\"picker-arrow\">▼</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showHourDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let h of hours\"\r\n [class.selected]=\"leaveHour === h\"\r\n (click)=\"selectHour(h)\">{{ h }}</div>\r\n </div>\r\n </div>\r\n <span class=\"time-sep\">:</span>\r\n <!-- Minute picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleMinuteDropdown()\">\r\n {{ leaveMinute || 'MM' }}\r\n <span class=\"picker-arrow\">▼</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showMinuteDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let m of minutes\"\r\n [class.selected]=\"leaveMinute === m\"\r\n (click)=\"selectMinute(m)\">{{ m }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button class=\"btn end-btn\" (click)=\"leaveConference()\" [disabled]=\"isReasonChecked && (!leaveHour || !leaveMinute)\">\r\n Leave\r\n </button>\r\n <button class=\"btn end-btn\" (click)=\"endConference()\" *ngIf=\"showEndAllButton\">\r\n End All\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"custom-modal\" *ngIf=\"showLeaveConfirmationModal\">\r\n <div class=\"modal-content warning-modal\">\r\n <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">info</span>\r\n </div>\r\n <h3>Leave Conference</h3>\r\n <p>\r\n You are about to leave <strong>{{ leaveConfConferenceName }}</strong>. \r\n Are you sure?\r\n </p>\r\n <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelLeave()\">Cancel</button>\r\n <button class=\"proceed-btn\" (click)=\"confirmLeave()\">Leave</button>\r\n </div>\r\n </div>\r\n</div>", styles: [".call-container{width:385px;height:646px!important;margin:auto;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;justify-content:center;align-items:center;z-index:1000;flex-flow:column;overflow-x:hidden;overflow-y:visible}.disabled{opacity:.5!important;pointer-events:none!important}.call-to-text{padding:6px 10px;border:1px solid #c2c2c2;border-radius:20px;font-size:13px}.collops{height:660px!important}.incoming-call-container{flex-flow:row!important}.active-call{width:385px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.call-info-wrapper{height:20px;overflow-y:auto;background:white;transition:height 1s}.open-collops{height:180px!important}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.search-bar input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;outline:none}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}.callerDetails h1{width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:12px 0 0;color:#fff;text-transform:capitalize;text-align:center}.callerDetails h4{margin:0;color:#fff}.tx-black,.title{color:#000!important}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:0;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 6px;border-bottom:1px dotted #4b4b4b;border-left:3px solid transparent;transition:background .15s ease,border-left-color .15s ease;cursor:pointer}.held-call-content.held-call-selected{background:rgba(255,255,255,.15);border-left-color:#fff;border-radius:0 6px 6px 0}.held-main-label{font-size:13px;color:#fff;text-transform:uppercase;letter-spacing:.5px}.fa-info{font-size:smaller!important}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.modal-content .contacts-header{height:40px}.search-contacts-list{max-height:196px;overflow:auto;position:absolute;width:91%;background:white;z-index:1000;box-shadow:0 4px 8px #0003,0 6px 20px #00000030;border-radius:0 10px 10px}.contant-body p{font-size:14px;color:#5f6061}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.disabled{opacity:.5;pointer-events:none}.contacts-list{padding:8px 8px 12px;overflow-y:auto}.contact-item{display:flex;align-items:center;padding:10px 8px;border-radius:10px}.contact-item:hover{background:#f7f9fc}.contact-avatar{width:37px;height:37px;border-radius:50%;object-fit:cover;margin-right:12px}.contact-info{flex:1;min-width:0;overflow:hidden}.contact-name{font-weight:600;color:#111827;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.contact-title{font-size:12px;color:#6b7280}.contact-call-btn{display:inline-flex;align-items:center;gap:6px;background:#234de8;color:#fff;border:none;border-radius:16px;padding:8px;cursor:pointer}.contact-add-btn{background-color:#2ecc71!important}.conference-hold-contact{display:inline-flex;align-items:center;gap:5px;background:#727070;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.conference-hold-contact.on-hold{background:#28a745!important;color:#fff}.user-info-section{width:100%;height:100%;overflow-y:auto;overflow-x:hidden!important}.user-info-section::-webkit-scrollbar{display:none}.toggle-btn{cursor:pointer}.text-container{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s ease}.mute-incoming-row{display:flex;align-items:center;justify-content:center;gap:8px;margin:0 0 10px}.mute-incoming-label{font-size:11px;color:#fff}.switch{position:relative;display:inline-block;width:38px;height:19px;flex-shrink:0}.switch input{opacity:0;width:0;height:0}.switch-slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;border-radius:22px;transition:.3s}.close-info-panel-section{width:100%;height:20px}.close-info-panel-section .material-symbols-outlined{font-size:12px;cursor:pointer}.c2c-title{color:#fff;white-space:normal;word-break:break-word;line-height:1.4}.switch-slider:before{content:\"\";position:absolute;height:14px;width:15px;left:3px;bottom:3px;background-color:#fff;border-radius:50%;transition:.3s}.switch input:checked+.switch-slider{background-color:#2ecc71}.switch input:checked+.switch-slider:before{transform:translate(18px)}.text-container.expanded{-webkit-line-clamp:unset}.userName{font-family:FontAwesome}.subject-text{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.conference-contact{display:inline-flex;align-items:center;gap:5px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.organizer-label{padding:1px 5px;font-size:11px;border-radius:10px;border:1px solid #a0a0a0;margin-top:2px;background:#fcfcfc;color:#000}.custom-modal{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;align-items:center;z-index:10000001;border-radius:21px}.modal-content{background:#ffffff;padding:25px;border-radius:8px;width:350px;text-align:center}.title{margin-bottom:15px;color:#d9534f}.message{margin-bottom:20px}.button-group{display:flex;justify-content:space-between}.btn{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-weight:500}.end-btn{background-color:#dc3545;color:#fff;display:flex;align-items:center;font-size:13px}.leave-btn{background-color:#007bff;color:#fff}.contact-call-btn .material-symbols-outlined{font-size:18px;color:#fff}.contact-call-btn .label{font-size:12px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}app-incoming-call{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1001}.min-call-container{width:320px;height:124px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;flex-direction:column;box-sizing:border-box;position:relative;overflow:hidden;margin:auto;align-items:center;padding:12px 16px;color:#fff}.min-call-animation{background:#fff;width:48px;height:48px;position:relative;margin:0 12px 0 auto;border-radius:100%;border:solid 2px #fff}.min-avatar-img{width:46px;height:46px;border-radius:100%;position:absolute;left:0;top:0}.border-radius-50{border-radius:50%}.min-callerDetails{color:#fff;display:flex;flex-direction:column;align-items:flex-start}.name{width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:20px;margin:0;color:#fff}.min-callerDetails p{margin:0;color:#fff}.min-btn-container{position:relative;display:flex;width:100%;justify-content:flex-start;align-items:center;margin-top:6px}.min-call-sec-btn{width:40px;height:40px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:20px;display:flex;align-items:center;justify-content:center;margin-right:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.min-call-sec-btn span{color:#cccbcb}.min-call-btn{width:40px;height:40px;border-radius:20px;box-sizing:border-box;border:2px solid white;display:flex;align-items:center;justify-content:center}.fullscreen{position:absolute;right:18px;top:14px;color:#e8e8e8;font-size:18px;cursor:pointer}.btn-container{display:flex;flex-wrap:wrap;padding:0 24px}.dial-btn{width:40px;height:40px;background-color:transparent;text-align:center;box-sizing:border-box;margin:4px 25px;font-size:24px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#b5b5b5;cursor:pointer}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.min-timer{width:50px;font-size:18px;margin-right:10px;border-radius:4px;height:35px;display:flex;align-items:center}.record-action-btns{display:flex;flex-direction:column;align-items:center;margin-top:35px}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 5px;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;margin-top:10px}.record-btn.pause-resume{border:none;border-radius:50%;width:50px;height:50px;background:white;display:flex;align-items:center;justify-content:center;margin:5px 0}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.conference-call-view{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:100%;padding:12px 16px 35px;color:#fff;height:100%}.conf-heading{display:flex;align-items:center;gap:8px;margin-top:45px}.conf-icon{color:#4579aa;font-size:32px;width:50px;height:50px;border:1px solid gray;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e1e1e1}.conf-title{font-weight:600;font-size:20px}.conf-name{margin-top:10px;font-size:17px;font-weight:600;text-align:center}.conf-timer{margin-top:4px;font-size:12px;opacity:.9}.conf-record{margin-top:14px}.record-stop-btn{width:44px;height:44px;border-radius:50%;border:none;background:#fff;display:flex;align-items:center;justify-content:center}.record-stop-btn .material-symbols-outlined{color:#e14e4e;font-size:28px}.conf-remove{margin-top:8px}.remove-btn{background:#ff0000!important;color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:12px;width:82px!important;height:auto}.conf-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:18px}.circle-btn{width:56px;height:56px;border-radius:50%;border:none;background:#000;display:flex;align-items:center;justify-content:center}.circle-btn .material-symbols-outlined{color:#fff;font-size:24px}.circle-btn.active{opacity:.85}.conf-end{margin-top:16px}.circle-btn.danger{background:#e14e4e}.circle-btn.danger .material-symbols-outlined{color:#fff}.warning-modal{background:white;width:360px;border-radius:18px;padding:24px;text-align:center;box-shadow:0 10px 30px #00000040}.warning-icon{margin-bottom:12px}.warning-icon .material-symbols-outlined{font-size:48px;color:#f59e0b}.warning-modal h3{margin-bottom:12px;font-size:20px;font-weight:600}.warning-modal p{color:#555;font-size:14px;line-height:1.5;margin-bottom:24px}.warning-actions{display:flex;justify-content:center;gap:12px}.cancel-btn,.proceed-btn{border:none;padding:10px 18px;border-radius:8px;cursor:pointer;font-weight:600}.cancel-btn{background:#e5e7eb;color:#111827}.proceed-btn{background:#234de8;color:#fff}.time-picker-24hr{display:flex;align-items:center;gap:4px}.time-sep{font-weight:700;font-size:16px;color:#333}.custom-time-select{position:relative;width:58px;-webkit-user-select:none;user-select:none}.custom-time-select.disabled-picker{opacity:.45;pointer-events:none}.custom-time-display{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;border:1px solid #ced4da;border-radius:4px;background:#fff;font-size:13px;cursor:pointer;white-space:nowrap}.custom-time-display:hover{border-color:#234de8}.picker-arrow{font-size:9px;margin-left:4px;color:#666}.custom-time-options{position:fixed;background:#fff;border:1px solid #ced4da;border-radius:4px;max-height:160px;overflow-y:auto;z-index:99999999;min-width:58px;box-shadow:0 4px 12px #00000026}.custom-time-option{padding:5px 10px;font-size:13px;cursor:pointer;text-align:center}.custom-time-option:hover{background:#e8eeff;color:#234de8}.custom-time-option.selected{background:#234de8;color:#fff;font-weight:600}.dialpad-alerts{position:absolute;left:50%;transform:translate(-50%);width:calc(100% - 32px);z-index:9999999}.normal-call-alert{top:78px}.conference-alert{top:145px}.dialbox-pop1{background:#dff6dd!important;color:#1d4d1d!important;border-radius:10px;padding:10px 14px;font-size:14px;box-shadow:0 4px 12px #00000040;border:1px solid #b7dfc3}.btn-disc{border:none;background:transparent;color:#6b7280!important;font-size:13px;font-weight:500}.connecting-overlay{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:16px 0 24px}.connecting-text{color:#ffffffe6;font-size:15px;font-weight:500;letter-spacing:.5px;margin:0}.connecting-dots{display:flex;gap:8px;align-items:center}.connecting-dots span{display:inline-block;width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.85);animation:connecting-bounce 1.2s infinite ease-in-out}.connecting-dots span:nth-child(1){animation-delay:0s}.connecting-dots span:nth-child(2){animation-delay:.2s}.connecting-dots span:nth-child(3){animation-delay:.4s}@keyframes connecting-bounce{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1.2);opacity:1}}.connecting-wrapper{display:flex;align-items:center;font-size:13px;color:#4caf50;margin-top:4px;font-weight:500}.ringing-text{margin-right:2px;font-size:11px}.dots span{animation:blink 1.4s infinite;opacity:0;font-size:16px}.dots span:nth-child(1){animation-delay:0s}.dots span:nth-child(2){animation-delay:.2s}.dots span:nth-child(3){animation-delay:.4s}@keyframes blink{0%{opacity:0}50%{opacity:1}to{opacity:0}}.loader-wrapper.outgoing-call-loader{position:absolute;inset:0;z-index:100;display:flex;align-items:center;justify-content:center}.panel-loader-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#ffffffb3;display:flex;justify-content:center;align-items:center;z-index:10000009}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
2201
|
+
CallProgressComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CallProgressComponent, selector: "lib-call-progress", inputs: { callData: "callData", selectedCallerId: "selectedCallerId", newIncomingCallData: "newIncomingCallData", newIncomingCallsList: "newIncomingCallsList", callerIdList: "callerIdList", newCallConference: "newCallConference", missCallInfo: "missCallInfo", userSettingInfo: "userSettingInfo", deviceId: "deviceId", callAction: "callAction", conferenceCallInfo: "conferenceCallInfo", incomingFromImage: "incomingFromImage", outgoingContactName: "outgoingContactName" }, outputs: { endCallEvent: "endCallEvent", incomingCallsNewInfo: "incomingCallsNewInfo", minimiseEvent: "minimiseEvent", incomingCallInitiated: "incomingCallInitiated", isLoadershown: "isLoadershown", endIncomingCallEvent: "endIncomingCallEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex\">\r\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\r\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\r\n <div class=\"loader-wrapper outgoing-call-loader\"\r\n *ngIf=\"showNewCallLoader\">\r\n <div class=\"active-call\" style=\"display: flex; flex-direction: column; position: relative;\">\r\n <div class=\"call-animation call-animation-play\">\r\n <img class=\"avatar-img\" [src]=\"newCallLoaderData?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 style=\"margin-top: 8px;\">Connecting...</h1>\r\n <p style=\"text-transform: capitalize;\">{{ newCallLoaderData?.name || newCallLoaderData?.phone || 'Unknown' }}</p>\r\n </div>\r\n \r\n <div class=\"call-action-btns\">\r\n <div class=\"d-flex justify-content-center\">\r\n <button class=\"call-btn end-call-btn\" disabled (click)=\"endCall()\" style=\"visibility: hidden;\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\"\r\n [ngClass]=\"{\r\n 'conference-alert': isConference && currentCall?.isConference,\r\n 'normal-call-alert': !isConference\r\n }\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\"\r\n [ngClass]=\"callNumberToast.type\"\r\n role=\"alert\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"flex-grow-1 text-left\">\r\n You'r calling\r\n <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\"> Cancel Call </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- All type Call Hold list -->\r\n <div class=\"held-call-banner\"\r\n *ngIf=\"(currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)) || !isAllAccepted\">\r\n <ng-container *ngFor=\"let conf of currentCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"!conf?.isAcceptCall && currentCallList.length > 1 && deviceNumberList.includes(conf?.to) && conf?.isNotification\"\r\n [ngClass]=\"{'held-call-selected': selectedUserInfo?.participantId && selectedUserInfo?.participantId === conf?.participantId}\"\r\n (click)=\"conf?.businessNumber ? toggleC2CInfoPanel(conf) : null\"\r\n [ngStyle]=\"{'cursor': conf?.businessNumber ? 'pointer' : 'default'}\">\r\n <div class=\"held-info\">\r\n <div class=\"img\">\r\n <img class=\"avatar-img-wrapper border-radius-50\" [src]=\"conf?.img || 'assets/images/user.jpg'\" alt=\"\" width=\"35\" height=\"35\" />\r\n </div>\r\n <div class=\"held-caller\" *ngIf=\"!conf?.businessNumber\">\r\n <span class=\"held-label\">{{conf?.from}}</span>\r\n <span class=\"held-name\">{{conf?.fromName}}</span>\r\n </div>\r\n <div class=\"held-caller\" *ngIf=\"conf?.businessNumber\">\r\n <span class=\"held-main-label\">Call from C2C:</span>\r\n <span class=\"held-label\" ><span [title]=\"conf?.sourceName\">{{ truncateText(conf?.sourceName, 10) }}</span>|\r\n <span [title]=\"conf?.pointName\">{{ truncateText(conf?.pointName, 10) }}</span></span>\r\n <span class=\"held-label\">{{ truncateText(conf?.name, 26) }}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <ng-container *ngIf=\"isConnectingIncomingCallId == conf?.id\">\r\n <div class=\"connecting-wrapper mr-2\">\r\n <span class=\"ringing-text\">Connecting</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <button class=\"conference-hold-contact receive-btn\" (click)=\"waitingCallAccept(conf)\" [disabled]=\"isConnecting || isIncomingCallBtnDisable\" *ngIf=\"isConnectingIncomingCallId !== conf?.id\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n <button class=\"conference-contact\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\" (click)=\"onRejectCall(conf); $event.stopPropagation();\"> call_end </span>\r\n </button>\r\n <div *ngIf=\"conf?.businessNumber\" class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleC2CInfoPanel(conf)\">\r\n <i class=\"fa fa-info\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let conf of conferenceCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"conf?.isConferenceHold && conferenceCallList.length > 1\"\r\n [ngClass]=\"{'held-call-selected': conf?.isBusinessNumber && selectedUserInfo?.participantId === conf?.businessParticipantId && isClickExpand}\"\r\n (click)=\"conf?.isBusinessNumber ? toggleC2CInfoPanel(conf) : null\"\r\n [ngStyle]=\"{'cursor': conf?.isBusinessNumber ? 'pointer' : 'default'}\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">{{conf?.callLabel}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': conf?.isConferenceHold }\"\r\n (click)=\"swapCalls(conf,true)\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"conf?.isConferenceHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(conf); $event.stopPropagation();\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- For single incoming call -->\r\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\r\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall\">\r\n <!-- <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown Number'}}</span>\r\n </div> -->\r\n <div class=\"callToNum\">\r\n <ng-container *ngIf=\"currentCallList[0]?.businessNumber; else normalCall\">\r\n C2C CALL\r\n <br />\r\n <span> From : {{ currentCallList[0]?.sourceName }} | {{ currentCallList[0]?.pointName }} </span>\r\n </ng-container>\r\n\r\n <ng-template #normalCall>\r\n Incoming call on\r\n <br />\r\n <span>{{ currentCallList[0]?.to || 'Unknown Number' }}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"incomingFromImage || 'assets/images/user.jpg'\" alt=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\" *ngIf=\"!currentCallList[0]?.businessNumber\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n <div class=\"callerDetails\" *ngIf=\"currentCallList[0]?.businessNumber\">\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ truncateText(currentCallList[0]?.name, 45) }}</p>\r\n <p >{{ currentCallList[0]?.number }}</p>\r\n </div>\r\n <!-- Connecting overlay (shown after accept btn click, hidden on API response) -->\r\n <div class=\"connecting-overlay mt-auto\" *ngIf=\"isConnecting\">\r\n <div class=\"connecting-dots\">\r\n <span></span><span></span><span></span>\r\n </div>\r\n <p class=\"connecting-text\">Connecting...</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\" *ngIf=\"!isConnecting\">\r\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\"\r\n [disabled]=\"isIncomingCallBtnDisable\" (click)=\"add(currentCallList[0])\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n <button class=\"call-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onRejectCall(currentCallList[0])\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For single active call -->\r\n <div *ngIf=\"(!isConference || isConferenceCallHold) && (!!currentCall?.id && !currentCall?.isConference) && currentCall?.isAcceptCall\"\r\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\r\n <div *ngIf=\"selectedUserInfo?.businessNumber;\" class=\"callToNum\">\r\n C2C CALL\r\n <br />\r\n <span> From : {{ selectedUserInfo?.sourceName }} | {{ selectedUserInfo?.pointName }} </span>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" *ngIf=\"!currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.toImage || 'assets/images/user.jpg' : currentCall?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <img class=\"avatar-img\" *ngIf=\"currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.fromImage || 'assets/images/user.jpg' : currentCall?.toImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <!-- C2C Business Call -->\r\n <ng-container *ngIf=\"selectedUserInfo?.businessNumber; else normalCall\">\r\n <h1>{{ selectedUserInfo?.name }}</h1>\r\n <p>{{ selectedUserInfo?.number }}</p>\r\n </ng-container>\r\n\r\n <!-- Normal Call -->\r\n <ng-template #normalCall>\r\n <h1 *ngIf=\"!currentCall?.client\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0':'8px'}\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.toName || outgoingContactName || 'Unknown'\r\n : currentCall?.fromName || 'Unknown' }}\r\n </h1>\r\n <h1 *ngIf=\"currentCall?.client\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0':'8px'}\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.fromName || 'Unknown'\r\n : currentCall?.toName || 'Unknown' }}\r\n </h1>\r\n <p *ngIf=\"!currentCall?.client\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.to\r\n : currentCall?.from }}\r\n </p>\r\n <p *ngIf=\"currentCall?.client\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.from\r\n : currentCall?.to }}\r\n </p>\r\n </ng-template>\r\n <!-- <h1 *ngIf=\"!currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.toName || outgoingContactName || 'Unknown' :\r\n currentCall?.fromName || 'Unknown'}}</h1>\r\n <h1 *ngIf=\"currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.fromName || 'Unknown' :\r\n currentCall?.toName || 'Unknown'}}</h1>\r\n <p *ngIf=\"!currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.to || 'Unknown' : currentCall?.from || 'Unknown'}}</p>\r\n <p *ngIf=\"currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.from || 'Unknown' : currentCall?.to || 'Unknown'}}</p> -->\r\n <h4 style=\"margin-top: 4px\">{{ timer}}</h4>\r\n </div>\r\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording, 'disabled': userSettingInfo?.callRecording == 'N'}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"!currentCall?.isAcceptCall || userSettingInfo?.callRecording == 'N'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\" (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <!-- Mute/unmute incoming call -->\r\n <div class=\"mute-incoming-row\" *ngIf=\"currentCall?.isAcceptCall && !showKeypad\">\r\n <span class=\"mute-incoming-label\">Mute incoming calls</span>\r\n <label class=\"switch mb-0\" title=\"Silence the ringtone of new incoming calls during this call\">\r\n <input type=\"checkbox\" [checked]=\"twilioService.isIncomingMuted\" (change)=\"toggleMuteIncomingCall()\">\r\n <span class=\"switch-slider\"></span>\r\n </label>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\r\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"toggleMute()\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\r\n </span>\r\n </button>\r\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n <div>\r\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- conference call view -->\r\n <div class=\"conference-call-view\" *ngIf=\"isConference\">\r\n <div class=\"conf-heading\">\r\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\r\n <span class=\"conf-title\">Conference Call</span>\r\n </div>\r\n <div class=\"scroll-container\">\r\n <div class=\"scroll-text conf-name\">\r\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\r\n <ng-container *ngIf=\"!call?.isConferenceHold\">\r\n <span *ngIf=\"shouldShowSeparator(i)\"> & </span>\r\n <span *ngIf=\"call?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(call) else selfNumber\">\r\n <span>{{call?.direction == 'outgoing-call' ? call?.fromName || call?.from :\r\n call?.toName || call?.to}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </span>\r\n <span *ngIf=\"!call?.client\">{{call?.direction == \"outgoing-call\" ? call?.toName || call?.to : call?.fromName || call?.from || 'Unknown number'}}</span>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"conf-timer\">{{ currentConferenceCall?.timer || timer }}</div>\r\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\" >\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\" [disabled]=\"userSettingInfo.callRecording == 'N'\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording, 'disabled': userSettingInfo?.callRecording == 'N'}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\" (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <!-- Mute/unmute incoming call -->\r\n <div class=\"mute-incoming-row\" *ngIf=\"currentCall?.isAcceptCall && !showKeypad\">\r\n <span class=\"mute-incoming-label\">Mute incoming calls</span>\r\n <label class=\"switch mb-0\" title=\"Silence the ringtone of new incoming calls during this call\">\r\n <input type=\"checkbox\" [checked]=\"twilioService.isIncomingMuted\" (change)=\"toggleMuteIncomingCall()\">\r\n <span class=\"switch-slider\"></span>\r\n </label>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n <div class=\"conf-actions\">\r\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\r\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\r\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall(currentConferenceCall?.participants[0])\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-- Incoming call user details shown in model -->\r\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\r\n <div class=\"close-info-panel-section\">\r\n <div class=\"d-flex justify-content-between\" *ngIf=\"currentConferenceCall?.conferenceId != selectedUserInfo?.conferenceId && newIncomingCallsList?.length > 1\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn \" (click)=\"onCloseC2CInfoPanel()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#ffffff\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"mb-2 user-info-section\">\r\n <div class=\"text-center my-3\">\r\n <h3 class=\"text-white\">C2C CALL : {{selectedUserInfo?.sourceName}} | {{selectedUserInfo?.pointName}}</h3>\r\n </div>\r\n <div class=\"mb-3\">\r\n <h5 class=\"text-white mb-1\">Name:</h5>\r\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\r\n </div>\r\n <div class=\"f-13\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Extension:</div>\r\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Number:</div>\r\n <div class=\"\">{{selectedUserInfo?.number}}</div>\r\n </div> \r\n </div>\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Email: </div>\r\n <div>{{selectedUserInfo?.email}}</div>\r\n </div>\r\n </div>\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Subject:</div>\r\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">\r\n {{selectedUserInfo?.subject}}</div>\r\n </div>\r\n </div>\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2 mb-1\">Image:</div>\r\n <div class=\"text-ellipsis\">\r\n <ng-container\r\n *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\r\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\" />\r\n </ng-container>\r\n <ng-template #noImage>\r\n <span class=\"ml-2\">No Image Available</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\" mb-4\">\r\n <div class=\"\">\r\n <div class=\"mb-1\">Message:</div>\r\n <div>\r\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}\r\n </div>\r\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See\r\n less' : 'See more' }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- contact list panel -->\r\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel && !showNewCallLoader\">\r\n <div class=\"panel-loader-overlay p-3 text-center\" *ngIf=\"isParticipantPanelLoading\">\r\n <div class=\"spinner-border text-secondary\" role=\"status\">\r\n <span class=\"sr-only\">Loading...</span>\r\n </div>\r\n <p class=\"mt-2\"></p>\r\n </div>\r\n <div class=\"contacts-header\">\r\n <div>\r\n <ng-container *ngIf=\"totalParticipantsCount < 3; else confHeading\">\r\n Call Participants\r\n </ng-container>\r\n <ng-template #confHeading>\r\n {{ selectedConfName || 'Conference' }} Participants\r\n </ng-template>\r\n </div>\r\n <div class=\"d-flex justify-content-between\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel({}, true)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\r\n <div class=\"search-bar p-3 position-relative\">\r\n <input type=\"text\" placeholder=\"Add a participant by Name or Number\" title=\"Add a participant by Name or Number\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\r\n <div class=\"search-contacts-list\">\r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"searchText\">\r\n <img class=\"contact-avatar\" [src]=\"c?.image || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number) }}{{ c?.numbersList[0]?.numberLabel ? ' (' + c.numbersList[0].numberLabel + ')' : '' }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(c)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"Add to call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(c?.numbersList[0]?.number, true)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filteredList.length && isDirectCallOptionShow && searchText\">\r\n <div class=\"contact-item\">\r\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-title\">{{ searchText }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"CallToUnsavedNumber(searchText)\"\r\n title=\"Add to call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(searchText, true)\"\r\n title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"contacts-list\">\r\n <div class=\"px-2\">\r\n <h5 class=\"mb-0 title\">Active participants ({{ activeParticipantsCount }})</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"!c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || 'Unknown'}}</div>\r\n\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(c) else selfNumber\">\r\n <span>{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' : c?.toName || 'Unknown'}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"c?.joined && !c?.host\">\r\n <div class=\"connecting-wrapper mr-2\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!c?.joined || c?.host\">\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.isHold\" (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.isHold }\"\r\n (click)=\"onHoldCall(c)\" *ngIf=\"!c?.host\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"!c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Hold'\"> phone_paused</span>\r\n <span *ngIf=\"c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </span>\r\n </button>\r\n </ng-container>\r\n <button class=\"conference-contact\" (click)=\"confirmLeaveParticipant(c)\"\r\n *ngIf=\"!c?.host\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(c)\"\r\n *ngIf=\"c?.host && (deviceNumberList.includes(c?.from) || (deviceNumberList.includes(c?.to) && c?.direction == 'incoming-call'))\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <hr class=\"m-2\">\r\n <div class=\"mt-3 px-2\">\r\n <h5 class=\"mb-0 title\">Participant added to the call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || 'Unknown'}}</div>\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' : c?.toName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <div class=\"connecting-wrapper\" *ngIf=\"c?.joined\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\" *ngIf=\"!c?.host && c?.joined\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"!c?.client && !c?.joined && !c?.businessNumber\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.to : c?.from, false, { skipDuplicateCheck: true })\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"c?.client && !c?.joined && !c?.businessNumber\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.from : c?.to, false, { skipDuplicateCheck: true })\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Conference Warning Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showConferenceWarningModal\">\r\n <div class=\"modal-content warning-modal\">\r\n <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">warning</span>\r\n </div>\r\n <h3>Conference Call Warning</h3>\r\n <p>\r\n Starting a new call will put the current conference on hold\r\n and cannot be merged later.\r\n </p>\r\n <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelNewCall()\">\r\n Cancel\r\n </button>\r\n <button class=\"proceed-btn\" (click)=\"confirmNewCall()\">\r\n Proceed\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n\r\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\r\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\r\n <div style=\"display: flex; width: 100%\">\r\n <div>\r\n <div class=\"min-call-animation\" id=\"call-avatar\">\r\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"min-callerDetails\">\r\n <div class=\"name\">\r\n {{callData.name}}\r\n </div>\r\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"min-btn-container\">\r\n <div class=\"min-timer\">{{timer}}</div>\r\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n</div>\r\n<!-- Call Disconnect Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showDisconnectModal\">\r\n <div class=\"modal-content p-3\">\r\n <div class=\"contacts-header p-0 pb-2\">\r\n <h4 class=\"title mb-0\">{{selectedConf?.conName || 'Call'}} Disconnect</h4>\r\n <div class=\"d-flex justify-content-between\">\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDisconnectModal = false\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"contant-body mb-2\">\r\n <p class=\"mt-2\">\r\n Exiting this call will not end the conference. The session will continue, and charges will incur to\r\n your\r\n account.\r\n </p>\r\n </div>\r\n <div class=\"button-group\">\r\n <div class=\"text-start d-flex align-items-center\">\r\n <label class=\"d-flex align-items-center mb-0 mr-2\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isReasonChecked\" (ngModelChange)=\"onReasonCheckChanged($event)\" class=\"me-2\"/>\r\n </label>\r\n <div class=\"time-picker-24hr\">\r\n <!-- Hour picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleHourDropdown()\">\r\n {{ leaveHour || 'HH' }}\r\n <span class=\"picker-arrow\">▼</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showHourDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let h of hours\"\r\n [class.selected]=\"leaveHour === h\"\r\n (click)=\"selectHour(h)\">{{ h }}</div>\r\n </div>\r\n </div>\r\n <span class=\"time-sep\">:</span>\r\n <!-- Minute picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleMinuteDropdown()\">\r\n {{ leaveMinute || 'MM' }}\r\n <span class=\"picker-arrow\">▼</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showMinuteDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let m of minutes\"\r\n [class.selected]=\"leaveMinute === m\"\r\n (click)=\"selectMinute(m)\">{{ m }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button class=\"btn end-btn\" (click)=\"leaveConference()\" [disabled]=\"isReasonChecked && (!leaveHour || !leaveMinute)\">\r\n Leave\r\n </button>\r\n <button class=\"btn end-btn\" (click)=\"endConference()\" *ngIf=\"showEndAllButton\">\r\n End All\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"custom-modal\" *ngIf=\"showLeaveConfirmationModal\">\r\n <div class=\"modal-content warning-modal\">\r\n <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">info</span>\r\n </div>\r\n <h3>Leave Conference</h3>\r\n <p>\r\n You are about to leave <strong>{{ leaveConfConferenceName }}</strong>. \r\n Are you sure?\r\n </p>\r\n <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelLeave()\">Cancel</button>\r\n <button class=\"proceed-btn\" (click)=\"confirmLeave()\">Leave</button>\r\n </div>\r\n </div>\r\n</div>", styles: [".call-container{width:385px;height:646px!important;margin:auto;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;justify-content:center;align-items:center;z-index:1000;flex-flow:column;overflow-x:hidden;overflow-y:visible}.disabled{opacity:.5!important;pointer-events:none!important}.call-to-text{padding:6px 10px;border:1px solid #c2c2c2;border-radius:20px;font-size:13px}.collops{height:660px!important}.incoming-call-container{flex-flow:row!important}.active-call{width:385px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.call-info-wrapper{height:20px;overflow-y:auto;background:white;transition:height 1s}.open-collops{height:180px!important}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.search-bar input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;outline:none}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}.callerDetails h1{width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:12px 0 0;color:#fff;text-transform:capitalize;text-align:center}.callerDetails h4{margin:0;color:#fff}.tx-black,.title{color:#000!important}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:0;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 6px;border-bottom:1px dotted #4b4b4b;border-left:3px solid transparent;transition:background .15s ease,border-left-color .15s ease;cursor:pointer}.held-call-content.held-call-selected{background:rgba(255,255,255,.15);border-left-color:#fff;border-radius:0 6px 6px 0}.held-main-label{font-size:13px;color:#fff;text-transform:uppercase;letter-spacing:.5px}.fa-info{font-size:smaller!important}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.modal-content .contacts-header{height:40px}.search-contacts-list{max-height:196px;overflow:auto;position:absolute;width:91%;background:white;z-index:1000;box-shadow:0 4px 8px #0003,0 6px 20px #00000030;border-radius:0 10px 10px}.contant-body p{font-size:14px;color:#5f6061}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.disabled{opacity:.5;pointer-events:none}.contacts-list{padding:8px 8px 12px;overflow-y:auto}.contact-item{display:flex;align-items:center;padding:10px 8px;border-radius:10px}.contact-item:hover{background:#f7f9fc}.contact-avatar{width:37px;height:37px;border-radius:50%;object-fit:cover;margin-right:12px}.contact-info{flex:1;min-width:0;overflow:hidden}.contact-name{font-weight:600;color:#111827;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.contact-title{font-size:12px;color:#6b7280}.contact-call-btn{display:inline-flex;align-items:center;gap:6px;background:#234de8;color:#fff;border:none;border-radius:16px;padding:8px;cursor:pointer}.contact-add-btn{background-color:#2ecc71!important}.conference-hold-contact{display:inline-flex;align-items:center;gap:5px;background:#727070;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.conference-hold-contact.on-hold{background:#28a745!important;color:#fff}.user-info-section{width:100%;height:100%;overflow-y:auto;overflow-x:hidden!important}.user-info-section::-webkit-scrollbar{display:none}.toggle-btn{cursor:pointer}.text-container{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s ease}.mute-incoming-row{display:flex;align-items:center;justify-content:center;gap:8px;margin:0 0 10px}.mute-incoming-label{font-size:11px;color:#fff}.switch{position:relative;display:inline-block;width:38px;height:19px;flex-shrink:0}.switch input{opacity:0;width:0;height:0}.switch-slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;border-radius:22px;transition:.3s}.close-info-panel-section{width:100%;height:20px}.close-info-panel-section .material-symbols-outlined{font-size:12px;cursor:pointer}.c2c-title{color:#fff;white-space:normal;word-break:break-word;line-height:1.4}.switch-slider:before{content:\"\";position:absolute;height:14px;width:15px;left:3px;bottom:3px;background-color:#fff;border-radius:50%;transition:.3s}.switch input:checked+.switch-slider{background-color:#2ecc71}.switch input:checked+.switch-slider:before{transform:translate(18px)}.text-container.expanded{-webkit-line-clamp:unset}.userName{font-family:FontAwesome}.subject-text{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.conference-contact{display:inline-flex;align-items:center;gap:5px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.organizer-label{padding:1px 5px;font-size:11px;border-radius:10px;border:1px solid #a0a0a0;margin-top:2px;background:#fcfcfc;color:#000}.custom-modal{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;align-items:center;z-index:10000001;border-radius:21px}.modal-content{background:#ffffff;padding:25px;border-radius:8px;width:350px;text-align:center}.title{margin-bottom:15px;color:#d9534f}.message{margin-bottom:20px}.button-group{display:flex;justify-content:space-between}.btn{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-weight:500}.end-btn{background-color:#dc3545;color:#fff;display:flex;align-items:center;font-size:13px}.leave-btn{background-color:#007bff;color:#fff}.contact-call-btn .material-symbols-outlined{font-size:18px;color:#fff}.contact-call-btn .label{font-size:12px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}app-incoming-call{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1001}.min-call-container{width:320px;height:124px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;flex-direction:column;box-sizing:border-box;position:relative;overflow:hidden;margin:auto;align-items:center;padding:12px 16px;color:#fff}.min-call-animation{background:#fff;width:48px;height:48px;position:relative;margin:0 12px 0 auto;border-radius:100%;border:solid 2px #fff}.min-avatar-img{width:46px;height:46px;border-radius:100%;position:absolute;left:0;top:0}.border-radius-50{border-radius:50%}.min-callerDetails{color:#fff;display:flex;flex-direction:column;align-items:flex-start}.name{width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:20px;margin:0;color:#fff}.min-callerDetails p{margin:0;color:#fff}.min-btn-container{position:relative;display:flex;width:100%;justify-content:flex-start;align-items:center;margin-top:6px}.min-call-sec-btn{width:40px;height:40px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:20px;display:flex;align-items:center;justify-content:center;margin-right:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.min-call-sec-btn span{color:#cccbcb}.min-call-btn{width:40px;height:40px;border-radius:20px;box-sizing:border-box;border:2px solid white;display:flex;align-items:center;justify-content:center}.fullscreen{position:absolute;right:18px;top:14px;color:#e8e8e8;font-size:18px;cursor:pointer}.btn-container{display:flex;flex-wrap:wrap;padding:0 24px}.dial-btn{width:40px;height:40px;background-color:transparent;text-align:center;box-sizing:border-box;margin:4px 25px;font-size:24px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#b5b5b5;cursor:pointer}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.min-timer{width:50px;font-size:18px;margin-right:10px;border-radius:4px;height:35px;display:flex;align-items:center}.record-action-btns{display:flex;flex-direction:column;align-items:center;margin-top:35px}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 5px;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;margin-top:10px}.record-btn.pause-resume{border:none;border-radius:50%;width:50px;height:50px;background:white;display:flex;align-items:center;justify-content:center;margin:5px 0}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.conference-call-view{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:100%;padding:12px 16px 35px;color:#fff;height:100%}.conf-heading{display:flex;align-items:center;gap:8px;margin-top:45px}.conf-icon{color:#4579aa;font-size:32px;width:50px;height:50px;border:1px solid gray;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e1e1e1}.conf-title{font-weight:600;font-size:20px}.conf-name{margin-top:10px;font-size:17px;font-weight:600;text-align:center}.conf-timer{margin-top:4px;font-size:12px;opacity:.9}.conf-record{margin-top:14px}.record-stop-btn{width:44px;height:44px;border-radius:50%;border:none;background:#fff;display:flex;align-items:center;justify-content:center}.record-stop-btn .material-symbols-outlined{color:#e14e4e;font-size:28px}.conf-remove{margin-top:8px}.remove-btn{background:#ff0000!important;color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:12px;width:82px!important;height:auto}.conf-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:18px}.circle-btn{width:56px;height:56px;border-radius:50%;border:none;background:#000;display:flex;align-items:center;justify-content:center}.circle-btn .material-symbols-outlined{color:#fff;font-size:24px}.circle-btn.active{opacity:.85}.conf-end{margin-top:16px}.circle-btn.danger{background:#e14e4e}.circle-btn.danger .material-symbols-outlined{color:#fff}.warning-modal{background:white;width:360px;border-radius:18px;padding:24px;text-align:center;box-shadow:0 10px 30px #00000040}.warning-icon{margin-bottom:12px}.warning-icon .material-symbols-outlined{font-size:48px;color:#f59e0b}.warning-modal h3{margin-bottom:12px;font-size:20px;font-weight:600}.warning-modal p{color:#555;font-size:14px;line-height:1.5;margin-bottom:24px}.warning-actions{display:flex;justify-content:center;gap:12px}.cancel-btn,.proceed-btn{border:none;padding:10px 18px;border-radius:8px;cursor:pointer;font-weight:600}.cancel-btn{background:#e5e7eb;color:#111827}.proceed-btn{background:#234de8;color:#fff}.time-picker-24hr{display:flex;align-items:center;gap:4px}.time-sep{font-weight:700;font-size:16px;color:#333}.custom-time-select{position:relative;width:58px;-webkit-user-select:none;user-select:none}.custom-time-select.disabled-picker{opacity:.45;pointer-events:none}.custom-time-display{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;border:1px solid #ced4da;border-radius:4px;background:#fff;font-size:13px;cursor:pointer;white-space:nowrap}.custom-time-display:hover{border-color:#234de8}.picker-arrow{font-size:9px;margin-left:4px;color:#666}.custom-time-options{position:fixed;background:#fff;border:1px solid #ced4da;border-radius:4px;max-height:160px;overflow-y:auto;z-index:99999999;min-width:58px;box-shadow:0 4px 12px #00000026}.custom-time-option{padding:5px 10px;font-size:13px;cursor:pointer;text-align:center}.custom-time-option:hover{background:#e8eeff;color:#234de8}.custom-time-option.selected{background:#234de8;color:#fff;font-weight:600}.dialpad-alerts{position:absolute;left:50%;transform:translate(-50%);width:calc(100% - 32px);z-index:9999999}.normal-call-alert{top:78px}.conference-alert{top:145px}.dialbox-pop1{background:#dff6dd!important;color:#1d4d1d!important;border-radius:10px;padding:10px 14px;font-size:14px;box-shadow:0 4px 12px #00000040;border:1px solid #b7dfc3}.btn-disc{border:none;background:transparent;color:#6b7280!important;font-size:13px;font-weight:500}.connecting-overlay{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:16px 0 24px}.connecting-text{color:#ffffffe6;font-size:15px;font-weight:500;letter-spacing:.5px;margin:0}.connecting-dots{display:flex;gap:8px;align-items:center}.connecting-dots span{display:inline-block;width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.85);animation:connecting-bounce 1.2s infinite ease-in-out}.connecting-dots span:nth-child(1){animation-delay:0s}.connecting-dots span:nth-child(2){animation-delay:.2s}.connecting-dots span:nth-child(3){animation-delay:.4s}@keyframes connecting-bounce{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1.2);opacity:1}}.connecting-wrapper{display:flex;align-items:center;font-size:13px;color:#4caf50;margin-top:4px;font-weight:500}.ringing-text{margin-right:2px;font-size:11px}.held-actions .connecting-wrapper{color:#fff}.dots span{animation:blink 1.4s infinite;opacity:0;font-size:16px}.dots span:nth-child(1){animation-delay:0s}.dots span:nth-child(2){animation-delay:.2s}.dots span:nth-child(3){animation-delay:.4s}@keyframes blink{0%{opacity:0}50%{opacity:1}to{opacity:0}}.loader-wrapper.outgoing-call-loader{position:absolute;inset:0;z-index:100;display:flex;align-items:center;justify-content:center}.panel-loader-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#ffffffb3;display:flex;justify-content:center;align-items:center;z-index:10000009}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
2189
2202
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CallProgressComponent, decorators: [{
|
|
2190
2203
|
type: Component,
|
|
2191
|
-
args: [{ selector: 'lib-call-progress', template: "<div class=\"d-flex\">\r\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\r\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\r\n <div class=\"loader-wrapper outgoing-call-loader\"\r\n *ngIf=\"showNewCallLoader\">\r\n <div class=\"active-call\" style=\"display: flex; flex-direction: column; position: relative;\">\r\n <div class=\"call-animation call-animation-play\">\r\n <img class=\"avatar-img\" [src]=\"newCallLoaderData?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 style=\"margin-top: 8px;\">Connecting...</h1>\r\n <p style=\"text-transform: capitalize;\">{{ newCallLoaderData?.name || newCallLoaderData?.phone || 'Unknown' }}</p>\r\n </div>\r\n \r\n <div class=\"call-action-btns\">\r\n <div class=\"d-flex justify-content-center\">\r\n <button class=\"call-btn end-call-btn\" disabled (click)=\"endCall()\" style=\"visibility: hidden;\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\"\r\n [ngClass]=\"{\r\n 'conference-alert': isConference && currentCall?.isConference,\r\n 'normal-call-alert': !isConference\r\n }\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\"\r\n [ngClass]=\"callNumberToast.type\"\r\n role=\"alert\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"flex-grow-1 text-left\">\r\n You'r calling\r\n <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\"> Cancel Call </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- All type Call Hold list -->\r\n <div class=\"held-call-banner\"\r\n *ngIf=\"(currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)) || !isAllAccepted\">\r\n <ng-container *ngFor=\"let conf of currentCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"!conf?.isAcceptCall && currentCallList.length > 1 && deviceNumberList.includes(conf?.to) && conf?.isNotification\"\r\n [ngClass]=\"{'held-call-selected': selectedUserInfo?.participantId && selectedUserInfo?.participantId === conf?.participantId}\"\r\n (click)=\"conf?.businessNumber ? toggleC2CInfoPanel(conf) : null\"\r\n [ngStyle]=\"{'cursor': conf?.businessNumber ? 'pointer' : 'default'}\">\r\n <div class=\"held-info\">\r\n <div class=\"img\">\r\n <img class=\"avatar-img-wrapper border-radius-50\" [src]=\"conf?.img || 'assets/images/user.jpg'\" alt=\"\" width=\"35\" height=\"35\" />\r\n </div>\r\n <div class=\"held-caller\" *ngIf=\"!conf?.businessNumber\">\r\n <span class=\"held-label\">{{conf?.from}}</span>\r\n <span class=\"held-name\">{{conf?.fromName}}</span>\r\n </div>\r\n <div class=\"held-caller\" *ngIf=\"conf?.businessNumber\">\r\n <span class=\"held-main-label\">Call from C2C:</span>\r\n <span class=\"held-label\" ><span [title]=\"conf?.sourceName\">{{ truncateText(conf?.sourceName, 10) }}</span>|\r\n <span [title]=\"conf?.pointName\">{{ truncateText(conf?.pointName, 10) }}</span></span>\r\n <span class=\"held-label\">{{ truncateText(conf?.name, 26) }}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact receive-btn\" (click)=\"waitingCallAccept(conf); $event.stopPropagation();\" [disabled]=\"isConnecting || isIncomingCallBtnDisable\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n <button class=\"conference-contact\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\" (click)=\"onRejectCall(conf); $event.stopPropagation();\"> call_end </span>\r\n </button>\r\n <div *ngIf=\"conf?.businessNumber\" class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleC2CInfoPanel(conf)\">\r\n <i class=\"fa fa-info\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let conf of conferenceCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"conf?.isConferenceHold && conferenceCallList.length > 1\"\r\n [ngClass]=\"{'held-call-selected': conf?.isBusinessNumber && selectedUserInfo?.participantId === conf?.businessParticipantId}\"\r\n (click)=\"conf?.isBusinessNumber ? toggleC2CInfoPanel(conf) : null\"\r\n [ngStyle]=\"{'cursor': conf?.isBusinessNumber ? 'pointer' : 'default'}\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">{{conf?.callLabel}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': conf?.isConferenceHold }\"\r\n (click)=\"swapCalls(conf,true)\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"conf?.isConferenceHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(conf)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- For single incoming call -->\r\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\r\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall\">\r\n <!-- <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown Number'}}</span>\r\n </div> -->\r\n <div class=\"callToNum\">\r\n <ng-container *ngIf=\"currentCallList[0]?.businessNumber; else normalCall\">\r\n C2C CALL\r\n <br />\r\n <span> From : {{ currentCallList[0]?.sourceName }} | {{ currentCallList[0]?.pointName }} </span>\r\n </ng-container>\r\n\r\n <ng-template #normalCall>\r\n Incoming call on\r\n <br />\r\n <span>{{ currentCallList[0]?.to || 'Unknown Number' }}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"incomingFromImage || 'assets/images/user.jpg'\" alt=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\" *ngIf=\"!currentCallList[0]?.businessNumber\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n <div class=\"callerDetails\" *ngIf=\"currentCallList[0]?.businessNumber\">\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ truncateText(currentCallList[0]?.name, 45) }}</p>\r\n <p >{{ currentCallList[0]?.number }}</p>\r\n </div>\r\n <!-- Connecting overlay (shown after accept btn click, hidden on API response) -->\r\n <div class=\"connecting-overlay mt-auto\" *ngIf=\"isConnecting\">\r\n <div class=\"connecting-dots\">\r\n <span></span><span></span><span></span>\r\n </div>\r\n <p class=\"connecting-text\">Connecting...</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\" *ngIf=\"!isConnecting\">\r\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\"\r\n [disabled]=\"isIncomingCallBtnDisable\" (click)=\"add(currentCallList[0])\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n <button class=\"call-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onRejectCall(currentCallList[0])\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For single active call -->\r\n <div *ngIf=\"(!isConference || isConferenceCallHold) && (!!currentCall?.id && !currentCall?.isConference) && currentCall?.isAcceptCall\"\r\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\r\n <div *ngIf=\"selectedUserInfo?.businessNumber;\" class=\"callToNum\">\r\n C2C CALL\r\n <br />\r\n <span> From : {{ selectedUserInfo?.sourceName }} | {{ selectedUserInfo?.pointName }} </span>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" *ngIf=\"!currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.toImage || 'assets/images/user.jpg' : currentCall?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <img class=\"avatar-img\" *ngIf=\"currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.fromImage || 'assets/images/user.jpg' : currentCall?.toImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <!-- C2C Business Call -->\r\n <ng-container *ngIf=\"selectedUserInfo?.businessNumber; else normalCall\">\r\n <h1>{{ selectedUserInfo?.name }}</h1>\r\n <p>{{ selectedUserInfo?.number }}</p>\r\n </ng-container>\r\n\r\n <!-- Normal Call -->\r\n <ng-template #normalCall>\r\n <h1 *ngIf=\"!currentCall?.client\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0':'8px'}\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.toName || outgoingContactName || 'Unknown'\r\n : currentCall?.fromName || 'Unknown' }}\r\n </h1>\r\n <h1 *ngIf=\"currentCall?.client\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0':'8px'}\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.fromName || 'Unknown'\r\n : currentCall?.toName || 'Unknown' }}\r\n </h1>\r\n <p *ngIf=\"!currentCall?.client\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.to\r\n : currentCall?.from }}\r\n </p>\r\n <p *ngIf=\"currentCall?.client\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.from\r\n : currentCall?.to }}\r\n </p>\r\n </ng-template>\r\n <!-- <h1 *ngIf=\"!currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.toName || outgoingContactName || 'Unknown' :\r\n currentCall?.fromName || 'Unknown'}}</h1>\r\n <h1 *ngIf=\"currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.fromName || 'Unknown' :\r\n currentCall?.toName || 'Unknown'}}</h1>\r\n <p *ngIf=\"!currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.to || 'Unknown' : currentCall?.from || 'Unknown'}}</p>\r\n <p *ngIf=\"currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.from || 'Unknown' : currentCall?.to || 'Unknown'}}</p> -->\r\n <h4 style=\"margin-top: 4px\">{{ timer}}</h4>\r\n </div>\r\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording, 'disabled': userSettingInfo?.callRecording == 'N'}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"!currentCall?.isAcceptCall || userSettingInfo?.callRecording == 'N'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\" (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <!-- Mute/unmute incoming call -->\r\n <div class=\"mute-incoming-row\" *ngIf=\"currentCall?.isAcceptCall && !showKeypad\">\r\n <span class=\"mute-incoming-label\">Mute incoming calls</span>\r\n <label class=\"switch mb-0\" title=\"Silence the ringtone of new incoming calls during this call\">\r\n <input type=\"checkbox\" [checked]=\"twilioService.isIncomingMuted\" (change)=\"toggleMuteIncomingCall()\">\r\n <span class=\"switch-slider\"></span>\r\n </label>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\r\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"toggleMute()\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\r\n </span>\r\n </button>\r\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n <div>\r\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- conference call view -->\r\n <div class=\"conference-call-view\" *ngIf=\"isConference\">\r\n <div class=\"conf-heading\">\r\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\r\n <span class=\"conf-title\">Conference Call</span>\r\n </div>\r\n <div class=\"scroll-container\">\r\n <div class=\"scroll-text conf-name\">\r\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\r\n <ng-container *ngIf=\"!call?.isConferenceHold\">\r\n <span *ngIf=\"shouldShowSeparator(i)\"> & </span>\r\n <span *ngIf=\"call?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(call) else selfNumber\">\r\n <span>{{call?.direction == 'outgoing-call' ? call?.fromName || call?.from :\r\n call?.toName || call?.to}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </span>\r\n <span *ngIf=\"!call?.client\">{{call?.direction == \"outgoing-call\" ? call?.toName || call?.to : call?.fromName || call?.from || 'Unknown number'}}</span>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"conf-timer\">{{ currentConferenceCall?.timer || timer }}</div>\r\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\" >\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\" [disabled]=\"userSettingInfo.callRecording == 'N'\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording, 'disabled': userSettingInfo?.callRecording == 'N'}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\" (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <!-- Mute/unmute incoming call -->\r\n <div class=\"mute-incoming-row\" *ngIf=\"currentCall?.isAcceptCall && !showKeypad\">\r\n <span class=\"mute-incoming-label\">Mute incoming calls</span>\r\n <label class=\"switch mb-0\" title=\"Silence the ringtone of new incoming calls during this call\">\r\n <input type=\"checkbox\" [checked]=\"twilioService.isIncomingMuted\" (change)=\"toggleMuteIncomingCall()\">\r\n <span class=\"switch-slider\"></span>\r\n </label>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n <div class=\"conf-actions\">\r\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\r\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\r\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall(currentConferenceCall?.participants[0])\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-- Incoming call user details shown in model -->\r\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\r\n <div class=\"close-info-panel-section\">\r\n <div class=\"d-flex justify-content-between\" *ngIf=\"currentConferenceCall?.conferenceId != selectedUserInfo?.conferenceId && newIncomingCallsList?.length > 1\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn \" (click)=\"onCloseC2CInfoPanel()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#ffffff\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"mb-2 user-info-section\">\r\n <div class=\"text-center my-3\">\r\n <h3 class=\"text-white\">C2C CALL : {{selectedUserInfo?.sourceName}} | {{selectedUserInfo?.pointName}}</h3>\r\n </div>\r\n <div class=\"mb-3\">\r\n <h5 class=\"text-white mb-1\">Name:</h5>\r\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\r\n </div>\r\n <div class=\"f-13\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Extension:</div>\r\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Number:</div>\r\n <div class=\"\">{{selectedUserInfo?.number}}</div>\r\n </div> \r\n </div>\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Email: </div>\r\n <div>{{selectedUserInfo?.email}}</div>\r\n </div>\r\n </div>\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Subject:</div>\r\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">\r\n {{selectedUserInfo?.subject}}</div>\r\n </div>\r\n </div>\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2 mb-1\">Image:</div>\r\n <div class=\"text-ellipsis\">\r\n <ng-container\r\n *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\r\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\" />\r\n </ng-container>\r\n <ng-template #noImage>\r\n <span class=\"ml-2\">No Image Available</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\" mb-4\">\r\n <div class=\"\">\r\n <div class=\"mb-1\">Message:</div>\r\n <div>\r\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}\r\n </div>\r\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See\r\n less' : 'See more' }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- contact list panel -->\r\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel && !showNewCallLoader\">\r\n <div class=\"panel-loader-overlay p-3 text-center\" *ngIf=\"isParticipantPanelLoading\">\r\n <div class=\"spinner-border text-secondary\" role=\"status\">\r\n <span class=\"sr-only\">Loading...</span>\r\n </div>\r\n <p class=\"mt-2\"></p>\r\n </div>\r\n <div class=\"contacts-header\">\r\n <div>Participants</div>\r\n <div class=\"d-flex justify-content-between\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel({}, true)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\r\n <div class=\"search-bar p-3 position-relative\">\r\n <input type=\"text\" placeholder=\"Search by name or phone number\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\r\n <div class=\"search-contacts-list\">\r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"searchText\">\r\n <img class=\"contact-avatar\" [src]=\"c?.image || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number) }}{{ c?.numbersList[0]?.numberLabel ? ' (' + c.numbersList[0].numberLabel + ')' : '' }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(c)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"Add to call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(c?.numbersList[0]?.number, true)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filteredList.length && isDirectCallOptionShow && searchText\">\r\n <div class=\"contact-item\">\r\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-title\">{{ searchText }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"CallToUnsavedNumber(searchText)\"\r\n title=\"Add to call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(searchText, true)\"\r\n title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"contacts-list\">\r\n <div class=\"px-2\">\r\n <h5 class=\"mb-0 title\" *ngIf=\"totalParticipantsCount >= 3\">\r\n {{selectedConfName}}'s active participants ({{activeParticipantsCount}})\r\n </h5>\r\n <h5 class=\"mb-0 title\" *ngIf=\"totalParticipantsCount < 3\">\r\n Active participants ({{activeParticipantsCount}})\r\n </h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"!c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || 'Unknown'}}</div>\r\n\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(c) else selfNumber\">\r\n <span>{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' : c?.toName || 'Unknown'}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"c?.joined && !c?.host\">\r\n <div class=\"connecting-wrapper mr-2\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!c?.joined || c?.host\">\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.isHold\" (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.isHold }\"\r\n (click)=\"onHoldCall(c)\" *ngIf=\"!c?.host\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"!c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Hold'\"> phone_paused</span>\r\n <span *ngIf=\"c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </span>\r\n </button>\r\n </ng-container>\r\n <button class=\"conference-contact\" (click)=\"confirmLeaveParticipant(c)\"\r\n *ngIf=\"!c?.host\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(c)\"\r\n *ngIf=\"c?.host && (deviceNumberList.includes(c?.from) || (deviceNumberList.includes(c?.to) && c?.direction == 'incoming-call'))\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <hr class=\"m-2\">\r\n <div class=\"mt-3 px-2\">\r\n <h5 class=\"mb-0 title\">Participant added to the call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || 'Unknown'}}</div>\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' : c?.toName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <div class=\"connecting-wrapper\" *ngIf=\"c?.joined\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\" *ngIf=\"!c?.host && c?.joined\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"!c?.client && !c?.joined && !c?.businessNumber\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.to : c?.from, false, { skipDuplicateCheck: true })\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"c?.client && !c?.joined && !c?.businessNumber\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.from : c?.to, false, { skipDuplicateCheck: true })\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Conference Warning Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showConferenceWarningModal\">\r\n <div class=\"modal-content warning-modal\">\r\n <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">warning</span>\r\n </div>\r\n <h3>Conference Call Warning</h3>\r\n <p>\r\n Starting a new call will put the current conference on hold\r\n and cannot be merged later.\r\n </p>\r\n <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelNewCall()\">\r\n Cancel\r\n </button>\r\n <button class=\"proceed-btn\" (click)=\"confirmNewCall()\">\r\n Proceed\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n\r\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\r\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\r\n <div style=\"display: flex; width: 100%\">\r\n <div>\r\n <div class=\"min-call-animation\" id=\"call-avatar\">\r\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"min-callerDetails\">\r\n <div class=\"name\">\r\n {{callData.name}}\r\n </div>\r\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"min-btn-container\">\r\n <div class=\"min-timer\">{{timer}}</div>\r\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n</div>\r\n<!-- Call Disconnect Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showDisconnectModal\">\r\n <div class=\"modal-content p-3\">\r\n <div class=\"contacts-header p-0 pb-2\">\r\n <h4 class=\"title mb-0\">{{selectedConf?.conName || 'Call'}} Disconnect</h4>\r\n <div class=\"d-flex justify-content-between\">\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDisconnectModal = false\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"contant-body mb-2\">\r\n <p class=\"mt-2\">\r\n Exiting this call will not end the conference. The session will continue, and charges will incur to\r\n your\r\n account.\r\n </p>\r\n </div>\r\n <div class=\"button-group\">\r\n <div class=\"text-start d-flex align-items-center\">\r\n <label class=\"d-flex align-items-center mb-0 mr-2\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isReasonChecked\" (ngModelChange)=\"onReasonCheckChanged($event)\" class=\"me-2\"/>\r\n </label>\r\n <div class=\"time-picker-24hr\">\r\n <!-- Hour picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleHourDropdown()\">\r\n {{ leaveHour || 'HH' }}\r\n <span class=\"picker-arrow\">▼</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showHourDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let h of hours\"\r\n [class.selected]=\"leaveHour === h\"\r\n (click)=\"selectHour(h)\">{{ h }}</div>\r\n </div>\r\n </div>\r\n <span class=\"time-sep\">:</span>\r\n <!-- Minute picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleMinuteDropdown()\">\r\n {{ leaveMinute || 'MM' }}\r\n <span class=\"picker-arrow\">▼</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showMinuteDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let m of minutes\"\r\n [class.selected]=\"leaveMinute === m\"\r\n (click)=\"selectMinute(m)\">{{ m }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button class=\"btn end-btn\" (click)=\"leaveConference()\" [disabled]=\"isReasonChecked && (!leaveHour || !leaveMinute)\">\r\n Leave\r\n </button>\r\n <button class=\"btn end-btn\" (click)=\"endConference()\" *ngIf=\"showEndAllButton\">\r\n End All\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"custom-modal\" *ngIf=\"showLeaveConfirmationModal\">\r\n <div class=\"modal-content warning-modal\">\r\n <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">info</span>\r\n </div>\r\n <h3>Leave Conference</h3>\r\n <p>\r\n You are about to leave <strong>{{ leaveConfConferenceName }}</strong>. \r\n Are you sure?\r\n </p>\r\n <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelLeave()\">Cancel</button>\r\n <button class=\"proceed-btn\" (click)=\"confirmLeave()\">Leave</button>\r\n </div>\r\n </div>\r\n</div>", styles: [".call-container{width:385px;height:646px!important;margin:auto;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;justify-content:center;align-items:center;z-index:1000;flex-flow:column;overflow-x:hidden;overflow-y:visible}.disabled{opacity:.5!important;pointer-events:none!important}.call-to-text{padding:6px 10px;border:1px solid #c2c2c2;border-radius:20px;font-size:13px}.collops{height:660px!important}.incoming-call-container{flex-flow:row!important}.active-call{width:385px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.call-info-wrapper{height:20px;overflow-y:auto;background:white;transition:height 1s}.open-collops{height:180px!important}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.search-bar input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;outline:none}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}.callerDetails h1{width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:12px 0 0;color:#fff;text-transform:capitalize;text-align:center}.callerDetails h4{margin:0;color:#fff}.tx-black,.title{color:#000!important}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:0;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 6px;border-bottom:1px dotted #4b4b4b;border-left:3px solid transparent;transition:background .15s ease,border-left-color .15s ease;cursor:pointer}.held-call-content.held-call-selected{background:rgba(255,255,255,.15);border-left-color:#fff;border-radius:0 6px 6px 0}.held-main-label{font-size:13px;color:#fff;text-transform:uppercase;letter-spacing:.5px}.fa-info{font-size:smaller!important}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.modal-content .contacts-header{height:40px}.search-contacts-list{max-height:196px;overflow:auto;position:absolute;width:91%;background:white;z-index:1000;box-shadow:0 4px 8px #0003,0 6px 20px #00000030;border-radius:0 10px 10px}.contant-body p{font-size:14px;color:#5f6061}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.disabled{opacity:.5;pointer-events:none}.contacts-list{padding:8px 8px 12px;overflow-y:auto}.contact-item{display:flex;align-items:center;padding:10px 8px;border-radius:10px}.contact-item:hover{background:#f7f9fc}.contact-avatar{width:37px;height:37px;border-radius:50%;object-fit:cover;margin-right:12px}.contact-info{flex:1;min-width:0;overflow:hidden}.contact-name{font-weight:600;color:#111827;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.contact-title{font-size:12px;color:#6b7280}.contact-call-btn{display:inline-flex;align-items:center;gap:6px;background:#234de8;color:#fff;border:none;border-radius:16px;padding:8px;cursor:pointer}.contact-add-btn{background-color:#2ecc71!important}.conference-hold-contact{display:inline-flex;align-items:center;gap:5px;background:#727070;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.conference-hold-contact.on-hold{background:#28a745!important;color:#fff}.user-info-section{width:100%;height:100%;overflow-y:auto;overflow-x:hidden!important}.user-info-section::-webkit-scrollbar{display:none}.toggle-btn{cursor:pointer}.text-container{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s ease}.mute-incoming-row{display:flex;align-items:center;justify-content:center;gap:8px;margin:0 0 10px}.mute-incoming-label{font-size:11px;color:#fff}.switch{position:relative;display:inline-block;width:38px;height:19px;flex-shrink:0}.switch input{opacity:0;width:0;height:0}.switch-slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;border-radius:22px;transition:.3s}.close-info-panel-section{width:100%;height:20px}.close-info-panel-section .material-symbols-outlined{font-size:12px;cursor:pointer}.c2c-title{color:#fff;white-space:normal;word-break:break-word;line-height:1.4}.switch-slider:before{content:\"\";position:absolute;height:14px;width:15px;left:3px;bottom:3px;background-color:#fff;border-radius:50%;transition:.3s}.switch input:checked+.switch-slider{background-color:#2ecc71}.switch input:checked+.switch-slider:before{transform:translate(18px)}.text-container.expanded{-webkit-line-clamp:unset}.userName{font-family:FontAwesome}.subject-text{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.conference-contact{display:inline-flex;align-items:center;gap:5px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.organizer-label{padding:1px 5px;font-size:11px;border-radius:10px;border:1px solid #a0a0a0;margin-top:2px;background:#fcfcfc;color:#000}.custom-modal{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;align-items:center;z-index:10000001;border-radius:21px}.modal-content{background:#ffffff;padding:25px;border-radius:8px;width:350px;text-align:center}.title{margin-bottom:15px;color:#d9534f}.message{margin-bottom:20px}.button-group{display:flex;justify-content:space-between}.btn{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-weight:500}.end-btn{background-color:#dc3545;color:#fff;display:flex;align-items:center;font-size:13px}.leave-btn{background-color:#007bff;color:#fff}.contact-call-btn .material-symbols-outlined{font-size:18px;color:#fff}.contact-call-btn .label{font-size:12px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}app-incoming-call{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1001}.min-call-container{width:320px;height:124px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;flex-direction:column;box-sizing:border-box;position:relative;overflow:hidden;margin:auto;align-items:center;padding:12px 16px;color:#fff}.min-call-animation{background:#fff;width:48px;height:48px;position:relative;margin:0 12px 0 auto;border-radius:100%;border:solid 2px #fff}.min-avatar-img{width:46px;height:46px;border-radius:100%;position:absolute;left:0;top:0}.border-radius-50{border-radius:50%}.min-callerDetails{color:#fff;display:flex;flex-direction:column;align-items:flex-start}.name{width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:20px;margin:0;color:#fff}.min-callerDetails p{margin:0;color:#fff}.min-btn-container{position:relative;display:flex;width:100%;justify-content:flex-start;align-items:center;margin-top:6px}.min-call-sec-btn{width:40px;height:40px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:20px;display:flex;align-items:center;justify-content:center;margin-right:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.min-call-sec-btn span{color:#cccbcb}.min-call-btn{width:40px;height:40px;border-radius:20px;box-sizing:border-box;border:2px solid white;display:flex;align-items:center;justify-content:center}.fullscreen{position:absolute;right:18px;top:14px;color:#e8e8e8;font-size:18px;cursor:pointer}.btn-container{display:flex;flex-wrap:wrap;padding:0 24px}.dial-btn{width:40px;height:40px;background-color:transparent;text-align:center;box-sizing:border-box;margin:4px 25px;font-size:24px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#b5b5b5;cursor:pointer}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.min-timer{width:50px;font-size:18px;margin-right:10px;border-radius:4px;height:35px;display:flex;align-items:center}.record-action-btns{display:flex;flex-direction:column;align-items:center;margin-top:35px}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 5px;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;margin-top:10px}.record-btn.pause-resume{border:none;border-radius:50%;width:50px;height:50px;background:white;display:flex;align-items:center;justify-content:center;margin:5px 0}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.conference-call-view{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:100%;padding:12px 16px 35px;color:#fff;height:100%}.conf-heading{display:flex;align-items:center;gap:8px;margin-top:45px}.conf-icon{color:#4579aa;font-size:32px;width:50px;height:50px;border:1px solid gray;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e1e1e1}.conf-title{font-weight:600;font-size:20px}.conf-name{margin-top:10px;font-size:17px;font-weight:600;text-align:center}.conf-timer{margin-top:4px;font-size:12px;opacity:.9}.conf-record{margin-top:14px}.record-stop-btn{width:44px;height:44px;border-radius:50%;border:none;background:#fff;display:flex;align-items:center;justify-content:center}.record-stop-btn .material-symbols-outlined{color:#e14e4e;font-size:28px}.conf-remove{margin-top:8px}.remove-btn{background:#ff0000!important;color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:12px;width:82px!important;height:auto}.conf-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:18px}.circle-btn{width:56px;height:56px;border-radius:50%;border:none;background:#000;display:flex;align-items:center;justify-content:center}.circle-btn .material-symbols-outlined{color:#fff;font-size:24px}.circle-btn.active{opacity:.85}.conf-end{margin-top:16px}.circle-btn.danger{background:#e14e4e}.circle-btn.danger .material-symbols-outlined{color:#fff}.warning-modal{background:white;width:360px;border-radius:18px;padding:24px;text-align:center;box-shadow:0 10px 30px #00000040}.warning-icon{margin-bottom:12px}.warning-icon .material-symbols-outlined{font-size:48px;color:#f59e0b}.warning-modal h3{margin-bottom:12px;font-size:20px;font-weight:600}.warning-modal p{color:#555;font-size:14px;line-height:1.5;margin-bottom:24px}.warning-actions{display:flex;justify-content:center;gap:12px}.cancel-btn,.proceed-btn{border:none;padding:10px 18px;border-radius:8px;cursor:pointer;font-weight:600}.cancel-btn{background:#e5e7eb;color:#111827}.proceed-btn{background:#234de8;color:#fff}.time-picker-24hr{display:flex;align-items:center;gap:4px}.time-sep{font-weight:700;font-size:16px;color:#333}.custom-time-select{position:relative;width:58px;-webkit-user-select:none;user-select:none}.custom-time-select.disabled-picker{opacity:.45;pointer-events:none}.custom-time-display{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;border:1px solid #ced4da;border-radius:4px;background:#fff;font-size:13px;cursor:pointer;white-space:nowrap}.custom-time-display:hover{border-color:#234de8}.picker-arrow{font-size:9px;margin-left:4px;color:#666}.custom-time-options{position:fixed;background:#fff;border:1px solid #ced4da;border-radius:4px;max-height:160px;overflow-y:auto;z-index:99999999;min-width:58px;box-shadow:0 4px 12px #00000026}.custom-time-option{padding:5px 10px;font-size:13px;cursor:pointer;text-align:center}.custom-time-option:hover{background:#e8eeff;color:#234de8}.custom-time-option.selected{background:#234de8;color:#fff;font-weight:600}.dialpad-alerts{position:absolute;left:50%;transform:translate(-50%);width:calc(100% - 32px);z-index:9999999}.normal-call-alert{top:78px}.conference-alert{top:145px}.dialbox-pop1{background:#dff6dd!important;color:#1d4d1d!important;border-radius:10px;padding:10px 14px;font-size:14px;box-shadow:0 4px 12px #00000040;border:1px solid #b7dfc3}.btn-disc{border:none;background:transparent;color:#6b7280!important;font-size:13px;font-weight:500}.connecting-overlay{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:16px 0 24px}.connecting-text{color:#ffffffe6;font-size:15px;font-weight:500;letter-spacing:.5px;margin:0}.connecting-dots{display:flex;gap:8px;align-items:center}.connecting-dots span{display:inline-block;width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.85);animation:connecting-bounce 1.2s infinite ease-in-out}.connecting-dots span:nth-child(1){animation-delay:0s}.connecting-dots span:nth-child(2){animation-delay:.2s}.connecting-dots span:nth-child(3){animation-delay:.4s}@keyframes connecting-bounce{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1.2);opacity:1}}.connecting-wrapper{display:flex;align-items:center;font-size:13px;color:#4caf50;margin-top:4px;font-weight:500}.ringing-text{margin-right:2px;font-size:11px}.dots span{animation:blink 1.4s infinite;opacity:0;font-size:16px}.dots span:nth-child(1){animation-delay:0s}.dots span:nth-child(2){animation-delay:.2s}.dots span:nth-child(3){animation-delay:.4s}@keyframes blink{0%{opacity:0}50%{opacity:1}to{opacity:0}}.loader-wrapper.outgoing-call-loader{position:absolute;inset:0;z-index:100;display:flex;align-items:center;justify-content:center}.panel-loader-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#ffffffb3;display:flex;justify-content:center;align-items:center;z-index:10000009}\n"] }]
|
|
2204
|
+
args: [{ selector: 'lib-call-progress', template: "<div class=\"d-flex\">\r\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\r\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\r\n <div class=\"loader-wrapper outgoing-call-loader\"\r\n *ngIf=\"showNewCallLoader\">\r\n <div class=\"active-call\" style=\"display: flex; flex-direction: column; position: relative;\">\r\n <div class=\"call-animation call-animation-play\">\r\n <img class=\"avatar-img\" [src]=\"newCallLoaderData?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 style=\"margin-top: 8px;\">Connecting...</h1>\r\n <p style=\"text-transform: capitalize;\">{{ newCallLoaderData?.name || newCallLoaderData?.phone || 'Unknown' }}</p>\r\n </div>\r\n \r\n <div class=\"call-action-btns\">\r\n <div class=\"d-flex justify-content-center\">\r\n <button class=\"call-btn end-call-btn\" disabled (click)=\"endCall()\" style=\"visibility: hidden;\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\"\r\n [ngClass]=\"{\r\n 'conference-alert': isConference && currentCall?.isConference,\r\n 'normal-call-alert': !isConference\r\n }\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\"\r\n [ngClass]=\"callNumberToast.type\"\r\n role=\"alert\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"flex-grow-1 text-left\">\r\n You'r calling\r\n <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\"> Cancel Call </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- All type Call Hold list -->\r\n <div class=\"held-call-banner\"\r\n *ngIf=\"(currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)) || !isAllAccepted\">\r\n <ng-container *ngFor=\"let conf of currentCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"!conf?.isAcceptCall && currentCallList.length > 1 && deviceNumberList.includes(conf?.to) && conf?.isNotification\"\r\n [ngClass]=\"{'held-call-selected': selectedUserInfo?.participantId && selectedUserInfo?.participantId === conf?.participantId}\"\r\n (click)=\"conf?.businessNumber ? toggleC2CInfoPanel(conf) : null\"\r\n [ngStyle]=\"{'cursor': conf?.businessNumber ? 'pointer' : 'default'}\">\r\n <div class=\"held-info\">\r\n <div class=\"img\">\r\n <img class=\"avatar-img-wrapper border-radius-50\" [src]=\"conf?.img || 'assets/images/user.jpg'\" alt=\"\" width=\"35\" height=\"35\" />\r\n </div>\r\n <div class=\"held-caller\" *ngIf=\"!conf?.businessNumber\">\r\n <span class=\"held-label\">{{conf?.from}}</span>\r\n <span class=\"held-name\">{{conf?.fromName}}</span>\r\n </div>\r\n <div class=\"held-caller\" *ngIf=\"conf?.businessNumber\">\r\n <span class=\"held-main-label\">Call from C2C:</span>\r\n <span class=\"held-label\" ><span [title]=\"conf?.sourceName\">{{ truncateText(conf?.sourceName, 10) }}</span>|\r\n <span [title]=\"conf?.pointName\">{{ truncateText(conf?.pointName, 10) }}</span></span>\r\n <span class=\"held-label\">{{ truncateText(conf?.name, 26) }}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <ng-container *ngIf=\"isConnectingIncomingCallId == conf?.id\">\r\n <div class=\"connecting-wrapper mr-2\">\r\n <span class=\"ringing-text\">Connecting</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <button class=\"conference-hold-contact receive-btn\" (click)=\"waitingCallAccept(conf)\" [disabled]=\"isConnecting || isIncomingCallBtnDisable\" *ngIf=\"isConnectingIncomingCallId !== conf?.id\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n <button class=\"conference-contact\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\" (click)=\"onRejectCall(conf); $event.stopPropagation();\"> call_end </span>\r\n </button>\r\n <div *ngIf=\"conf?.businessNumber\" class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleC2CInfoPanel(conf)\">\r\n <i class=\"fa fa-info\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let conf of conferenceCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"conf?.isConferenceHold && conferenceCallList.length > 1\"\r\n [ngClass]=\"{'held-call-selected': conf?.isBusinessNumber && selectedUserInfo?.participantId === conf?.businessParticipantId && isClickExpand}\"\r\n (click)=\"conf?.isBusinessNumber ? toggleC2CInfoPanel(conf) : null\"\r\n [ngStyle]=\"{'cursor': conf?.isBusinessNumber ? 'pointer' : 'default'}\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">{{conf?.callLabel}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': conf?.isConferenceHold }\"\r\n (click)=\"swapCalls(conf,true)\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"conf?.isConferenceHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(conf); $event.stopPropagation();\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- For single incoming call -->\r\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\r\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall\">\r\n <!-- <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown Number'}}</span>\r\n </div> -->\r\n <div class=\"callToNum\">\r\n <ng-container *ngIf=\"currentCallList[0]?.businessNumber; else normalCall\">\r\n C2C CALL\r\n <br />\r\n <span> From : {{ currentCallList[0]?.sourceName }} | {{ currentCallList[0]?.pointName }} </span>\r\n </ng-container>\r\n\r\n <ng-template #normalCall>\r\n Incoming call on\r\n <br />\r\n <span>{{ currentCallList[0]?.to || 'Unknown Number' }}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"incomingFromImage || 'assets/images/user.jpg'\" alt=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\" *ngIf=\"!currentCallList[0]?.businessNumber\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n <div class=\"callerDetails\" *ngIf=\"currentCallList[0]?.businessNumber\">\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ truncateText(currentCallList[0]?.name, 45) }}</p>\r\n <p >{{ currentCallList[0]?.number }}</p>\r\n </div>\r\n <!-- Connecting overlay (shown after accept btn click, hidden on API response) -->\r\n <div class=\"connecting-overlay mt-auto\" *ngIf=\"isConnecting\">\r\n <div class=\"connecting-dots\">\r\n <span></span><span></span><span></span>\r\n </div>\r\n <p class=\"connecting-text\">Connecting...</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\" *ngIf=\"!isConnecting\">\r\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\"\r\n [disabled]=\"isIncomingCallBtnDisable\" (click)=\"add(currentCallList[0])\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n <button class=\"call-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onRejectCall(currentCallList[0])\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For single active call -->\r\n <div *ngIf=\"(!isConference || isConferenceCallHold) && (!!currentCall?.id && !currentCall?.isConference) && currentCall?.isAcceptCall\"\r\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\r\n <div *ngIf=\"selectedUserInfo?.businessNumber;\" class=\"callToNum\">\r\n C2C CALL\r\n <br />\r\n <span> From : {{ selectedUserInfo?.sourceName }} | {{ selectedUserInfo?.pointName }} </span>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" *ngIf=\"!currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.toImage || 'assets/images/user.jpg' : currentCall?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <img class=\"avatar-img\" *ngIf=\"currentCall?.client\"\r\n [src]=\"currentCall?.direction == 'outgoing-call' ? currentCall?.fromImage || 'assets/images/user.jpg' : currentCall?.toImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <!-- C2C Business Call -->\r\n <ng-container *ngIf=\"selectedUserInfo?.businessNumber; else normalCall\">\r\n <h1>{{ selectedUserInfo?.name }}</h1>\r\n <p>{{ selectedUserInfo?.number }}</p>\r\n </ng-container>\r\n\r\n <!-- Normal Call -->\r\n <ng-template #normalCall>\r\n <h1 *ngIf=\"!currentCall?.client\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0':'8px'}\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.toName || outgoingContactName || 'Unknown'\r\n : currentCall?.fromName || 'Unknown' }}\r\n </h1>\r\n <h1 *ngIf=\"currentCall?.client\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0':'8px'}\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.fromName || 'Unknown'\r\n : currentCall?.toName || 'Unknown' }}\r\n </h1>\r\n <p *ngIf=\"!currentCall?.client\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.to\r\n : currentCall?.from }}\r\n </p>\r\n <p *ngIf=\"currentCall?.client\">\r\n {{ currentCall?.direction == 'outgoing-call'\r\n ? currentCall?.from\r\n : currentCall?.to }}\r\n </p>\r\n </ng-template>\r\n <!-- <h1 *ngIf=\"!currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.toName || outgoingContactName || 'Unknown' :\r\n currentCall?.fromName || 'Unknown'}}</h1>\r\n <h1 *ngIf=\"currentCall?.client\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.direction == 'outgoing-call' ? currentCall?.fromName || 'Unknown' :\r\n currentCall?.toName || 'Unknown'}}</h1>\r\n <p *ngIf=\"!currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.to || 'Unknown' : currentCall?.from || 'Unknown'}}</p>\r\n <p *ngIf=\"currentCall?.client\">{{ currentCall?.direction == 'outgoing-call' ? currentCall?.from || 'Unknown' : currentCall?.to || 'Unknown'}}</p> -->\r\n <h4 style=\"margin-top: 4px\">{{ timer}}</h4>\r\n </div>\r\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording, 'disabled': userSettingInfo?.callRecording == 'N'}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\" [disabled]=\"!currentCall?.isAcceptCall || userSettingInfo?.callRecording == 'N'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\" (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <!-- Mute/unmute incoming call -->\r\n <div class=\"mute-incoming-row\" *ngIf=\"currentCall?.isAcceptCall && !showKeypad\">\r\n <span class=\"mute-incoming-label\">Mute incoming calls</span>\r\n <label class=\"switch mb-0\" title=\"Silence the ringtone of new incoming calls during this call\">\r\n <input type=\"checkbox\" [checked]=\"twilioService.isIncomingMuted\" (change)=\"toggleMuteIncomingCall()\">\r\n <span class=\"switch-slider\"></span>\r\n </label>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\r\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"toggleMute()\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\r\n </span>\r\n </button>\r\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n <div>\r\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- conference call view -->\r\n <div class=\"conference-call-view\" *ngIf=\"isConference\">\r\n <div class=\"conf-heading\">\r\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\r\n <span class=\"conf-title\">Conference Call</span>\r\n </div>\r\n <div class=\"scroll-container\">\r\n <div class=\"scroll-text conf-name\">\r\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\r\n <ng-container *ngIf=\"!call?.isConferenceHold\">\r\n <span *ngIf=\"shouldShowSeparator(i)\"> & </span>\r\n <span *ngIf=\"call?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(call) else selfNumber\">\r\n <span>{{call?.direction == 'outgoing-call' ? call?.fromName || call?.from :\r\n call?.toName || call?.to}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </span>\r\n <span *ngIf=\"!call?.client\">{{call?.direction == \"outgoing-call\" ? call?.toName || call?.to : call?.fromName || call?.from || 'Unknown number'}}</span>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"conf-timer\">{{ currentConferenceCall?.timer || timer }}</div>\r\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\" >\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\" [disabled]=\"userSettingInfo.callRecording == 'N'\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording, 'disabled': userSettingInfo?.callRecording == 'N'}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\" (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <!-- Mute/unmute incoming call -->\r\n <div class=\"mute-incoming-row\" *ngIf=\"currentCall?.isAcceptCall && !showKeypad\">\r\n <span class=\"mute-incoming-label\">Mute incoming calls</span>\r\n <label class=\"switch mb-0\" title=\"Silence the ringtone of new incoming calls during this call\">\r\n <input type=\"checkbox\" [checked]=\"twilioService.isIncomingMuted\" (change)=\"toggleMuteIncomingCall()\">\r\n <span class=\"switch-slider\"></span>\r\n </label>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\" (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\" (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n <div class=\"conf-actions\">\r\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\r\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\r\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall(currentConferenceCall?.participants[0])\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-- Incoming call user details shown in model -->\r\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\r\n <div class=\"close-info-panel-section\">\r\n <div class=\"d-flex justify-content-between\" *ngIf=\"currentConferenceCall?.conferenceId != selectedUserInfo?.conferenceId && newIncomingCallsList?.length > 1\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn \" (click)=\"onCloseC2CInfoPanel()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#ffffff\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"mb-2 user-info-section\">\r\n <div class=\"text-center my-3\">\r\n <h3 class=\"text-white\">C2C CALL : {{selectedUserInfo?.sourceName}} | {{selectedUserInfo?.pointName}}</h3>\r\n </div>\r\n <div class=\"mb-3\">\r\n <h5 class=\"text-white mb-1\">Name:</h5>\r\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\r\n </div>\r\n <div class=\"f-13\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Extension:</div>\r\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Number:</div>\r\n <div class=\"\">{{selectedUserInfo?.number}}</div>\r\n </div> \r\n </div>\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Email: </div>\r\n <div>{{selectedUserInfo?.email}}</div>\r\n </div>\r\n </div>\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Subject:</div>\r\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">\r\n {{selectedUserInfo?.subject}}</div>\r\n </div>\r\n </div>\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2 mb-1\">Image:</div>\r\n <div class=\"text-ellipsis\">\r\n <ng-container\r\n *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\r\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\" />\r\n </ng-container>\r\n <ng-template #noImage>\r\n <span class=\"ml-2\">No Image Available</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\" mb-4\">\r\n <div class=\"\">\r\n <div class=\"mb-1\">Message:</div>\r\n <div>\r\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}\r\n </div>\r\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See\r\n less' : 'See more' }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- contact list panel -->\r\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel && !showNewCallLoader\">\r\n <div class=\"panel-loader-overlay p-3 text-center\" *ngIf=\"isParticipantPanelLoading\">\r\n <div class=\"spinner-border text-secondary\" role=\"status\">\r\n <span class=\"sr-only\">Loading...</span>\r\n </div>\r\n <p class=\"mt-2\"></p>\r\n </div>\r\n <div class=\"contacts-header\">\r\n <div>\r\n <ng-container *ngIf=\"totalParticipantsCount < 3; else confHeading\">\r\n Call Participants\r\n </ng-container>\r\n <ng-template #confHeading>\r\n {{ selectedConfName || 'Conference' }} Participants\r\n </ng-template>\r\n </div>\r\n <div class=\"d-flex justify-content-between\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel({}, true)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\r\n <div class=\"search-bar p-3 position-relative\">\r\n <input type=\"text\" placeholder=\"Add a participant by Name or Number\" title=\"Add a participant by Name or Number\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\r\n <div class=\"search-contacts-list\">\r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"searchText\">\r\n <img class=\"contact-avatar\" [src]=\"c?.image || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number) }}{{ c?.numbersList[0]?.numberLabel ? ' (' + c.numbersList[0].numberLabel + ')' : '' }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(c)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"Add to call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(c?.numbersList[0]?.number, true)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filteredList.length && isDirectCallOptionShow && searchText\">\r\n <div class=\"contact-item\">\r\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-title\">{{ searchText }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"CallToUnsavedNumber(searchText)\"\r\n title=\"Add to call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(searchText, true)\"\r\n title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"contacts-list\">\r\n <div class=\"px-2\">\r\n <h5 class=\"mb-0 title\">Active participants ({{ activeParticipantsCount }})</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"!c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || 'Unknown'}}</div>\r\n\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">\r\n <ng-container *ngIf=\"!isSelfNumber(c) else selfNumber\">\r\n <span>{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' : c?.toName || 'Unknown'}}</span>\r\n </ng-container>\r\n <ng-template #selfNumber>\r\n <span>You</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"c?.joined && !c?.host\">\r\n <div class=\"connecting-wrapper mr-2\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!c?.joined || c?.host\">\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.isHold\" (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.isHold }\"\r\n (click)=\"onHoldCall(c)\" *ngIf=\"!c?.host\" [disabled]=\"isHoldBtnDisable\">\r\n <span *ngIf=\"!c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Hold'\"> phone_paused</span>\r\n <span *ngIf=\"c?.isHold\" class=\"material-symbols-outlined\" [title]=\"'Resume'\"> resume </span>\r\n </button>\r\n </ng-container>\r\n <button class=\"conference-contact\" (click)=\"confirmLeaveParticipant(c)\"\r\n *ngIf=\"!c?.host\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(c)\"\r\n *ngIf=\"c?.host && (deviceNumberList.includes(c?.from) || (deviceNumberList.includes(c?.to) && c?.direction == 'incoming-call'))\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <hr class=\"m-2\">\r\n <div class=\"mt-3 px-2\">\r\n <h5 class=\"mb-0 title\">Participant added to the call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"c?.isLeft\">\r\n <img class=\"contact-avatar\" *ngIf=\"!c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <img class=\"contact-avatar\" *ngIf=\"c?.client\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.fromImage || 'assets/images/user.jpg' : c?.toImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\" *ngIf=\"!c?.client\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"!c?.client\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from || 'Unknown'}}</div>\r\n <div class=\"contact-name\" *ngIf=\"c?.client\">{{c?.direction == 'outgoing-call' ? c?.fromName || 'Unknown' : c?.toName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.client\">{{ c?.direction == 'outgoing-call' ? c?.from || 'Unknown' : c?.to || 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.host\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <div class=\"connecting-wrapper\" *ngIf=\"c?.joined\">\r\n <span class=\"ringing-text\">Ringing</span>\r\n <span class=\"dots\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </div>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\" *ngIf=\"!c?.host && c?.joined\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"!c?.client && !c?.joined && !c?.businessNumber\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.to : c?.from, false, { skipDuplicateCheck: true })\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n <button class=\"contact-call-btn contact-add-btn\" *ngIf=\"c?.client && !c?.joined && !c?.businessNumber\"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.from : c?.to, false, { skipDuplicateCheck: true })\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Rejoin</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Conference Warning Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showConferenceWarningModal\">\r\n <div class=\"modal-content warning-modal\">\r\n <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">warning</span>\r\n </div>\r\n <h3>Conference Call Warning</h3>\r\n <p>\r\n Starting a new call will put the current conference on hold\r\n and cannot be merged later.\r\n </p>\r\n <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelNewCall()\">\r\n Cancel\r\n </button>\r\n <button class=\"proceed-btn\" (click)=\"confirmNewCall()\">\r\n Proceed\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n\r\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\r\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\r\n <div style=\"display: flex; width: 100%\">\r\n <div>\r\n <div class=\"min-call-animation\" id=\"call-avatar\">\r\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"min-callerDetails\">\r\n <div class=\"name\">\r\n {{callData.name}}\r\n </div>\r\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"min-btn-container\">\r\n <div class=\"min-timer\">{{timer}}</div>\r\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n</div>\r\n<!-- Call Disconnect Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showDisconnectModal\">\r\n <div class=\"modal-content p-3\">\r\n <div class=\"contacts-header p-0 pb-2\">\r\n <h4 class=\"title mb-0\">{{selectedConf?.conName || 'Call'}} Disconnect</h4>\r\n <div class=\"d-flex justify-content-between\">\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDisconnectModal = false\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"contant-body mb-2\">\r\n <p class=\"mt-2\">\r\n Exiting this call will not end the conference. The session will continue, and charges will incur to\r\n your\r\n account.\r\n </p>\r\n </div>\r\n <div class=\"button-group\">\r\n <div class=\"text-start d-flex align-items-center\">\r\n <label class=\"d-flex align-items-center mb-0 mr-2\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isReasonChecked\" (ngModelChange)=\"onReasonCheckChanged($event)\" class=\"me-2\"/>\r\n </label>\r\n <div class=\"time-picker-24hr\">\r\n <!-- Hour picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleHourDropdown()\">\r\n {{ leaveHour || 'HH' }}\r\n <span class=\"picker-arrow\">▼</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showHourDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let h of hours\"\r\n [class.selected]=\"leaveHour === h\"\r\n (click)=\"selectHour(h)\">{{ h }}</div>\r\n </div>\r\n </div>\r\n <span class=\"time-sep\">:</span>\r\n <!-- Minute picker -->\r\n <div class=\"custom-time-select\" [class.disabled-picker]=\"!isReasonChecked\">\r\n <div class=\"custom-time-display\" (click)=\"isReasonChecked && toggleMinuteDropdown()\">\r\n {{ leaveMinute || 'MM' }}\r\n <span class=\"picker-arrow\">▼</span>\r\n </div>\r\n <div class=\"custom-time-options\" *ngIf=\"showMinuteDropdown\">\r\n <div class=\"custom-time-option\"\r\n *ngFor=\"let m of minutes\"\r\n [class.selected]=\"leaveMinute === m\"\r\n (click)=\"selectMinute(m)\">{{ m }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button class=\"btn end-btn\" (click)=\"leaveConference()\" [disabled]=\"isReasonChecked && (!leaveHour || !leaveMinute)\">\r\n Leave\r\n </button>\r\n <button class=\"btn end-btn\" (click)=\"endConference()\" *ngIf=\"showEndAllButton\">\r\n End All\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"custom-modal\" *ngIf=\"showLeaveConfirmationModal\">\r\n <div class=\"modal-content warning-modal\">\r\n <div class=\"warning-icon\">\r\n <span class=\"material-symbols-outlined\">info</span>\r\n </div>\r\n <h3>Leave Conference</h3>\r\n <p>\r\n You are about to leave <strong>{{ leaveConfConferenceName }}</strong>. \r\n Are you sure?\r\n </p>\r\n <div class=\"warning-actions\">\r\n <button class=\"cancel-btn\" (click)=\"cancelLeave()\">Cancel</button>\r\n <button class=\"proceed-btn\" (click)=\"confirmLeave()\">Leave</button>\r\n </div>\r\n </div>\r\n</div>", styles: [".call-container{width:385px;height:646px!important;margin:auto;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;justify-content:center;align-items:center;z-index:1000;flex-flow:column;overflow-x:hidden;overflow-y:visible}.disabled{opacity:.5!important;pointer-events:none!important}.call-to-text{padding:6px 10px;border:1px solid #c2c2c2;border-radius:20px;font-size:13px}.collops{height:660px!important}.incoming-call-container{flex-flow:row!important}.active-call{width:385px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.call-info-wrapper{height:20px;overflow-y:auto;background:white;transition:height 1s}.open-collops{height:180px!important}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.search-bar input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;outline:none}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}.callerDetails h1{width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:12px 0 0;color:#fff;text-transform:capitalize;text-align:center}.callerDetails h4{margin:0;color:#fff}.tx-black,.title{color:#000!important}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:0;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 6px;border-bottom:1px dotted #4b4b4b;border-left:3px solid transparent;transition:background .15s ease,border-left-color .15s ease;cursor:pointer}.held-call-content.held-call-selected{background:rgba(255,255,255,.15);border-left-color:#fff;border-radius:0 6px 6px 0}.held-main-label{font-size:13px;color:#fff;text-transform:uppercase;letter-spacing:.5px}.fa-info{font-size:smaller!important}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.modal-content .contacts-header{height:40px}.search-contacts-list{max-height:196px;overflow:auto;position:absolute;width:91%;background:white;z-index:1000;box-shadow:0 4px 8px #0003,0 6px 20px #00000030;border-radius:0 10px 10px}.contant-body p{font-size:14px;color:#5f6061}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.disabled{opacity:.5;pointer-events:none}.contacts-list{padding:8px 8px 12px;overflow-y:auto}.contact-item{display:flex;align-items:center;padding:10px 8px;border-radius:10px}.contact-item:hover{background:#f7f9fc}.contact-avatar{width:37px;height:37px;border-radius:50%;object-fit:cover;margin-right:12px}.contact-info{flex:1;min-width:0;overflow:hidden}.contact-name{font-weight:600;color:#111827;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.contact-title{font-size:12px;color:#6b7280}.contact-call-btn{display:inline-flex;align-items:center;gap:6px;background:#234de8;color:#fff;border:none;border-radius:16px;padding:8px;cursor:pointer}.contact-add-btn{background-color:#2ecc71!important}.conference-hold-contact{display:inline-flex;align-items:center;gap:5px;background:#727070;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.conference-hold-contact.on-hold{background:#28a745!important;color:#fff}.user-info-section{width:100%;height:100%;overflow-y:auto;overflow-x:hidden!important}.user-info-section::-webkit-scrollbar{display:none}.toggle-btn{cursor:pointer}.text-container{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s ease}.mute-incoming-row{display:flex;align-items:center;justify-content:center;gap:8px;margin:0 0 10px}.mute-incoming-label{font-size:11px;color:#fff}.switch{position:relative;display:inline-block;width:38px;height:19px;flex-shrink:0}.switch input{opacity:0;width:0;height:0}.switch-slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;border-radius:22px;transition:.3s}.close-info-panel-section{width:100%;height:20px}.close-info-panel-section .material-symbols-outlined{font-size:12px;cursor:pointer}.c2c-title{color:#fff;white-space:normal;word-break:break-word;line-height:1.4}.switch-slider:before{content:\"\";position:absolute;height:14px;width:15px;left:3px;bottom:3px;background-color:#fff;border-radius:50%;transition:.3s}.switch input:checked+.switch-slider{background-color:#2ecc71}.switch input:checked+.switch-slider:before{transform:translate(18px)}.text-container.expanded{-webkit-line-clamp:unset}.userName{font-family:FontAwesome}.subject-text{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.conference-contact{display:inline-flex;align-items:center;gap:5px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.organizer-label{padding:1px 5px;font-size:11px;border-radius:10px;border:1px solid #a0a0a0;margin-top:2px;background:#fcfcfc;color:#000}.custom-modal{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;align-items:center;z-index:10000001;border-radius:21px}.modal-content{background:#ffffff;padding:25px;border-radius:8px;width:350px;text-align:center}.title{margin-bottom:15px;color:#d9534f}.message{margin-bottom:20px}.button-group{display:flex;justify-content:space-between}.btn{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-weight:500}.end-btn{background-color:#dc3545;color:#fff;display:flex;align-items:center;font-size:13px}.leave-btn{background-color:#007bff;color:#fff}.contact-call-btn .material-symbols-outlined{font-size:18px;color:#fff}.contact-call-btn .label{font-size:12px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}app-incoming-call{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1001}.min-call-container{width:320px;height:124px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;flex-direction:column;box-sizing:border-box;position:relative;overflow:hidden;margin:auto;align-items:center;padding:12px 16px;color:#fff}.min-call-animation{background:#fff;width:48px;height:48px;position:relative;margin:0 12px 0 auto;border-radius:100%;border:solid 2px #fff}.min-avatar-img{width:46px;height:46px;border-radius:100%;position:absolute;left:0;top:0}.border-radius-50{border-radius:50%}.min-callerDetails{color:#fff;display:flex;flex-direction:column;align-items:flex-start}.name{width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:20px;margin:0;color:#fff}.min-callerDetails p{margin:0;color:#fff}.min-btn-container{position:relative;display:flex;width:100%;justify-content:flex-start;align-items:center;margin-top:6px}.min-call-sec-btn{width:40px;height:40px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:20px;display:flex;align-items:center;justify-content:center;margin-right:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.min-call-sec-btn span{color:#cccbcb}.min-call-btn{width:40px;height:40px;border-radius:20px;box-sizing:border-box;border:2px solid white;display:flex;align-items:center;justify-content:center}.fullscreen{position:absolute;right:18px;top:14px;color:#e8e8e8;font-size:18px;cursor:pointer}.btn-container{display:flex;flex-wrap:wrap;padding:0 24px}.dial-btn{width:40px;height:40px;background-color:transparent;text-align:center;box-sizing:border-box;margin:4px 25px;font-size:24px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#b5b5b5;cursor:pointer}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.min-timer{width:50px;font-size:18px;margin-right:10px;border-radius:4px;height:35px;display:flex;align-items:center}.record-action-btns{display:flex;flex-direction:column;align-items:center;margin-top:35px}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 5px;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;margin-top:10px}.record-btn.pause-resume{border:none;border-radius:50%;width:50px;height:50px;background:white;display:flex;align-items:center;justify-content:center;margin:5px 0}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.conference-call-view{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:100%;padding:12px 16px 35px;color:#fff;height:100%}.conf-heading{display:flex;align-items:center;gap:8px;margin-top:45px}.conf-icon{color:#4579aa;font-size:32px;width:50px;height:50px;border:1px solid gray;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e1e1e1}.conf-title{font-weight:600;font-size:20px}.conf-name{margin-top:10px;font-size:17px;font-weight:600;text-align:center}.conf-timer{margin-top:4px;font-size:12px;opacity:.9}.conf-record{margin-top:14px}.record-stop-btn{width:44px;height:44px;border-radius:50%;border:none;background:#fff;display:flex;align-items:center;justify-content:center}.record-stop-btn .material-symbols-outlined{color:#e14e4e;font-size:28px}.conf-remove{margin-top:8px}.remove-btn{background:#ff0000!important;color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:12px;width:82px!important;height:auto}.conf-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:18px}.circle-btn{width:56px;height:56px;border-radius:50%;border:none;background:#000;display:flex;align-items:center;justify-content:center}.circle-btn .material-symbols-outlined{color:#fff;font-size:24px}.circle-btn.active{opacity:.85}.conf-end{margin-top:16px}.circle-btn.danger{background:#e14e4e}.circle-btn.danger .material-symbols-outlined{color:#fff}.warning-modal{background:white;width:360px;border-radius:18px;padding:24px;text-align:center;box-shadow:0 10px 30px #00000040}.warning-icon{margin-bottom:12px}.warning-icon .material-symbols-outlined{font-size:48px;color:#f59e0b}.warning-modal h3{margin-bottom:12px;font-size:20px;font-weight:600}.warning-modal p{color:#555;font-size:14px;line-height:1.5;margin-bottom:24px}.warning-actions{display:flex;justify-content:center;gap:12px}.cancel-btn,.proceed-btn{border:none;padding:10px 18px;border-radius:8px;cursor:pointer;font-weight:600}.cancel-btn{background:#e5e7eb;color:#111827}.proceed-btn{background:#234de8;color:#fff}.time-picker-24hr{display:flex;align-items:center;gap:4px}.time-sep{font-weight:700;font-size:16px;color:#333}.custom-time-select{position:relative;width:58px;-webkit-user-select:none;user-select:none}.custom-time-select.disabled-picker{opacity:.45;pointer-events:none}.custom-time-display{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;border:1px solid #ced4da;border-radius:4px;background:#fff;font-size:13px;cursor:pointer;white-space:nowrap}.custom-time-display:hover{border-color:#234de8}.picker-arrow{font-size:9px;margin-left:4px;color:#666}.custom-time-options{position:fixed;background:#fff;border:1px solid #ced4da;border-radius:4px;max-height:160px;overflow-y:auto;z-index:99999999;min-width:58px;box-shadow:0 4px 12px #00000026}.custom-time-option{padding:5px 10px;font-size:13px;cursor:pointer;text-align:center}.custom-time-option:hover{background:#e8eeff;color:#234de8}.custom-time-option.selected{background:#234de8;color:#fff;font-weight:600}.dialpad-alerts{position:absolute;left:50%;transform:translate(-50%);width:calc(100% - 32px);z-index:9999999}.normal-call-alert{top:78px}.conference-alert{top:145px}.dialbox-pop1{background:#dff6dd!important;color:#1d4d1d!important;border-radius:10px;padding:10px 14px;font-size:14px;box-shadow:0 4px 12px #00000040;border:1px solid #b7dfc3}.btn-disc{border:none;background:transparent;color:#6b7280!important;font-size:13px;font-weight:500}.connecting-overlay{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:16px 0 24px}.connecting-text{color:#ffffffe6;font-size:15px;font-weight:500;letter-spacing:.5px;margin:0}.connecting-dots{display:flex;gap:8px;align-items:center}.connecting-dots span{display:inline-block;width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.85);animation:connecting-bounce 1.2s infinite ease-in-out}.connecting-dots span:nth-child(1){animation-delay:0s}.connecting-dots span:nth-child(2){animation-delay:.2s}.connecting-dots span:nth-child(3){animation-delay:.4s}@keyframes connecting-bounce{0%,80%,to{transform:scale(.6);opacity:.4}40%{transform:scale(1.2);opacity:1}}.connecting-wrapper{display:flex;align-items:center;font-size:13px;color:#4caf50;margin-top:4px;font-weight:500}.ringing-text{margin-right:2px;font-size:11px}.held-actions .connecting-wrapper{color:#fff}.dots span{animation:blink 1.4s infinite;opacity:0;font-size:16px}.dots span:nth-child(1){animation-delay:0s}.dots span:nth-child(2){animation-delay:.2s}.dots span:nth-child(3){animation-delay:.4s}@keyframes blink{0%{opacity:0}50%{opacity:1}to{opacity:0}}.loader-wrapper.outgoing-call-loader{position:absolute;inset:0;z-index:100;display:flex;align-items:center;justify-content:center}.panel-loader-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#ffffffb3;display:flex;justify-content:center;align-items:center;z-index:10000009}\n"] }]
|
|
2192
2205
|
}], ctorParameters: function () { return [{ type: i1.ExtensionService }, { type: i0.ChangeDetectorRef }, { type: i2.TwilioService }, { type: i3.IpAddressService }, { type: i4.IncomeingCallSocketService }]; }, propDecorators: { callData: [{
|
|
2193
2206
|
type: Input
|
|
2194
2207
|
}], selectedCallerId: [{
|
|
@@ -2228,4 +2241,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
2228
2241
|
}], outgoingContactName: [{
|
|
2229
2242
|
type: Input
|
|
2230
2243
|
}] } });
|
|
2231
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1wcm9ncmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2NvbXBvbmVudHMvY2FsbC1wcm9ncmVzcy9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFRLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQW1COUMsTUFBTSxPQUFPLHFCQUFxQjtJQTBIaEMsWUFBb0IsZ0JBQWtDLEVBQVUsR0FBc0IsRUFDN0UsYUFBNEIsRUFDM0IsU0FBMkIsRUFDM0IsMEJBQXNEO1FBSDVDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUM3RSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQiwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO1FBekh2RCx5QkFBb0IsR0FBUSxFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBUSxFQUFFLENBQUM7UUFDdkIsc0JBQWlCLEdBQVEsRUFBRSxDQUFDO1FBQzVCLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLG9CQUFlLEdBQVEsRUFBRSxDQUFDO1FBSTFCLHNCQUFpQixHQUFVLEVBQUUsQ0FBQTtRQUU1QixpQkFBWSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzVELHlCQUFvQixHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDLENBQUEsRUFBRTtRQUNwRSxrQkFBYSxHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDO1FBRzdFLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyxVQUFLLEdBQVcsT0FBTyxDQUFDO1FBRXhCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsY0FBUyxHQUFHLE1BQU0sQ0FBQztRQUNuQixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBQ3ZCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLHNCQUFpQixHQUFtQixJQUFJLENBQUM7UUFDekMsc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBQ2xDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFbEIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFDckIsMEJBQXFCLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFDckUsa0JBQWEsR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUNuRSx5QkFBb0IsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUk5RSxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBRTFCLGdCQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYTtRQUM5QixlQUFVLEdBQVksS0FBSyxDQUFDO1FBRTVCLGVBQVUsR0FBVyxTQUFTLENBQUMsQ0FBSSxFQUFFO1FBR3JDLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQywyQkFBc0IsR0FBWSxLQUFLLENBQUMsQ0FBRyxFQUFFO1FBQzdDLHlCQUFvQixHQUFZLEtBQUssQ0FBQyxDQUFHLEVBQUU7UUFFM0MsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsYUFBUSxHQUFVLEVBQUUsQ0FBQztRQUNyQixvQkFBZSxHQUFVLEVBQUUsQ0FBQztRQUc1QixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUUvQiw4QkFBeUIsR0FBUSxFQUFFLENBQUM7UUFDcEMseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBRXRDLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixpQkFBWSxHQUFRLEVBQUUsQ0FBQztRQUV2QixlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsMkJBQXNCLEdBQVksS0FBSyxDQUFDO1FBQ3hDLGNBQVMsR0FBRztZQUNWLEdBQUcsRUFBRSxFQUFFO1lBQ1AsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFBO1FBQ0Qsb0JBQWUsR0FBUSxFQUFFLENBQUM7UUFDMUIsdUJBQWtCLEdBQVUsRUFBRSxDQUFDO1FBQy9CLDZCQUF3QixHQUFZLEtBQUssQ0FBQztRQUMxQyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUU5QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxxQkFBZ0IsR0FBUSxFQUFFLENBQUM7UUFDM0Isa0JBQWEsR0FBUSxFQUFFLENBQUM7UUFDeEIsMEJBQXFCLEdBQVEsRUFBRSxDQUFDO1FBQ2hDLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBQ2pDLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBQ3pCLHNCQUFzQjtRQUN0QixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBQ3ZCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBQ3pCLFVBQUssR0FBYSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0RixZQUFPLEdBQWEsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEYscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUVwQywrQkFBMEIsR0FBWSxLQUFLLENBQUM7UUFDNUMsb0JBQWUsR0FBUSxJQUFJLENBQUM7UUFDNUIsb0JBQWUsR0FBRztZQUNoQixJQUFJLEVBQUUsS0FBSztZQUNYLElBQUksRUFBRSxlQUFlO1lBQ3JCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDO1FBRUYsNEJBQXVCLEdBQVcsQ0FBQyxDQUFDO1FBQ3BDLDBCQUFxQixHQUFRLEVBQUUsQ0FBQztRQUV4QixxQkFBZ0IsR0FBVSxFQUFFLENBQUM7UUFDckMscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLGdCQUFXLEdBQVEsRUFBRSxDQUFDO1FBQ2QsMkJBQXNCLEdBQWtCLElBQUksQ0FBQztRQUM3QyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFFM0MsNEJBQXVCLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakQsdUJBQWtCLEdBQXlCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDckQsc0JBQWlCLEdBQVcsS0FBSyxDQUFDO1FBQ2xDLHNCQUFpQixHQUFrRCxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQztRQUNqSCx3QkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDbEMsK0JBQTBCLEdBQVksS0FBSyxDQUFDO1FBQzVDLHlCQUFvQixHQUFRLElBQUksQ0FBQztRQUNqQyw0QkFBdUIsR0FBVyxFQUFFLENBQUM7UUFDckMsOEJBQXlCLEdBQUcsS0FBSyxDQUFDO1FBbXNEbEMsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUF5UDdCLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQXQ3RDFCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUVELFFBQVE7UUFDTixpREFBaUQ7UUFDaEQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUk7WUFDRixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQzthQUM1QztTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUUsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDNUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN2QixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFO2dCQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQzFCO2lCQUFNLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxVQUFVLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUU7Z0JBQ2pHLElBQUksQ0FBQyxXQUFXLEdBQUc7b0JBQ2pCLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVk7b0JBQ25DLEVBQUUsRUFBRSxLQUFLO29CQUNULEdBQUcsRUFBRSx3QkFBd0I7b0JBQzdCLGNBQWMsRUFBRSxLQUFLO29CQUNyQixNQUFNLEVBQUUsS0FBSztvQkFDYixNQUFNLEVBQUUsS0FBSztvQkFDYixZQUFZLEVBQUUsS0FBSztvQkFDbkIsWUFBWSxFQUFFLElBQUk7b0JBQ2xCLElBQUksRUFBRSxJQUFJO29CQUNWLEtBQUssRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxFQUFFLEtBQUs7b0JBQzlDLGFBQWEsRUFBRSxLQUFLO29CQUNwQixJQUFJLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxRQUFRLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxNQUFNLElBQUksRUFBRTtvQkFDNUksSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLO2lCQUNqQixDQUFDO2dCQUNGLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3JEO1NBQ0Y7UUFDRCxJQUFJLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRTtZQUNuSCxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sRUFBRTtnQkFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUU7b0JBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN6RTtnQkFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBYSxFQUFFLENBQVMsRUFBRSxFQUFFO29CQUM3RCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7b0JBQzNGLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FDbkYsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsY0FBYyxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsSUFBSSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQzlULENBQUE7b0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTt3QkFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7cUJBQzVFO3lCQUFNLElBQUksYUFBYSxFQUFFLE1BQU0sS0FBSyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7d0JBQzNELElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxFQUFFLE1BQU0sQ0FBQzt3QkFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztxQkFDL0I7b0JBQ0QsNkVBQTZFO29CQUM3RSxJQUFJLDRCQUE0QixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDdEssSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3JMLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ25FLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWlCLEVBQUUsRUFBRTt3QkFDekQsSUFBRyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7NEJBQ3ZDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxhQUFhLEtBQUssYUFBYSxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTt5QkFDbkw7b0JBQ0gsQ0FBQyxDQUFDLENBQUE7b0JBQ0YsSUFBSSxhQUFhLEVBQUUsRUFBRSxFQUFFO3dCQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO3dCQUN4RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBUSxFQUFFLEVBQUU7NEJBQ25FLElBQUksR0FBRyxFQUFFLElBQUksRUFBRTtnQ0FDYixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQzs2QkFDdkI7NEJBQ0QsSUFBRyxhQUFhLEVBQUUsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLElBQUksR0FBRyxFQUFFLFlBQVksQ0FBQyxJQUFJLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtnQ0FDN0osSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7NkJBQzFCOzRCQUNDLElBQUksT0FBTyxHQUFRLEVBQUUsQ0FBQTs0QkFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRTtnQ0FDekIsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDdkMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUM3RixDQUFBOzZCQUNGOzRCQUNELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dDQUNwQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0NBQy9FLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLFdBQVcsSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLFVBQVUsRUFBRTtvQ0FDekYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7d0NBQ3hCLEdBQUcsR0FBRzt3Q0FDTixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRTt3Q0FDdkMsTUFBTSxFQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUU7d0NBQ3BDLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBRSxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsS0FBSyxJQUFJLHdCQUF3Qjt3Q0FDbkksY0FBYyxFQUFFLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZTt3Q0FDakQsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNO3dDQUNuQixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSzt3Q0FDdkYsY0FBYyxFQUFFLFFBQVEsRUFBRSxlQUFlLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7d0NBQ3JILE1BQU0sRUFBRSxLQUFLO3dDQUNiLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTt3Q0FDL0IsWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO3dDQUM1RSxJQUFJLEVBQUUsSUFBSTt3Q0FDVixLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO3dDQUM5RCxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVM7d0NBQzlCLGFBQWEsRUFBRSxHQUFHLEVBQUUsRUFBRTt3Q0FDdEIsYUFBYSxFQUFFLFFBQVEsRUFBRSxhQUFhO3dDQUN0QyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNO3dDQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxRQUFRLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztxQ0FDeEUsQ0FBQyxDQUFDO29DQUNILElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO3dDQUMxQixJQUFJLENBQUMsa0NBQWtDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUM7d0NBQ3pFLDJEQUEyRDt3Q0FDM0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO3FDQUNwQjtvQ0FDRCxJQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sRUFBQzt3Q0FDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7cUNBQzFDO2lDQUNGO3FDQUFNLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLFdBQVcsSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxFQUFFO29DQUNsRyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztvQ0FDM0IsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRTt3Q0FDM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FDQUN2Qzt5Q0FBTTt3Q0FDTCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUNBQ3ZDO29DQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO3dDQUMxQixJQUFJLENBQUMsa0NBQWtDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUM7d0NBQ3pFLDBEQUEwRDt3Q0FDMUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO3FDQUNwQjtvQ0FDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7aUNBQzdDO3FDQUFNLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRTtvQ0FDdEMsbUJBQW1CO29DQUNuQixNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO29DQUU3Qix5REFBeUQ7b0NBQ3pELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7b0NBQ3RFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7b0NBRWhFLElBQUksV0FBb0IsQ0FBQztvQ0FDekIsSUFBSSxhQUFhLEVBQUU7d0NBQ2pCLDBFQUEwRTt3Q0FDMUUsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLFlBQVksRUFBRTs0Q0FDL0IsV0FBVyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7NENBQ3pCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7NENBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7eUNBQy9DOzZDQUFNOzRDQUNMLDBFQUEwRTs0Q0FDMUUsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDO3lDQUNsRDtxQ0FDRjt5Q0FBTTt3Q0FDTCwyQ0FBMkM7d0NBQzNDLFdBQVcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO3FDQUMxQjtvQ0FDRCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHO3dDQUM1QixHQUFHLEdBQUc7d0NBQ04sUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7d0NBQ3ZDLE1BQU0sRUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFO3dDQUNwQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLElBQUksT0FBTyxFQUFFLEtBQUssSUFBSSx3QkFBd0I7d0NBQ2xJLGNBQWMsRUFBRSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWU7d0NBQ2pELE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTTt3Q0FDbkIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUs7d0NBQ3ZGLGNBQWMsRUFBRSxRQUFRLEVBQUUsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO3dDQUNySCxNQUFNLEVBQUUsV0FBVzt3Q0FDbkIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO3dDQUMvQixZQUFZLEVBQUUsR0FBRyxDQUFDLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7d0NBQzNFLElBQUksRUFBRSxJQUFJO3dDQUNWLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0NBQzlELGFBQWEsRUFBRSxHQUFHLEVBQUUsRUFBRTt3Q0FDdEIsYUFBYSxFQUFFLFFBQVEsRUFBRSxhQUFhO3dDQUN0QyxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVM7d0NBQzlCLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLElBQUksR0FBRyxFQUFFLE1BQU07d0NBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO3FDQUN4RSxDQUFDO2lDQUNIOzZCQUNGO2lDQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksV0FBVyxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFO2dDQUNqRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztvQ0FDeEIsR0FBRyxHQUFHO29DQUNOLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO29DQUN2QyxNQUFNLEVBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRTtvQ0FDcEMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLE9BQU8sRUFBRSxLQUFLLElBQUksd0JBQXdCO29DQUNqSSxjQUFjLEVBQUUsR0FBRyxDQUFDLFNBQVMsSUFBSSxlQUFlO29DQUNoRCxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU07b0NBQ25CLGdCQUFnQixFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLO29DQUN2RixjQUFjLEVBQUUsUUFBUSxFQUFFLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztvQ0FDckgsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNO29DQUNuQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7b0NBQy9CLFlBQVksRUFBRSxHQUFHLENBQUMsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQ0FDM0UsSUFBSSxFQUFFLElBQUk7b0NBQ1YsS0FBSyxFQUFFLEdBQUcsQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQ0FDN0QsYUFBYSxFQUFFLEdBQUcsQ0FBQyxFQUFFO29DQUNyQixhQUFhLEVBQUUsUUFBUSxFQUFFLGFBQWE7b0NBQ3RDLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUztvQ0FDOUIsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsSUFBSSxHQUFHLEVBQUUsTUFBTTtvQ0FDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7aUNBQ3hFLENBQUMsQ0FBQztnQ0FDSCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztnQ0FDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7NkJBQ2hDO3dCQUNMLENBQUMsQ0FBQyxDQUFBO3dCQUNGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUM7cUJBQ2xDO3lCQUFNO3dCQUNMLElBQUcsSUFBSSxDQUFDLHVCQUF1QixHQUFHLENBQUMsRUFBRTs0QkFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBOzRCQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzs0QkFDdkIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQzs0QkFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7NEJBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDOzRCQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOzRCQUM5QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDOzRCQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDOzRCQUMvQiw2RUFBNkU7NEJBQzdFLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQzNDLHVDQUF1Qzs0QkFDdkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7NEJBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFBOzRCQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDOzRCQUN6QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0NBQ2xCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs2QkFDekM7NEJBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzs0QkFDdkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDOzRCQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO3lCQUMxQjt3QkFDRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztxQkFDOUI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsZ0ZBQWdGO2dCQUNoRixNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNyRyxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7b0JBQzVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQ3BDLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUMzQztpQkFDRjtnQkFDRCxJQUFJLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0gsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDeEcsSUFBSSxXQUFXLEdBQU8sRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO29CQUN4RSxPQUFPLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFO3dCQUNuRCxJQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLGNBQWMsRUFBRTs0QkFDclUsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzs0QkFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7eUJBQ3hGO3dCQUNELElBQUcsV0FBVyxFQUFFLElBQUksRUFBRTs0QkFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsUUFBUSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzt5QkFDM0Y7d0JBQ0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUE7b0JBQzNVLENBQUMsQ0FBQyxDQUFBO2dCQUNKLENBQUMsQ0FBQyxDQUFDO2dCQUNILGdFQUFnRTtnQkFDaEUsd0ZBQXdGO2dCQUV4RixJQUFJLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUU7b0JBQ3pELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDO29CQUN0RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2lCQUNoQztxQkFBTSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtvQkFDakUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztvQkFDM0csTUFBTSx3QkFBd0IsR0FBRyxRQUFRLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQ3ZFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO3dCQUN6RixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQzlILENBQUM7b0JBQ0YsaUdBQWlHO29CQUNqRyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxFQUFFO3dCQUNsRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO3FCQUMvQjtpQkFDRjtnQkFFRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxZQUFZLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtvQkFDM0csTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDMUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7d0JBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ1QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQztvQkFFMUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTt3QkFDdEQsSUFBSSxHQUFHLEVBQUUsZ0JBQWdCOzRCQUFFLE9BQU8sS0FBSyxDQUFDO3dCQUV4QyxJQUFJLFVBQVUsRUFBRTs0QkFDZCwyREFBMkQ7NEJBQzNELE9BQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0NBQzFGLENBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksR0FBRyxFQUFFLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQztnQ0FDM0csQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO3lCQUN2Qzs2QkFBTTs0QkFDTCxvRkFBb0Y7NEJBQ3BGLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxZQUFZLENBQUM7Z0NBQzdFLENBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxZQUFZLElBQUksQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7NEJBQzFGLE9BQU8sQ0FBQyxLQUFLLENBQUM7eUJBQ2Y7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBRUgsSUFBSSxRQUFRLEVBQUU7d0JBQ1osSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztxQkFDeEQ7aUJBQ0Y7cUJBQ0ssSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUU7b0JBQzNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQ25GLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2lCQUMxQjtxQkFBTSxJQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQztvQkFDakgsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVksRUFBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMvSCxJQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRTt3QkFDN0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRSxLQUFLLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEdBQUUsSUFBSSxDQUFDO3dCQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDL0I7aUJBQ0Y7cUJBQU0sSUFBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDNUYsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2lCQUM3RjtnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDdkQsSUFBSSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7d0JBQzVELGdFQUFnRTt3QkFDaEUsa0ZBQWtGO3dCQUNsRiwrRUFBK0U7d0JBQy9FLElBQUksWUFBWSxHQUFRLElBQUksQ0FBQzt3QkFDN0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7NEJBQzVDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsc0JBQXNCO2dDQUFFLFNBQVM7NEJBQy9ELFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFBRSxNQUFNLENBQUM7bUNBQ3pILENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDOzRCQUN0SyxJQUFJLFlBQVk7Z0NBQUUsTUFBTTt5QkFDekI7d0JBQ0QsSUFBSSxZQUFZLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFOzRCQUNwRCxJQUFJLFFBQVEsR0FBUSxJQUFJLENBQUMseUJBQXlCLENBQUM7Z0NBQ2pELGFBQWEsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7Z0NBQ2pDLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWTtnQ0FDeEMsSUFBSSxFQUFFLEtBQUs7Z0NBQ1gsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLElBQUksS0FBSzs2QkFDbEMsQ0FBQyxDQUFDOzRCQUNILElBQUcsUUFBUSxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUU7Z0NBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFBOzZCQUN4Qzs0QkFDRCxJQUFJLENBQUMsa0NBQWtDLEdBQUcsWUFBWSxFQUFFLFlBQVksQ0FBQzs0QkFDckUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQzs0QkFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQzs0QkFDL0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQzt5QkFDcEM7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFO29CQUN4QyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUM7b0JBQzlHLElBQUksWUFBWSxFQUFFO3dCQUNoQixZQUFZLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQzt3QkFDbkMsSUFBRyxZQUFZLENBQUMsY0FBYyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUU7NEJBQ2xFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQzt5QkFDdkM7NkJBQU07NEJBQ0wsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFlBQVksQ0FBQzt5QkFDdEM7d0JBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO3FCQUN4Qjt5QkFBTTt3QkFDTCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO3dCQUNsRixJQUFJLFlBQVksRUFBRSxhQUFhLEVBQUU7NEJBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7NEJBQ3JDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQ0FDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDOzZCQUN4Qjt5QkFDRjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDOzRCQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzt5QkFDNUI7cUJBQ0Y7aUJBQ0Y7cUJBQU07b0JBQ0wsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2pJLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFO3dCQUNqQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQzt3QkFDeEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3ZELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztxQkFDeEI7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFBO2dCQUNsRixNQUFNLFVBQVUsR0FBRztvQkFDakIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO2lCQUNqRixDQUFDO2dCQUVGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDekQsR0FBRyxJQUFJO2lCQUNSLENBQUMsQ0FBQyxDQUFDO2dCQUNKLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtvQkFDNUMsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxZQUFZLElBQUksSUFBSSxFQUFFLFlBQVksSUFBSSxHQUFHLEVBQUUsY0FBYyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUM1SSxJQUFHLGVBQWUsRUFBRSxFQUFFLEVBQUU7d0JBQ3RCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLGVBQWUsRUFBRSxjQUFjLENBQUM7d0JBQzNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLGVBQWUsRUFBRSxhQUFhLENBQUM7cUJBQ2hFO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUM7YUFDbEM7aUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUU7Z0JBQy9DLElBQUcsSUFBSSxDQUFDLHVCQUF1QixHQUFHLENBQUMsRUFBQztvQkFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7b0JBQ2xDLElBQUcsSUFBSSxDQUFDLElBQUksRUFBRTt3QkFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO3FCQUN4QjtvQkFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUE7b0JBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTt3QkFDbEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxDQUFDO3FCQUN6QztvQkFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztvQkFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7b0JBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7b0JBQzlCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7b0JBQ2xDLDZFQUE2RTtvQkFDN0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUMxQjtnQkFDRCxJQUFJLENBQUMsdUJBQXVCLElBQUcsQ0FBQyxDQUFDO2dCQUMvQiw0QkFBNEI7YUFDN0I7WUFBQSxDQUFDO1NBQ0g7UUFDRCxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksUUFBUSxFQUFFO1lBQzVFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEssSUFBRyxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNsQztTQUNGO1FBQ0QsSUFBSSxPQUFPLENBQUMsbUJBQW1CLENBQUMsRUFBRSxZQUFZLEVBQUU7WUFDOUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7U0FDL0Q7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFhO1FBQzVCLElBQUk7WUFDRixJQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUU7Z0JBQ3BDLElBQUkseUJBQXlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFELElBQUkseUJBQXlCLEVBQUUsRUFBRSxFQUFFO29CQUNqQyxJQUFJLFFBQVEsR0FBUSxJQUFJLENBQUMseUJBQXlCLENBQUM7d0JBQ2pELGFBQWEsRUFBRSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsQ0FBQzt3QkFDOUMsWUFBWSxFQUFFLHlCQUF5QixFQUFFLFlBQVk7d0JBQ3JELElBQUksRUFBRSxJQUFJO3dCQUNWLElBQUksRUFBRSx5QkFBeUIsRUFBRSxJQUFJLElBQUksS0FBSztxQkFDL0MsQ0FBQyxDQUFDO29CQUNILElBQUcsUUFBUSxFQUFFLE1BQU0sSUFBSSxHQUFHLEVBQUU7d0JBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFBO3FCQUN4QztpQkFDRjthQUNGO1lBQ0QsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQzFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7bUJBQ3pDLE9BQU8sRUFBRSxNQUFNLElBQUksT0FBTyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsSUFBSSxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUMxTixDQUFBO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUM5Qix3Q0FBd0M7WUFDeEMsTUFBTSxTQUFTLEdBQVEsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQy9FLHVCQUF1QjtZQUN2QixNQUFNLE9BQU8sR0FBUTtnQkFDbkIsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO2dCQUNsQyxlQUFlLEVBQUUsSUFBSTthQUN0QixDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUV6RCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7Z0JBQ3BDLE1BQU0sRUFBRTtvQkFDTixJQUFJLEVBQUUscUJBQXFCLENBQUMsSUFBSTtvQkFDaEMsRUFBRSxFQUFFLHFCQUFxQixDQUFDLEVBQUU7b0JBQzVCLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztvQkFDcEIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDekIsR0FBRyxFQUFFLHFCQUFxQixDQUFDLE1BQU07b0JBQ2pDLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxZQUFZO2lCQUNsRDtnQkFDRCxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUU7YUFDbkQsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNwQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLElBQUk7b0JBQ0EsSUFBSSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7d0JBQ3RELElBQUksRUFBRSxxQkFBcUIsQ0FBQyxJQUFJO3dCQUNoQyxLQUFLLEVBQUUsVUFBVTt3QkFDakIsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsRUFBRTt3QkFDNUMsWUFBWSxFQUFFLHFCQUFxQixFQUFFLFlBQVk7d0JBQ2pELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO3dCQUNyRCxLQUFLLEVBQUUsRUFBRTt3QkFDVCxXQUFXLEVBQUUsRUFBRTt3QkFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7d0JBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUM7d0JBQzNDLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxFQUFFO3FCQUNwQyxDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLHFCQUFxQixFQUFFLFlBQVksQ0FBQztvQkFDOUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7aUJBQzVCO2dCQUFDLE9BQU8sS0FBSyxFQUFFO29CQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3hEO1lBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ1o7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxlQUFvQixFQUFFLFVBQWU7UUFDL0MsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDMUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDMUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDNUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDcEQsZUFBZSxDQUFDLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDOUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDaEQsZUFBZSxDQUFFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDM0MsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDOUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDcEQsZUFBZSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsVUFBVSxDQUFDLHFCQUFxQixDQUFDO1FBQzVFLGVBQWUsQ0FBQyxZQUFZLENBQUMsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQ3RELGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQ2hELE9BQU8sRUFBQyxHQUFHLGVBQWUsRUFBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxXQUFlO1FBQ3BDLElBQUcsV0FBVyxFQUFFLE1BQU0sRUFBQztZQUNyQixJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLFdBQVcsQ0FBQztTQUN4RTthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ2pFO1FBQ0QsSUFBRyxJQUFJLENBQUMsa0NBQWtDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxFQUFFLE1BQU0sRUFBRTtZQUM3SCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUM7U0FDL0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDO1lBQ25GLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxZQUFrQjtRQUMxQyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRTtZQUN6QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7YUFDbkM7WUFDRCxPQUFPO1NBQ1I7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2hDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQU0sRUFBRSxFQUFFO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hGLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRiw2RUFBNkU7UUFDN0UsK0RBQStEO1FBQy9ELG9GQUFvRjtRQUNwRiw0RkFBNEY7UUFDNUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQ3pCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQzNELENBQUM7UUFFRixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUzRSxNQUFNLE1BQU0sR0FBVSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDYixTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUQsSUFBSSxhQUFhLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDL0MsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFlBQVksRUFBRTtvQkFDaEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzdDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUN6QztxQkFBTTtvQkFDTCxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2lCQUM3QzthQUNGO1lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckUsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDakIsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7YUFDakM7WUFDRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLGtDQUFrQyxDQUFDLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQztZQUNsSixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO1lBQ2pDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBYztRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ3JCLElBQUksRUFBRSxJQUFJO1lBQ1YsSUFBSSxFQUFFLGVBQWU7WUFDckIsTUFBTSxFQUFFLE1BQU07WUFDZCxVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDO1FBRUYsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNwQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0QsU0FBUyxDQUFDLEdBQVE7UUFDaEIsSUFBSSxHQUFHLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRTtZQUNyQyxPQUFPLEdBQUcsRUFBRSxVQUFVLElBQUksa0JBQWtCLElBQUksR0FBRyxFQUFFLFVBQVUsSUFBSSxrQkFBa0IsSUFBSSxHQUFHLEVBQUUsVUFBVSxJQUFJLGtCQUFrQixJQUFJLEdBQUcsRUFBRSxVQUFVLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUNqTDthQUFNLElBQUcsR0FBRyxFQUFFLFNBQVMsSUFBSSxlQUFlLEVBQUU7WUFDM0MsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNO1lBQ0wsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLFVBQVUsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLGVBQWUsRUFBRTtnQkFDaEUsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTTtnQkFDTCxPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUNqRCxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ1gsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDO2dCQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7YUFDbkM7aUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7YUFDekI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO2FBQ3hCO1lBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxFQUNELENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBYSxFQUFFLGVBQXlCO1FBQ3RELElBQUk7WUFDRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBQzlCLE1BQU0sT0FBTyxHQUFHO2dCQUNkLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUztnQkFDaEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQ3JELEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSztnQkFDbEIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUN6QixLQUFLLEVBQUUsT0FBTztnQkFDZCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixNQUFNLEVBQUUsSUFBSTtnQkFDWixNQUFNLEVBQUUsSUFBSTtnQkFDWixTQUFTLEVBQUUsSUFBSTthQUNoQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRztnQkFDakIsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLE9BQU8sRUFBRSxFQUFFO2dCQUNYLFVBQVUsRUFBRSxFQUFFO2dCQUNkLFlBQVksRUFBRSxFQUFFO2dCQUNoQixJQUFJLEVBQUUsSUFBSTtnQkFDVixTQUFTLEVBQUUsZUFBZTtnQkFDMUIsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixFQUFFLEVBQUUsVUFBVTtnQkFDZCxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSx3QkFBd0I7Z0JBQzdDLFlBQVksRUFBRSxJQUFJO2dCQUNsQixZQUFZLEVBQUUsS0FBSztnQkFDbkIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFFBQVEsRUFBRSxFQUFFO2dCQUNaLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBQzFCLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUM1QixJQUFJLEVBQUUsUUFBUTtnQkFDZCxNQUFNLEVBQUUsRUFBRTtnQkFDVixJQUFJLEVBQUUsRUFBRTtnQkFDUixFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN6QixNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUM1QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxRQUFRLEVBQUUsTUFBTTthQUN4QyxDQUFDO1lBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRTtnQkFDMUIsTUFBTSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFHLFNBQVMsRUFBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDckYsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsQ0FBQyw2QkFBNkI7Z0JBQzNELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RDLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtvQkFDcEIsSUFBSTt3QkFDRixJQUFJLHVCQUF1QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQzs0QkFDdEQsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJOzRCQUNwQixLQUFLLEVBQUUsVUFBVTs0QkFDakIsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLEtBQUs7NEJBQ2xDLFlBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUU7NEJBQ3BDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDOzRCQUNyRCxLQUFLLEVBQUUsRUFBRTs0QkFDVCxXQUFXLEVBQUUsRUFBRTs0QkFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7NEJBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUM7eUJBQzVDLENBQUMsQ0FBQzt3QkFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDOzRCQUM1QyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUk7NEJBQ3BCLEtBQUssRUFBRSxVQUFVOzRCQUNqQixpQkFBaUIsRUFBRSxRQUFRLEVBQUUsS0FBSzs0QkFDbEMsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRTs0QkFDcEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7NEJBQ3JELEtBQUssRUFBRSxFQUFFOzRCQUNULFdBQVcsRUFBRSxFQUFFOzRCQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTt5QkFDeEIsQ0FBQyxDQUFDO3dCQUNILElBQUcsZUFBZSxFQUFFOzRCQUNsQixJQUFJLENBQUMsa0NBQWtDLEdBQUcsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7eUJBQ2xFO3dCQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFBO3dCQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQy9CLG9FQUFvRTt3QkFDcEUseURBQXlEO3FCQUMxRDtvQkFBQyxPQUFPLENBQUMsRUFBRTt3QkFDVixPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUN2RDtnQkFDSCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQ1Isb0NBQW9DO2FBQ3JDO2lCQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNoQjtTQUVGO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLENBQU07UUFDckIsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFHL0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV6RCxDQUFDLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQixhQUFhLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDOUIsWUFBWSxFQUFFLENBQUMsRUFBRSxZQUFZO1lBQzdCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNkLElBQUksRUFBRSxZQUFZO1NBQ25CLENBQUMsQ0FBQztRQUVILHlEQUF5RDtRQUN6RCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUNuRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQy9DO1FBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBTTtRQUNyQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUU7WUFDbE0sSUFBSSxVQUFVLEdBQVEsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQVMsRUFBRSxLQUFhLEVBQUUsRUFBRTtnQkFDbkUsSUFBSSxJQUFJLEVBQUUsWUFBWSxJQUFJLENBQUMsRUFBRSxZQUFZLEVBQUU7b0JBQ3pDLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FDNUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUMvTSxDQUFBO29CQUNELElBQUksZUFBZSxFQUFFLEVBQUUsRUFBRzt3QkFDeEIsSUFBSSxRQUFRLEdBQVEsSUFBSSxDQUFDLHlCQUF5QixDQUFDOzRCQUNqRCxhQUFhLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDOzRCQUNwQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFlBQVk7NEJBQzNDLElBQUksRUFBRSxDQUFDLGVBQWUsRUFBRSxNQUFNOzRCQUM5QixJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksSUFBSSxLQUFLO3lCQUNyQyxDQUFDLENBQUM7d0JBQ0gsSUFBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTs0QkFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUE7eUJBQ3ZDO3FCQUNGO2lCQUNGO3FCQUFNO29CQUNMLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FDekQsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxPQUFPLEVBQUUsTUFBTSxLQUFLLENBQUMsRUFBRSxNQUFNLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FDaFAsQ0FBQTtpQkFDRjtnQkFDRCxJQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxHQUFFLENBQUMsRUFBRTtvQkFDaEQsSUFBSSxVQUFVLEVBQUUsRUFBRSxJQUFJLFVBQVUsRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRTt3QkFDckQsSUFBSSxRQUFRLEdBQVEsSUFBSSxDQUFDLHlCQUF5QixDQUFDOzRCQUNqRCxhQUFhLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDOzRCQUMvQixZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVk7NEJBQ3RDLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxNQUFNOzRCQUN6QixJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksSUFBSSxLQUFLO3lCQUNoQyxDQUFDLENBQUM7d0JBQ0gsSUFBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTs0QkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUE7eUJBQ3hDO3dCQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7cUJBQy9CO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7cUJBQy9CO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsSUFBSSxRQUFRLEdBQVEsSUFBSSxDQUFDLHlCQUF5QixDQUFDO2dCQUNqRCxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyQixZQUFZLEVBQUUsQ0FBQyxFQUFFLFlBQVk7Z0JBQzdCLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNO2dCQUNmLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEtBQUs7YUFDdkIsQ0FBQyxDQUFDO1lBQ0gsSUFBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTtnQkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUE7YUFDeEM7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQzlCLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ3RCO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsa0NBQWtDLEdBQUcsQ0FBQyxFQUFFLFlBQVksQ0FBQztRQUMxRCxrREFBa0Q7SUFDcEQsQ0FBQztJQUNELEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBTSxFQUFFLFlBQXNCLEVBQUUsU0FBbUI7UUFDakUsSUFBSSxhQUFhLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNwRSxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFZLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxZQUFZLElBQUksQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVLLElBQUcsZUFBZSxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDN0MsYUFBYSxHQUFHLEtBQUssQ0FBQztTQUN2QjtRQUNELElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLElBQUkseUJBQXlCLEVBQUUsWUFBWSxDQUFDO1FBQzdFLElBQUksR0FBRyxHQUFRLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM3RSxJQUFJLEdBQUcsRUFBRSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksMEJBQTBCLEVBQUU7WUFDcEUsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzFCO2FBQU0sSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTtZQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDMUI7UUFDRCxJQUFJLENBQUMsa0NBQWtDLEdBQUcsWUFBWSxDQUFDO1FBQ3ZELGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEMscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFZO1FBQ3JDLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxLQUFLLENBQUMseUJBQXlCLENBQUMsT0FBWTtRQUMxQyxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMxRSxDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLE9BQVk7UUFDN0MsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekUsQ0FBQztJQUVPLG9CQUFvQixDQUFDLE9BQVk7UUFDdkMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekUsQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFZO1FBQzFDLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUVPLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxhQUFrQixFQUFFLFlBQWlCO1FBQ3ZFLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3BHLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQWE7UUFDdkMsT0FBTztZQUNMLEVBQUUsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDeEIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVTtZQUN4QyxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLO1NBQ25DLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLFVBQWtCO1FBQ25ELE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNoRyxDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFVLEVBQUUsUUFBYSxFQUFFLFNBQWM7UUFDckUsTUFBTSxPQUFPLEdBQVE7WUFDbkIsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO1lBQ2xDLGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDcEMsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsRUFBRSxFQUFFLFFBQVEsQ0FBQyxLQUFLO2dCQUNsQixHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3BCLEtBQUssRUFBRSxLQUFLO2dCQUNaLEdBQUcsRUFBRSxRQUFRLENBQUMsTUFBTTthQUNyQjtZQUNELGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7U0FDaEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNwQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNsQiwyRUFBMkU7WUFDM0UsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDO1lBQ3ZELElBQUksZUFBZSxFQUFFO2dCQUNuQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssZUFBZSxDQUFDLENBQUM7Z0JBQ3pGLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQzlFLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sS0FBSyxlQUFlLENBQ3RELENBQUM7YUFDSDtZQUNELDJCQUEyQjtRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUMzQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDakMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRVQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLGlHQUFpRztZQUNqRyxJQUFJO2dCQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDMUI7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2hEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE9BQVksRUFBRSxFQUFFO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFVBQVUsQ0FBQyxNQUFlO1FBQ2hDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUV0QixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2xELElBQUksT0FBTyxHQUFHLENBQUMsRUFBRTtZQUNmLE9BQU8sR0FBRyxDQUFDLENBQUM7U0FDYjtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNqQyxPQUFPLEVBQUUsQ0FBQztZQUNWLHlDQUF5QztZQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxTQUFTO1FBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztJQUN2QixDQUFDO0lBRU8sVUFBVSxDQUFDLFlBQW9CO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkQsTUFBTSxPQUFPLEdBQUcsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDYixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztTQUN2RTthQUFNO1lBQ0wsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1NBQ3BEO0lBQ0gsQ0FBQztJQUVTLEdBQUcsQ0FBQyxLQUFhO1FBQ3ZCLE9BQU8sS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBQ08sV0FBVyxDQUFDLEtBQVU7UUFDNUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQVU7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsc0NBQXNDO1FBQ3RDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxZQUFZLElBQUksSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3hHLElBQUksVUFBVSxHQUFHLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN6SCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxVQUFVLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvTyxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQztZQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxZQUFZLElBQUksSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDcEksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDM0I7YUFBTTtZQUNMLElBQUksSUFBSSxFQUFFLFlBQVksRUFBRTtnQkFDdEIsSUFBSSxlQUFlLEdBQUcsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDO3VCQUN6SCxXQUFXLEVBQUUsTUFBTSxJQUFJLFdBQVcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQTtnQkFDbFEsSUFBSSxlQUFlLEVBQUUsRUFBRSxFQUFFO29CQUN2QixJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFO3dCQUNsQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsZUFBZSxDQUFDO3dCQUM1QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDekQsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssVUFBVSxFQUFFLFlBQVksQ0FDeEQsRUFBRSxTQUFTLElBQUksWUFBWSxDQUFDO3dCQUM3QixJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO3dCQUN2QyxPQUFPO3FCQUNSO29CQUNELElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUE7aUJBQ2hDO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2hCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFzQjtRQUNsQyw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLFlBQVksRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFO2dCQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzFCO1NBQ0Y7YUFBTTtZQUNMLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFFckQsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxrQkFBa0IsRUFBRTtnQkFDeEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO2dCQUMvQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDekQsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssa0JBQWtCLENBQUMsWUFBWSxDQUMvRCxFQUFFLFNBQVMsSUFBSSxjQUFjLENBQUM7Z0JBQy9CLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZDLE9BQU87YUFDUjtZQUVELElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDbEQ7SUFDSCxDQUFDO0lBR0QsS0FBSyxDQUFDLFVBQVUsQ0FBQyxZQUFzQjtRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQixhQUFhLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLElBQUkseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1lBQ3pGLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxZQUFZO1lBQ3JELElBQUksRUFBRSx5QkFBeUIsQ0FBQyxNQUFNO1lBQ3RDLElBQUksRUFBRSxDQUFDLHlCQUF5QixFQUFFLE1BQU07WUFDeEMsOERBQThEO1NBQy9ELENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdEMsMERBQTBEO0lBQzVELENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CO2FBQzdCLE9BQU8sQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQzthQUNqRCxJQUFJLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksV0FBVyxFQUFFLE1BQU0sQ0FBQztlQUMvSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQVcsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDak4sQ0FBQztJQUNELFlBQVk7UUFDVixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsb0ZBQW9GO0lBQ3BGLHNCQUFzQjtRQUNwQixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDO1FBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsSUFBSSxRQUFRLEVBQUU7WUFDWiw0RUFBNEU7WUFDNUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3pDO2FBQU07WUFDTCxtRkFBbUY7WUFDbkYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDOUYsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxDQUFDO2FBQ3hDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsUUFBYyxFQUFFLE9BQWlCO1FBQ25ELElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxRQUFRLEVBQUUsWUFBWSxDQUFDO1FBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBVyxFQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxLQUFLLFFBQVEsRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDO1FBQ3hJLG1EQUFtRDtRQUNuRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDbEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUN2RCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGtCQUFrQixDQUFDLFFBQWEsRUFBRSxPQUFpQjtRQUNqRCxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7WUFDM0IsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsY0FBYyxJQUFJLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFO1lBQzVELDRFQUE0RTtZQUM1RSxvQ0FBb0M7WUFDcEMsT0FBTztTQUNSO1FBQ0QsOEVBQThFO1FBQzlFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7UUFDakMsSUFBSSxhQUFhLEdBQUcsUUFBUSxFQUFFLHFCQUFxQixJQUFJLFFBQVEsRUFBRSxhQUFhLElBQUksUUFBUSxFQUFFLEVBQUUsQ0FBQTtRQUM5RixJQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFO1lBQ25HLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ2hFLElBQUksRUFBRSxDQUFDLE9BQVksRUFBRSxFQUFFO29CQUN2QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLGFBQWEsSUFBSSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUE7b0JBQzlGLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztvQkFDckcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3BELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNsRCxDQUFDO2FBQ0EsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3pEO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztRQUMzRCxnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUN6RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLGdCQUFvQjtRQUMxQyxJQUFJLGFBQWEsR0FBUSxFQUFFLENBQUE7UUFDM0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNwSSxJQUFJLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFO1lBQ2xDLGFBQWEsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQzFELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUMxTyxDQUFDO1NBQ0g7UUFDRCw0RkFBNEY7UUFDNUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxhQUFhLEVBQUUsRUFBRSxJQUFJLGFBQWEsRUFBRSxZQUFZLEtBQUssZ0JBQWdCLEVBQUUsWUFBWSxFQUFFO1lBQ3ZGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7WUFDbkMsSUFBSSxPQUFPLEdBQUc7Z0JBQ1osYUFBYSxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztnQkFDbEMsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZO2dCQUN6QyxJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksSUFBSSxLQUFLO2FBQ25DLENBQUE7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBQyxFQUFFO2dCQUNuRSxJQUFHLEdBQUcsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO29CQUNyQixJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksdUJBQXVCLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ2xGO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDNUMsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1NBQ2xDO2FBQU07WUFDTCxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQzNDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBVSxFQUFFLGFBQW1CLEVBQUUsWUFBbUI7UUFDNUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUd6QixJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2hDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzdFLElBQUcsWUFBWSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUU7Z0JBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0NBQStDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtnQkFDcEYsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN0QixNQUFNLGFBQWEsR0FBRztvQkFDcEIsSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDdkIsSUFBSTtpQkFDTCxDQUFDO2dCQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN2RCwyRUFBMkU7Z0JBQzNFLHVFQUF1RTtnQkFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLE9BQU8sR0FBRztvQkFDWixTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7b0JBQ2hDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDbEIsU0FBUyxFQUFFLEVBQUU7b0JBQ2IsU0FBUyxFQUFFLEVBQUU7b0JBQ2IsVUFBVSxFQUFFLFVBQVU7b0JBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDdkIsTUFBTSxFQUFHLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7b0JBQ3RELFNBQVMsRUFBRSxFQUFFO29CQUNiLFNBQVMsRUFBRSxZQUFZLENBQUMsVUFBVSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsU0FBUztvQkFDN0QsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLElBQUksSUFBSTtpQkFDekMsQ0FBQTtnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFRLEVBQUUsRUFBRTtvQkFDaEYsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRTt3QkFDckIsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUMxQixJQUFJLENBQUMsa0NBQWtDLEdBQUcsSUFBSSxFQUFFLFlBQVksQ0FBQzt3QkFDN0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ3pFLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO3dCQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7d0JBQ3ZJLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7d0JBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO3dCQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDdkQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUUxRCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQzt3QkFDckQsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFOzRCQUNqQyxJQUFJLFdBQVcsRUFBRTtnQ0FDZixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssV0FBVyxDQUFDLENBQUM7Z0NBQ3JGLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQzlFLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sS0FBSyxXQUFXLENBQ2xELENBQUM7Z0NBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQzs2QkFDN0Q7NEJBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO3dCQUNsRCxDQUFDLENBQUMsQ0FBQzt3QkFFSCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO3FCQUMxQjt5QkFBTTt3QkFDTCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDO3dCQUM3RSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUM5RSxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLEtBQUssR0FBRyxDQUMxQyxDQUFDO3dCQUNGLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTt3QkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3ZELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTt3QkFDNUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO3dCQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQzt3QkFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7d0JBQzFCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7d0JBQ3RDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTt3QkFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ3pCLG9GQUFvRjtxQkFDckY7b0JBQ0QsVUFBVSxDQUFDLEdBQUUsRUFBRTt3QkFDYixJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO29CQUN0QyxDQUFDLEVBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ1IsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO2dCQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQzFCO2lCQUFNLElBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsSUFBSSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUM7Z0JBQ2pHLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDMUIsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FDOUUsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxLQUFLLEdBQUcsQ0FDMUMsQ0FBQztnQkFDRixJQUFJLE9BQU8sR0FBRztvQkFDWixhQUFhLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO29CQUNsQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFlBQVk7b0JBQ3pDLElBQUksRUFBRSxLQUFLO29CQUNYLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxJQUFJLEtBQUs7aUJBQ25DLENBQUE7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUMsRUFBRTtvQkFDbkUsSUFBRyxHQUFHLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTt3QkFDckIsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLHVCQUF1QixFQUFFLE9BQU8sQ0FBQyxDQUFDO3FCQUNsRjtnQkFDSCxDQUFDLENBQUMsQ0FBQTtnQkFDRixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzFCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7Z0JBQ3RDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7YUFDeEI7UUFDSCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFZLEVBQUUsZUFBeUIsRUFBRSxPQUEwQztRQUNuRyxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxPQUFPLEVBQUUsS0FBSyxDQUFDO1FBRXBHLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtDQUFrQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDO1FBQ3JHLElBQUksQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUU7WUFDaEMsSUFBSSxrQkFBa0IsRUFBRTtnQkFDdEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUMzRCxHQUFHLENBQUMsWUFBWSxLQUFLLGtCQUFrQjtvQkFDdkMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLFdBQVcsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQztvQkFDbEQsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUNiLENBQUM7Z0JBQ0YsSUFBSSxhQUFhLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxXQUFXLHlCQUF5QixDQUFDLENBQUM7b0JBQy9ELE9BQU8sS0FBSyxDQUFDO2lCQUNkO2FBQ0Y7U0FDRjtRQUNELElBQUk7WUFDRixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLElBQUksSUFBSSxHQUFRLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDO29CQUM5QyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTTtvQkFDL0UsS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLGlCQUFpQixFQUFFLFdBQVc7b0JBQzlCLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVk7b0JBQzVDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO29CQUNyRCxLQUFLLEVBQUUsRUFBRTtvQkFDVCxXQUFXLEVBQUUsRUFBRTtvQkFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7aUJBQ3hCLENBQUMsQ0FBQztnQkFDSCxJQUFJLFFBQVEsR0FBUSxJQUFJLENBQUMseUJBQXlCLENBQUM7b0JBQ2pELGFBQWEsRUFBRSxDQUFDLElBQUksRUFBRSxhQUFhLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztvQkFDaEQsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWTtvQkFDNUMsSUFBSSxFQUFFLElBQUk7b0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLEtBQUs7b0JBQ3JDLFVBQVUsRUFBRSxJQUFJO2lCQUNqQixDQUFDLENBQUM7Z0JBQ0gsSUFBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTtvQkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUE7aUJBQ3pDO2dCQUNELElBQUksQ0FBQyxRQUFRLEdBQUc7b0JBQ2QsS0FBSyxFQUFFLFdBQVc7b0JBQ2xCLFVBQVUsRUFBRSxXQUFXO29CQUN2QixJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksSUFBSSxHQUFHLE9BQU8sRUFBRSxTQUFTLElBQUksT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLFdBQVc7b0JBQ2xGLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLHdCQUF3QjtvQkFDN0MsYUFBYSxFQUFFLElBQUksRUFBRSxhQUFhO29CQUNsQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU07b0JBQ25DLGNBQWMsRUFBRSxLQUFLO29CQUNyQixNQUFNLEVBQUUsS0FBSztvQkFDYixNQUFNLEVBQUUsS0FBSztvQkFDYixZQUFZLEVBQUUsSUFBSTtpQkFDbkIsQ0FBQztnQkFDRixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2dCQUMvQixJQUFJLENBQUMsa0NBQWtDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUM7Z0JBQ3hFLDBEQUEwRDtnQkFDMUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7aUJBQU07Z0JBRUgsSUFBSSxjQUFjLEdBQVEsRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBTSxFQUFFLEVBQUU7b0JBQzVDLElBQUksQ0FBQyxFQUFFLGFBQWEsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRTt3QkFDdEYsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7cUJBQ3ZDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUVILG9DQUFvQztnQkFDcEMsSUFBSSxJQUFJLEdBQVEsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUM7b0JBQzlDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTTtvQkFDMUQsS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLGlCQUFpQixFQUFFLFdBQVc7b0JBQzlCLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVk7b0JBQzVDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO29CQUNyRCxLQUFLLEVBQUUsRUFBRTtvQkFDVCxXQUFXLEVBQUUsRUFBRTtvQkFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7aUJBQ3hCLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBRXpCLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFBO2dCQUN4QyxJQUFJLFFBQVEsR0FBUSxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztvQkFDdkQsYUFBYSxFQUFFLGNBQWM7b0JBQzdCLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVk7b0JBQzNDLElBQUksRUFBRSxJQUFJO29CQUNWLElBQUksRUFBRSxJQUFJO29CQUNWLFVBQVUsRUFBRSxJQUFJO2lCQUNqQixDQUFDLENBQUM7Z0JBRUgsSUFBSSxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRTtvQkFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUE7aUJBQ3pDO2dCQUVELGdFQUFnRTtnQkFDaEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUc7b0JBQ2QsS0FBSyxFQUFFLFdBQVc7b0JBQ2xCLFVBQVUsRUFBRSxXQUFXO29CQUN2QixJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksSUFBSSxHQUFHLE9BQU8sRUFBRSxTQUFTLElBQUksT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLFdBQVc7b0JBQ2xGLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLHdCQUF3QjtvQkFDN0MsYUFBYSxFQUFFLElBQUksRUFBRSxhQUFhO29CQUNsQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU07b0JBQ25DLGNBQWMsRUFBRSxLQUFLO29CQUNyQixNQUFNLEVBQUUsS0FBSztvQkFDYixNQUFNLEVBQUUsS0FBSztvQkFDYixZQUFZLEVBQUUsS0FBSztpQkFDcEIsQ0FBQztnQkFDRixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2FBQ2xDO1NBQ0Y7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsZUFBeUIsRUFBRSxPQUEwQztRQUM3RyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNyRyxJQUFJO1lBQ0YsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELElBQUksU0FBUyxFQUFFO2dCQUNiLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFO2dCQUNwRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQ0FBa0MsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQztnQkFDckcsSUFBSSxrQkFBa0IsRUFBRTtvQkFDdEIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUN6RCxHQUFHLENBQUMsWUFBWSxLQUFLLGtCQUFrQjt3QkFDdkMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDOzRCQUN0RCxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDeEUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUNiLENBQUM7b0JBQ0YsSUFBSSxhQUFhLEVBQUU7d0JBQ2pCLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxNQUFNLHdCQUF3QixDQUFDLENBQUM7d0JBQ3pELE9BQU8sS0FBSyxDQUFDO3FCQUNkO2lCQUNGO2FBQ0Y7WUFFRCxJQUFJLE1BQU0sS0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUNuRCxJQUFJLENBQUMsT0FBTyxFQUFFLDhCQUE4QixDQUFDLENBQUM7Z0JBQzlDLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO2dCQUNoRCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFBO1lBQ3RFLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV4Qyx5Q0FBeUM7WUFDekMsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTO2dCQUN4QixHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssSUFBSSx3QkFBd0I7Z0JBQy9DLEtBQUssRUFBRSxNQUFNO2dCQUNiLE1BQU0sRUFBRSxFQUFFO2dCQUNWLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU07Z0JBQ2xDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTthQUNwQyxDQUFDO1lBRUYsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUMzQixJQUFJLGFBQWEsR0FBUSxFQUFFLENBQUE7Z0JBQzNCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFhLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQ25JLElBQUksUUFBUSxFQUFFO29CQUNaLGFBQWEsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQzFELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FDL00sQ0FBQTtpQkFDRjtnQkFFRCxJQUFJLGFBQWEsRUFBRSxFQUFFLEVBQUU7b0JBQ3JCLElBQUksUUFBUSxHQUFRLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDO3dCQUN2RCxhQUFhLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO3dCQUNsQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFlBQVk7d0JBQ3pDLElBQUksRUFBRSxJQUFJO3dCQUNWLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxJQUFJLEtBQUs7cUJBQ25DLENBQUMsQ0FBQztvQkFDSCxJQUFHLFFBQVEsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO3dCQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQTtxQkFDekM7b0JBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztvQkFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ25DO3FCQUFNO29CQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNuQztnQkFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQzthQUN0QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2FBQ3hDO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLFFBQWEsRUFBRSxtQkFBbUIsR0FBRyxLQUFLO1FBQ3JELHFDQUFxQztRQUNyQyxJQUFJLG1CQUFtQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxRCxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztZQUNoQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFDeEMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRztnQkFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JDLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUs7Z0JBQ2pDLEdBQUcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSx3QkFBd0I7YUFDMUQsQ0FBQztZQUNGLElBQUksQ0FBQyxlQUFlLEdBQUc7Z0JBQ3JCLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxlQUFlO2dCQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLO2dCQUNsQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLO2FBQ3ZDLENBQUM7WUFFRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBRzlCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ3BDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztRQUN4QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFvQjtRQUNwQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7WUFDM0IscURBQXFEO1lBQ3JELElBQUksU0FBUyxHQUFRLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pFLE1BQU0sR0FBRyxHQUFRLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDL0csSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRTtnQkFDckIsT0FBTyxHQUFHLEVBQUUsUUFBUSxDQUFBO2FBQ3JCO2lCQUFNO2dCQUNMLE9BQU8sWUFBWSxDQUFBO2FBQ3BCO1NBQ0Y7YUFBTTtZQUNMLE9BQU8sWUFBWSxDQUFBO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBYztRQUNsQyxJQUFJO1lBQ0YsSUFBSSxNQUFNLElBQUksRUFBRSxFQUFFO2dCQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxNQUFNLGtCQUFrQixHQUFHLGVBQWUsQ0FBQyxDQUFDLCtDQUErQztZQUMzRixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLElBQUksQ0FBQzthQUNiO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLENBQUMsa0VBQWtFO1NBQ2hGO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFlO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixHQUFHLEVBQUUsT0FBTztZQUNaLElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQztRQUNGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDOUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVILEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxZQUFvQjtRQUMzQyxVQUFVLENBQUMsR0FBRSxFQUFFO1lBQ2IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDL0QsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFRLEVBQUUsRUFBRTtvQkFDdkIsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFLFlBQVksSUFBSSxHQUFHLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQztvQkFDakUsOEJBQThCO29CQUM5QixrQ0FBa0M7b0JBQ2xDLHVDQUF1QztvQkFDdkMsWUFBWTtvQkFDWixJQUFJO29CQUNKLGlEQUFpRDtvQkFDakQseUNBQXlDO29CQUN6QyxtREFBbUQ7b0JBQ25ELCtDQUErQztvQkFFL0MsZUFBZTtvQkFDZixjQUFjO29CQUNkLDBDQUEwQztvQkFDMUMsb0NBQW9DO29CQUNwQyxTQUFTO29CQUNULE9BQU87b0JBQ1AsS0FBSztvQkFFTCxpREFBaUQ7b0JBQ2pELDZEQUE2RDtvQkFDN0Qsc0JBQXNCO2dCQUN4QixDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNiLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7b0JBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7Z0JBQ3BDLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDUixDQUFDO0lBRUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFhLEVBQUUsZ0JBQTBCO1FBQ3ZELElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDeEMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQztTQUN2QztRQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQU0sRUFBRSxFQUFFO1lBQ2pELElBQUksQ0FBQyxFQUFFLFlBQVksSUFBSSxRQUFRLEVBQUUsWUFBWSxFQUFFO2dCQUM3QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQ3pELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FDL00sQ0FBQTtnQkFDRCxJQUFJLGVBQWUsRUFBRSxFQUFFLEVBQUU7b0JBQ3ZCLElBQUksUUFBUSxHQUFRLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDO3dCQUN2RCxhQUFhLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO3dCQUNwQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFlBQVk7d0JBQzNDLElBQUksRUFBRSxLQUFLO3dCQUNYLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxJQUFJLEtBQUs7cUJBQ3JDLENBQUMsQ0FBQztvQkFDSCxJQUFHLFFBQVEsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO3dCQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQTtxQkFDekM7b0JBQ0Qsb0NBQW9DO29CQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO29CQUM5QixJQUFJLENBQUMsa0NBQWtDLEdBQUcsUUFBUSxFQUFFLFlBQVksQ0FBQTtvQkFDaEUsbURBQW1EO2lCQUNwRDthQUNGO2lCQUFNO2dCQUNMLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FDekQsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUMvTSxDQUFBO2dCQUNELElBQUksZUFBZSxFQUFFLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUU7b0JBQ25ELElBQUksUUFBUSxHQUFRLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDO3dCQUN2RCxhQUFhLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO3dCQUNwQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFlBQVk7d0JBQzNDLElBQUksRUFBRSxJQUFJO3dCQUNWLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxJQUFJLEtBQUs7cUJBQ3JDLENBQUMsQ0FBQztvQkFDSCxJQUFHLFFBQVEsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO3dCQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQTtxQkFDekM7b0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztvQkFDOUIsb0NBQW9DO2lCQUNyQzthQUNGO1lBQ0QsSUFBSSxDQUFDLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFO2dCQUN0RixJQUFJLFFBQVEsR0FBUSxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztvQkFDdkQsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLGFBQWEsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUMxQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLFlBQVk7b0JBQzVCLElBQUksRUFBRSxJQUFJO29CQUNWLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEtBQUs7aUJBQ3ZCLENBQUMsQ0FBQztnQkFDSCxJQUFHLFFBQVEsRUFBRSxNQUFNLElBQUksR0FBRyxFQUFFO29CQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQTtpQkFDekM7Z0JBQ0Qsb0NBQW9DO2FBQ3JDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFDRCxlQUFlLENBQUMsUUFBYTtRQUMzQixJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzVCLG1EQUFtRDtRQUNuRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUU7WUFDekQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7WUFDOUMsT0FBTyxDQUFDLENBQUMsQ0FDUCxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssR0FBRztnQkFDcEMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEdBQUc7Z0JBQ2hDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxHQUFHO2dCQUNwQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssR0FBRztnQkFDeEMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEdBQUc7Z0JBQzFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxHQUFHO2dCQUN4QyxJQUFJLENBQUMsR0FBRztnQkFDUixJQUFJLENBQUMsUUFBUTtnQkFDYixJQUFJLENBQUMsU0FBUyxDQUNmLENBQUM7U0FDSDtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFRO1FBQ25CLElBQUk7WUFDRixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7Z0JBQ25FLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtvQkFDZCxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUM1RDtxQkFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7b0JBQ3JCLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQzVEO3FCQUFNO29CQUNMLElBQUksS0FBSyxDQUFDLGdDQUFnQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUM5RDtnQkFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQzthQUMxQjtZQUNELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM1QjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQjtJQUNILENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUk7WUFDRixJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdkM7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFDRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN0QjthQUFNO1lBQ0wsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLEdBQUcsQ0FBQztRQUNSLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDdkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDN0MsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUM7UUFFL0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDOUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsYUFBYTtRQUNYLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN0QztJQUNILENBQUM7SUFDRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FDN0YsUUFBUSxDQUFDLEVBQUU7WUFDVCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakQsbURBQW1EO1FBQ3JELENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELGVBQWU7UUFDYixJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzFHLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGlCQUFpQixDQUFDLFNBQWlCO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFekMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtRQUN4RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTFCLE1BQU0sRUFBRSxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNsRCxNQUFNLEVBQUUsR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFFbEQsT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNyRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0Qsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtZQUN4RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLENBQVEsb0NBQW9DO1NBQ2hGO0lBQ0gsQ0FBQztJQUNELGdCQUFnQjtRQUNkLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEdBQUcsT0FBTyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQzNELENBQUM7SUFDRCxjQUFjLENBQUMsVUFBa0I7UUFDL0IsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsNEJBQTRCO1FBQ25ELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDLHVCQUF1QjtRQUNsRCxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDcEIsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3hDLFdBQVcsSUFBSSxZQUFZLENBQUM7WUFDNUIsSUFBSTtnQkFDRixNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxFQUF3QixDQUFDO2dCQUMvRyxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFO29CQUNoRCxJQUFJLENBQUMsVUFBVSxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO29CQUN4RCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssYUFBYSxFQUFFO3dCQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDO3dCQUNsRCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFOzRCQUN4QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7eUJBQ3ZCO3dCQUNELGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDM0I7eUJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFdBQVcsRUFBRTt3QkFDMUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUMxQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ2YsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO3FCQUN0QjtpQkFDRjthQUNGO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2QsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzNCO1lBQ0QsSUFBSSxXQUFXLElBQUksT0FBTyxFQUFFO2dCQUMxQiwyREFBMkQ7Z0JBQzNELGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUMzQjtRQUNILENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLGFBQWE7SUFDYiw0REFBNEQ7SUFDNUQsMkJBQTJCO0lBQzNCLGtEQUFrRDtJQUNsRCxvQkFBb0I7SUFDcEIsMERBQTBEO0lBQzFELFVBQVU7SUFDVixNQUFNO0lBQ04sSUFBSTtJQUNKLHdCQUF3QixDQUFDLElBQVM7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLDhCQUE4QjtJQUM5Qiw4QkFBOEI7SUFDOUIsK0NBQStDO0lBQy9DLDJDQUEyQztJQUMzQywwQkFBMEI7SUFDMUIsUUFBUTtJQUNSLDhDQUE4QztJQUM5Qyw2QkFBNkI7SUFDN0IsMENBQTBDO0lBQzFDLDBCQUEwQjtJQUMxQixRQUFRO0lBQ1IsUUFBUTtJQUNSLHFCQUFxQjtJQUNyQixJQUFJO0lBRUosYUFBYSxDQUFDLElBQVM7UUFDckIsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUU7WUFDbkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUM3QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7YUFBTTtZQUNMLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztnQkFDN0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQ3hCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLG9CQUFvQjtJQUNwQiwwQkFBMEI7SUFDMUIscUJBQXFCO0lBQ3JCLHFCQUFxQjtJQUNyQiw4QkFBOEI7SUFDOUIsK0JBQStCO0lBQy9CLGdGQUFnRjtJQUNoRixNQUFNO0lBQ04sbUZBQW1GO0lBQ25GLHVCQUF1QjtJQUN2QixPQUFPO0lBQ1AsSUFBSTtJQUVKLFlBQVk7UUFDVixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM3QyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDbEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztTQUN4RDtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDbEMsMENBQTBDO1lBQzFDLHFLQUFxSztZQUNySyxzQkFBc0I7WUFDdEIsK0JBQStCO1lBQy9CLGFBQWE7WUFDYixnQ0FBZ0M7WUFDaEMsTUFBTTtZQUNOLE1BQU07WUFDTixPQUFPO1NBQ1I7UUFDRCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFVLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQy9CLElBQUksZUFBZSxFQUFFO2dCQUNuQixDQUFDLENBQUMsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7b0JBQ3hDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDcEMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztxQkFDM0M7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDakUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ2hELENBQUMsQ0FBQyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO29CQUNsRCxDQUFDLENBQUMsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLFNBQVMsRUFBRTtvQkFDYixNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUUsV0FBVyxDQUFDO29CQUMvQixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDakMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFOzRCQUM5QixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNqRCxDQUFDLENBQUMsQ0FBQztxQkFDSjt5QkFBTTt3QkFDTCxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNsQjtpQkFDRjthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ25DLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hHLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNkLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDekI7aUJBQU07Z0JBQ0wsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQzthQUMxQjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGVBQWU7UUFDYixNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFnQixDQUFDO1FBQ3BFLElBQUksRUFBRSxFQUFFLFlBQVksR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUNELFVBQVU7UUFDUixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLGtCQUFrQjtRQUNoQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRTtZQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDekM7YUFBTTtZQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFO1lBQ3BELElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQy9DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBRUQsVUFBVSxDQUFDLENBQVM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFlBQVksQ0FBQyxDQUFTO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsSUFBSSxPQUFPLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQTtZQUNyTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtTQUNwRjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUU7WUFDbkMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFBO1lBQ3BILElBQUksZUFBZSxHQUFHLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQzttQkFDekgsV0FBVyxFQUFFLE1BQU0sSUFBSSxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksQ0FBQyxXQUFXLEVBQUUsY0FBYyxJQUFJLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDOVEsSUFBSSxlQUFlLEVBQUUsRUFBRSxFQUFFO2dCQUN2QixJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFO29CQUNsQyx5Q0FBeUM7b0JBQ3pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxlQUFlLENBQUM7b0JBQzVDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxTQUFTLElBQUksWUFBWSxDQUFDO29CQUMvSSxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO2lCQUN4QztxQkFBTTtvQkFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUNqQzthQUNGO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUNELG9CQUFvQixDQUFDLElBQVk7UUFDL0IsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxPQUFPLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUNoQyxDQUFDO0lBRUQsWUFBWSxDQUFDLFFBQWE7UUFDeEIsSUFBSSxPQUFPLEdBQUc7WUFDWixTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7WUFDaEMsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ3RCLFNBQVMsRUFBRSxFQUFFO1lBQ2IsU0FBUyxFQUFFLEVBQUU7WUFDYixVQUFVLEVBQUUsSUFBSTtZQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsTUFBTSxFQUFHLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDdEQsU0FBUyxFQUFFLEVBQUU7WUFDYixTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVM7WUFDOUIsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLElBQUksSUFBSTtTQUM3QyxDQUFBO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBUSxFQUFFLEVBQUU7WUFDaEYsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUYsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxZQUFZLENBQUMsV0FBZ0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUksQ0FBQztJQUVELG1CQUFtQixDQUFDLEtBQWE7UUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDaEgsT0FBTyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsOEJBQThCO1FBQzlCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGNBQWMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuSyxJQUFHLFlBQVksRUFBRTtZQUNmLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUNoRDthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQVc7UUFDZixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQzlDLE9BQU8sQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUssTUFBTSxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sV0FBVyxFQUFFLFNBQVMsSUFBSSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxTQUFTLElBQUksRUFBRSxJQUFJLFdBQVcsRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUNwSSxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQVc7UUFDaEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUM5QyxPQUFPLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFLLE1BQU0sSUFBSSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUM7UUFDckYsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFdBQVcsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFBO0lBQ25DLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RSxPQUFPLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELHVCQUF1QixDQUFDLENBQU07UUFDNUIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRTtZQUNsQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUN6RCxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsWUFBWSxDQUNwRCxFQUFFLFNBQVMsSUFBSSxZQUFZLENBQUM7WUFDN0IsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztTQUN4QzthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBQ0QsdUJBQXVCO1FBQ3JCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FDeEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7Z0JBQ3JELENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsSUFBSSxlQUFlLElBQUksQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQ25HLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FDWCxDQUFDO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1QixJQUFJLGNBQWM7Z0JBQUUsS0FBSyxFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUNELFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNsRDtRQUNELElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFDeEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFDeEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFDRCxZQUFZLENBQUMsSUFBWSxFQUFFLFNBQWlCO1FBQzFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0UsQ0FBQztJQUVELElBQUksc0JBQXNCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELG9CQUFvQixDQUFDLFFBQWdCO1FBQ25DLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQzlCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUNsQyxDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEM7SUFDSCxDQUFDOzttSEEvdkVVLHFCQUFxQjt1R0FBckIscUJBQXFCLDZ4QkMzQmxDLGk1OUNBNnVCTTs0RkRsdEJPLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUI7Mk9BS3BCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBa0JHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFpRkUsbUJBQW1CO3NCQUEzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2FsbCwgRGV2aWNlIH0gZnJvbSAnQHR3aWxpby92b2ljZS1zZGsnO1xyXG5pbXBvcnQgeyBFeHRlbnNpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9leHRlbnNpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFR3aWxpb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL3R3aWxpby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnRzJztcclxuaW1wb3J0IHN3YWwgZnJvbSAnc3dlZXRhbGVydDInO1xyXG5pbXBvcnQgeyBrZXlwYWQgfSBmcm9tICcuLi8uLi8uLi9rZXlwYWQnO1xyXG5pbXBvcnQgeyBpbnRlcnZhbCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9pbmNvbWVpbmctY2FsbC1zb2NrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IElwQWRkcmVzc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2lwLWFkZHJlc3Muc2VydmljZSc7XHJcbmludGVyZmFjZSBDYWxsRGV0YWlscyB7XHJcbiAgY2FsbFNpZDogc3RyaW5nO1xyXG4gIGNhbGxTdGF0dXM6IHN0cmluZztcclxufVxyXG5pbnRlcmZhY2UgQ2FsbFN0YXR1c1Jlc3BvbnNlIHtcclxuICBjYWxsRGV0YWlsczogQ2FsbERldGFpbHM7XHJcbiAgcmVzcG9uc2U6IHN0cmluZztcclxuICBlcnJvclR5cGU6IG51bWJlcjtcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgc3RhdHVzOiBudW1iZXI7XHJcbn1cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItY2FsbC1wcm9ncmVzcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYWxsUHJvZ3Jlc3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgY2FsbERhdGE6IGFueTtcclxuICBASW5wdXQoKSBzZWxlY3RlZENhbGxlcklkOiBhbnk7XHJcbiAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsRGF0YT86IENhbGw7IC8vXHJcbiAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsc0xpc3Q6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIGNhbGxlcklkTGlzdDogYW55ID0gW107XHJcbiAgQElucHV0KCkgbmV3Q2FsbENvbmZlcmVuY2U6IGFueSA9IHt9O1xyXG4gIEBJbnB1dCgpIG1pc3NDYWxsSW5mbzogYW55ID0ge307XHJcbiAgQElucHV0KCkgdXNlclNldHRpbmdJbmZvOiBhbnkgPSB7fTtcclxuICBASW5wdXQoKSBkZXZpY2VJZDogYW55O1xyXG4gIEBJbnB1dCgpIGNhbGxBY3Rpb246IGFueTtcclxuICBASW5wdXQoKSBjb25mZXJlbmNlQ2FsbEluZm86IGFueTtcclxuICBASW5wdXQoKSBpbmNvbWluZ0Zyb21JbWFnZTpzdHJpbmcgPSAnJ1xyXG4gIHVzZXJJZDogYW55O1xyXG4gIEBPdXRwdXQoKSBlbmRDYWxsRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsc05ld0luZm86IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7Ly9cclxuICBAT3V0cHV0KCkgbWluaW1pc2VFdmVudDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIGRldmljZT86IERldmljZTtcclxuICBjYWxsITogQ2FsbCB8IGFueTtcclxuICBzaG93UmluZ0FuaW1hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRpbWVyOiBzdHJpbmcgPSAnMDA6MDAnO1xyXG4gIGludGVydmFsSWQ6IGFueTtcclxuICBzaG93S2V5cGFkOiBib29sZWFuID0gZmFsc2U7XHJcbiAga2V5cGFkVmFsID0ga2V5cGFkO1xyXG4gIGNhbGxJbnB1dDogc3RyaW5nID0gJyc7XHJcbiAgaXNNdXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcGVuZGluZ011dGVVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZTsgXHJcbiAgaW50ZW5kZWRNdXRlU3RhdGU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcclxuICBkaXNiYWxlRW5kQ2FsbEJ0bjogYm9vbGVhbiA9IHRydWU7XHJcbiAgc2hvd0NsZWFyQnRuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDb2xsb3BzID0gZmFsc2U7XHJcbiAgY3VycmVudENhbGw6IGFueTtcclxuICBpc0NvbmZlcmVuY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc091dGdvaW5nQ2FsbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQE91dHB1dCgpIGluY29taW5nQ2FsbEluaXRpYXRlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBpc0xvYWRlcnNob3duOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgQE91dHB1dCgpIGVuZEluY29taW5nQ2FsbEV2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIC8vIFJlY29yZGluZyB2YXJpYWJsZXNcclxuICBjYWxsU2lkOiBhbnk7XHJcbiAgaXNSZWNvcmRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1BhdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRpbWVyU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG4gIHRpbWVFbGFwc2VkID0gMDsgLy8gaW4gc2Vjb25kc1xyXG4gIHJlY29yZENhbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpbmNvbWluZ0NhbGxTaWQ6IGFueTtcclxuICBjYWxsU3RhdHVzOiBzdHJpbmcgPSAncmluZ2luZyc7ICAgIC8vXHJcbiAgaW5jb21pbmdSZWNvcmRDYWxsPzogYW55O1xyXG4gIHNlbGVjdGVkSW5jb21pbmdDYWxsOiBhbnk7XHJcbiAgc2hvd0NvbnRhY3RzUGFuZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0FkZFJlbW92ZVBhcnRpY2lwYW50OiBib29sZWFuID0gZmFsc2U7ICAgLy9cclxuICBpc0NvbmN1cnJlbnRJbmNvbWluZzogYm9vbGVhbiA9IGZhbHNlOyAgIC8vXHJcbiAgaGVsZENhbGw/OiBDYWxsOyAgLy9cclxuICBpc0NhbGxPbkhvbGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjb250YWN0czogYW55W10gPSBbXTtcclxuICBjdXJyZW50Q2FsbExpc3Q6IGFueVtdID0gW107XHJcbiAgY29uZmVyZW5jZUlkOiBhbnk7XHJcbiAgYWxsUGFydGljaXBlbnRMaXN0OiBhbnk7XHJcbiAgaXNDbGlja0V4cGFuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQ2FsbEluUHJvZ3Jlc3MhOiBib29sZWFuO1xyXG4gIGlzQ3VycmVudEluY29taW5nQ2FsbExpc3Q6IGFueSA9IFtdO1xyXG4gIGlzQ29uZmVyZW5jZUNhbGxIb2xkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRVc2VySW5mbzogYW55O1xyXG4gIGlzU2VhcmNoVmlzaWJsZSA9IGZhbHNlO1xyXG4gIGlzRXhwYW5kZWQgPSBmYWxzZTtcclxuICBzZWFyY2hUZXh0ID0gJyc7XHJcbiAgZmlsdGVyZWRMaXN0OiBhbnkgPSBbXTtcclxuICBmaWx0ZXJlZFBhcnRpY2lwZW50TGlzdDogYW55O1xyXG4gIHNob3dCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1Jpbmdpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0RpcmVjdENhbGxPcHRpb25TaG93OiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGlhbEFsZXJ0ID0ge1xyXG4gICAgbXNnOiAnJyxcclxuICAgIHNob3c6IGZhbHNlXHJcbiAgfVxyXG4gIGxlZnRQYXJ0aWNpcGVudDogYW55ID0ge307XHJcbiAgY29uZmVyZW5jZUNhbGxMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIGlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQ29ubmVjdGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGhvc3RudW1iZXI6IGFueTtcclxuICBpc05ld0FkZGVkQ2FsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRldmljZU51bWJlckxpc3Q6IGFueSA9IFtdO1xyXG4gIG91ck51bWJlckluZm86IGFueSA9IHt9O1xyXG4gIGN1cnJlbnRDb25mZXJlbmNlQ2FsbDogYW55ID0ge307XHJcbiAgaXNSZWFzb25DaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNBbGxBY2NlcHRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGxlYXZlUmVhc29uOiBzdHJpbmcgPSAnJztcclxuICAvLyAyNC1ob3VyIHRpbWUgcGlja2VyXHJcbiAgbGVhdmVIb3VyOiBzdHJpbmcgPSAnJztcclxuICBsZWF2ZU1pbnV0ZTogc3RyaW5nID0gJyc7XHJcbiAgaG91cnM6IHN0cmluZ1tdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjQgfSwgKF8sIGkpID0+IGkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpKTtcclxuICBtaW51dGVzOiBzdHJpbmdbXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDYwIH0sIChfLCBpKSA9PiBpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSk7XHJcbiAgc2hvd0hvdXJEcm9wZG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dNaW51dGVEcm9wZG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkQ29uZjogYW55O1xyXG4gIHNob3dDb25mZXJlbmNlV2FybmluZ01vZGFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcGVuZGluZ0NhbGxEYXRhOiBhbnkgPSBudWxsO1xyXG4gIGNhbGxOdW1iZXJUb2FzdCA9IHtcclxuICAgIHNob3c6IGZhbHNlLFxyXG4gICAgdHlwZTogJ2FsZXJ0LXN1Y2Nlc3MnLFxyXG4gICAgbnVtYmVyOiAnJyxcclxuICAgIGRpc3BsYXlOdW06ICcnXHJcbiAgfTtcclxuICBpc1VuaG9sZENvbmZlcmVuY2VDYWxsOiBhbnk7ICAvL1xyXG4gIGNvbmZlcmVuY2VDYWxsTnVsbENvdW50OiBudW1iZXIgPSAwO1xyXG4gIGFsbENvblBhcnRpY2lwZW50TGlzdDogYW55ID0ge307XHJcbiAgY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdDogYW55O1xyXG4gIHByaXZhdGUgYWNjZXB0ZWRDYWxsTGlzdDogYW55W10gPSBbXTtcclxuICBpc0hvbGRCdG5EaXNhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQzJDb25mb0xpc3Q6IGFueSA9IHt9O1xyXG4gIHByaXZhdGUgbGFzdEFjdGl2ZUNvbmZlcmVuY2VJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBwZW5kaW5nQXV0b1VuaG9sZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkQ29uZk5hbWU6IGFueTtcclxuICBwZW5kaW5nTXV0ZVBhcnRpY2lwYW50czogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XHJcbiAgaW50ZW5kZWRNdXRlU3RhdGVzOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcclxuICBzaG93TmV3Q2FsbExvYWRlcjpib29sZWFuID0gZmFsc2U7XHJcbiAgbmV3Q2FsbExvYWRlckRhdGE6IHsgbmFtZTogc3RyaW5nOyBwaG9uZTogc3RyaW5nLCBpbWc/OiBzdHJpbmcgfSA9IHsgbmFtZTogJycsIHBob25lOiAnJywgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgfTtcclxuICBASW5wdXQoKSBvdXRnb2luZ0NvbnRhY3ROYW1lID0gJyc7XHJcbiAgc2hvd0xlYXZlQ29uZmlybWF0aW9uTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBsZWF2ZUNvbmZQYXJ0aWNpcGFudDogYW55ID0gbnVsbDtcclxuICBsZWF2ZUNvbmZDb25mZXJlbmNlTmFtZTogc3RyaW5nID0gJyc7XHJcbiAgaXNQYXJ0aWNpcGFudFBhbmVsTG9hZGluZyA9IGZhbHNlO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXh0ZW5zaW9uU2VydmljZTogRXh0ZW5zaW9uU2VydmljZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHVibGljIHR3aWxpb1NlcnZpY2U6IFR3aWxpb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGlwU2VydmljZTogSXBBZGRyZXNzU2VydmljZSxcclxuICAgIHByaXZhdGUgaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2U6IEluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmNhbGwgPSB0aGlzLnR3aWxpb1NlcnZpY2UuY2FsbDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gU3Vic2NyaWJlIHRvIGluY29taW5nIGNhbGxzIGZyb20gVHdpbGlvU2VydmljZVxyXG4gICAgIHRoaXMuR2V0Q29udGFjdHNMaXN0KCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZCkge1xyXG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdWJzY3JpYmluZyB0byBpbmNvbWluZyBjYWxsczonLCBlKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGV2aWNlTnVtYmVyTGlzdCA9IHRoaXMuY2FsbGVySWRMaXN0Lm1hcCgocmVzOiBhbnkpID0+IHJlcy5udW1iZXIpO1xyXG4gICBcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLnVzZXJJZCkge1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UudXNlcklkID0gdGhpcy51c2VySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ2NhbGxEYXRhJ10pIHtcclxuICAgICAgaWYgKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5pc0luY29taW5nQ2FsbCkge1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZGlzcGxheU51bSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZnJvbSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7XHJcbiAgICAgICAgICAuLi5jaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZSxcclxuICAgICAgICAgIGlkOiAnMTI1JyxcclxuICAgICAgICAgIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXHJcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IGZhbHNlLFxyXG4gICAgICAgICAgaXNBY2NlcHRDYWxsOiB0cnVlLFxyXG4gICAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICAgIHBob25lOiBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8ucGhvbmUsXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiAnMTIxJyxcclxuICAgICAgICAgIG5hbWU6IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5uYW1lIHx8IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5mcm9tTmFtZSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8udG9OYW1lIHx8ICcnLFxyXG4gICAgICAgICAgdGltZTogdGhpcy50aW1lcixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMub25BZGROZXdDYWxsKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10/LmN1cnJlbnRWYWx1ZT8ubGVuZ3RoIHx8IGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10/LnByZXZpb3VzVmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmlzUGFydGljaXBhbnRQYW5lbExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIGlmICghdGhpcy5kZXZpY2VOdW1iZXJMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuZGV2aWNlTnVtYmVyTGlzdCA9IHRoaXMuY2FsbGVySWRMaXN0Lm1hcCgocmVzOiBhbnkpID0+IHJlcy5udW1iZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmxvZygnbmV3SW5jb21pbmdDYWxsc0xpc3QnLCB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0KTtcclxuICAgICAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZvckVhY2goKGNhbGxJbmZvOiBhbnksIGk6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb25mZXJlbmNlSWQgPSBpID09IDAgPyB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0W2ldLmNvbmZlcmVuY2VJZCA6IHRoaXMuY29uZmVyZW5jZUlkO1xyXG4gICAgICAgICAgbGV0IG91ck51bWJlckluZm8gPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0W2ldPy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHJlc0RhdGE/LmNsaWVudCkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiAoIXJlc0RhdGE/LmJ1c2luZXNzTnVtYmVyIHx8IChyZXNEYXRhPy5idXNpbmVzc051bWJlciAmJiBjYWxsSW5mbz8ucGFydGljaXBhbnRzPy5sZW5ndGggPT0gMSkpKSkgJiYgIXJlc0RhdGE/LmlzTGVmdFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmdNdXRlVXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNNdXRlID0gIW91ck51bWJlckluZm8/LmlzSG9sZCA/IG91ck51bWJlckluZm8/LmlzTXV0ZSA6IHRoaXMuaXNNdXRlO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChvdXJOdW1iZXJJbmZvPy5pc011dGUgPT09IHRoaXMuaW50ZW5kZWRNdXRlU3RhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5pc011dGUgPSBvdXJOdW1iZXJJbmZvPy5pc011dGU7XHJcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ011dGVVcGRhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvL3RoaXMuaXNNdXRlID0gIW91ck51bWJlckluZm8/LmlzSG9sZCA/IG91ck51bWJlckluZm8/LmlzTXV0ZSA6IHRoaXMuaXNNdXRlO1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRjYWxsUGFydGljaXBhbnRMaXN0SUQgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKHJlcyk9PiByZXMuY29uZmVyZW5jZUlkID09IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0/LmNvbmZlcmVuY2VJZCkubWFwKChyZXMpPT4gcmVzLnBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgbGV0IHVwZGF0ZWRMaXN0ID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maWx0ZXIoKGNvbmY6IGFueSkgPT4gY29uZi5jb25mZXJlbmNlSWQgPT09IGNhbGxJbmZvLmNvbmZlcmVuY2VJZCkuZmxhdE1hcCgoY29uZjogYW55KSA9PiBjb25mLnBhcnRpY2lwYW50cy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCkpO1xyXG4gICAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdFtpXS5wYXJ0aWNpcGFudHMubWFwKChyZXM6YW55KSA9PiByZXMuaWQpO1xyXG4gICAgICAgICAgY3VycmVudGNhbGxQYXJ0aWNpcGFudExpc3RJRC5mb3JFYWNoKChwYXJ0aWNpcGFudElkOmFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZighdXBkYXRlZExpc3QuaW5jbHVkZXMocGFydGljaXBhbnRJZCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigocmVzSW5mbzphbnkpID0+IHJlc0luZm8/LnBhcnRpY2lwYW50SWQgIT09IHBhcnRpY2lwYW50SWQgfHwgKHJlc0luZm8/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgIXJlc0luZm8/LmlzQWNjZXB0Q2FsbCkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBpZiAob3VyTnVtYmVySW5mbz8uaWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVkUGFydGljaXBhbnRMaXN0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0/LnBhcnRpY2lwYW50cyk7XHJcbiAgICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0ucGFydGljaXBhbnRzLmZvckVhY2goYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlcz8uaG9zdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0bnVtYmVyID0gcmVzO1xyXG4gICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgaWYob3VyTnVtYmVySW5mbz8uaXNDb25mZXJlbmNlIHx8ICh0aGlzLmhvc3RudW1iZXI/LmlzQ29uZmVyZW5jZSAmJiB0aGlzLmhvc3RudW1iZXI/LmNvbmZlcmVuY2VJZCA9PSByZXM/LmNvbmZlcmVuY2VJZCkgfHwgY2FsbEluZm8/LnBhcnRpY2lwYW50cz8ubGVuZ3RoID4gMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBjb250YWN0OiBhbnkgPSB7fVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGFjdHM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICBjb250YWN0ID0gdGhpcy5jb250YWN0cy5maW5kKChyZXNEYXRhKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc0RhdGE/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgPT0gKHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy5mcm9tIDogcmVzPy50bylcclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtPy5pZCA9PSByZXM/LmlkKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xICYmICFyZXMuaXNMZWZ0ICYmIHJlcz8uc3RhdHVzICE9ICduby1hbnN3ZXInICYmIHJlcz8uc3RhdHVzICE9ICdjYW5jZWxlZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgIC4uLnJlcyxcclxuICAgICAgICAgICAgICAgICAgICAgIGZyb21OYW1lOiB0aGlzLmdldE5hbWUocmVzPy5mcm9tKSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHRvTmFtZTogIHRoaXMuZ2V0TmFtZShyZXM/LnRvKSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGltZzogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyAocmVzPy5mcm9tSW1hZ2UgfHwgcmVzPy5pbWcpICA6IHJlcz8udG9JbWFnZSB8fCBjb250YWN0Py5pbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0hvbGQ6IHJlcz8uaXNIb2xkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlSG9sZDogdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoID4gMSA/IG91ck51bWJlckluZm8/LmlzSG9sZCA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNOb3RpZmljYXRpb246IGNhbGxJbmZvPy5faXNOb3RpZmljYXRpb24gJiYgIXRoaXMuZ2V0U3RhdHVzKHJlcykgJiYgcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc011dGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlOiB0aGlzLmlzQ29uZmVyZW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwaG9uZTogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbExhYmVsOiBjYWxsSW5mbz8uY2FsbExhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogcmVzPy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VTaWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlU2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcz8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93Q29udGFjdHNQYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIXRoaXMudGltZXIgfHwgdGhpcy50aW1lciA9PSAnMDA6MDAnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lcihvdXJOdW1iZXJJbmZvPy5qb2luZWRBdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ICE9IC0xICYmIChyZXM/LmlzTGVmdCB8fCByZXM/LnN0YXR1cyA9PSAnbm8tYW5zd2VyJyB8fCByZXM/LnN0YXR1cyA9PSAnY2FuY2VsZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0/LmlkID09IHRoaXMuY3VycmVudENhbGw/LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93Q29udGFjdHNQYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jdXJyZW50Q2FsbD8uam9pbmVkQXQpO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ICE9IC0xICYmICFyZXM/LmlzTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cocmVzKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0aWNpcGFudElkID0gcmVzLmlkO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBhIG11dGUgdXBkYXRlIGlzIHBlbmRpbmcgZm9yIHRoaXMgcGFydGljaXBhbnRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc011dGVQZW5kaW5nID0gdGhpcy5wZW5kaW5nTXV0ZVBhcnRpY2lwYW50cy5oYXMocGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZW5kZWRNdXRlID0gdGhpcy5pbnRlbmRlZE11dGVTdGF0ZXMuZ2V0KHBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkTXV0ZTogYm9vbGVhbjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNNdXRlUGVuZGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlcnZlciBhbHJlYWR5IGNvbmZpcm1lZCBvdXIgY2hhbmdlLCBhY2NlcHQgaXQgYW5kIGNsZWFyIHBlbmRpbmdcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuaXNNdXRlID09PSBpbnRlbmRlZE11dGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZE11dGUgPSByZXMuaXNNdXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdNdXRlUGFydGljaXBhbnRzLmRlbGV0ZShwYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZXMuZGVsZXRlKHBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBrZWVwIHRoZSBjdXJyZW50IGxvY2FsIHZhbHVlIChpZ25vcmUgdGhlIHN0YWxlIHNlcnZlciBzdGF0ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZE11dGUgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0uaXNNdXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBObyBwZW5kaW5nIG11dGUg4oCTIHRydXN0IHRoZSBzZXJ2ZXIgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRNdXRlID0gcmVzLmlzTXV0ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbU5hbWU6IHRoaXMuZ2V0TmFtZShyZXM/LmZyb20pIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdG9OYW1lOiAgdGhpcy5nZXROYW1lKHJlcz8udG8pIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaW1nOiByZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IChyZXM/LmZyb21JbWFnZSB8fCByZXM/LmltZykgOiByZXM/LnRvSW1hZ2UgfHwgY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNIb2xkOiByZXM/LmlzSG9sZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZUhvbGQ6IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCA+IDEgPyBvdXJOdW1iZXJJbmZvPy5pc0hvbGQgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzTm90aWZpY2F0aW9uOiBjYWxsSW5mbz8uX2lzTm90aWZpY2F0aW9uICYmICF0aGlzLmdldFN0YXR1cyhyZXMpICYmIHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNNdXRlOiB1cGRhdGVkTXV0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZTogdGhpcy5pc0NvbmZlcmVuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwaG9uZTogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogcmVzPy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VTaWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlU2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbExhYmVsOiBjYWxsSW5mbz8uY2FsbExhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcz8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXMuaXNMZWZ0ICYmIHJlcz8uc3RhdHVzICE9ICduby1hbnN3ZXInICYmIHJlcz8uc3RhdHVzICE9ICdjYW5jZWxlZCcpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb21OYW1lOiB0aGlzLmdldE5hbWUocmVzPy5mcm9tKSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICB0b05hbWU6ICB0aGlzLmdldE5hbWUocmVzPy50bykgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1nOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gKHJlcz8uZnJvbUltYWdlIHx8IHJlcz8uaW1nKSA6IHJlcz8udG9JbWFnZSB8fCBjb250YWN0Py5pbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNIb2xkOiByZXM/LmlzSG9sZCxcclxuICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2VIb2xkOiB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGggPiAxID8gb3VyTnVtYmVySW5mbz8uaXNIb2xkIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNOb3RpZmljYXRpb246IGNhbGxJbmZvPy5faXNOb3RpZmljYXRpb24gJiYgIXRoaXMuZ2V0U3RhdHVzKHJlcykgJiYgcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNNdXRlOiByZXM/LmlzTXV0ZSxcclxuICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6IHRoaXMuaXNDb25mZXJlbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHRoaXMuZ2V0U3RhdHVzKHJlcykgOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcGhvbmU6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHJlcy5pZCxcclxuICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlU2lkOiBjYWxsSW5mbz8uY29uZmVyZW5jZVNpZCxcclxuICAgICAgICAgICAgICAgICAgICBjYWxsTGFiZWw6IGNhbGxJbmZvPy5jYWxsTGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXM/LmpvaW5lZEF0IHx8IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSksXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyID0gJzAwOjAwJztcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKHJlcz8uam9pbmVkQXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsTnVsbENvdW50ID0gMDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY29uZmVyZW5jZUNhbGxOdWxsQ291bnQgPiA1KSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NhbGwgZW5kIGluIDI5OScpXHJcbiAgICAgICAgICAgIHRoaXMuaXNSaW5naW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25jdXJyZW50SW5jb21pbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gTm8gY2FsbCBpbiBwcm9ncmVzczogcmVzZXQgdGhlIGluY29taW5nLW11dGUgc3dpdGNoIGJhY2sgdG8gZGVmYXVsdCAob2ZmKS5cclxuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLnNldEluY29taW5nTXV0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHt9XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNSaW5naW5nKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbE51bGxDb3VudCsrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLy8gUmVtb3ZlIHBhcnRpY2lwYW50IGRhdGEgZm9yIGNvbmZlcmVuY2VzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgYWN0aXZlIGxpc3RcclxuICAgICAgICBjb25zdCBhY3RpdmVDb25mZXJlbmNlSWRzID0gbmV3IFNldCh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Lm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmNvbmZlcmVuY2VJZCkpO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29uZklkIG9mIE9iamVjdC5rZXlzKHRoaXMuYWxsQ29uUGFydGljaXBlbnRMaXN0KSkge1xyXG4gICAgICAgICAgaWYgKCFhY3RpdmVDb25mZXJlbmNlSWRzLmhhcyhjb25mSWQpKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFsbENvblBhcnRpY2lwZW50TGlzdFtjb25mSWRdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdmFsaWRWYWx1ZXMgPSBuZXcgU2V0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmxhdE1hcCgoaXRlbTogYW55KSA9PiBpdGVtPy5wYXJ0aWNpcGFudHMubWFwKCh2YWw6IGFueSkgPT4gdmFsPy5pZCkpKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiB2YWxpZFZhbHVlcy5oYXMoaXRlbT8ucGFydGljaXBhbnRJZCkpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Q2FsbDphbnkgPSBbXTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmluZCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gaXRlbT8ucGFydGljaXBhbnRzPy5maW5kKChwYXJ0aWNpcGFudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py5mcm9tKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiBwYXJ0aWNpcGFudD8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcGFydGljaXBhbnQ/LmNsaWVudCkpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0ICYmICFwYXJ0aWNpcGFudD8uaXNIb2xkICYmICFwYXJ0aWNpcGFudD8uYnVzaW5lc3NOdW1iZXIpIHtcclxuICAgICAgICAgICAgICBjdXJyZW50Q2FsbC5wdXNoKHBhcnRpY2lwYW50KTtcclxuICAgICAgICAgICAgICB0aGlzLnRpbWVyID0gdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShwYXJ0aWNpcGFudD8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihwYXJ0aWNpcGFudD8uaG9zdCkge1xyXG4gICAgICAgICAgICAgIGl0ZW1bJ3RpbWVyJ10gPSB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHBhcnRpY2lwYW50Py5qb2luZWRBdCB8fCBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8uZnJvbSkgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgJiYgcGFydGljaXBhbnQ/LmNsaWVudCkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8udG8pICYmIHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmIHBhcnRpY2lwYW50Py5jbGllbnQpKSAmJiAhcGFydGljaXBhbnQ/LmlzTGVmdCAmJiAhcGFydGljaXBhbnQ/LmlzSG9sZCAmJiAhcGFydGljaXBhbnQ/LmJ1c2luZXNzTnVtYmVyXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIERldGVjdCBkaXNjb25uZWN0IHZzLiBob2xkIHRyYW5zaXRpb24gZXhhY3RseSBvbmNlIHBlciBldmVudC5cclxuICAgICAgICAvLyBTYW1lIHBhcnRpY2lwYW50IGZpbHRlciBhcyBnZXRDdXJyZW50Q2FsbEluZm8oKSAod2l0aG91dCAhaXNIb2xkKSB0byBzdGF5IGNvbnNpc3RlbnQuXHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCAmJiAhY3VycmVudENhbGxbMF0/LmlzSG9sZCkge1xyXG4gICAgICAgICAgdGhpcy5sYXN0QWN0aXZlQ29uZmVyZW5jZUlkID0gdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGwuY29uZmVyZW5jZUlkO1xyXG4gICAgICAgICAgdGhpcy5wZW5kaW5nQXV0b1VuaG9sZCA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYXN0QWN0aXZlQ29uZmVyZW5jZUlkICYmICF0aGlzLnBlbmRpbmdBdXRvVW5ob2xkKSB7XHJcbiAgICAgICAgICBjb25zdCBsYXN0Q29uZiA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmluZCgoYzogYW55KSA9PiBjLmNvbmZlcmVuY2VJZCA9PSB0aGlzLmxhc3RBY3RpdmVDb25mZXJlbmNlSWQpO1xyXG4gICAgICAgICAgY29uc3Qgb3VyUGFydGljaXBhbnRJbkxhc3RDb25mID0gbGFzdENvbmY/LnBhcnRpY2lwYW50cz8uZmluZCgocDogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwPy5mcm9tKSAmJiBwPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHA/LmNsaWVudCkgfHxcclxuICAgICAgICAgICAgICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocD8udG8pICYmIHA/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcD8uY2xpZW50ICYmICFwPy5idXNpbmVzc051bWJlcikpICYmICFwPy5pc0xlZnRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICAvLyBDb25mZXJlbmNlIGdvbmUgT1Igb3VyIHBhcnRpY2lwYW50IG5vdCBoZWxkIOKGkiB0aGUgYWN0aXZlIGNhbGwgZGlzY29ubmVjdGVkIOKGkiBxdWV1ZSBhdXRvLXVuaG9sZFxyXG4gICAgICAgICAgaWYgKCFsYXN0Q29uZiB8fCAhb3VyUGFydGljaXBhbnRJbkxhc3RDb25mPy5pc0hvbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQXV0b1VuaG9sZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50cy5sZW5ndGggPT0gMiAmJiB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzWzBdPy5pZCkge1xyXG4gICAgICAgICAgY29uc3Qgb3duTnVtYmVycyA9IHRoaXMuZGV2aWNlTnVtYmVyTGlzdCAmJiB0aGlzLmRldmljZU51bWJlckxpc3QubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICA/IHRoaXMuZGV2aWNlTnVtYmVyTGlzdFxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgICBjb25zdCBjYWxsZXJOdW1iZXIgPSB0aGlzLmNhbGxEYXRhPy5mcm9tIHx8IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcz8uaXNDb25mZXJlbmNlSG9sZCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKG93bk51bWJlcnMpIHtcclxuICAgICAgICAgICAgICAvLyBPcmlnaW5hbCBsb2dpYyDigJMgd29ya3Mgd2hlbiB0aGUgY2FsbGVy4oCRSUQgbGlzdCBpcyBsb2FkZWRcclxuICAgICAgICAgICAgICByZXR1cm4gKHJlcz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiByZXM/LmNsaWVudCAmJiAhb3duTnVtYmVycy5pbmNsdWRlcyhyZXM/LmZyb20pKSB8fFxyXG4gICAgICAgICAgICAgICAgKHJlcz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiByZXM/LmNsaWVudCAmJiAhb3duTnVtYmVycy5pbmNsdWRlcyhyZXM/LnRvKSAmJiAhcmVzPy5idXNpbmVzc051bWJlcikgfHxcclxuICAgICAgICAgICAgICAgICghcmVzPy5jbGllbnQgJiYgcmVzPy5pc0FjY2VwdENhbGwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIFNhZmUgZmFsbGJhY2s6IGV4Y2x1ZGUgdGhlIHBhcnRpY2lwYW50IHdob3NlIG51bWJlciBtYXRjaGVzIHRoZSBjYWxsZXIgSUQgd2UgdXNlZFxyXG4gICAgICAgICAgICAgIGNvbnN0IGlzT3duID0gKHJlcz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiByZXM/LmZyb20gPT09IGNhbGxlck51bWJlcikgfHxcclxuICAgICAgICAgICAgICAgIChyZXM/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcmVzPy50byA9PT0gY2FsbGVyTnVtYmVyICYmICFyZXM/LmJ1c2luZXNzTnVtYmVyKTtcclxuICAgICAgICAgICAgICByZXR1cm4gIWlzT3duO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHsgLi4uc2VsZWN0ZWQsIGlzQWNjZXB0Q2FsbDogdHJ1ZSB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAgZWxzZSBpZiAodGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50cz8ubGVuZ3RoID4gMiAmJiB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzWzFdPy5pc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gIXJlcz8uaXNDb25mZXJlbmNlSG9sZCk7XHJcbiAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmKHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHM/Lmxlbmd0aCA9PSAxICYmIHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHNbMF0/LmlkKXtcclxuICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChjYWxsSW5mbzphbnkpPT4gY2FsbEluZm8/LmlkID09IHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHNbMF0/LmlkKTtcclxuICAgICAgICAgIGlmKHRoaXMuY3VycmVudENhbGw/LmNsaWVudCAmJiB0aGlzLmN1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxbJ2NsaWVudCddPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbFsnaXNBY2NlcHRDYWxsJ109IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuY3VycmVudENhbGwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZighdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGwgJiZ0aGlzLmN1cnJlbnRDYWxsICYmIHRoaXMuY3VycmVudENhbGxMaXN0Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IHJlcz8uaWQgPT0gdGhpcy5jdXJyZW50Q2FsbD8uaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsICYmICF0aGlzLmlzTmV3QWRkZWRDYWxsKSB7XHJcbiAgICAgICAgICBsZXQgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbyA9IHRoaXMuZ2V0Q3VycmVudENhbGxJbmZvKCk7XHJcbiAgICAgICAgICBpZiAoIWN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmlkICYmIHRoaXMucGVuZGluZ0F1dG9VbmhvbGQpIHtcclxuICAgICAgICAgICAgLy8gU2VhcmNoIEFMTCBjb25mZXJlbmNlcyBleGNlcHQgdGhlIG9uZSB0aGF0IGp1c3QgZGlzY29ubmVjdGVkLlxyXG4gICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgc2luZ2xlLWNvbmZlcmVuY2UgaG9sZCAoaW5jbHVkaW5nIGJyaWVmIGlzTGVmdCByYWNlIGNvbmRpdGlvbnMpXHJcbiAgICAgICAgICAgIC8vIGZyb20gZXZlciB0cmlnZ2VyaW5nIGFuIHVuaG9sZCDigJQgd2Ugb25seSB1bmhvbGQgYSBESUZGRVJFTlQgaGVsZCBjb25mZXJlbmNlLlxyXG4gICAgICAgICAgICBsZXQgaG9sZENhbGxJbmZvOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbmYgb2YgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCkge1xyXG4gICAgICAgICAgICAgIGlmIChjb25mLmNvbmZlcmVuY2VJZCA9PSB0aGlzLmxhc3RBY3RpdmVDb25mZXJlbmNlSWQpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgIGhvbGRDYWxsSW5mbyA9IGNvbmYucGFydGljaXBhbnRzLmZpbmQoKGNhbGxJbmZvOiBhbnkpID0+ICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGNhbGxJbmZvPy5mcm9tKSAmJiBjYWxsSW5mbz8uY2xpZW50KVxyXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjYWxsSW5mbz8udG8pICYmIGNhbGxJbmZvPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSkgJiYgIWNhbGxJbmZvPy5pc0xlZnQgJiYgY2FsbEluZm8/LmlzSG9sZCAmJiAhY2FsbEluZm8/LmJ1c2luZXNzTnVtYmVyKTtcclxuICAgICAgICAgICAgICBpZiAoaG9sZENhbGxJbmZvKSBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaG9sZENhbGxJbmZvPy5pZCAmJiAhdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2hvbGRDYWxsSW5mbz8uaWRdLFxyXG4gICAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBob2xkQ2FsbEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgbXV0ZTogaG9sZENhbGxJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDM4NycsIGhvbGRJbmZvKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSBob2xkQ2FsbEluZm8/LmNvbmZlcmVuY2VJZDtcclxuICAgICAgICAgICAgICB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdBdXRvVW5ob2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5sYXN0QWN0aXZlQ29uZmVyZW5jZUlkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgICAgICBsZXQgc2VsZWN0ZWRVc2VyID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtPy5pZCA9PSB0aGlzLnNlbGVjdGVkVXNlckluZm8/LnBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgaWYgKHNlbGVjdGVkVXNlcikge1xyXG4gICAgICAgICAgICBzZWxlY3RlZFVzZXIuSXNVc2VySW5mb1Nob3cgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZihzZWxlY3RlZFVzZXIuYnVzaW5lc3NOdW1iZXIgPT0gdHJ1ZSAmJiAhc2VsZWN0ZWRVc2VyLnVzZXJJbmZvSWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUMyQ0luZm9QYW5lbChzZWxlY3RlZFVzZXIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHNlbGVjdGVkVXNlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGluY29taW5nQ2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbT8uYnVzaW5lc3NOdW1iZXIpO1xyXG4gICAgICAgICAgICBpZiAoaW5jb21pbmdDYWxsPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gaW5jb21pbmdDYWxsO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzQ2xpY2tFeHBhbmQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHt9O1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCByZXNJbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiAhIWl0ZW0/LmJ1c2luZXNzTnVtYmVyICYmIHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhpdGVtPy50bykpO1xyXG4gICAgICAgICAgaWYgKHJlc0luZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3RbcmVzSW5kZXhdWydJc1VzZXJJbmZvU2hvdyddID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbcmVzSW5kZXhdO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5pc0FsbEFjY2VwdGVkID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZXZlcnkoKGNhbGw6IGFueSkgPT4gY2FsbD8uaXNBY2NlcHRDYWxsKVxyXG4gICAgICAgIGNvbnN0IHVuaXF1ZUxpc3QgPSBbXHJcbiAgICAgICAgICAuLi5uZXcgTWFwKHRoaXMuY3VycmVudENhbGxMaXN0Lm1hcChpdGVtID0+IFtpdGVtLmNvbmZlcmVuY2VJZCwgaXRlbV0pKS52YWx1ZXMoKVxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0ID0gdW5pcXVlTGlzdC5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbExpc3QuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgcGFydGljaXBhbnRMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IHJlcz8uY29uZmVyZW5jZUlkID09IGl0ZW0/LmNvbmZlcmVuY2VJZCAmJiByZXM/LmJ1c2luZXNzTnVtYmVyICYmICFyZXM/Lmhvc3QpO1xyXG4gICAgICAgICAgaWYocGFydGljaXBhbnRMaXN0Py5pZCkge1xyXG4gICAgICAgICAgICBpdGVtWydpc0J1c2luZXNzTnVtYmVyJ10gPSBwYXJ0aWNpcGFudExpc3Q/LmJ1c2luZXNzTnVtYmVyO1xyXG4gICAgICAgICAgICBpdGVtWydidXNpbmVzc1BhcnRpY2lwYW50SWQnXSA9IHBhcnRpY2lwYW50TGlzdD8ucGFydGljaXBhbnRJZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTsgXHJcbiAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbE51bGxDb3VudCA9IDA7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICBpZih0aGlzLmNvbmZlcmVuY2VDYWxsTnVsbENvdW50ID4gNSl7XHJcbiAgICAgICAgY29uc29sZS5sb2coJzQxMScpXHJcbiAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYodGhpcy5jYWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7fVxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBpZiAodGhpcy5pc1JpbmdpbmcpIHtcclxuICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgLy8gTm8gY2FsbCBpbiBwcm9ncmVzczogcmVzZXQgdGhlIGluY29taW5nLW11dGUgc3dpdGNoIGJhY2sgdG8gZGVmYXVsdCAob2ZmKS5cclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2Uuc2V0SW5jb21pbmdNdXRlZChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbE51bGxDb3VudCArPTE7XHJcbiAgICAgICAgLy8gdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ2NhbGxBY3Rpb24nXT8uY3VycmVudFZhbHVlICYmIHRoaXMuY2FsbEFjdGlvbj8udHlwZSA9PSAncmVKb2luJykge1xyXG4gICAgICB0aGlzLmRldmljZU51bWJlckxpc3QgPSB0aGlzLmNhbGxlcklkTGlzdC5tYXAoKHJlczogYW55KSA9PiByZXMubnVtYmVyKTtcclxuICAgICAgbGV0IGRhdGEgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbT8uY29uZmVyZW5jZUlkID09IHRoaXMuY2FsbEFjdGlvbj8uY29uZmVyZW5jZUlkKT8ucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT4gcmVzRGF0YT8uaG9zdCk7XHJcbiAgICAgIGlmKGRhdGE/LmlzTGVmdCB8fCAhZGF0YSkge1xyXG4gICAgICAgIHRoaXMucmVqb2luSG9zdCh0aGlzLmNhbGxBY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snbmV3Q2FsbENvbmZlcmVuY2UnXT8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuQ2FsbFRvVW5zYXZlZE51bWJlcih0aGlzLm5ld0NhbGxDb25mZXJlbmNlPy5udW1iZXIsIHRydWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWpvaW5Ib3N0KGNhbGxJbmZvOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIGxldCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvID0gdGhpcy5nZXRDdXJyZW50Q2FsbEluZm8oKTtcclxuICAgICAgICBpZiAoY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uaWQpIHtcclxuICAgICAgICAgIGxldCBob2xkSW5mbzogYW55ID0gdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2N1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gMzg3JywgaG9sZEluZm8pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHJlam9pblBhcnRpY2lwZW50SW5mbyA9IGNhbGxJbmZvPy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSlcclxuICAgICAgICAgICYmIHJlc0RhdGE/LmNsaWVudCAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnKSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LnRvKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmICFyZXNEYXRhPy5idXNpbmVzc051bWJlciAmJiByZXNEYXRhPy5ob3N0KSAmJiByZXNEYXRhPy5pc0xlZnQpXHJcbiAgICAgIClcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IHRydWU7XHJcbiAgICAgIC8vIDHvuI/ig6MgR2V0IG5ldyB0b2tlbiBmb3Igc2FtZSBjb25mZXJlbmNlXHJcbiAgICAgIGNvbnN0IHRva2VuRGF0YTogYW55ID0gYXdhaXQgdGhpcy5nZXRPdXRnb2luZ0NhbGxUb2tlbihjYWxsSW5mbz8uY29uZmVyZW5jZUlkKTtcclxuICAgICAgLy8gMu+4j+KDoyBSZWNvbm5lY3QgZGV2aWNlXHJcbiAgICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcclxuICAgICAgICBjb2RlY1ByZWZlcmVuY2VzOiBbJ29wdXMnLCAncGNtdSddLFxyXG4gICAgICAgIGNsb3NlUHJvdGVjdGlvbjogdHJ1ZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5kZXZpY2UgPSBuZXcgRGV2aWNlKHRva2VuRGF0YS50b2tlbi52YWx1ZSwgb3B0aW9ucyk7XHJcblxyXG4gICAgICB0aGlzLmNhbGwgPSBhd2FpdCB0aGlzLmRldmljZS5jb25uZWN0KHtcclxuICAgICAgICBwYXJhbXM6IHtcclxuICAgICAgICAgIEZyb206IHJlam9pblBhcnRpY2lwZW50SW5mby5mcm9tLFxyXG4gICAgICAgICAgVG86IHJlam9pblBhcnRpY2lwZW50SW5mby50byxcclxuICAgICAgICAgIEVudjogZW52aXJvbm1lbnQuYWJiLFxyXG4gICAgICAgICAgVG9rZW46IHRva2VuRGF0YS50b2tlbi5pZCxcclxuICAgICAgICAgIEV4dDogcmVqb2luUGFydGljaXBlbnRJbmZvLmV4dE51bSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogcmVqb2luUGFydGljaXBlbnRJbmZvPy5jb25mZXJlbmNlSWRcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJ0Y0NvbnN0cmFpbnRzOiB7IGF1ZGlvOiB7IGRldmljZUlkOiAnZGVmYXVsdCcgfSB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudHdpbGlvU2VydmljZS5jYWxsID0gdGhpcy5jYWxsO1xyXG4gICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgYWRkQ2xpZW50UGFydGljaXBhbnRSZXMgPSB0aGlzLmFkZENsaWVudFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgICBmcm9tOiByZWpvaW5QYXJ0aWNpcGVudEluZm8uZnJvbSxcclxuICAgICAgICAgICAgICByb3V0ZTogXCJPVVRHT0lOR1wiLFxyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiByZWpvaW5QYXJ0aWNpcGVudEluZm8/LnRvLFxyXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogcmVqb2luUGFydGljaXBlbnRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICAgICAgcHJveHk6ICcnLFxyXG4gICAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgICBjbGllbnRTaWQ6IHRoaXMuY2FsbD8ucGFyYW1ldGVyc1snQ2FsbFNpZCddLFxyXG4gICAgICAgICAgICAgIHJlY29yZElkOiByZWpvaW5QYXJ0aWNpcGVudEluZm8/LmlkXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSByZWpvaW5QYXJ0aWNpcGVudEluZm8/LmNvbmZlcmVuY2VJZDtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBhZGRDbGllbnRQYXJ0aWNpcGFudDonLCBlcnJvcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTAwMCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdSZWpvaW4gZmFpbGVkJywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWFwVXNlckluZm8ocGFydGljaXBhbnRJbmZvOiBhbnksIGNhbGxlckluZm86IGFueSkge1xyXG4gICAgcGFydGljaXBhbnRJbmZvWydlbWFpbCddID0gY2FsbGVySW5mby5lbWFpbDtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWyduYW1lJ10gPSBjYWxsZXJJbmZvLm5hbWU7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1snaW1hZ2UnXSA9IGNhbGxlckluZm8uaW1hZ2U7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1snZXh0ZW5zaW9uJ10gPSBjYWxsZXJJbmZvLmV4dGVuc2lvbjtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWyd1c2VySW5mb0lkJ10gPSBjYWxsZXJJbmZvLmlkO1xyXG4gICAgICBwYXJ0aWNpcGFudEluZm9bJ21lc3NhZ2UnXSA9IGNhbGxlckluZm8ubWVzc2FnZTtcclxuICAgICAgcGFydGljaXBhbnRJbmZvIFsnbm90ZSddID0gY2FsbGVySW5mby5ub3RlO1xyXG4gICAgICBwYXJ0aWNpcGFudEluZm9bJ251bWJlciddID0gY2FsbGVySW5mby5udW1iZXI7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1sncG9pbnROYW1lJ10gPSBjYWxsZXJJbmZvLnBvaW50TmFtZTtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWydzb2Z0cGhvbmVUd2lsaW9BdXRoSWQnXSA9IGNhbGxlckluZm8uc29mdHBob25lVHdpbGlvQXV0aElkO1xyXG4gICAgICBwYXJ0aWNpcGFudEluZm9bJ3NvdXJjZU5hbWUnXSA9IGNhbGxlckluZm8uc291cmNlTmFtZTtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWydzdWJqZWN0J10gPSBjYWxsZXJJbmZvLnN1YmplY3Q7XHJcbiAgICAgIHJldHVybiB7Li4ucGFydGljaXBhbnRJbmZvfTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZWRQYXJ0aWNpcGFudExpc3QocGFydGljaXBhbnQ6YW55KSB7XHJcbiAgICBpZihwYXJ0aWNpcGFudD8ubGVuZ3RoKXtcclxuICAgICAgdGhpcy5hbGxDb25QYXJ0aWNpcGVudExpc3RbcGFydGljaXBhbnRbMF0/LmNvbmZlcmVuY2VJZF0gPSBwYXJ0aWNpcGFudDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmFsbENvblBhcnRpY2lwZW50TGlzdFtwYXJ0aWNpcGFudFswXT8uY29uZmVyZW5jZUlkXTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCAmJiAhIXRoaXMuYWxsQ29uUGFydGljaXBlbnRMaXN0Py5bdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0XT8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMucGFydGljaXBhbnRMaXN0SW5kbyh0aGlzLmFsbENvblBhcnRpY2lwZW50TGlzdFt0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3RdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5jb25mZXJlbmNlSWQ7XHJcbiAgICAgIHRoaXMucGFydGljaXBhbnRMaXN0SW5kbygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcGFydGljaXBhbnRMaXN0SW5kbyhwYXJ0aWNpcGFudHM/OiBhbnkpIHtcclxuICAgIGlmICghcGFydGljaXBhbnRzPy5sZW5ndGgpIHtcclxuICAgICAgaWYgKHRoaXMuYWxsUGFydGljaXBlbnRMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgcGFydGljaXBhbnRzLm1hcChhc3luYyAocDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZnJvbU5hbWUgPSBhd2FpdCB0aGlzLmdldE5hbWUocC5mcm9tKTtcclxuICAgICAgICBjb25zdCB0b05hbWUgPSBhd2FpdCB0aGlzLmdldE5hbWUocC50byk7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ucCwgZnJvbU5hbWU6IGZyb21OYW1lIHx8IHAuZnJvbU5hbWUsIHRvTmFtZTogdG9OYW1lIHx8IHAudG9OYW1lIH07XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIEJ1aWxkIGEgbG9va3VwIG1hcCBmcm9tIHRoZSBjdXJyZW50IHJlbmRlcmVkIGxpc3Qgc28gd2UgY2FuIHJldXNlIHRoZSBzYW1lXHJcbiAgICAvLyBvYmplY3QgcmVmZXJlbmNlIGZvciBwYXJ0aWNpcGFudHMgd2hvc2UgZGF0YSBoYXNuJ3QgY2hhbmdlZC5cclxuICAgIC8vIEFuZ3VsYXIncyAqbmdGb3IgdXNlcyBvYmplY3QgaWRlbnRpdHkgKD09PSkgdG8gZGVjaWRlIHdoZXRoZXIgdG8gcmUtcmVuZGVyIGEgcm93O1xyXG4gICAgLy8ga2VlcGluZyB0aGUgc2FtZSByZWZlcmVuY2UgcHJldmVudHMgRE9NIGRlc3RydWN0aW9uL3JlY3JlYXRpb24gYW5kIGVsaW1pbmF0ZXMgZmxpY2tlcmluZy5cclxuICAgIGNvbnN0IGV4aXN0aW5nTWFwID0gbmV3IE1hcDxhbnksIGFueT4oXHJcbiAgICAgICh0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCB8fCBbXSkubWFwKChwOiBhbnkpID0+IFtwLmlkLCBwXSlcclxuICAgICk7XHJcblxyXG4gICAgbGV0IGFueUNoYW5nZSA9IHJlc29sdmVkLmxlbmd0aCAhPT0gKHRoaXMuYWxsUGFydGljaXBlbnRMaXN0Py5sZW5ndGggfHwgMCk7XHJcblxyXG4gICAgY29uc3QgbWVyZ2VkOiBhbnlbXSA9IHJlc29sdmVkLm1hcCgobmV3UDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gZXhpc3RpbmdNYXAuZ2V0KG5ld1AuaWQpO1xyXG4gICAgICBpZiAoIWV4aXN0aW5nKSB7XHJcbiAgICAgICAgYW55Q2hhbmdlID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gbmV3UDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaXNNdXRlUGVuZGluZyA9IHRoaXMucGVuZGluZ011dGVQYXJ0aWNpcGFudHMuaGFzKG5ld1AuaWQpO1xyXG4gICAgICBjb25zdCBpbnRlbmRlZE11dGUgPSB0aGlzLmludGVuZGVkTXV0ZVN0YXRlcy5nZXQobmV3UC5pZCk7XHJcbiAgICAgIGlmIChpc011dGVQZW5kaW5nICYmIGludGVuZGVkTXV0ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKG5ld1AuaXNNdXRlID09PSBpbnRlbmRlZE11dGUpIHtcclxuICAgICAgICAgIHRoaXMucGVuZGluZ011dGVQYXJ0aWNpcGFudHMuZGVsZXRlKG5ld1AuaWQpO1xyXG4gICAgICAgICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZXMuZGVsZXRlKG5ld1AuaWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXdQID0geyAuLi5uZXdQLCBpc011dGU6IGV4aXN0aW5nLmlzTXV0ZSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgY2hhbmdlZCA9IE9iamVjdC5rZXlzKG5ld1ApLnNvbWUoayA9PiBleGlzdGluZ1trXSAhPT0gbmV3UFtrXSk7XHJcbiAgICAgIGlmIChjaGFuZ2VkKSB7XHJcbiAgICAgICAgYW55Q2hhbmdlID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4geyAuLi5leGlzdGluZywgLi4ubmV3UCB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBleGlzdGluZztcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChhbnlDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbmZOYW1lID0gdGhpcy5jb25mZXJlbmNlQ2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IHJlcz8uY29uZmVyZW5jZUlkID09IHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCk/LmNhbGxMYWJlbCB8fCAnJztcclxuICAgICAgdGhpcy5hbGxQYXJ0aWNpcGVudExpc3QgPSBtZXJnZWQ7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSBbLi4ubWVyZ2VkXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dDYWxsaW5nVG9hc3QobnVtYmVyOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY2FsbE51bWJlclRvYXN0ID0ge1xyXG4gICAgICBzaG93OiB0cnVlLFxyXG4gICAgICB0eXBlOiAnYWxlcnQtc3VjY2VzcycsXHJcbiAgICAgIG51bWJlcjogbnVtYmVyLFxyXG4gICAgICBkaXNwbGF5TnVtOiBudW1iZXJcclxuICAgIH07XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2FsbE51bWJlclRvYXN0LnNob3cgPSBmYWxzZTtcclxuICAgIH0sIDcwMDApO1xyXG4gIH1cclxuICBnZXRTdGF0dXMocmVzOiBhbnkpIHtcclxuICAgIGlmIChyZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIikge1xyXG4gICAgICByZXR1cm4gcmVzPy5jYWxsU3RhdHVzID09IFwicGFydGljaXBhbnQtam9pblwiIHx8IHJlcz8uY2FsbFN0YXR1cyA9PSBcInBhcnRpY2lwYW50LW11dGVcIiB8fCByZXM/LmNhbGxTdGF0dXMgPT0gXCJwYXJ0aWNpcGFudC1ob2xkXCIgfHwgcmVzPy5jYWxsU3RhdHVzID09ICdjb25uZWN0ZWQnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmKHJlcz8uZGlyZWN0aW9uID09IFwib3V0Z29pbmctY2FsbFwiKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gJ2Fuc3dlcmVkJyAmJiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBHZXRDb250YWN0c0xpc3QoKSB7XHJcbiAgICBjb25zdCB0b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB8fCAnJztcclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5yZWFkQ29udGFjdHModG9rZW4pLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMucGhvbmVCb29rKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gcmVzLnBob25lQm9vaztcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gcmVzLnBob25lQm9vaztcclxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xyXG4gICAgICAgICAgdGhpcy5jb250YWN0cyA9IHJlcztcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gcmVzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gW107XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjb250YWN0czonLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5jb250YWN0cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGFkZFJlczogYW55O1xyXG4gIGFzeW5jIHN0YXJ0Q2FsbChjYWxsRGF0YTogYW55LCBpc05ld0NvbmZlcmVuY2U/OiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xyXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICAgIGNoYW5uZWxJZDogZW52aXJvbm1lbnQuY2hhbm5lbElkLFxyXG4gICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgIHRvOiBjYWxsRGF0YS5waG9uZSxcclxuICAgICAgICBmcm9tTnVtYmVyOiBjYWxsRGF0YS5mcm9tLFxyXG4gICAgICAgIHNjb3BlOiAnbG9jYWwnLFxyXG4gICAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICAgIGZpcnN0bmFtZTogbnVsbCxcclxuICAgICAgICBsYXN0bmFtZTogbnVsbCxcclxuICAgICAgICBjb3VudHJ5Y29kZTogbnVsbCxcclxuICAgICAgICBudW1iZXI6IG51bGwsXHJcbiAgICAgICAgbnVtb3RwOiBudWxsLFxyXG4gICAgICAgIGV4dGVuc2lvbjogbnVsbCxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHtcclxuICAgICAgICBidXNpbmVzc051bWJlcjogZmFsc2UsXHJcbiAgICAgICAgY2FsbFNpZDogJycsXHJcbiAgICAgICAgY2FsbFN0YXR1czogJycsXHJcbiAgICAgICAgY29uZmVyZW5jZUlkOiAnJyxcclxuICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgIGRpcmVjdGlvbjogJ291dGdvaW5nLWNhbGwnLFxyXG4gICAgICAgIGZvcndhcmRlZFRvOiAnJyxcclxuICAgICAgICBmcm9tOiBjYWxsRGF0YS5mcm9tLFxyXG4gICAgICAgIGlkOiAneXl1Z2doamInLFxyXG4gICAgICAgIGltZzogY2FsbERhdGEuaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICBpc0FjY2VwdENhbGw6IHRydWUsXHJcbiAgICAgICAgaXNDb25mZXJlbmNlOiBmYWxzZSxcclxuICAgICAgICBpc0hvbGQ6IGZhbHNlLFxyXG4gICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICBpc0xlZnQ6IGZhbHNlLFxyXG4gICAgICAgIGlzTXV0ZTogZmFsc2UsXHJcbiAgICAgICAgam9pbmVkQXQ6ICcnLFxyXG4gICAgICAgIG5hbWU6IGNhbGxEYXRhPy5uYW1lIHx8ICcnLFxyXG4gICAgICAgIHBhcnRpY2lwYW50SWQ6ICcnLFxyXG4gICAgICAgIHBob25lOiBjYWxsRGF0YT8ucGhvbmUgfHwgJycsXHJcbiAgICAgICAgcm9sZTogJ2NhbGxlZScsXHJcbiAgICAgICAgc3RhdHVzOiAnJyxcclxuICAgICAgICB0aW1lOiAnJyxcclxuICAgICAgICB0bzogY2FsbERhdGE/LnBob25lIHx8ICcnLFxyXG4gICAgICAgIHRvTmFtZTogY2FsbERhdGE/Lm5hbWUgfHwgJycsXHJcbiAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBjYWxsRGF0YT8udXNlcklkXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaW5pdGlhdGVDYWxsKHBheWxvYWQpO1xyXG4gICAgICB0aGlzLmNvbmZlcmVuY2VJZCA9IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQ7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7XHJcbiAgICAgICAgY29uc3QgeyBpZDogY2FsbEF1dGhJZCwgcmVjb3JkQ2FsbCwgIHRva2VuRGF0YX0gPSBhd2FpdCB0aGlzLmdldENhbGxBdXRoSWQocmVzcG9uc2UpO1xyXG4gICAgICAgIHRoaXMucmVjb3JkQ2FsbCA9IHJlY29yZENhbGw7IC8vIFN0b3JlIHRoZSByZWNvcmRDYWxsIHZhbHVlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0VG9EZXZpY2UoY2FsbEF1dGhJZCwgY2FsbERhdGEsIHRva2VuRGF0YSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2FsbFN0YXR1cyhjYWxsQXV0aElkKTtcclxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBhZGRDbGllbnRQYXJ0aWNpcGFudFJlcyA9IHRoaXMuYWRkQ2xpZW50UGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgIGZyb206IGNhbGxEYXRhPy5mcm9tLFxyXG4gICAgICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IGNhbGxEYXRhPy5waG9uZSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQsXHJcbiAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICAgICAgcHJveHk6ICcnLFxyXG4gICAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgICBjbGllbnRTaWQ6IHRoaXMuY2FsbD8ucGFyYW1ldGVyc1snQ2FsbFNpZCddXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFJlcyA9IGF3YWl0IHRoaXMuYWRkUGFydGljaXBhbnRUb0NhbGwoe1xyXG4gICAgICAgICAgICAgIGZyb206IGNhbGxEYXRhPy5mcm9tLFxyXG4gICAgICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IGNhbGxEYXRhPy5waG9uZSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQsXHJcbiAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICAgICAgcHJveHk6ICcnLFxyXG4gICAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmKGlzTmV3Q29uZmVyZW5jZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaXNOZXdBZGRlZENhbGwgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaXNMb2FkZXJzaG93Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGVyc2hvd24uZW1pdChmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQ7XHJcbiAgICAgICAgICAgIC8vIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhZGRpbmcgaW5pdGlhbCBwYXJ0aWNpcGFudDonLCBlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAxNTAwKVxyXG4gICAgICAgIC8vIFBvbGwgdGhlIHN0YXR1cyBmb3IgMzAtNDUgc2Vjb25kc1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDEpIHtcclxuICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaXNMb2FkZXJzaG93Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkZXJzaG93bi5lbWl0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLmlzTmV3QWRkZWRDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgc3dhbChcIkVycm9yXCIsIHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxici8+XCIpLCBcImVycm9yXCIpO1xyXG4gICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yKTtcclxuICAgICAgdGhpcy5lbmRDYWxsKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uTXV0ZVVzZXIoYzogYW55KSB7XHJcbiAgICBjb25zdCBwYXJ0aWNpcGFudElkID0gYy5pZDtcclxuICAgIGNvbnN0IG5ld011dGVTdGF0ZSA9ICFjLmlzTXV0ZTtcclxuXHJcbiAgICBcclxuICAgIHRoaXMucGVuZGluZ011dGVQYXJ0aWNpcGFudHMuYWRkKHBhcnRpY2lwYW50SWQpO1xyXG4gICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZXMuc2V0KHBhcnRpY2lwYW50SWQsIG5ld011dGVTdGF0ZSk7XHJcblxyXG4gICAgYy5pc011dGUgPSBuZXdNdXRlU3RhdGU7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLm9uTXV0ZVBhcnRpY2lwYW50KHtcclxuICAgICAgcGFydGljaXBhbnRJZDogW3BhcnRpY2lwYW50SWRdLFxyXG4gICAgICBjb25mZXJlbmNlSWQ6IGM/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgaG9sZDogYy5pc0hvbGQsXHJcbiAgICAgIG11dGU6IG5ld011dGVTdGF0ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy9yZW1vdmUgcGVuZGluZyBndWFyZCBhZnRlciA1IHNlY29uZHMgaWYgbm8gY29uZmlybWF0aW9uXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMucGVuZGluZ011dGVQYXJ0aWNpcGFudHMuaGFzKHBhcnRpY2lwYW50SWQpKSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nTXV0ZVBhcnRpY2lwYW50cy5kZWxldGUocGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZXMuZGVsZXRlKHBhcnRpY2lwYW50SWQpO1xyXG4gICAgICB9XHJcbiAgICB9LCA1MDAwKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uSG9sZENhbGwoYzogYW55KSB7XHJcbiAgICB0aGlzLmlzSG9sZEJ0bkRpc2FibGUgPSB0cnVlO1xyXG4gICAgaWYoKChjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjPy5mcm9tKSkgfHwgKGM/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgdGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGM/LnRvKSkpICYmIGM/LmNsaWVudCAmJiAhYz8uYnVzaW5lc3NOdW1iZXIpIHtcclxuICAgICAgbGV0IHVuSG9sZEluZm86IGFueSA9IHt9O1xyXG4gICAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZvckVhY2goYXN5bmMgKGNhbGw6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGlmIChjYWxsPy5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgICBsZXQgcGFydGljaXBhbnRJbmZvID0gY2FsbC5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiAhcmVzRGF0YT8uYnVzaW5lc3NOdW1iZXIpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0ICYmIHJlc0RhdGE/LmNsaWVudFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgaWYgKHBhcnRpY2lwYW50SW5mbz8uaWQgKSB7XHJcbiAgICAgICAgICAgIGxldCBob2xkSW5mbzogYW55ID0gdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbcGFydGljaXBhbnRJbmZvPy5pZF0sXHJcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBwYXJ0aWNpcGFudEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgICBob2xkOiAhcGFydGljaXBhbnRJbmZvPy5pc0hvbGQsXHJcbiAgICAgICAgICAgICAgbXV0ZTogcGFydGljaXBhbnRJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZihob2xkSW5mbz8uc3RhdHVzICE9IDIwMCkge1xyXG4gICAgICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gNzg4JywgaG9sZEluZm8pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdW5Ib2xkSW5mbyA9IGF3YWl0IGNhbGwucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT5cclxuICAgICAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgIXJlc0RhdGE/LmJ1c2luZXNzTnVtYmVyKSkgJiYgIXJlc0RhdGE/LmlzTGVmdCAmJiByZXNEYXRhPy5pc0hvbGQgIT09IGM/LmlzSG9sZCAmJiByZXNEYXRhPy5jbGllbnRcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoaW5kZXggPT0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoIC0xKSB7XHJcbiAgICAgICAgICBpZiAodW5Ib2xkSW5mbz8uaWQgJiYgdW5Ib2xkSW5mbz8uaXNIb2xkICE9IGM/LmlzSG9sZCkge1xyXG4gICAgICAgICAgICBsZXQgaG9sZEluZm86IGFueSA9IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW3VuSG9sZEluZm8/LmlkXSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHVuSG9sZEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgICBob2xkOiAhdW5Ib2xkSW5mbz8uaXNIb2xkLFxyXG4gICAgICAgICAgICAgIG11dGU6IHVuSG9sZEluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gODA1JywgaG9sZEluZm8pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5pc0hvbGRCdG5EaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlzSG9sZEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjLmlkXSxcclxuICAgICAgICBjb25mZXJlbmNlSWQ6IGM/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICBob2xkOiAhYy5pc0hvbGQsXHJcbiAgICAgICAgbXV0ZTogYz8ubXV0ZSB8fCBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdob2xkSW5mbyA4MTknLCBob2xkSW5mbylcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmlzSG9sZEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgYy5pc0hvbGQgPSAhYy5pc0hvbGQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSBjPy5jb25mZXJlbmNlSWQ7XHJcbiAgICAvLyBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyhjPy5jb25mZXJlbmNlSWQpO1xyXG4gIH1cclxuICBhc3luYyBvbkVuZENhbGwoYzogYW55LCBpc0FsbENhbGxFbmQ/OiBib29sZWFuLCBpc0NvbnRlY3Q/OiBib29sZWFuKSB7XHJcbiAgICBsZXQgcGFydGljaXBhbnRJZCA9IGlzQWxsQ2FsbEVuZCA/ICdhbGwnIDogYy5wYXJ0aWNpcGFudElkIHx8IGM/LmlkO1xyXG4gICAgY29uc3QgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbyA9IHRoaXMuZ2V0Q3VycmVudENhbGxJbmZvKCk7XHJcbiAgICBjb25zdCBwYXJ0aWNpcGFudExpc3QgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbmQoKGNhbGxJbmZvOmFueSkgPT4gY2FsbEluZm8/LmNvbmZlcmVuY2VJZCA9PSBjPy5jb25mZXJlbmNlSWQpLnBhcnRpY2lwYW50cy5maWx0ZXIoKHJlc0RhdGE6IGFueSkgPT4gIXJlc0RhdGE/LmlzTGVmdCk7XHJcbiAgICBpZihwYXJ0aWNpcGFudExpc3Q/Lmxlbmd0aCA8PSAyICYmICFpc0NvbnRlY3QpIHtcclxuICAgICAgcGFydGljaXBhbnRJZCA9ICdhbGwnO1xyXG4gICAgfVxyXG4gICAgbGV0IGNvbmZlcmVuY2VJZCA9IGMuY29uZmVyZW5jZUlkIHx8IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VJZDtcclxuICAgIGxldCByZXM6IGFueSA9IGF3YWl0IHRoaXMuZ2V0UmVtb3ZlUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQsIGNvbmZlcmVuY2VJZCk7XHJcbiAgICBpZiAocmVzPy5zdGF0dXMgPT0gMjAxICYmIHJlcz8ubWVzc2FnZSA9PSAncGFydGljaXBhbnQgYWxyZWFkeSBsZWZ0Jykge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdQYXJ0aWNpcGFudCBhbHJlYWR5IGxlZnQnLCByZXMpO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9IGVsc2UgaWYgKHJlcz8uc3RhdHVzICE9IDIwMCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZW1vdmluZyBwYXJ0aWNpcGFudCcsIHJlcyk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IGNvbmZlcmVuY2VJZDtcclxuICAgIC8vIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCk7XHJcbiAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAvLyB0aGlzLmVuZEluY29taW5nQ2FsbEV2ZW50LmVtaXQoYyk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhdGVDYWxsKHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5pbml0aWF0ZUNhbGwocGF5bG9hZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5ob2xkUGFydGljaXBhbnQocGF5bG9hZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGFkZFBhcnRpY2lwYW50VG9DYWxsKHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5hZGRQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkQ2xpZW50UGFydGljaXBhbnQocGF5bG9hZDogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25TZXJ2aWNlLmFkZENsaWVudFBhcnRpY2lwYW50KHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvbk11dGVQYXJ0aWNpcGFudChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2Uub25NdXRlUGFydGljaXBhbnQocGF5bG9hZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldFJlbW92ZVBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudElkOiBhbnksIGNvbmZlcmVuY2VJZDogYW55KSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFJlbW92ZVBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudElkLCBjb25mZXJlbmNlSWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRDYWxsQXV0aElkKHJlc3BvbnNlOiBhbnkpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlkOiByZXNwb25zZS5jYWxsYXV0aC5pZCxcclxuICAgICAgcmVjb3JkQ2FsbDogcmVzcG9uc2UuY2FsbGF1dGgucmVjb3JkQ2FsbCxcclxuICAgICAgdG9rZW5EYXRhOiByZXNwb25zZS5jYWxsYXV0aC50b2tlblxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3V0Z29pbmdDYWxsVG9rZW4oY2FsbEF1dGhJZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENvbmZlcmVuY2VDYWxsVG9rZW4oeyBhdXRoSWQ6IGNhbGxBdXRoSWQgfSkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RUb0RldmljZSh0b2tlbjogYW55LCBjYWxsRGF0YTogYW55LCB0b2tlbkRhdGE6IGFueSkge1xyXG4gICAgY29uc3Qgb3B0aW9uczogYW55ID0ge1xyXG4gICAgICBjb2RlY1ByZWZlcmVuY2VzOiBbJ29wdXMnLCAncGNtdSddLFxyXG4gICAgICBjbG9zZVByb3RlY3Rpb246IHRydWUsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZGV2aWNlID0gbmV3IERldmljZSh0b2tlbkRhdGEsIG9wdGlvbnMpO1xyXG4gICAgdGhpcy5jYWxsID0gYXdhaXQgdGhpcy5kZXZpY2UuY29ubmVjdCh7XHJcbiAgICAgIHBhcmFtczoge1xyXG4gICAgICAgIEZyb206IGNhbGxEYXRhLmZyb20sXHJcbiAgICAgICAgVG86IGNhbGxEYXRhLnBob25lLFxyXG4gICAgICAgIEVudjogZW52aXJvbm1lbnQuYWJiLFxyXG4gICAgICAgIFRva2VuOiB0b2tlbixcclxuICAgICAgICBFeHQ6IGNhbGxEYXRhLmV4dE51bVxyXG4gICAgICB9LFxyXG4gICAgICBydGNDb25zdHJhaW50czogeyBhdWRpbzogdHJ1ZSB9LFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnR3aWxpb1NlcnZpY2UuY2FsbCA9IHRoaXMuY2FsbDtcclxuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xyXG4gICAgdGhpcy5zdGFydFRpbWVyKCk7XHJcbiAgICB0aGlzLmRldmljZT8ub24oJ2Vycm9yJywgKGVycikgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdlcnJvcicsIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ2Rpc2Nvbm5lY3QnLCAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd0ZXN0LWRpc2Nvbm5lY3QnKVxyXG4gICAgICBjb25zb2xlLmxvZygnODMyJylcclxuICAgICAgLy8gQ2xlYW4gdXAgdGhpcyBjYWxsIGZyb20gYWNjZXB0ZWRDYWxsTGlzdHMgc28gZGV2aWNlIHJlLWluaXQgZ3VhcmQgcmVzZXRzXHJcbiAgICAgIGNvbnN0IGRpc2Nvbm5lY3RlZFNpZCA9IHRoaXMuY2FsbD8ucGFyYW1ldGVycz8uQ2FsbFNpZDtcclxuICAgICAgaWYgKGRpc2Nvbm5lY3RlZFNpZCkge1xyXG4gICAgICAgIHRoaXMuYWNjZXB0ZWRDYWxsTGlzdCA9IHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5maWx0ZXIoYyA9PiBjLmNhbGxTaWQgIT09IGRpc2Nvbm5lY3RlZFNpZCk7XHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3QgPSB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdC5maWx0ZXIoXHJcbiAgICAgICAgICAoYzogYW55KSA9PiBjLnBhcmFtZXRlcnM/LkNhbGxTaWQgIT09IGRpc2Nvbm5lY3RlZFNpZFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5jYWxsPy5kaXNjb25uZWN0KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdyaW5naW5nJywgKCkgPT4ge1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbigncmVqZWN0JywgKCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygndGVzdDUnKVxyXG4gICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ2FjY2VwdCcsICgpID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG93TmV3Q2FsbExvYWRlciA9IGZhbHNlO1xyXG4gICAgICB9LCAyMDAwKTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5kaXNiYWxlRW5kQ2FsbEJ0biA9IGZhbHNlO1xyXG4gICAgICAvLyBFbnN1cmUgdGhlIGFjdGl2ZSBvdXRnb2luZyBjYWxsIGlzIG1hcmtlZCBhcyBhY2NlcHRlZCBzbyB0aGUgVUkgc3dpdGNoZXMgdG8gdGhlIGNvbm5lY3RlZCB2aWV3XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHVwZGF0aW5nIGFjY2VwdCBzdGF0ZTonLCBlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdtZXNzYWdlUmVjZWl2ZWQnLCAobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhcnRUaW1lcihqb2luQXQ/OiBzdHJpbmcpIHtcclxuICAgIGlmICgham9pbkF0KSByZXR1cm47XHJcblxyXG4gIGNvbnN0IGpvaW5UaW1lID0gbmV3IERhdGUoam9pbkF0KS5nZXRUaW1lKCkgfHwgMDtcclxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgIGxldCBzZWNvbmRzID0gTWF0aC5mbG9vcigobm93IC0gam9pblRpbWUpIC8gMTAwMCk7XHJcbiAgICBpZiAoc2Vjb25kcyA8IDApIHtcclxuICAgICAgc2Vjb25kcyA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLmludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHNlY29uZHMrKztcclxuICAgICAgLy8gdGhpcy50aW1lciA9IHRoaXMuZm9ybWF0VGltZShzZWNvbmRzKTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSwgMTAwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0b3BUaW1lcigpIHtcclxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKTtcclxuICAgIHRoaXMudGltZXIgPSAnMDA6MDAnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKHRvdGFsU2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcclxuICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IodG90YWxTZWNvbmRzIC8gMzYwMCk7XHJcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKHRvdGFsU2Vjb25kcyAlIDM2MDApIC8gNjApO1xyXG4gIGNvbnN0IHNlY29uZHMgPSB0b3RhbFNlY29uZHMgJSA2MDtcclxuICBpZiAoaG91cnMgPiAwKSB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5wYWQoaG91cnMpfToke3RoaXMucGFkKG1pbnV0ZXMpfToke3RoaXMucGFkKHNlY29uZHMpfWA7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBgJHt0aGlzLnBhZChtaW51dGVzKX06JHt0aGlzLnBhZChzZWNvbmRzKX1gO1xyXG4gIH1cclxufVxyXG5cclxuICBwcml2YXRlIHBhZCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB2YWx1ZSA8IDEwID8gYDAke3ZhbHVlfWAgOiBgJHt2YWx1ZX1gO1xyXG4gIH1cclxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBhbnkpIHtcclxuICAgIHN3YWwoXCJFcnJvclwiLCBlcnJvciwgXCJlcnJvclwiKTtcclxuICB9XHJcblxyXG4gIGVuZENvbmZlcmVuZWNlQ2FsbChjb25mPzogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZiA9IGNvbmY7XHJcbiAgICAvLyB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSB0cnVlO1xyXG4gICAgbGV0IGNvbmZlcmVuY2UgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5maW5kKChyZXM6IGFueSkgPT4gcmVzPy5jb25mZXJlbmNlSWQgPT0gY29uZj8uY29uZmVyZW5jZUlkKTtcclxuICAgIGxldCBob3N0TnVtYmVyID0gY29uZmVyZW5jZT8ucGFydGljaXBhbnRzPy5maW5kKChwYXJ0aWNpcGFudDogYW55KSA9PiBwYXJ0aWNpcGFudD8uaG9zdCAmJiAhcGFydGljaXBhbnQ/LmJ1c2luZXNzTnVtYmVyKTtcclxuICAgIGlmICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGhvc3ROdW1iZXI/LmZyb20pIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoaG9zdE51bWJlcj8udG8pICYmIGhvc3ROdW1iZXI/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgaG9zdE51bWJlcj8uaG9zdCkpICYmIGNvbmZlcmVuY2U/LnBhcnRpY2lwYW50cy5maWx0ZXIoKHA6IGFueSkgPT4gIXAuaXNMZWZ0KS5sZW5ndGggPiAyKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25mID0gaG9zdE51bWJlcjtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbmZbJ2Nvbk5hbWUnXSA9IHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0LmZpbmQoKHJlczogYW55KSA9PiByZXM/LmNvbmZlcmVuY2VJZCA9PSBjb25mPy5jb25mZXJlbmNlSWQpPy5jYWxsTGFiZWwgfHwgJyc7XHJcbiAgICAgIHRoaXMub25DYWxsRGlzY29ubmVjdGVkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoY29uZj8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgbGV0IHBhcnRpY2lwZW50SW5mbyA9IGNvbmZlcmVuY2U/LnBhcnRpY2lwYW50cz8uZmluZCgocGFydGljaXBhbnQ6IGFueSkgPT4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LmZyb20pXHJcbiAgICAgICAgICAmJiBwYXJ0aWNpcGFudD8uY2xpZW50ICYmIHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnKSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgIXBhcnRpY2lwYW50Py5idXNpbmVzc051bWJlcikgJiYgIXBhcnRpY2lwYW50Py5idXNpbmVzc051bWJlcikgJiYgIXBhcnRpY2lwYW50Py5pc0xlZnQpXHJcbiAgICAgICAgaWYgKHBhcnRpY2lwZW50SW5mbz8uaWQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmlzSW5NdWx0aXBsZUNvbmZlcmVuY2VzKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5sZWF2ZUNvbmZQYXJ0aWNpcGFudCA9IHBhcnRpY2lwZW50SW5mbztcclxuICAgICAgICAgICAgdGhpcy5sZWF2ZUNvbmZDb25mZXJlbmNlTmFtZSA9IHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0LmZpbmQoXHJcbiAgICAgICAgICAgICAgKGM6IGFueSkgPT4gYy5jb25mZXJlbmNlSWQgPT09IGNvbmZlcmVuY2U/LmNvbmZlcmVuY2VJZFxyXG4gICAgICAgICAgICApPy5jYWxsTGFiZWwgfHwgJ0NvbmZlcmVuY2UnO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dMZWF2ZUNvbmZpcm1hdGlvbk1vZGFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vbkVuZENhbGwocGFydGljaXBlbnRJbmZvKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZW5kQ2FsbChpc0FsbENhbGxFbmQ/OiBib29sZWFuKSB7XHJcbiAgICAvLyB0aGlzLmlzQ29uZmVyZW5jZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgaWYgKGlzQWxsQ2FsbEVuZCkge1xyXG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgICB0aGlzLm9uRW5kQ2FsbCh7fSwgaXNBbGxDYWxsRW5kKTtcclxuICAgICAgaWYgKCF0aGlzLmN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coODk2KVxyXG4gICAgICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY3VycmVudFBhcnRpY2lwYW50ID0gdGhpcy5nZXRDdXJyZW50Q2FsbEluZm8oKTtcclxuICAgICAgXHJcbiAgICAgIGlmICh0aGlzLmlzSW5NdWx0aXBsZUNvbmZlcmVuY2VzKCkgJiYgY3VycmVudFBhcnRpY2lwYW50KSB7XHJcbiAgICAgICAgdGhpcy5sZWF2ZUNvbmZQYXJ0aWNpcGFudCA9IGN1cnJlbnRQYXJ0aWNpcGFudDtcclxuICAgICAgICB0aGlzLmxlYXZlQ29uZkNvbmZlcmVuY2VOYW1lID0gdGhpcy5jb25mZXJlbmNlQ2FsbExpc3QuZmluZChcclxuICAgICAgICAgIChjOiBhbnkpID0+IGMuY29uZmVyZW5jZUlkID09PSBjdXJyZW50UGFydGljaXBhbnQuY29uZmVyZW5jZUlkXHJcbiAgICAgICAgKT8uY2FsbExhYmVsIHx8ICdDdXJyZW50IENhbGwnO1xyXG4gICAgICAgIHRoaXMuc2hvd0xlYXZlQ29uZmlybWF0aW9uTW9kYWwgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybjsgXHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRoaXMub25FbmRDYWxsKGN1cnJlbnRQYXJ0aWNpcGFudCwgaXNBbGxDYWxsRW5kKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBhc3luYyB0b2dnbGVNdXRlKGlzQ29uZmVyZW5jZT86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNNdXRlID0gIXRoaXMuaXNNdXRlO1xyXG4gICAgdGhpcy5wZW5kaW5nTXV0ZVVwZGF0ZSA9IHRydWU7IFxyXG4gICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZSA9IHRoaXMuaXNNdXRlO1xyXG4gICAgdGhpcy5jYWxsPy5tdXRlKHRoaXMuaXNNdXRlKTtcclxuICAgIGNvbnN0IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8gPSB0aGlzLmdldEN1cnJlbnRDYWxsSW5mbygpO1xyXG4gICAgdGhpcy5vbk11dGVQYXJ0aWNpcGFudCh7XHJcbiAgICAgIHBhcnRpY2lwYW50SWQ6IFtjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvLnBhcnRpY2lwYW50SWQgfHwgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uaWRdLFxyXG4gICAgICBjb25mZXJlbmNlSWQ6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgaG9sZDogY3VycmVudENvbmZlcmVuY2VDYWxsSW5mby5pc0hvbGQsXHJcbiAgICAgIG11dGU6ICFjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5pc011dGVcclxuICAgICAgLy8gY29uZmVyZW5jZTogY3VycmVudENvbmZlcmVuY2VDYWxsSW5mby5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgIH0pXHJcbiAgICB0aGlzLmN1cnJlbnRDYWxsLmlzTXV0ZSA9IHRoaXMuaXNNdXRlO1xyXG4gICAgLy8gdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3VycmVudENhbGxJbmZvKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RcclxuICAgICAgLmZsYXRNYXAoKGNhbGxJbmZvOiBhbnkpID0+IGNhbGxJbmZvLnBhcnRpY2lwYW50cylcclxuICAgICAgLmZpbmQoKHBhcnRpY2lwYW50OiBhbnkpID0+ICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py5mcm9tKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiBwYXJ0aWNpcGFudD8uY2xpZW50KVxyXG4gICAgICAgIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LnRvKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiBwYXJ0aWNpcGFudD8uY2xpZW50ICYmICFwYXJ0aWNpcGFudD8uYnVzaW5lc3NOdW1iZXIpKSAmJiAhcGFydGljaXBhbnQ/LmlzTGVmdCAmJiAhcGFydGljaXBhbnQ/LmlzSG9sZCk7XHJcbiAgfVxyXG4gIHRvZ2dsZUtleXBhZCgpIHtcclxuICAgIHRoaXMuc2hvd0tleXBhZCA9ICF0aGlzLnNob3dLZXlwYWQ7XHJcbiAgICB0aGlzLmNhbGxJbnB1dCA9ICcnO1xyXG4gIH1cclxuXHJcbiAgLy8gU3dpdGNoIHRoYXQgc2lsZW5jZXMgKG9yIHJlc3RvcmVzKSB0aGUgaW5jb21pbmcgcmluZyB3aGlsZSBhIGNhbGwgaXMgaW4gcHJvZ3Jlc3MuXHJcbiAgdG9nZ2xlTXV0ZUluY29taW5nQ2FsbCgpIHtcclxuICAgIGNvbnN0IG5ld011dGVkID0gIXRoaXMudHdpbGlvU2VydmljZS5pc0luY29taW5nTXV0ZWQ7XHJcbiAgICB0aGlzLnR3aWxpb1NlcnZpY2Uuc2V0SW5jb21pbmdNdXRlZChuZXdNdXRlZCk7XHJcbiAgICBpZiAobmV3TXV0ZWQpIHtcclxuICAgICAgLy8gTXV0ZSBPTjogc3RvcCB0aGUgY3VzdG9tIHJpbmcgaW1tZWRpYXRlbHkgZm9yIGFueSBjdXJyZW50bHktcmluZ2luZyBjYWxsLlxyXG4gICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBNdXRlIE9GRjogaWYgdGhlcmUgYXJlIHN0aWxsIHVuYWNjZXB0ZWQgaW5jb21pbmcgY2FsbHMgcmluZ2luZywgcmVzdW1lIHRoZSByaW5nLlxyXG4gICAgICBjb25zdCBoYXNSaW5naW5nID0gdGhpcy5jdXJyZW50Q2FsbExpc3Quc29tZSgoYzogYW55KSA9PiBjLmlzTm90aWZpY2F0aW9uICYmICFjLmlzQWNjZXB0Q2FsbCk7XHJcbiAgICAgIGlmIChoYXNSaW5naW5nKSB7XHJcbiAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wbGF5KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUNvbnRhY3RzUGFuZWwoY2FsbEluZm8/OiBhbnksIGlzQ2xvc2U/OiBib29sZWFuKTogYW55IHtcclxuICAgIGlmIChpc0Nsb3NlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaG93Q29udGFjdHNQYW5lbCA9ICFpc0Nsb3NlO1xyXG4gICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gY2FsbEluZm8/LmNvbmZlcmVuY2VJZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25mTmFtZSA9IHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0LmZpbmQoKHJlc0RhdGE6YW55KT0+IHJlc0RhdGE/LmNvbmZlcmVuY2VJZCA9PT0gY2FsbEluZm8/LmNvbmZlcmVuY2VJZCk/LmNhbGxMYWJlbCB8fCAnJztcclxuICAgIC8vIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKGNhbGxJbmZvPy5jb25mZXJlbmNlSWQpO1xyXG4gICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLmNvbnRhY3RzO1xyXG4gICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xyXG4gICAgdGhpcy5pc1NlYXJjaFZpc2libGUgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQzJDSW5mb1BhbmVsKHVzZXJJbmZvOiBhbnksIGlzQ2xvc2U/OiBib29sZWFuKTogYW55IHtcclxuICAgIGlmIChpc0Nsb3NlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHt9O1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIXVzZXJJbmZvPy5idXNpbmVzc051bWJlciAmJiAhdXNlckluZm8/LmlzQnVzaW5lc3NOdW1iZXIpIHtcclxuICAgICAgLy8gTm9uLUMyQyBpdGVtOiBqdXN0IG1hcmsgaXQgYXMgc2VsZWN0ZWQgZm9yIGhpZ2hsaWdodCwgbm8gQVBJIGNhbGwgbmVlZGVkLlxyXG4gICAgICAvLyB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB1c2VySW5mbztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gU2V0IHNlbGVjdGlvbiBpbW1lZGlhdGVseSBzbyB0aGUgaGlnaGxpZ2h0IGFwcGVhcnMgYmVmb3JlIHRoZSBBUEkgcmVzcG9uZHMuXHJcbiAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB1c2VySW5mbztcclxuICAgIGxldCBwYXJ0aWNpcGFudElEID0gdXNlckluZm8/LmJ1c2luZXNzUGFydGljaXBhbnRJZCB8fCB1c2VySW5mbz8ucGFydGljaXBhbnRJZCB8fCB1c2VySW5mbz8uaWRcclxuICAgIGlmKCF0aGlzLkMyQ29uZm9MaXN0W3VzZXJJbmZvPy5wYXJ0aWNpcGFudElkXSAmJiAhdGhpcy5DMkNvbmZvTGlzdFt1c2VySW5mbz8uYnVzaW5lc3NQYXJ0aWNpcGFudElkXSkge1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0VXNlckluZm9ybWF0aW9uKHBhcnRpY2lwYW50SUQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc0luZm86IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtPy5wYXJ0aWNpcGFudElkID09IHVzZXJJbmZvPy5pZClcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0gPSB0aGlzLm1hcFVzZXJJbmZvKHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XSwgcmVzSW5mbz8uYzJjSW5mb3JtYXRpb24pO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XTtcclxuICAgICAgICB0aGlzLkMyQ29uZm9MaXN0W3BhcnRpY2lwYW50SURdID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdO1xyXG4gICAgICB9LCBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHVzZXIgaW5mbzonLCBlcnIpO1xyXG4gICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gdGhpcy5DMkNvbmZvTGlzdFtwYXJ0aWNpcGFudElEXTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRSZW1vdmVQYXJ0aWNpcGFudCgpIHtcclxuICAgIHRoaXMuaXNBZGRSZW1vdmVQYXJ0aWNpcGFudCA9ICF0aGlzLmlzQWRkUmVtb3ZlUGFydGljaXBhbnQ7XHJcbiAgICAvLyBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCk7XHJcbiAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q7XHJcbiAgfVxyXG5cclxuICBhc3luYyB3YWl0aW5nQ2FsbEFjY2VwdChpbmNvbWluZ0NhbGxJbmZvOmFueSkge1xyXG4gICAgbGV0IG91ck51bWJlckluZm86IGFueSA9IHt9XHJcbiAgICBsZXQgY2FsbEluZm8gPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbmQoKGNhbGxJbmZvOiBhbnksIGk6IG51bWJlcikgPT4gdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkID09IGNhbGxJbmZvLmNvbmZlcmVuY2VJZClcclxuICAgIGlmIChjYWxsSW5mbz8ucGFydGljaXBhbnRzPy5sZW5ndGgpIHtcclxuICAgICAgb3VyTnVtYmVySW5mbyA9IGNhbGxJbmZvLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LnRvKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmICFyZXNEYXRhPy5idXNpbmVzc051bWJlcikpICYmICFyZXNEYXRhPy5pc0xlZnQgJiYgdGhpcy5nZXRTdGF0dXMocmVzRGF0YSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIC8vIGNvbnN0IGNhcHR1cmVkQ2FsbCA9IHRoaXMudHdpbGlvU2VydmljZS5nZXRJbmNvbWluZ0NhbGxCeUlkKGluY29taW5nQ2FsbEluZm8/LmNsaWVudFNpZCk7XHJcbiAgICB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdC5mb3JFYWNoKChjYWxsOiBhbnkpID0+IHtcclxuICAgICAgY2FsbC5tdXRlKHRydWUpO1xyXG4gICAgfSk7XHJcbiAgICBpZiAob3VyTnVtYmVySW5mbz8uaWQgJiYgb3VyTnVtYmVySW5mbz8uY29uZmVyZW5jZUlkICE9PSBpbmNvbWluZ0NhbGxJbmZvPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsID0gdHJ1ZTtcclxuICAgICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgcGFydGljaXBhbnRJZDogW291ck51bWJlckluZm8/LmlkXSxcclxuICAgICAgICBjb25mZXJlbmNlSWQ6IG91ck51bWJlckluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICBob2xkOiB0cnVlLFxyXG4gICAgICAgIG11dGU6IG91ck51bWJlckluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaG9sZFBhcnRpY2lwYW50KHBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpPT57XHJcbiAgICAgICAgaWYocmVzPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICBzd2FsKFwiRXJyb3JcIiwgcmVzPy5tZXNzYWdlPy5qb2luPy4oXCI8YnIvPlwiKSB8fCAnSW50ZXJuYWwgU2VydmVyIEVycm9yJywgXCJlcnJvclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGQoaW5jb21pbmdDYWxsSW5mbywgb3VyTnVtYmVySW5mbyk7XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hZGQoaW5jb21pbmdDYWxsSW5mbywgb3VyTnVtYmVySW5mbyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGQoZGF0YT86IGFueSwgb3VyTnVtYmVySW5mbz86IGFueSwgY2FwdHVyZWRDYWxsPzogQ2FsbCkge1xyXG4gICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzQ29ubmVjdGluZ0luY29taW5nQ2FsbElkLm5leHQoZGF0YT8uaWQpO1xyXG4gICAgdGhpcy5pc0luY29taW5nQ2FsbEJ0bkRpc2FibGUgPSB0cnVlO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIFxyXG4gICAgbGV0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhbGxUb0FjY2VwdCA9IHRoaXMudHdpbGlvU2VydmljZS5nZXRJbmNvbWluZ0NhbGxCeUlkKGRhdGE/LmNsaWVudFNpZCk7XHJcbiAgICAgIGlmKGNhbGxUb0FjY2VwdD8ucGFyYW1ldGVycz8uQ2FsbFNpZCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdjYWxsVG9BY2NlcHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQnLCBjYWxsVG9BY2NlcHQsIGRhdGE/LmlkKVxyXG4gICAgICAgIGNhbGxUb0FjY2VwdC5hY2NlcHQoKTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZEVudHJ5ID0ge1xyXG4gICAgICAgICAgY2FsbDogY2FsbFRvQWNjZXB0LFxyXG4gICAgICAgICAgY2FsbFNpZDogZGF0YS5jbGllbnRTaWQsXHJcbiAgICAgICAgICBkYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmFjY2VwdGVkQ2FsbExpc3QucHVzaChhY2NlcHRlZEVudHJ5KTtcclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdC5wdXNoKGNhbGxUb0FjY2VwdCk7XHJcbiAgICAgICAgLy8gU3RhcnQgcHJlcGFyaW5nIHRoZSBzcGFyZSBkZXZpY2UgaW1tZWRpYXRlbHkgKGJlZm9yZSB0aGUgQVBJIHJvdW5kLXRyaXApXHJcbiAgICAgICAgLy8gc28gaXQgaXMgcmVnaXN0ZXJlZCB3ZWxsIGJlZm9yZSB0aGUgbmV4dCBjb25jdXJyZW50IGNhbGwgY2FuIGFycml2ZS5cclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UucHJlcGFyZURldmljZTJGb3JJbmNvbWluZ0NhbGwoKTtcclxuICAgICAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgICAgIGNoYW5uZWxJZDogZW52aXJvbm1lbnQuY2hhbm5lbElkLFxyXG4gICAgICAgICAgcmVjb3JkSWQ6IGRhdGE/LmlkLFxyXG4gICAgICAgICAgaXBBZGRyZXNzOiAnJyxcclxuICAgICAgICAgIGlwQ291bnRyeTogJycsXHJcbiAgICAgICAgICBjYWxsU3RhdHVzOiAnYW5zd2VyZWQnLFxyXG4gICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICB1c2VySWQ6ICB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICBjb21wYW55SWQ6ICcnLFxyXG4gICAgICAgICAgY2xpZW50U2lkOiBjYWxsVG9BY2NlcHQucGFyYW1ldGVycz8uQ2FsbFNpZCB8fCBkYXRhLmNsaWVudFNpZCxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogZGF0YT8uY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnNldEluY29taW5nQ2FsbFN0YXR1cyhwYXlsb2FkKS5zdWJzY3JpYmUoYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gZGF0YT8uY29uZmVyZW5jZUlkO1xyXG4gICAgICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLmlzQ3VycmVudEluY29taW5nQ2FsbExpc3QucHVzaChkYXRhPy5pZCk7XHJcbiAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5pc1Nob3dJbmNvbWluZ0NhbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmlzQWNjZXB0SUluY29taW5nQ2FsbC5uZXh0KHsgY29uZmVyZW5jZUlkOiBkYXRhPy5jb25mZXJlbmNlSWQsIHBhcnRpY2lwYW50SWQ6IGRhdGE/LmlkID8/IGRhdGE/LnBhcnRpY2lwYW50SWQgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbmNvbWluZ0NhbGxCdG5EaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5pc0Nvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZC5uZXh0KCcnKTtcclxuICAgICAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2Uub25Db25jdXJyZW50Q2FsbEFjY2VwdGVkKGNhbGxUb0FjY2VwdCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhY2NlcHRlZFNpZCA9IGNhbGxUb0FjY2VwdC5wYXJhbWV0ZXJzPy5DYWxsU2lkO1xyXG4gICAgICAgICAgICBjYWxsVG9BY2NlcHQub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkU2lkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2VwdGVkQ2FsbExpc3QgPSB0aGlzLmFjY2VwdGVkQ2FsbExpc3QuZmlsdGVyKGMgPT4gYy5jYWxsU2lkICE9PSBhY2NlcHRlZFNpZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdCA9IHRoaXMudHdpbGlvU2VydmljZS5hY2NlcHRlZENhbGxMaXN0LmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgKGM6IGFueSkgPT4gYy5wYXJhbWV0ZXJzPy5DYWxsU2lkICE9PSBhY2NlcHRlZFNpZFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5yZWxlYXNlQ29uY3VycmVudENhbGxEZXZpY2UoYWNjZXB0ZWRTaWQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UudGVhcmRvd25TcGFyZURldmljZXNJZklkbGUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzaWQgPSBjYWxsVG9BY2NlcHQucGFyYW1ldGVycz8uQ2FsbFNpZDtcclxuICAgICAgICAgICAgdGhpcy5hY2NlcHRlZENhbGxMaXN0ID0gdGhpcy5hY2NlcHRlZENhbGxMaXN0LmZpbHRlcihjID0+IGMuY2FsbFNpZCAhPT0gc2lkKTtcclxuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3QgPSB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdC5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKGM6IGFueSkgPT4gYy5wYXJhbWV0ZXJzPy5DYWxsU2lkICE9PSBzaWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKVxyXG4gICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNDb25uZWN0aW5nSW5jb21pbmdDYWxsSWQubmV4dCgnJyk7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgocmVzKSA9PiByZXMucGFydGljaXBhbnRJZCA9PSBkYXRhLnBhcnRpY2lwYW50SWQpXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnNwbGljZShpbmRleCwgMSlcclxuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcxMDk2JylcclxuICAgICAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdChkYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAvLyBzd2FsKFwiRXJyb3JcIiwgcmVzPy5tZXNzYWdlPy5qb2luPy4oXCI8YnIvPlwiKSB8fCAnSW50ZXJuYWwgU2VydmVyIEVycm9yJywgXCJlcnJvclwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNldFRpbWVvdXQoKCk9PntcclxuICAgICAgICAgICAgdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICB9LDUwMClcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZClcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0gZWxzZSBpZih0aGlzLm1pc3NDYWxsSW5mbz8uZGF0YT8uZGF0YT8ucmVjb3JkSWQgPT0gZGF0YT8uaWQgJiYgIWNhbGxUb0FjY2VwdC5wYXJhbWV0ZXJzPy5DYWxsU2lkKXtcclxuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgIGNvbnN0IHNpZCA9IGNhbGxUb0FjY2VwdC5wYXJhbWV0ZXJzPy5DYWxsU2lkO1xyXG4gICAgICAgIHRoaXMuYWNjZXB0ZWRDYWxsTGlzdCA9IHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5maWx0ZXIoYyA9PiBjLmNhbGxTaWQgIT09IHNpZCk7XHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3QgPSB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdC5maWx0ZXIoXHJcbiAgICAgICAgICAoYzogYW55KSA9PiBjLnBhcmFtZXRlcnM/LkNhbGxTaWQgIT09IHNpZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbb3VyTnVtYmVySW5mbz8uaWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiBvdXJOdW1iZXJJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICBob2xkOiBmYWxzZSxcclxuICAgICAgICAgIG11dGU6IG91ck51bWJlckluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmhvbGRQYXJ0aWNpcGFudChwYXlsb2FkKS5zdWJzY3JpYmUoKHJlczogYW55KT0+e1xyXG4gICAgICAgICAgaWYocmVzPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHN3YWwoXCJFcnJvclwiLCByZXM/Lm1lc3NhZ2U/LmpvaW4/LihcIjxici8+XCIpIHx8ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLCBcImVycm9yXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0luY29taW5nQ2FsbEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmRlc3Ryb3lEZXZpY2UyKCk7XHJcbiAgICAgICAgc3dhbChcIkVycm9yXCIsICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLCBcImVycm9yXCIpO1xyXG4gICAgICAgIHRoaXMubWlzc0NhbGxJbmZvID0ge307XHJcbiAgICAgIH1cclxuICAgIH0sIDEwMDApO1xyXG4gIH1cclxuICBhc3luYyBjYWxsQ29udGFjdChjb250YWN0OiBhbnksIGlzVW5zYXZlZE51bWJlcj86IGJvb2xlYW4sIG9wdGlvbnM/OiB7IHNraXBEdXBsaWNhdGVDaGVjaz86IGJvb2xlYW4gfSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBwaG9uZU51bWJlciA9IGlzVW5zYXZlZE51bWJlciA/IGNvbnRhY3QgOiBjb250YWN0Py5udW1iZXJzTGlzdD8uWzBdPy5udW1iZXIgfHwgY29udGFjdD8ucGhvbmU7XHJcbiAgICBcclxuICAgIGNvbnN0IHRhcmdldENvbmZlcmVuY2VJZCA9IHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCB8fCB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQ7XHJcbiAgICBpZiAoIW9wdGlvbnM/LnNraXBEdXBsaWNhdGVDaGVjaykge1xyXG4gICAgICBpZiAodGFyZ2V0Q29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgY29uc3QgYWxyZWFkeUluQ2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKHJlczogYW55KSA9PlxyXG4gICAgICAgICAgcmVzLmNvbmZlcmVuY2VJZCA9PT0gdGFyZ2V0Q29uZmVyZW5jZUlkICYmXHJcbiAgICAgICAgICAocmVzLnRvID09IHBob25lTnVtYmVyIHx8IHJlcy5mcm9tID09IHBob25lTnVtYmVyKSAmJlxyXG4gICAgICAgICAgIXJlcz8uaXNMZWZ0XHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoYWxyZWFkeUluQ2FsbCkge1xyXG4gICAgICAgICAgc3dhbCgnRXJyb3InLCBgQWxyZWFkeSAke3Bob25lTnVtYmVyfSBudW1iZXIgaW4gdGhpcyBjYWxsIDIuYCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5pc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICBsZXQgZGF0YTogYW55ID0gYXdhaXQgdGhpcy5hZGRQYXJ0aWNpcGFudFRvQ2FsbCh7XHJcbiAgICAgICAgICBmcm9tOiB0aGlzLmNhbGxEYXRhPy5mcm9tID8gdGhpcy5jYWxsRGF0YT8uZnJvbSA6IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxyXG4gICAgICAgICAgcm91dGU6IFwiT1VUR09JTkdcIixcclxuICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICBwcm94eTogJycsXHJcbiAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBob2xkSW5mbzogYW55ID0gdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtkYXRhPy5wYXJ0aWNpcGFudElkIHx8IGRhdGE/LmlkXSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgaG9sZDogbnVsbCxcclxuICAgICAgICAgIG11dGU6IHRoaXMuY3VycmVudENhbGw/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICBjb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDEyMTgnLCBob2xkSW5mbylcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcclxuICAgICAgICAgIHBob25lOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGRpc3BsYXlOdW06IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgbmFtZTogY29udGFjdD8ubmFtZSB8fCBgJHtjb250YWN0Py5maXJzdE5hbWV9ICR7Y29udGFjdD8ubGFzdE5hbWV9YCB8fCBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGltZzogY29udGFjdD8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IGRhdGE/LnBhcnRpY2lwYW50SWQsXHJcbiAgICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcixcclxuICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICAgIGlzSG9sZDogZmFsc2UsXHJcbiAgICAgICAgICBpc0xlZnQ6IGZhbHNlLFxyXG4gICAgICAgICAgaXNDb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkO1xyXG4gICAgICAgIC8vIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKTtcclxuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICBsZXQgcGFydGljaXBhbnRJRHM6IGFueSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjPy5wYXJ0aWNpcGFudElkICYmICFjPy5pc0hvbGQgJiYgdGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnRJRHMucHVzaChjPy5wYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gQWRkIHBhcnRpY2lwYW50IHRvIHRoZSBjb25mZXJlbmNlXHJcbiAgICAgICAgICBsZXQgZGF0YTogYW55ID0gYXdhaXQgdGhpcy5hZGRQYXJ0aWNpcGFudFRvQ2FsbCh7XHJcbiAgICAgICAgICAgIGZyb206IHRoaXMuY2FsbERhdGE/LmZyb20gfHwgdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXHJcbiAgICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgICAgICBwcm94eTogJycsXHJcbiAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWRcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgcGFydGljaXBhbnRJRHMucHVzaChkYXRhPy5wYXJ0aWNpcGFudElkKVxyXG4gICAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBwYXJ0aWNpcGFudElEcyxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogbnVsbCxcclxuICAgICAgICAgICAgbXV0ZTogbnVsbCxcclxuICAgICAgICAgICAgY29uZmVyZW5jZTogdHJ1ZVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgaWYgKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDEyNzcnLCBob2xkSW5mbylcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCk7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgICAgICAgIHRoaXMuY2FsbERhdGEgPSB7XHJcbiAgICAgICAgICAgIHBob25lOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgICAgZGlzcGxheU51bTogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICAgIG5hbWU6IGNvbnRhY3Q/Lm5hbWUgfHwgYCR7Y29udGFjdD8uZmlyc3ROYW1lfSAke2NvbnRhY3Q/Lmxhc3ROYW1lfWAgfHwgcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICAgIGltZzogY29udGFjdD8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogZGF0YT8ucGFydGljaXBhbnRJZCxcclxuICAgICAgICAgICAgZnJvbTogdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXHJcbiAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNMZWZ0OiBmYWxzZSxcclxuICAgICAgICAgICAgaXNDb25mZXJlbmNlOiBmYWxzZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWRkaW5nIHBhcnRpY2lwYW50OicsIGVycm9yKTtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIENhbGxUb1Vuc2F2ZWROdW1iZXIobnVtYmVyOiBzdHJpbmcsIGlzTmV3Q29uZmVyZW5jZT86IGJvb2xlYW4sIG9wdGlvbnM/OiB7IHNraXBEdXBsaWNhdGVDaGVjaz86IGJvb2xlYW4gfSkge1xyXG4gICAgY29uc29sZS5sb2coJ3NraXBEdXBsaWNhdGVDaGVjazonLCBvcHRpb25zPy5za2lwRHVwbGljYXRlQ2hlY2ssICdpc05ld0NvbmZlcmVuY2U6JywgaXNOZXdDb25mZXJlbmNlKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKG51bWJlcik7XHJcbiAgICAgIGlmIChpc0ludmFsaWQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGlmICghaXNOZXdDb25mZXJlbmNlICYmICFvcHRpb25zPy5za2lwRHVwbGljYXRlQ2hlY2spIHtcclxuICAgICAgICBjb25zdCB0YXJnZXRDb25mZXJlbmNlSWQgPSB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgfHwgdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkO1xyXG4gICAgICAgIGlmICh0YXJnZXRDb25mZXJlbmNlSWQpIHtcclxuICAgICAgICAgIGxldCBhbHJlYWR5SW5DYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+XHJcbiAgICAgICAgICAgIHJlcy5jb25mZXJlbmNlSWQgPT09IHRhcmdldENvbmZlcmVuY2VJZCAmJlxyXG4gICAgICAgICAgICAoKHJlcy50byA9PSBudW1iZXIgJiYgcmVzPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSB8fFxyXG4gICAgICAgICAgICAgIChyZXMuZnJvbSA9PSBudW1iZXIgJiYgcmVzPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHJlcy5ob3N0KSkgJiZcclxuICAgICAgICAgICAgIXJlcz8uaXNMZWZ0XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKGFscmVhZHlJbkNhbGwpIHtcclxuICAgICAgICAgICAgc3dhbCgnRXJyb3InLCBgQWxyZWFkeSAke251bWJlcn0gbnVtYmVyIGluIHRoaXMgY2FsbDEuYCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGlmIChudW1iZXIgPT09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xyXG4gICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW4gbm90IGRpYWwgdGhpcyBudW1iZXInKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjb250YWN0ID0gdGhpcy5jb250YWN0cy5maW5kKChjb250YWN0OiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gY29udGFjdC5udW1iZXJzTGlzdC5zb21lKChudW06IGFueSkgPT4gbnVtLm51bWJlciA9PT0gbnVtYmVyKVxyXG4gICAgICB9KTtcclxuICAgICAgbnVtYmVyID0gYXdhaXQgdGhpcy5nZXRUb051bWJlcihudW1iZXIpO1xyXG5cclxuICAgICAgLy8gVXBkYXRlIGNhbGwgZGF0YSBpbiBhIHNpbmdsZSBvcGVyYXRpb25cclxuICAgICAgY29uc3QgY2FsbERhdGEgPSB7XHJcbiAgICAgICAgbmFtZTogY29udGFjdD8uZmlyc3ROYW1lLFxyXG4gICAgICAgIGltZzogY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgIHBob25lOiBudW1iZXIsXHJcbiAgICAgICAgZXh0TnVtOiAnJyxcclxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxyXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoaXNOZXdDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgbGV0IG91ck51bWJlckluZm86IGFueSA9IHt9XHJcbiAgICAgICAgbGV0IGNhbGxJbmZvID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChjYWxsSW5mbzogYW55LCBpOiBudW1iZXIpID0+IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkID09IGNhbGxJbmZvLmNvbmZlcmVuY2VJZClcclxuICAgICAgICBpZiAoY2FsbEluZm8pIHtcclxuICAgICAgICAgIG91ck51bWJlckluZm8gPSBjYWxsSW5mby5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgIXJlc0RhdGE/LmJ1c2luZXNzTnVtYmVyKSkgJiYgIXJlc0RhdGE/LmlzTGVmdFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG91ck51bWJlckluZm8/LmlkKSB7XHJcbiAgICAgICAgICBsZXQgaG9sZEluZm86IGFueSA9IGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtvdXJOdW1iZXJJbmZvPy5pZF0sXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogb3VyTnVtYmVySW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICBob2xkOiB0cnVlLFxyXG4gICAgICAgICAgICBtdXRlOiBvdXJOdW1iZXJJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDEzNTUnLCBob2xkSW5mbylcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5vbkFkZE5ld0NhbGwoY2FsbERhdGEsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm9uQWRkTmV3Q2FsbChjYWxsRGF0YSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgICAgIHRoaXMuY2FsbENvbnRhY3QobnVtYmVyLCB0cnVlLCBvcHRpb25zKVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ZhaWxlZCB0byBpbml0aWF0ZSBjYWxsLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkFkZE5ld0NhbGwoY2FsbERhdGE6IGFueSwgaXNOZXdDb25mZXJlbmNlQ2FsbCA9IGZhbHNlKSB7XHJcbiAgICAvLyB3YXJuaW5nIG9ubHkgZm9yIE5FVyBTRVBBUkFURSBDQUxMXHJcbiAgICBpZiAoaXNOZXdDb25mZXJlbmNlQ2FsbCAmJiB0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMucGVuZGluZ0NhbGxEYXRhID0gY2FsbERhdGE7XHJcbiAgICAgIHRoaXMuc2hvd0NvbmZlcmVuY2VXYXJuaW5nTW9kYWwgPSB0cnVlO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhcnRDYWxsKGNhbGxEYXRhLCBpc05ld0NvbmZlcmVuY2VDYWxsKTtcclxuICB9XHJcblxyXG4gIGNvbmZpcm1OZXdDYWxsKCkge1xyXG4gICAgdGhpcy5zaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMucGVuZGluZ0NhbGxEYXRhKSB7XHJcbiAgICAgIHRoaXMubmV3Q2FsbExvYWRlckRhdGEgPSB7XHJcbiAgICAgICAgbmFtZTogdGhpcy5wZW5kaW5nQ2FsbERhdGEubmFtZSB8fCAnJyxcclxuICAgICAgICBwaG9uZTogdGhpcy5wZW5kaW5nQ2FsbERhdGEucGhvbmUsXHJcbiAgICAgICAgaW1nOiB0aGlzLnBlbmRpbmdDYWxsRGF0YS5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuY2FsbE51bWJlclRvYXN0ID0ge1xyXG4gICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ2FsZXJ0LXN1Y2Nlc3MnLFxyXG4gICAgICAgIG51bWJlcjogdGhpcy5wZW5kaW5nQ2FsbERhdGEucGhvbmUsXHJcbiAgICAgICAgZGlzcGxheU51bTogdGhpcy5wZW5kaW5nQ2FsbERhdGEucGhvbmVcclxuICAgICAgfTsgIFxyXG4gICAgICBcclxuICAgICAgdGhpcy5zaG93TmV3Q2FsbExvYWRlciA9IHRydWU7XHJcbiAgICAgIFxyXG4gICAgICBcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jYWxsTnVtYmVyVG9hc3Quc2hvdyA9IGZhbHNlO1xyXG4gICAgICB9LCA3MDAwKTtcclxuICAgICAgdGhpcy5zdGFydENhbGwodGhpcy5wZW5kaW5nQ2FsbERhdGEsIHRydWUpO1xyXG4gICAgICB0aGlzLnBlbmRpbmdDYWxsRGF0YSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5jZWxOZXdDYWxsKCkge1xyXG4gICAgdGhpcy5zaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbCA9IGZhbHNlO1xyXG4gICAgdGhpcy5wZW5kaW5nQ2FsbERhdGEgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VG9OdW1iZXIoZGlhbGVkTnVtYmVyOiBzdHJpbmcpIHtcclxuICAgIGlmIChkaWFsZWROdW1iZXJbMF0gIT09ICcrJykge1xyXG4gICAgICAvLyB0aGlzIGlzIGNhc2Ugd2hlbiB1c2VyIGdlb2xvY2F0aW9uIGRpYWwgY29kZSBpcyBvblxyXG4gICAgICBsZXQgaXBBZGRyZXNzOiBhbnkgPSBhd2FpdCB0aGlzLmlwU2VydmljZS5nZXRJcEFkZHJlc3NJbmZvKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgdGhpcy50d2lsaW9TZXJ2aWNlLmdldFRvTnVtYmVyKGRpYWxlZE51bWJlciwgaXBBZGRyZXNzLmFkZHJlc3MuY291bnRyeUNvZGUpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICByZXR1cm4gcmVzPy50b051bWJlclxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBkaWFsZWROdW1iZXJcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGRpYWxlZE51bWJlclxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgaXNJbnZhbGlkTnVtYmVyKG51bWJlcjogc3RyaW5nKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAobnVtYmVyID09ICcnKSB7XHJcbiAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZhbGlkTnVtYmVyUGF0dGVybiA9IC9eWytcXGRcXHMoKS1dKiQvOyAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggdmFsaWQgY2hhcmFjdGVyc1xyXG4gICAgICBjb25zdCBwaG9uZU51bWJlciA9IG51bWJlcjtcclxuICAgICAgaWYgKCF2YWxpZE51bWJlclBhdHRlcm4udGVzdChwaG9uZU51bWJlcikpIHtcclxuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gUmV0dXJuIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIG1lYW5pbmcgdGhlIG51bWJlciBpcyBpbnZhbGlkXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93RGlhbEFsZXJ0KG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgdGhpcy5kaWFsQWxlcnQgPSB7XHJcbiAgICAgIG1zZzogbWVzc2FnZSxcclxuICAgICAgc2hvdzogdHJ1ZVxyXG4gICAgfTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmRpYWxBbGVydC5zaG93ID0gZmFsc2U7XHJcbiAgICB9LCAzMDAwKTtcclxuICB9XHJcblxyXG5hc3luYyBnZXRBbGxQYXJ0aWNpcGFudHMoY29uZmVyZW5jZUlkOiBzdHJpbmcpIHtcclxuICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0QWxsUGFydGljaXBhbnRzKGNvbmZlcmVuY2VJZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFydGljaXBhbnRzID0gcmVzPy5wYXJ0aWNpcGFudHMgfHwgcmVzPy5wYXJ0aWNpcGFudCB8fCBbXTtcclxuICAgICAgICAvLyBpZiAoIXBhcnRpY2lwYW50cy5sZW5ndGgpIHtcclxuICAgICAgICAvLyAgIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgICAgLy8gICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgICAgLy8gICByZXR1cm47XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGNvbnN0IHVwZGF0ZWRQYXJ0aWNpcGFudHMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAvLyAgIHBhcnRpY2lwYW50cy5tYXAoYXN5bmMgKHA6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCBmcm9tTmFtZSA9IGF3YWl0IHRoaXMuZ2V0TmFtZShwLmZyb20pO1xyXG4gICAgICAgIC8vICAgICBjb25zdCB0b05hbWUgPSBhd2FpdCB0aGlzLmdldE5hbWUocC50byk7XHJcbiAgXHJcbiAgICAgICAgLy8gICAgIHJldHVybiB7XHJcbiAgICAgICAgLy8gICAgICAgLi4ucCxcclxuICAgICAgICAvLyAgICAgICBmcm9tTmFtZTogZnJvbU5hbWUgfHwgcC5mcm9tTmFtZSxcclxuICAgICAgICAvLyAgICAgICB0b05hbWU6IHRvTmFtZSB8fCBwLnRvTmFtZSxcclxuICAgICAgICAvLyAgICAgfTtcclxuICAgICAgICAvLyAgIH0pXHJcbiAgICAgICAgLy8gKTtcclxuICBcclxuICAgICAgICAvLyB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCA9IHVwZGF0ZWRQYXJ0aWNpcGFudHM7XHJcbiAgICAgICAgLy8gdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IFsuLi51cGRhdGVkUGFydGljaXBhbnRzXTsgIFxyXG4gICAgICAgIC8vIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSBbXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfSw3MDApXHJcbn1cclxuXHJcbiAgYXN5bmMgc3dhcENhbGxzKGNhbGxJbmZvOiBhbnksIGlzQ29uZmVyZW5jZUNhbGw/OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRoaXMuaXNQYXJ0aWNpcGFudFBhbmVsTG9hZGluZyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoYz8uY29uZmVyZW5jZUlkID09IGNhbGxJbmZvPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgICB0aGlzLmlzSG9sZEJ0bkRpc2FibGUgPSB0cnVlO1xyXG4gICAgICAgIGxldCBwYXJ0aWNpcGFudEluZm8gPSBjLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgIXJlc0RhdGE/LmJ1c2luZXNzTnVtYmVyKSkgJiYgIXJlc0RhdGE/LmlzTGVmdFxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAocGFydGljaXBhbnRJbmZvPy5pZCkge1xyXG4gICAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbcGFydGljaXBhbnRJbmZvPy5pZF0sXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogcGFydGljaXBhbnRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBtdXRlOiBwYXJ0aWNpcGFudEluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gMTUwMicsIGhvbGRJbmZvKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmlzSG9sZEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IGNhbGxJbmZvPy5jb25mZXJlbmNlSWRcclxuICAgICAgICAgIC8vIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKGNhbGxJbmZvPy5jb25mZXJlbmNlSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcGFydGljaXBhbnRJbmZvID0gYy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LnRvKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmICFyZXNEYXRhPy5idXNpbmVzc051bWJlcikpICYmICFyZXNEYXRhPy5pc0xlZnRcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHBhcnRpY2lwYW50SW5mbz8uaWQgJiYgIXBhcnRpY2lwYW50SW5mbz8uaXNIb2xkKSB7XHJcbiAgICAgICAgICBsZXQgaG9sZEluZm86IGFueSA9IGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtwYXJ0aWNpcGFudEluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBwYXJ0aWNpcGFudEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgICAgbXV0ZTogcGFydGljaXBhbnRJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDE1MjEnLCBob2xkSW5mbylcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaXNIb2xkQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChjPy5pc0NvbmZlcmVuY2UgJiYgIWM/LmlzSG9sZCAmJiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWQgfHwgYz8uaWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiBjLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDE1MzUnLCBob2xkSW5mbylcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBoYXNEZXRhaWxlZEluZm8oY2FsbERhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFjYWxsRGF0YSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gQ2hlY2sgaWYgdXNlckluZm8gZXhpc3RzIGFuZCBoYXMgbWVhbmluZ2Z1bCBkYXRhXHJcbiAgICBpZiAoY2FsbERhdGEudXNlckluZm8gJiYgY2FsbERhdGEudXNlckluZm8uYzJjSW5mb3JtYXRpb24pIHtcclxuICAgICAgY29uc3QgaW5mbyA9IGNhbGxEYXRhLnVzZXJJbmZvLmMyY0luZm9ybWF0aW9uO1xyXG4gICAgICByZXR1cm4gISEoXHJcbiAgICAgICAgaW5mby5zdWJqZWN0ICYmIGluZm8uc3ViamVjdCAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5lbWFpbCAmJiBpbmZvLmVtYWlsICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLm1lc3NhZ2UgJiYgaW5mby5tZXNzYWdlICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLnBvaW50TmFtZSAmJiBpbmZvLnBvaW50TmFtZSAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5zb3VyY2VOYW1lICYmIGluZm8uc291cmNlTmFtZSAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5leHRlbnNpb24gJiYgaW5mby5leHRlbnNpb24gIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8udXJsIHx8XHJcbiAgICAgICAgaW5mby5sYXRpdHVkZSB8fFxyXG4gICAgICAgIGluZm8ubG9uZ2l0dWRlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvbkNhbGxJbnB1dHMobnVtOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtID09ICcrJyB8fCBudW0gPT0gJyonIHx8IG51bSA9PSAnIycpIHtcclxuICAgICAgICBpZiAobnVtID09ICcjJykge1xyXG4gICAgICAgICAgbmV3IEF1ZGlvKGAvYXNzZXRzL2RpYWwtdG9uZXMvZHRtZi9kdG1mLWhhc2gtLm1wM2ApLnBsYXkoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG51bSA9PSAnKicpIHtcclxuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1zdGFyLS5tcDNgKS5wbGF5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi0ke251bX0tLm1wM2ApLnBsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWxsSW5wdXQgPSB0aGlzLmNhbGxJbnB1dCArIFN0cmluZyhudW0pO1xyXG4gICAgICAgIHRoaXMuc2hvd0NsZWFyQnRuID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc3RyID0gU3RyaW5nKG51bSk7XHJcbiAgICAgIHRoaXMuY2FsbD8uc2VuZERpZ2l0cyhzdHIpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH1cclxuICB9XHJcbiAgb25DYWxsSW5wdXRFbnRlcihldjogYW55KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmNhbGw/LnNlbmREaWdpdHMoU3RyaW5nKGV2LmtleSkpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFySW5wdXRzKCkge1xyXG4gICAgdGhpcy5jYWxsSW5wdXQgPSB0aGlzLmNhbGxJbnB1dC5zbGljZSgwLCAtMSk7XHJcbiAgfVxyXG4gIGlzTWluaW1pc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbWluaW1pc2VEaWFscGFkKCkge1xyXG4gICAgdGhpcy5taW5pbWlzZUV2ZW50LmVtaXQodHJ1ZSk7XHJcbiAgICB0aGlzLmlzTWluaW1pc2VkID0gdHJ1ZTtcclxuICB9XHJcbiAgbWF4aW1pc2VEaWFscGFkKCkge1xyXG4gICAgdGhpcy5taW5pbWlzZUV2ZW50LmVtaXQoZmFsc2UpO1xyXG4gICAgdGhpcy5pc01pbmltaXNlZCA9IGZhbHNlO1xyXG4gIH1cclxuICB0b2dnbGVSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5pc1JlY29yZGluZykge1xyXG4gICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhcnRSZWNvcmRpbmcoKSB7XHJcbiAgICBsZXQgc2lkO1xyXG4gICAgY29uc3QgZGV0YWlscyA9IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU2lkKCk7XHJcbiAgICB0aGlzLmluY29taW5nQ2FsbFNpZCA9IGRldGFpbHMuY2FsbFNpZDtcclxuICAgIHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsID0gZGV0YWlscy5yZWNvcmRDYWxsO1xyXG4gICAgc2lkID0gdGhpcy5pbmNvbWluZ0NhbGxTaWQgPyB0aGlzLmluY29taW5nQ2FsbFNpZCA6IHRoaXMuY2FsbFNpZCB8fCB0aGlzLmFkZFJlcz8uY29uZmVyZW5jZVNpZDtcclxuXHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFJlY29yZGluZyh7IFwiY29uZmVyZW5jZUlkXCI6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCB9KS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICB0aGlzLmlzUmVjb3JkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnRpbWVFbGFwc2VkID0gMDtcclxuICAgICAgdGhpcy5zdGFydFRpbWVyMSgpO1xyXG4gICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcFJlY29yZGluZygpIHtcclxuICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcGF1c2VSZWNvcmRpbmcoKSB7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UucGF1c2VPclJlc3VtZVJlY29yZGluZyh0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsICdwYXVzZScpLnN1YnNjcmliZShcclxuICAgICAgcmVzcG9uc2UgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcFJlY29yZGluZ1RpbWVyKCk7XHJcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhdXNpbmcgcmVjb3JkaW5nOicsIGVycm9yKTtcclxuICAgICAgICAvLyBDb25zaWRlciB1cGRhdGluZyB0aGUgVUkgdG8gc2hvdyB0aGUgZXJyb3Igc3RhdGVcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgcmVzdW1lUmVjb3JkaW5nKCkge1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnBhdXNlT3JSZXN1bWVSZWNvcmRpbmcodGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLCAncmVzdW1lJykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0YXJ0VGltZXIxKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlc3VtaW5nIHJlY29yZGluZycsIGVycm9yKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBnZXRUaW1lRGlmZmVyZW5jZShpbnB1dFRpbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXN0VGltZSA9IG5ldyBEYXRlKGlucHV0VGltZSkuZ2V0VGltZSgpO1xyXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuXHJcbiAgICBsZXQgZGlmZiA9IE1hdGguZmxvb3IoKGN1cnJlbnRUaW1lIC0gcGFzdFRpbWUpIC8gMTAwMCk7IC8vIHRvdGFsIHNlY29uZHNcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKGRpZmYgLyA2MCk7XHJcbiAgICBjb25zdCBzZWNvbmRzID0gZGlmZiAlIDYwO1xyXG5cclxuICAgIGNvbnN0IG1tID0gbWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXM7XHJcbiAgICBjb25zdCBzcyA9IHNlY29uZHMgPCAxMCA/ICcwJyArIHNlY29uZHMgOiBzZWNvbmRzO1xyXG5cclxuICAgIHJldHVybiBgJHttbX06JHtzc31gO1xyXG4gIH1cclxuICBzdGFydFRpbWVyMSgpIHtcclxuICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSBpbnRlcnZhbCgxMDAwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnRpbWVFbGFwc2VkKys7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcFJlY29yZGluZ1RpbWVyKCkge1xyXG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOyAvLyBQYXVzZSB0aGUgdGltZXJcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDsgICAgICAgIC8vIE9wdGlvbmFsbHkgcmVzZXQgdGhlIHN1YnNjcmlwdGlvblxyXG4gICAgfVxyXG4gIH1cclxuICBnZXRGb3JtYXR0ZWRUaW1lKCkge1xyXG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IodGhpcy50aW1lRWxhcHNlZCAvIDYwKTtcclxuICAgIGNvbnN0IHNlY29uZHMgPSB0aGlzLnRpbWVFbGFwc2VkICUgNjA7XHJcbiAgICByZXR1cm4gYCR7bWludXRlc306JHtzZWNvbmRzIDwgMTAgPyAnMCcgOiAnJ30ke3NlY29uZHN9YDtcclxuICB9XHJcbiAgcG9sbENhbGxTdGF0dXMoY2FsbEF1dGhJZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBtYXhUaW1lID0gMzAwMDA7IC8vIFBvbGwgZm9yIHVwIHRvIDMwIHNlY29uZHNcclxuICAgIGNvbnN0IHBvbGxJbnRlcnZhbCA9IDMwMDA7IC8vIFBvbGwgZXZlcnkgMyBzZWNvbmRzXHJcbiAgICBsZXQgZWxhcHNlZFRpbWUgPSAwO1xyXG4gICAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcclxuICAgICAgZWxhcHNlZFRpbWUgKz0gcG9sbEludGVydmFsO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHN0YXR1c1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxTdGF0dXMoY2FsbEF1dGhJZCkudG9Qcm9taXNlKCkgYXMgQ2FsbFN0YXR1c1Jlc3BvbnNlO1xyXG4gICAgICAgIGlmIChzdGF0dXNSZXNwb25zZSAmJiBzdGF0dXNSZXNwb25zZS5jYWxsRGV0YWlscykge1xyXG4gICAgICAgICAgdGhpcy5jYWxsU3RhdHVzID0gc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMuY2FsbFN0YXR1cztcclxuICAgICAgICAgIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdpbi1wcm9ncmVzcycpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU2lkID0gc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMuY2FsbFNpZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVjb3JkQ2FsbCAmJiAhdGhpcy5pc1JlY29yZGluZykge1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdjb21wbGV0ZWQnKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZWxhcHNlZFRpbWUgPj0gbWF4VGltZSkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdNYXggcG9sbGluZyB0aW1lIHJlYWNoZWQuIFN0b3BwaW5nIHBvbGwuJyk7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgfVxyXG4gICAgfSwgcG9sbEludGVydmFsKTtcclxuICB9XHJcblxyXG4gIC8vIGdldFVzZXJJbmZvcm1hdGlvbihpZDogYW55KSB7XHJcbiAgLy8gICBpZihpZCkge1xyXG4gIC8vICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbihpZCkuc3Vic2NyaWJlKFxyXG4gIC8vICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLCAndXNlckluZm9ybWF0aW9uJyk7XHJcbiAgLy8gICAgIH0sIGVycm9yID0+IHtcclxuICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuICBzZWxlY3RlZEluY29taW5nQ2FsbEluZm8oZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsID0gZGF0YTtcclxuICB9XHJcblxyXG4gIC8vIGdldEhvbGRDYWxsTGlzdCgpIHtcclxuICAvLyAgIGxldCBob2xkTGlzdDogYW55W10gPSBbXTtcclxuICAvLyAgIGxldCBpc0NvbmZlcmVuY2UgPSBmYWxzZTtcclxuICAvLyAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goKGM6IGFueSkgPT4ge1xyXG4gIC8vICAgICBpZiAoYz8uaXNIb2xkICYmICFjPy5pc0NvbmZlcmVuY2UpIHtcclxuICAvLyAgICAgICBob2xkTGlzdC5wdXNoKGMpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGlmIChjPy5pc0NvbmZlcmVuY2UgJiYgIWlzQ29uZmVyZW5jZSkge1xyXG4gIC8vICAgICAgIGlzQ29uZmVyZW5jZSA9IHRydWU7XHJcbiAgLy8gICAgICAgY1snaXNDb25mZXJlbmNlQ2FsbEhvbGQnXSA9IHRydWU7XHJcbiAgLy8gICAgICAgaG9sZExpc3QucHVzaChjKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSk7XHJcbiAgLy8gICByZXR1cm4gaG9sZExpc3Q7XHJcbiAgLy8gfVxyXG5cclxuICBvbkNsaWNrRXhwYW5kKGRhdGE6IGFueSkge1xyXG4gICAgaWYgKGRhdGEuaWQgIT0gdGhpcy5zZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGRhdGE7XHJcbiAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSAhdGhpcy5pc0NsaWNrRXhwYW5kO1xyXG4gICAgICBpZiAodGhpcy5pc0NsaWNrRXhwYW5kKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gZGF0YTtcclxuICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBzZXRJbmNvbWluZ0NhbGxTdGF0dXMoZGF0YTogYW55KSB7XHJcbiAgLy8gICBsZXQgcGF5bG9hZCA9IHtcclxuICAvLyAgICAgcmVjb3JkSWQ6IGRhdGE/LmlkLFxyXG4gIC8vICAgICBpcEFkZHJlc3M6ICcnLFxyXG4gIC8vICAgICBpcENvdW50cnk6ICcnLFxyXG4gIC8vICAgICBjYWxsU3RhdHVzOiAnYW5zd2VyZWQnLFxyXG4gIC8vICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAvLyAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQgfHwgZGF0YS5jb25mZXJlbmNlSWQgfHwgJ25vJ1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnNldEluY29taW5nQ2FsbFN0YXR1cyhwYXlsb2FkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgLy8gICAgIGNvbnNvbGUubG9nKHJlcylcclxuICAvLyAgIH0pXHJcbiAgLy8gfVxyXG5cclxuICB0b2dnbGVTZWFyY2goKSB7XHJcbiAgICB0aGlzLmlzU2VhcmNoVmlzaWJsZSA9ICF0aGlzLmlzU2VhcmNoVmlzaWJsZTtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgaWYgKCF0aGlzLmlzU2VhcmNoVmlzaWJsZSkge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuY29udGFjdHM7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVyKCkge1xyXG4gICAgY29uc3QgdGV4dCA9IHRoaXMuc2VhcmNoVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHRoaXMuaXNEaXJlY3RDYWxsT3B0aW9uU2hvdyA9IC9eXFwrP1xcZCskLy50ZXN0KHRleHQpXHJcbiAgICBpZiAoIXRleHQubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cztcclxuICAgICAgLy8gdGhpcy5maWx0ZXJlZExpc3QuZm9yRWFjaCgoYzogYW55KSA9PiB7XHJcbiAgICAgIC8vICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChjYzogYW55KSA9PiAhY2M/LklzQ29ubmVjdGVkICYmIChjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciB8fCBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlcikpO1xyXG4gICAgICAvLyAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgIC8vICAgICBjWydJc0Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAgICAgLy8gICB9IGVsc2Uge1xyXG4gICAgICAvLyAgICAgY1snSXNDb25uZWN0ZWQnXSA9IGZhbHNlO1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzTnVtZXJpY1NlYXJjaCA9IC9eXFwrP1xcZCskLy50ZXN0KHRleHQpO1xyXG4gICAgY29uc3QgZXhwYW5kZWQ6IGFueVtdID0gW107XHJcbiAgICB0aGlzLmNvbnRhY3RzLmZvckVhY2goKGM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXNOdW1lcmljU2VhcmNoKSB7XHJcbiAgICAgICAgKGM/Lm51bWJlcnNMaXN0IHx8IFtdKS5mb3JFYWNoKChuOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICgobj8ubnVtYmVyIHx8ICcnKS5pbmNsdWRlcyh0ZXh0KSkge1xyXG4gICAgICAgICAgICBleHBhbmRlZC5wdXNoKHsgLi4uYywgbnVtYmVyc0xpc3Q6IFtuXSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBuYW1lTWF0Y2ggPSAoYz8uZmlyc3ROYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8XHJcbiAgICAgICAgICAoYz8ubGFzdE5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHxcclxuICAgICAgICAgIChjPy5taWRkbGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8XHJcbiAgICAgICAgICAoYz8ubmlja05hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCk7XHJcbiAgICAgICAgaWYgKG5hbWVNYXRjaCkge1xyXG4gICAgICAgICAgY29uc3QgbnVtYmVycyA9IGM/Lm51bWJlcnNMaXN0O1xyXG4gICAgICAgICAgaWYgKG51bWJlcnMgJiYgbnVtYmVycy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIG51bWJlcnMuZm9yRWFjaCgobnVtT2JqOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBleHBhbmRlZC5wdXNoKHsgLi4uYywgbnVtYmVyc0xpc3Q6IFtudW1PYmpdIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGV4cGFuZGVkLnB1c2goYyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gZXhwYW5kZWQ7XHJcbiAgICB0aGlzLmZpbHRlcmVkTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcclxuICAgICAgY1snZnJvbU5hbWUnXSA9IHRoaXMuZ2V0TmFtZShjLmZyb20pIHx8ICcnO1xyXG4gICAgICBjWyd0b05hbWUnXSA9IHRoaXMuZ2V0TmFtZShjLnRvKSB8fCAnJztcclxuICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChjYzogYW55KSA9PiBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlcik7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgY2hlY2tUZXh0SGVpZ2h0KCkge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGV4dC1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChlbD8uc2Nyb2xsSGVpZ2h0ID4gZWw/LmNsaWVudEhlaWdodCkge1xyXG4gICAgICB0aGlzLnNob3dCdXR0b24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuICB0b2dnbGVUZXh0KCkge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gIXRoaXMuaXNFeHBhbmRlZDtcclxuICB9XHJcbiAgc2hvd0Rpc2Nvbm5lY3RNb2RhbCA9IGZhbHNlO1xyXG4gIC8vIENhbGwgdGhpcyB3aGVuIGNhbGwgZGlzY29ubmVjdHNcclxuICBvbkNhbGxEaXNjb25uZWN0ZWQoKSB7XHJcbiAgICB0aGlzLnJlc2V0TGVhdmVUaW1lcigpO1xyXG4gICAgdGhpcy5zaG93RGlzY29ubmVjdE1vZGFsID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGVuZENvbmZlcmVuY2UoKSB7XHJcbiAgICB0aGlzLnNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29uZj8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgIHRoaXMub25FbmRDYWxsKHRoaXMuc2VsZWN0ZWRDb25mLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZW5kQ2FsbCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBDb21iaW5lcyB0aGUgdHdvIDI0LWhvdXIgc2VsZWN0cyBpbnRvIGxlYXZlUmVhc29uIChISDpNTSkgKi9cclxuICBvblRpbWVDaGFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5sZWF2ZUhvdXIgIT09ICcnICYmIHRoaXMubGVhdmVNaW51dGUgIT09ICcnKSB7XHJcbiAgICAgIHRoaXMubGVhdmVSZWFzb24gPSBgJHt0aGlzLmxlYXZlSG91cn06JHt0aGlzLmxlYXZlTWludXRlfWA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVIb3VyRHJvcGRvd24oKSB7XHJcbiAgICB0aGlzLnNob3dIb3VyRHJvcGRvd24gPSAhdGhpcy5zaG93SG91ckRyb3Bkb3duO1xyXG4gICAgdGhpcy5zaG93TWludXRlRHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZU1pbnV0ZURyb3Bkb3duKCkge1xyXG4gICAgdGhpcy5zaG93TWludXRlRHJvcGRvd24gPSAhdGhpcy5zaG93TWludXRlRHJvcGRvd247XHJcbiAgICB0aGlzLnNob3dIb3VyRHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdEhvdXIoaDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmxlYXZlSG91ciA9IGg7XHJcbiAgICB0aGlzLnNob3dIb3VyRHJvcGRvd24gPSBmYWxzZTtcclxuICAgIHRoaXMub25UaW1lQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RNaW51dGUobTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmxlYXZlTWludXRlID0gbTtcclxuICAgIHRoaXMuc2hvd01pbnV0ZURyb3Bkb3duID0gZmFsc2U7XHJcbiAgICB0aGlzLm9uVGltZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgbGVhdmVDb25mZXJlbmNlKCkge1xyXG4gICAgdGhpcy5zaG93RGlzY29ubmVjdE1vZGFsID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5pc1JlYXNvbkNoZWNrZWQpIHtcclxuICAgICAgbGV0IHBheWxvYWQgPSB7IGNvbmZlcmVuY2VJZDogdGhpcy5zZWxlY3RlZENvbmY/LmNvbmZlcmVuY2VJZCB8fCB0aGlzLmhvc3RudW1iZXI/LmNvbmZlcmVuY2VJZCwgdGltZTogdGhpcy5jb252ZXJ0SEhNTVRvTWludXRlcyh0aGlzLmxlYXZlUmVhc29uKSwgdGltZXJEYXRlOiBuZXcgRGF0ZSgpLnRvU3RyaW5nKCkgfVxyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2Uuc2V0VGltZXJGb3JFbmRDb25mZXJlbmNlQ2FsbChwYXlsb2FkKS5zdWJzY3JpYmUoKHJlcykgPT4geyB9KVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb25mPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgbGV0IGNvbmZlcmVuY2UgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5maW5kKChyZXM6IGFueSkgPT4gcmVzPy5jb25mZXJlbmNlSWQgPT0gdGhpcy5zZWxlY3RlZENvbmY/LmNvbmZlcmVuY2VJZClcclxuICAgICAgbGV0IHBhcnRpY2lwZW50SW5mbyA9IGNvbmZlcmVuY2U/LnBhcnRpY2lwYW50cz8uZmluZCgocGFydGljaXBhbnQ6IGFueSkgPT4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LmZyb20pXHJcbiAgICAgICAgJiYgcGFydGljaXBhbnQ/LmNsaWVudCAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJykgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8udG8pICYmIHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmICFwYXJ0aWNpcGFudD8uYnVzaW5lc3NOdW1iZXIgJiYgcGFydGljaXBhbnQ/Lmhvc3QpICYmIHBhcnRpY2lwYW50Py5jbGllbnQpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0KVxyXG4gICAgICBpZiAocGFydGljaXBlbnRJbmZvPy5pZCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5NdWx0aXBsZUNvbmZlcmVuY2VzKCkpIHtcclxuICAgICAgICAgIC8vIFNob3cgcG9wdXAgaW5zdGVhZCBvZiBkaXJlY3RseSBsZWF2aW5nXHJcbiAgICAgICAgICB0aGlzLmxlYXZlQ29uZlBhcnRpY2lwYW50ID0gcGFydGljaXBlbnRJbmZvO1xyXG4gICAgICAgICAgdGhpcy5sZWF2ZUNvbmZDb25mZXJlbmNlTmFtZSA9IHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0LmZpbmQoKGM6IGFueSkgPT4gYy5jb25mZXJlbmNlSWQgPT09IGNvbmZlcmVuY2UuY29uZmVyZW5jZUlkKT8uY2FsbExhYmVsIHx8ICdDb25mZXJlbmNlJztcclxuICAgICAgICAgIHRoaXMuc2hvd0xlYXZlQ29uZmlybWF0aW9uTW9kYWwgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm9uRW5kQ2FsbChwYXJ0aWNpcGVudEluZm8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vbkVuZENhbGwodGhpcy5ob3N0bnVtYmVyKTtcclxuICAgIH1cclxuICB9XHJcbiAgY29udmVydEhITU1Ub01pbnV0ZXModGltZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IFtob3VycywgbWludXRlc10gPSB0aW1lLnNwbGl0KCc6JykubWFwKE51bWJlcik7XHJcbiAgICByZXR1cm4gKGhvdXJzICogNjApICsgbWludXRlcztcclxuICB9XHJcblxyXG4gIG9uUmVqZWN0Q2FsbChjYWxsSW5mbzogYW55KSB7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgY2hhbm5lbElkOiBlbnZpcm9ubWVudC5jaGFubmVsSWQsXHJcbiAgICAgIHJlY29yZElkOiBjYWxsSW5mbz8uaWQsXHJcbiAgICAgIGlwQWRkcmVzczogJycsXHJcbiAgICAgIGlwQ291bnRyeTogJycsXHJcbiAgICAgIGNhbGxTdGF0dXM6ICdubycsXHJcbiAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICB1c2VySWQ6ICB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgIGNvbXBhbnlJZDogJycsXHJcbiAgICAgIGNsaWVudFNpZDogY2FsbEluZm8/LmNsaWVudFNpZCxcclxuICAgICAgY29uZmVyZW5jZUlkOiBjYWxsSW5mbz8uY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAgIH1cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5zZXRJbmNvbWluZ0NhbGxTdGF0dXMocGF5bG9hZCkuc3Vic2NyaWJlKGFzeW5jIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigocmVzOiBhbnkpID0+IHJlcz8uaWQgIT0gY2FsbEluZm8/LmlkKTtcclxuICAgICAgdGhpcy5vbkNsb3NlQzJDSW5mb1BhbmVsKCk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pXHJcbiAgfVxyXG4gIFxyXG4gIGlzU2VsZk51bWJlcihwYXJ0aWNpcGFudDogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VOdW1iZXJMaXN0LmZpbmQoKHJlczogYW55KSA9PiByZXMgPT0gKHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gcGFydGljaXBhbnQ/LmZyb20gOiBwYXJ0aWNpcGFudD8udG8pKTtcclxuICB9XHJcblxyXG4gIHNob3VsZFNob3dTZXBhcmF0b3IoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdmlzaWJsZUNvdW50ID0gdGhpcy5jdXJyZW50Q2FsbExpc3Quc2xpY2UoMCwgaW5kZXgpLmZpbHRlcigoY2FsbDogYW55KSA9PiAhY2FsbD8uaXNDb25mZXJlbmNlSG9sZCkubGVuZ3RoO1xyXG4gICAgcmV0dXJuIHZpc2libGVDb3VudCA+IDA7XHJcbiAgfVxyXG5cclxuICBvbkNsb3NlQzJDSW5mb1BhbmVsKCkge1xyXG4gICAgLy8gdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICBsZXQgYnVzaW5lc3NJbmZvID0gdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50cy5maW5kKChpdGVtOiBhbnkpID0+ICEhaXRlbT8uYnVzaW5lc3NOdW1iZXIgJiYgdGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGl0ZW0/LnRvKSAmJiAhaXRlbT8uaG9zdCk7XHJcbiAgICBpZihidXNpbmVzc0luZm8pIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZChyZXMgPT4gYnVzaW5lc3NJbmZvPy5pZCA9PSByZXM/LmlkKTtcclxuICAgICAgdGhpcy50b2dnbGVDMkNJbmZvUGFuZWwodGhpcy5zZWxlY3RlZFVzZXJJbmZvKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZShudW1iZXI6IGFueSkge1xyXG4gICAgICBsZXQgY29udGFjdEluZm8gPSB0aGlzLmNvbnRhY3RzLmZpbmQoKGM6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyICA9PSBudW1iZXIgfHwgYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlciA9PSBudW1iZXI7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gY29udGFjdEluZm8/LmZpcnN0TmFtZSB8fCBjb250YWN0SW5mbz8ubGFzdE5hbWUgPyBgJHtjb250YWN0SW5mbz8uZmlyc3ROYW1lIHx8ICcnfSAke2NvbnRhY3RJbmZvPy5sYXN0TmFtZSB8fCAnJ31gIDogbnVsbFxyXG4gIH1cclxuICBcclxuICBnZXRJbWcobnVtYmVyOiBhbnkpIHtcclxuICAgIGxldCBjb250YWN0SW5mbyA9IHRoaXMuY29udGFjdHMuZmluZCgoYzogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyICA9PSBudW1iZXIgfHwgYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlciA9PSBudW1iZXI7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb250YWN0SW5mbz8uaW1hZ2UgfHwgbnVsbFxyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3dFbmRBbGxCdXR0b24oKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhY3RpdmVQYXJ0aWNpcGFudHMgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKGM6IGFueSkgPT4gIWMuaXNMZWZ0KTtcclxuICAgIHJldHVybiBhY3RpdmVQYXJ0aWNpcGFudHMubGVuZ3RoID4gMjtcclxuICB9XHJcbiAgY29uZmlybUxlYXZlUGFydGljaXBhbnQoYzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5pc0luTXVsdGlwbGVDb25mZXJlbmNlcygpKSB7XHJcbiAgICAgIHRoaXMubGVhdmVDb25mUGFydGljaXBhbnQgPSBjO1xyXG4gICAgICB0aGlzLmxlYXZlQ29uZkNvbmZlcmVuY2VOYW1lID0gdGhpcy5jb25mZXJlbmNlQ2FsbExpc3QuZmluZChcclxuICAgICAgICAoY29uZjogYW55KSA9PiBjb25mLmNvbmZlcmVuY2VJZCA9PT0gYy5jb25mZXJlbmNlSWRcclxuICAgICAgKT8uY2FsbExhYmVsIHx8ICdDb25mZXJlbmNlJztcclxuICAgICAgdGhpcy5zaG93TGVhdmVDb25maXJtYXRpb25Nb2RhbCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9uRW5kQ2FsbChjLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzSW5NdWx0aXBsZUNvbmZlcmVuY2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNvdW50ID0gMDtcclxuICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZm9yRWFjaCgoY29uZjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGNvbmYpO1xyXG4gICAgICBjb25zdCBvdXJQYXJ0aWNpcGFudCA9IGNvbmYucGFydGljaXBhbnRzPy5maW5kKChwOiBhbnkpID0+XHJcbiAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocD8uZnJvbSkgJiYgcD8uY2xpZW50KSB8fFxyXG4gICAgICAgICAgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwPy50bykgJiYgcD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiAhcD8uYnVzaW5lc3NOdW1iZXIpKSAmJlxyXG4gICAgICAgICFwPy5pc0xlZnRcclxuICAgICAgKTtcclxuICAgICAgY29uc29sZS5sb2cob3VyUGFydGljaXBhbnQpO1xyXG4gICAgICBpZiAob3VyUGFydGljaXBhbnQpIGNvdW50Kys7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb3VudCA+IDE7XHJcbiAgfVxyXG4gIGNvbmZpcm1MZWF2ZSgpIHtcclxuICAgIGlmICh0aGlzLmxlYXZlQ29uZlBhcnRpY2lwYW50KSB7XHJcbiAgICAgIHRoaXMub25FbmRDYWxsKHRoaXMubGVhdmVDb25mUGFydGljaXBhbnQsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd0xlYXZlQ29uZmlybWF0aW9uTW9kYWwgPSBmYWxzZTtcclxuICAgIHRoaXMubGVhdmVDb25mUGFydGljaXBhbnQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsTGVhdmUoKSB7XHJcbiAgICB0aGlzLnNob3dMZWF2ZUNvbmZpcm1hdGlvbk1vZGFsID0gZmFsc2U7XHJcbiAgICB0aGlzLmxlYXZlQ29uZlBhcnRpY2lwYW50ID0gbnVsbDtcclxuICB9XHJcbiAgZ2V0IGFjdGl2ZVBhcnRpY2lwYW50c0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q/LmZpbHRlcigocDogYW55KSA9PiAhcC5pc0xlZnQpLmxlbmd0aCB8fCAwO1xyXG4gIH1cclxuICB0cnVuY2F0ZVRleHQodGV4dDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRleHQpIHJldHVybiAnJztcclxuICAgIHJldHVybiB0ZXh0Lmxlbmd0aCA+IG1heExlbmd0aCA/IHRleHQuc3Vic3RyaW5nKDAsIG1heExlbmd0aCkgKyAnLi4uJyA6IHRleHQ7XHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxQYXJ0aWNpcGFudHNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0Py5sZW5ndGggfHwgMDtcclxuICB9XHJcbiAgb25SZWFzb25DaGVja0NoYW5nZWQobmV3VmFsdWU6Ym9vbGVhbikge1xyXG4gICAgaWYgKCFuZXdWYWx1ZSkge1xyXG4gICAgICB0aGlzLnNob3dIb3VyRHJvcGRvd24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zaG93TWludXRlRHJvcGRvd24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5sZWF2ZUhvdXIgPSAnJztcclxuICAgICAgdGhpcy5sZWF2ZU1pbnV0ZSA9ICcnO1xyXG4gICAgICB0aGlzLmxlYXZlUmVhc29uID0gJyc7IFxyXG4gICAgfVxyXG4gIH1cclxuICByZXNldExlYXZlVGltZXIoKSB7XHJcbiAgICB0aGlzLmlzUmVhc29uQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5sZWF2ZUhvdXIgPSAnJztcclxuICAgIHRoaXMubGVhdmVNaW51dGUgPSAnJztcclxuICAgIHRoaXMubGVhdmVSZWFzb24gPSAnJztcclxuICAgIHRoaXMuc2hvd0hvdXJEcm9wZG93biA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93TWludXRlRHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmNhbGxEYXRhLmRpYWwgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsbC1jb250YWluZXJcIiAqbmdJZj1cIiFpc01pbmltaXNlZCAmJiBjdXJyZW50Q2FsbExpc3Q/Lmxlbmd0aFwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydjb2xsb3BzJzogaXNDb2xsb3BzLCAnaW5jb21pbmctY2FsbC1jb250YWluZXInOiBpc0NsaWNrRXhwYW5kLCAnY29udGFjdHMtb3Blbic6IHNob3dDb250YWN0c1BhbmVsIH1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGVyLXdyYXBwZXIgb3V0Z29pbmctY2FsbC1sb2FkZXJcIlxyXG4gICAgICAgICAgICAqbmdJZj1cInNob3dOZXdDYWxsTG9hZGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3RpdmUtY2FsbFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgcG9zaXRpb246IHJlbGF0aXZlO1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYW5pbWF0aW9uIGNhbGwtYW5pbWF0aW9uLXBsYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiIFtzcmNdPVwibmV3Q2FsbExvYWRlckRhdGE/LmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbGVyRGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMSBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDtcIj5Db25uZWN0aW5nLi4uPC9oMT5cclxuICAgICAgICAgICAgICAgICAgICA8cCBzdHlsZT1cInRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1wiPnt7IG5ld0NhbGxMb2FkZXJEYXRhPy5uYW1lIHx8IG5ld0NhbGxMb2FkZXJEYXRhPy5waG9uZSB8fCAnVW5rbm93bicgfX08L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFjdGlvbi1idG5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0biBlbmQtY2FsbC1idG5cIiBkaXNhYmxlZCAoY2xpY2spPVwiZW5kQ2FsbCgpXCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbHBhZC1hbGVydHNcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAnY29uZmVyZW5jZS1hbGVydCc6IGlzQ29uZmVyZW5jZSAmJiBjdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlLFxyXG4gICAgICAgICdub3JtYWwtY2FsbC1hbGVydCc6ICFpc0NvbmZlcmVuY2VcclxuICAgICAgICB9XCIgKm5nSWY9XCJjYWxsTnVtYmVyVG9hc3Quc2hvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbGJveC1wb3AxIGFsZXJ0IGZhZGUgc2hvd1wiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjYWxsTnVtYmVyVG9hc3QudHlwZVwiXHJcbiAgICAgICAgICAgICAgICByb2xlPVwiYWxlcnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgdGV4dC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgWW91J3IgY2FsbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3tjYWxsTnVtYmVyVG9hc3QuZGlzcGxheU51bX19PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tZGlzYyBwLTAgcHgtMVwiPiBDYW5jZWwgQ2FsbCA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gQWxsIHR5cGUgQ2FsbCBIb2xkIGxpc3QgIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtYmFubmVyXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIoY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgISFjdXJyZW50Q2FsbCAmJiAoKGlzQ29uZmVyZW5jZUNhbGxIb2xkIHx8IGlzQ29uZmVyZW5jZSkgfHwgIWlzQ29uZmVyZW5jZSkpIHx8ICFpc0FsbEFjY2VwdGVkXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbmYgb2YgY3VycmVudENhbGxMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsLWNvbnRlbnRcIiAqbmdJZj1cIiFjb25mPy5pc0FjY2VwdENhbGwgJiYgY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjb25mPy50bykgJiYgY29uZj8uaXNOb3RpZmljYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaGVsZC1jYWxsLXNlbGVjdGVkJzogc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCAmJiBzZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkID09PSBjb25mPy5wYXJ0aWNpcGFudElkfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmY/LmJ1c2luZXNzTnVtYmVyID8gdG9nZ2xlQzJDSW5mb1BhbmVsKGNvbmYpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjdXJzb3InOiBjb25mPy5idXNpbmVzc051bWJlciA/ICdwb2ludGVyJyA6ICdkZWZhdWx0J31cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nLXdyYXBwZXIgYm9yZGVyLXJhZGl1cy01MFwiIFtzcmNdPVwiY29uZj8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIHdpZHRoPVwiMzVcIiBoZWlnaHQ9XCIzNVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsZXJcIiAqbmdJZj1cIiFjb25mPy5idXNpbmVzc051bWJlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLWxhYmVsXCI+e3tjb25mPy5mcm9tfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPnt7Y29uZj8uZnJvbU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGxlclwiICpuZ0lmPVwiY29uZj8uYnVzaW5lc3NOdW1iZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1tYWluLWxhYmVsXCI+Q2FsbCBmcm9tIEMyQzo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbGFiZWxcIiA+PHNwYW4gW3RpdGxlXT1cImNvbmY/LnNvdXJjZU5hbWVcIj57eyB0cnVuY2F0ZVRleHQoY29uZj8uc291cmNlTmFtZSwgMTApIH19PC9zcGFuPnxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbdGl0bGVdPVwiY29uZj8ucG9pbnROYW1lXCI+e3sgdHJ1bmNhdGVUZXh0KGNvbmY/LnBvaW50TmFtZSwgMTApIH19PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1sYWJlbFwiPnt7IHRydW5jYXRlVGV4dChjb25mPy5uYW1lLCAyNikgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IHJlY2VpdmUtYnRuXCIgKGNsaWNrKT1cIndhaXRpbmdDYWxsQWNjZXB0KGNvbmYpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCIgW2Rpc2FibGVkXT1cImlzQ29ubmVjdGluZyB8fCBpc0luY29taW5nQ2FsbEJ0bkRpc2FibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIiAoY2xpY2spPVwib25SZWplY3RDYWxsKGNvbmYpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb25mPy5idXNpbmVzc051bWJlclwiIGNsYXNzPVwidG9nZ2xlYXJyb3ctYXJyb3cgbWUtMlwiIGlkPVwidG9nZ2xlYXJyb3dcIiAoY2xpY2spPVwidG9nZ2xlQzJDSW5mb1BhbmVsKGNvbmYpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWluZm9cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb25mIG9mIGNvbmZlcmVuY2VDYWxsTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbC1jb250ZW50XCIgKm5nSWY9XCJjb25mPy5pc0NvbmZlcmVuY2VIb2xkICYmIGNvbmZlcmVuY2VDYWxsTGlzdC5sZW5ndGggPiAxXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2hlbGQtY2FsbC1zZWxlY3RlZCc6IGNvbmY/LmlzQnVzaW5lc3NOdW1iZXIgJiYgc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCA9PT0gY29uZj8uYnVzaW5lc3NQYXJ0aWNpcGFudElkfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmY/LmlzQnVzaW5lc3NOdW1iZXIgPyB0b2dnbGVDMkNJbmZvUGFuZWwoY29uZikgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2N1cnNvcic6IGNvbmY/LmlzQnVzaW5lc3NOdW1iZXIgPyAncG9pbnRlcicgOiAnZGVmYXVsdCd9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaG9sZC1pY29uXCI+cGF1c2VfY2lyY2xlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1sYWJlbFwiPkhvbGQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPnt7Y29uZj8uY2FsbExhYmVsfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0XCIgW25nQ2xhc3NdPVwieyAnb24taG9sZCc6IGNvbmY/LmlzQ29uZmVyZW5jZUhvbGQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3dhcENhbGxzKGNvbmYsdHJ1ZSlcIiBbZGlzYWJsZWRdPVwiaXNIb2xkQnRuRGlzYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb25mPy5pc0NvbmZlcmVuY2VIb2xkXCIgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgW3RpdGxlXT1cIidSZXN1bWUnXCI+IHJlc3VtZSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cImVuZENvbmZlcmVuZWNlQ2FsbChjb25mKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgdGl0bGU9XCJDYWxsIEVuZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlYXJyb3ctYXJyb3cgbWUtMlwiIGlkPVwidG9nZ2xlYXJyb3dcIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjb25mKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gRm9yIHNpbmdsZSBpbmNvbWluZyBjYWxsIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoLTEwMCBweS01XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudENhbGxMaXN0Lmxlbmd0aCA9PT0gMSAmJiBjdXJyZW50Q2FsbExpc3RbMF0/LmlzSW5jb21pbmdDYWxsICYmICFjdXJyZW50Q2FsbExpc3RbMF0/LmlzQWNjZXB0Q2FsbFwiPlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjYWxsVG9OdW1cIj5JbmNvbWluZyBjYWxsIG9uIDxiciAvPjxzcGFuPnt7Y3VycmVudENhbGxMaXN0WzBdPy50byB8fCAnVW5rbm93biBOdW1iZXInfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxUb051bVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRDYWxsTGlzdFswXT8uYnVzaW5lc3NOdW1iZXI7IGVsc2Ugbm9ybWFsQ2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEMyQyBDQUxMXHJcbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+IEZyb20gOiB7eyBjdXJyZW50Q2FsbExpc3RbMF0/LnNvdXJjZU5hbWUgfX0gfCB7eyBjdXJyZW50Q2FsbExpc3RbMF0/LnBvaW50TmFtZSB9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vcm1hbENhbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgSW5jb21pbmcgY2FsbCBvblxyXG4gICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGN1cnJlbnRDYWxsTGlzdFswXT8udG8gfHwgJ1Vua25vd24gTnVtYmVyJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hbmltYXRpb25cIiBbbmdDbGFzc109XCJ7J2NhbGwtYW5pbWF0aW9uLXBsYXknOiBzaG93UmluZ0FuaW1hdGlvbn1cIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nXCIgW3NyY109XCJpbmNvbWluZ0Zyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiB3aWR0aD1cIjEyMFwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbGVyRGV0YWlsc1wiICpuZ0lmPVwiIWN1cnJlbnRDYWxsTGlzdFswXT8uYnVzaW5lc3NOdW1iZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoMT57eyBjdXJyZW50Q2FsbExpc3RbMF0/Lm5hbWUgPyBjdXJyZW50Q2FsbExpc3RbMF0/Lm5hbWUgOiBjdXJyZW50Q2FsbExpc3RbMF0/LnBob25lIHx8ICdVbmtub3duIE51bWJlcicgfX08L2gxPlxyXG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCIhIWN1cnJlbnRDYWxsTGlzdFswXT8ubmFtZVwiPnt7IGN1cnJlbnRDYWxsTGlzdFswXT8ucGhvbmUgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbGVyRGV0YWlsc1wiICpuZ0lmPVwiY3VycmVudENhbGxMaXN0WzBdPy5idXNpbmVzc051bWJlclwiPlxyXG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCIhIWN1cnJlbnRDYWxsTGlzdFswXT8ubmFtZVwiPnt7IHRydW5jYXRlVGV4dChjdXJyZW50Q2FsbExpc3RbMF0/Lm5hbWUsIDQ1KSB9fTwvcD5cclxuICAgICAgICAgICAgICAgIDxwID57eyBjdXJyZW50Q2FsbExpc3RbMF0/Lm51bWJlciB9fTwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gQ29ubmVjdGluZyBvdmVybGF5IChzaG93biBhZnRlciBhY2NlcHQgYnRuIGNsaWNrLCBoaWRkZW4gb24gQVBJIHJlc3BvbnNlKSAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbm5lY3Rpbmctb3ZlcmxheSBtdC1hdXRvXCIgKm5nSWY9XCJpc0Nvbm5lY3RpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25uZWN0aW5nLWRvdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjb25uZWN0aW5nLXRleHRcIj5Db25uZWN0aW5nLi4uPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFjdGlvbi1idG5zIG10LWF1dG9cIiAqbmdJZj1cIiFpc0Nvbm5lY3RpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0biByZWNlaXZlLWJ0blwiICpuZ0lmPVwiIW5ld0luY29taW5nQ2FsbHNMaXN0WzBdPy5pc0NhbGxDb25uZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0luY29taW5nQ2FsbEJ0bkRpc2FibGVcIiAoY2xpY2spPVwiYWRkKGN1cnJlbnRDYWxsTGlzdFswXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0biByZWplY3QtYnRuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cIm9uUmVqZWN0Q2FsbChjdXJyZW50Q2FsbExpc3RbMF0pXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBGb3Igc2luZ2xlIGFjdGl2ZSBjYWxsIC0tPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIoIWlzQ29uZmVyZW5jZSB8fCBpc0NvbmZlcmVuY2VDYWxsSG9sZCkgJiYgKCEhY3VycmVudENhbGw/LmlkICYmICFjdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlKSAmJiBjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwieydkaXNwbGF5JzogJ2ZsZXgnLCAnZmxleC1kaXJlY3Rpb24nOiAnY29sdW1uJywgJ3Bvc2l0aW9uJzogJ3JlbGF0aXZlJ31cIiBjbGFzcz1cImFjdGl2ZS1jYWxsXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFVzZXJJbmZvPy5idXNpbmVzc051bWJlcjtcIiBjbGFzcz1cImNhbGxUb051bVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEMyQyBDQUxMXHJcbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+IEZyb20gOiB7eyBzZWxlY3RlZFVzZXJJbmZvPy5zb3VyY2VOYW1lIH19IHwge3sgc2VsZWN0ZWRVc2VySW5mbz8ucG9pbnROYW1lIH19IDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFuaW1hdGlvblwiIFtuZ0NsYXNzXT1cInsnY2FsbC1hbmltYXRpb24tcGxheSc6IHNob3dSaW5nQW5pbWF0aW9ufVwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImF2YXRhci1pbWdcIiAqbmdJZj1cIiFjdXJyZW50Q2FsbD8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY3VycmVudENhbGw/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIDogY3VycmVudENhbGw/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImF2YXRhci1pbWdcIiAqbmdJZj1cImN1cnJlbnRDYWxsPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGN1cnJlbnRDYWxsPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbGVyRGV0YWlsc1wiPlxyXG4gICAgICAgICAgICA8IS0tIEMyQyBCdXNpbmVzcyBDYWxsIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVXNlckluZm8/LmJ1c2luZXNzTnVtYmVyOyBlbHNlIG5vcm1hbENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDE+e3sgc2VsZWN0ZWRVc2VySW5mbz8ubmFtZSB9fTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+e3sgc2VsZWN0ZWRVc2VySW5mbz8ubnVtYmVyIH19PC9wPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBOb3JtYWwgQ2FsbCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9ybWFsQ2FsbD5cclxuICAgICAgICAgICAgICAgICAgICA8aDEgKm5nSWY9XCIhY3VycmVudENhbGw/LmNsaWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6JzhweCd9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGN1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGN1cnJlbnRDYWxsPy50b05hbWUgfHwgb3V0Z29pbmdDb250YWN0TmFtZSB8fCAnVW5rbm93bidcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudENhbGw/LmZyb21OYW1lIHx8ICdVbmtub3duJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgxICpuZ0lmPVwiY3VycmVudENhbGw/LmNsaWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6JzhweCd9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGN1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGN1cnJlbnRDYWxsPy5mcm9tTmFtZSB8fCAnVW5rbm93bidcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudENhbGw/LnRvTmFtZSB8fCAnVW5rbm93bicgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiIWN1cnJlbnRDYWxsPy5jbGllbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY3VycmVudENhbGw/LnRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN1cnJlbnRDYWxsPy5mcm9tIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiY3VycmVudENhbGw/LmNsaWVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjdXJyZW50Q2FsbD8uZnJvbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50Q2FsbD8udG8gfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8aDEgKm5nSWY9XCIhY3VycmVudENhbGw/LmNsaWVudFwiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICc4cHgnfVwiPnt7Y3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8udG9OYW1lIHx8IG91dGdvaW5nQ29udGFjdE5hbWUgfHwgJ1Vua25vd24nIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2FsbD8uZnJvbU5hbWUgfHwgJ1Vua25vd24nfX08L2gxPlxyXG4gICAgICAgICAgICAgICAgPGgxICpuZ0lmPVwiY3VycmVudENhbGw/LmNsaWVudFwiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICc4cHgnfVwiPnt7Y3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8uZnJvbU5hbWUgfHwgJ1Vua25vd24nIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2FsbD8udG9OYW1lIHx8ICdVbmtub3duJ319PC9oMT5cclxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiIWN1cnJlbnRDYWxsPy5jbGllbnRcIj57eyBjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGN1cnJlbnRDYWxsPy50byB8fCAnVW5rbm93bicgOiBjdXJyZW50Q2FsbD8uZnJvbSB8fCAnVW5rbm93bid9fTwvcD5cclxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiY3VycmVudENhbGw/LmNsaWVudFwiPnt7IGN1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY3VycmVudENhbGw/LmZyb20gfHwgJ1Vua25vd24nIDogY3VycmVudENhbGw/LnRvIHx8ICdVbmtub3duJ319PC9wPiAtLT5cclxuICAgICAgICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbi10b3A6IDRweFwiPnt7IHRpbWVyfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1hY3Rpb24tYnRuc1wiICpuZ0lmPVwiIXNob3dLZXlwYWRcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnMjBweCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWJ0bi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBzdGFydC1zdG9wXCIgKm5nSWY9XCIhaXNSZWNvcmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3JlY29yZGluZyc6IGlzUmVjb3JkaW5nLCAnc3RvcHBlZCc6ICFpc1JlY29yZGluZywgJ2Rpc2FibGVkJzogdXNlclNldHRpbmdJbmZvPy5jYWxsUmVjb3JkaW5nID09ICdOJ31cIiAoY2xpY2spPVwidG9nZ2xlUmVjb3JkaW5nKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXNSZWNvcmRpbmcgPyAnU3RvcCBSZWNvcmRpbmcnIDogJ1N0YXJ0IFJlY29yZGluZydcIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGwgfHwgdXNlclNldHRpbmdJbmZvPy5jYWxsUmVjb3JkaW5nID09ICdOJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlY29yZGluZy1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXVzZS1yZXN1bWUtYnRuc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUmVjb3JkaW5nICYmICFpc1BhdXNlZFwiIChjbGljayk9XCJwYXVzZVJlY29yZGluZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGF1c2UgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJpc1BhdXNlZFwiIChjbGljayk9XCJyZXN1bWVSZWNvcmRpbmcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBsYXlfYXJyb3cgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzUmVjb3JkaW5nXCIgY2xhc3M9XCJ0aW1lci1kaXNwbGF5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZ2V0Rm9ybWF0dGVkVGltZSgpIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gTXV0ZS91bm11dGUgaW5jb21pbmcgY2FsbCAgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdXRlLWluY29taW5nLXJvd1wiICpuZ0lmPVwiY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbCAmJiAhc2hvd0tleXBhZFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdXRlLWluY29taW5nLWxhYmVsXCI+TXV0ZSBpbmNvbWluZyBjYWxsczwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN3aXRjaCBtYi0wXCIgdGl0bGU9XCJTaWxlbmNlIHRoZSByaW5ndG9uZSBvZiBuZXcgaW5jb21pbmcgY2FsbHMgZHVyaW5nIHRoaXMgY2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJ0d2lsaW9TZXJ2aWNlLmlzSW5jb21pbmdNdXRlZFwiIChjaGFuZ2UpPVwidG9nZ2xlTXV0ZUluY29taW5nQ2FsbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzd2l0Y2gtc2xpZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93S2V5cGFkXCIgY2xhc3M9XCJzZW5kRGlnaXRcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJjYWxsLWlucHV0c1wiIGlkPVwiY2FsbC1pbnB1dFwiIFsobmdNb2RlbCldPVwiY2FsbElucHV0XCIgKGtleXVwKT1cIm9uQ2FsbElucHV0RW50ZXIoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGlucHV0LWNsZWFyLWJ0blwiICpuZ0lmPVwiY2FsbElucHV0XCIgKGNsaWNrKT1cImNsZWFySW5wdXRzKClcIj5jbG9zZV9zbWFsbDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29udGFpbmVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cInNob3dLZXlwYWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXktYnRuXCIgKm5nRm9yPVwibGV0IGtleSBvZiBrZXlwYWRWYWxcIiAoY2xpY2spPVwib25DYWxsSW5wdXRzKGtleS5udW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3trZXkubnVtfX1cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1hbGJoYWJldHNcIj57e2tleS50ZXh0ID8ga2V5LnRleHQgOiAnJm5ic3A7J319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYWN0aW9uLWJ0bnNcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnNzIzeCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWV2ZW5seSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtc2VjLWJ0biBtci0zXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCIgKGNsaWNrKT1cInRvZ2dsZU11dGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cImlzTXV0ZVwiPiBtaWNfb2ZmIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhaXNNdXRlXCI+IG1pYyA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtc2VjLWJ0biBtci0zXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIChjbGljayk9XCJ0b2dnbGVLZXlwYWQoKVwiPiB0cmFuc2l0aW9uX2Rpc3NvbHZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1zZWMtYnRuXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwoY3VycmVudENhbGwpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBncm91cHNfMiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIGVuZC1jYWxsLWJ0blwiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiIChjbGljayk9XCJlbmRDYWxsKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBjb25mZXJlbmNlIGNhbGwgdmlldyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmVyZW5jZS1jYWxsLXZpZXdcIiAqbmdJZj1cImlzQ29uZmVyZW5jZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi1oZWFkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbmYtaWNvbiBtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGdyb3VwcyA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbmYtdGl0bGVcIj5Db25mZXJlbmNlIENhbGw8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbC10ZXh0IGNvbmYtbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNhbGwgb2YgY3VycmVudENhbGxMaXN0OyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2FsbD8uaXNDb25mZXJlbmNlSG9sZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG91bGRTaG93U2VwYXJhdG9yKGkpXCI+ICYgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjYWxsPy5jbGllbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU2VsZk51bWJlcihjYWxsKSBlbHNlIHNlbGZOdW1iZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tjYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY2FsbD8uZnJvbU5hbWUgfHwgY2FsbD8uZnJvbSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGw/LnRvTmFtZSB8fCBjYWxsPy50b319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2VsZk51bWJlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WW91PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjYWxsPy5jbGllbnRcIj57e2NhbGw/LmRpcmVjdGlvbiA9PSBcIm91dGdvaW5nLWNhbGxcIiA/IGNhbGw/LnRvTmFtZSB8fCBjYWxsPy50byA6IGNhbGw/LmZyb21OYW1lIHx8IGNhbGw/LmZyb20gfHwgJ1Vua25vd24gbnVtYmVyJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmYtdGltZXJcIj57eyBjdXJyZW50Q29uZmVyZW5jZUNhbGw/LnRpbWVyIHx8IHRpbWVyIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYWN0aW9uLWJ0bnMgbXQtYXV0b1wiICpuZ0lmPVwiIXNob3dLZXlwYWRcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnMjBweCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWJ0bi1jb250YWluZXJcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gc3RhcnQtc3RvcFwiICpuZ0lmPVwiIWlzUmVjb3JkaW5nXCIgW2Rpc2FibGVkXT1cInVzZXJTZXR0aW5nSW5mby5jYWxsUmVjb3JkaW5nID09ICdOJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsncmVjb3JkaW5nJzogaXNSZWNvcmRpbmcsICdzdG9wcGVkJzogIWlzUmVjb3JkaW5nLCAnZGlzYWJsZWQnOiB1c2VyU2V0dGluZ0luZm8/LmNhbGxSZWNvcmRpbmcgPT0gJ04nfVwiIChjbGljayk9XCJ0b2dnbGVSZWNvcmRpbmcoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpc1JlY29yZGluZyA/ICdTdG9wIFJlY29yZGluZycgOiAnU3RhcnQgUmVjb3JkaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlY29yZGluZy1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXVzZS1yZXN1bWUtYnRuc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUmVjb3JkaW5nICYmICFpc1BhdXNlZFwiIChjbGljayk9XCJwYXVzZVJlY29yZGluZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGF1c2UgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJpc1BhdXNlZFwiIChjbGljayk9XCJyZXN1bWVSZWNvcmRpbmcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBsYXlfYXJyb3cgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzUmVjb3JkaW5nXCIgY2xhc3M9XCJ0aW1lci1kaXNwbGF5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZ2V0Rm9ybWF0dGVkVGltZSgpIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gTXV0ZS91bm11dGUgaW5jb21pbmcgY2FsbCAgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdXRlLWluY29taW5nLXJvd1wiICpuZ0lmPVwiY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbCAmJiAhc2hvd0tleXBhZFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdXRlLWluY29taW5nLWxhYmVsXCI+TXV0ZSBpbmNvbWluZyBjYWxsczwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN3aXRjaCBtYi0wXCIgdGl0bGU9XCJTaWxlbmNlIHRoZSByaW5ndG9uZSBvZiBuZXcgaW5jb21pbmcgY2FsbHMgZHVyaW5nIHRoaXMgY2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJ0d2lsaW9TZXJ2aWNlLmlzSW5jb21pbmdNdXRlZFwiIChjaGFuZ2UpPVwidG9nZ2xlTXV0ZUluY29taW5nQ2FsbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzd2l0Y2gtc2xpZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93S2V5cGFkXCIgY2xhc3M9XCJzZW5kRGlnaXQgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNhbGwtaW5wdXRzXCIgaWQ9XCJjYWxsLWlucHV0XCIgWyhuZ01vZGVsKV09XCJjYWxsSW5wdXRcIiAoa2V5dXApPVwib25DYWxsSW5wdXRFbnRlcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaW5wdXQtY2xlYXItYnRuXCIgKm5nSWY9XCJjYWxsSW5wdXRcIiAoY2xpY2spPVwiY2xlYXJJbnB1dHMoKVwiPmNsb3NlX3NtYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1jb250YWluZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwic2hvd0tleXBhZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleS1idG5cIiAqbmdGb3I9XCJsZXQga2V5IG9mIGtleXBhZFZhbFwiIChjbGljayk9XCJvbkNhbGxJbnB1dHMoa2V5Lm51bSlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2tleS5udW19fVxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWFsYmhhYmV0c1wiPnt7a2V5LnRleHQgPyBrZXkudGV4dCA6ICcmbmJzcDsnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBpc011dGV9XCIgKGNsaWNrKT1cInRvZ2dsZU11dGUodHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4ge3sgaXNNdXRlID8gJ21pY19vZmYnIDogJ21pYycgfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0blwiIChjbGljayk9XCJ0b2dnbGVLZXlwYWQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiB0cmFuc2l0aW9uX2Rpc3NvbHZlIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjdXJyZW50Q2FsbClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzXzIgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi1lbmRcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuIGRhbmdlclwiIChjbGljayk9XCJlbmRDb25mZXJlbmVjZUNhbGwoY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHNbMF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndhdmUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3YXZlc1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIlxyXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMjQgMTUwIDI4XCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIiBzaGFwZS1yZW5kZXJpbmc9XCJhdXRvXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD1cImdlbnRsZS13YXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0tMTYwIDQ0YzMwIDAgNTgtMTggODgtMThzIDU4IDE4IDg4IDE4IDU4LTE4IDg4LTE4IDU4IDE4IDg4IDE4IHY0NGgtMzUyelwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICA8ZyBjbGFzcz1cInBhcmFsbGF4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjBcIiBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjcpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiM1wiIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCI3XCIgZmlsbD1cIiNmZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gSW5jb21pbmcgY2FsbCB1c2VyIGRldGFpbHMgc2hvd24gaW4gbW9kZWwgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsbC1jb250YWluZXItbW9kZWwgcC0zIHRleHQtd2hpdGUgbW9kZWwtY29udGVudCBjYWxsLWNvbnRhaW5lclwiICpuZ0lmPVwiaXNDbGlja0V4cGFuZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZS1pbmZvLXBhbmVsLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiICpuZ0lmPVwiY3VycmVudENvbmZlcmVuY2VDYWxsPy5jb25mZXJlbmNlSWQgIT0gc2VsZWN0ZWRVc2VySW5mbz8uY29uZmVyZW5jZUlkICYmIG5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgICAgICAgICA8cD48L3A+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZGlhbC1jbG9zZS1idG4gXCIgKGNsaWNrKT1cIm9uQ2xvc2VDMkNJbmZvUGFuZWwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI2ZmZmZmZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0yNTYtMjAwLTU2LTU2IDIyNC0yMjQtMjI0LTIyNCA1Ni01NiAyMjQgMjI0IDIyNC0yMjQgNTYgNTYtMjI0IDIyNCAyMjQgMjI0LTU2IDU2LTIyNC0yMjQtMjI0IDIyNFpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMiB1c2VyLWluZm8tc2VjdGlvblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgbXktM1wiPlxyXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwidGV4dC13aGl0ZVwiPkMyQyBDQUxMIDoge3tzZWxlY3RlZFVzZXJJbmZvPy5zb3VyY2VOYW1lfX0gfCB7e3NlbGVjdGVkVXNlckluZm8/LnBvaW50TmFtZX19PC9oMz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJ0ZXh0LXdoaXRlIG1iLTFcIj5OYW1lOjwvaDU+XHJcbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJ0ZXh0LXdoaXRlIHVzZXJOYW1lXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5uYW1lfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImYtMTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+RXh0ZW5zaW9uOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMlwiPnt7c2VsZWN0ZWRVc2VySW5mbz8uZXh0ZW5zaW9ufX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPk51bWJlcjo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPnt7c2VsZWN0ZWRVc2VySW5mbz8ubnVtYmVyfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiPkVtYWlsOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e3NlbGVjdGVkVXNlckluZm8/LmVtYWlsfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+U3ViamVjdDo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTIgc3ViamVjdC10ZXh0XCIgdGl0bGU9XCJ7e3NlbGVjdGVkVXNlckluZm8/LnN1YmplY3R9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzZWxlY3RlZFVzZXJJbmZvPy5zdWJqZWN0fX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yIG1iLTFcIj5JbWFnZTo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZWxsaXBzaXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkVXNlckluZm8/LmltYWdlICYmIHNlbGVjdGVkVXNlckluZm8/LmltYWdlICE9PSAnLSc7IGVsc2Ugbm9JbWFnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwie3tzZWxlY3RlZFVzZXJJbmZvPy5pbWFnZX19XCIgYWx0PVwiXCIgd2lkdGg9XCIxNTBcIiBjbGFzcz1cIm1sLTJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSW1hZ2U+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yXCI+Tm8gSW1hZ2UgQXZhaWxhYmxlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5NZXNzYWdlOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY29udGFpbmVyXCIgW2NsYXNzLmV4cGFuZGVkXT1cImlzRXhwYW5kZWRcIj57e3NlbGVjdGVkVXNlckluZm8/Lm1lc3NhZ2V9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0b2dnbGUtYnRuXCIgKm5nSWY9XCJzaG93QnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZVRleHQoKVwiPnt7IGlzRXhwYW5kZWQgPyAnU2VlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzcycgOiAnU2VlIG1vcmUnIH19PC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIGNvbnRhY3QgbGlzdCBwYW5lbCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1wYW5lbFwiICpuZ0lmPVwic2hvd0NvbnRhY3RzUGFuZWwgJiYgIXNob3dOZXdDYWxsTG9hZGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWxvYWRlci1vdmVybGF5IHAtMyB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiaXNQYXJ0aWNpcGFudFBhbmVsTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1zZWNvbmRhcnlcIiByb2xlPVwic3RhdHVzXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5Mb2FkaW5nLi4uPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0yXCI+PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgPGRpdj5QYXJ0aWNpcGFudHM8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgPHA+PC9wPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwoe30sIHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMDAwMDAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwibTI1Ni0yMDAtNTYtNTYgMjI0LTIyNC0yMjQtMjI0IDU2LTU2IDIyNCAyMjQgMjI0LTIyNCA1NiA1Ni0yMjQgMjI0IDIyNCAyMjQtNTYgNTYtMjI0LTIyNC0yMjQgMjI0WlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNFQVJDSCBJTlBVVCAodmlzaWJsZSB3aGVuIGlzU2VhcmNoVmlzaWJsZSA9IHRydWUpIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYmFyIHAtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBieSBuYW1lIG9yIHBob25lIG51bWJlclwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIChpbnB1dCk9XCJhcHBseUZpbHRlcigpXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1jb250YWN0cy1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIiAqbmdJZj1cInNlYXJjaFRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCJjPy5pbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tjPy5maXJzdE5hbWV9fSB7e2M/Lm1pZGRsZU5hbWV9fSB7e2M/Lmxhc3ROYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3sgKGM/Lm51bWJlcnNMaXN0ICYmIGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIpIH19e3sgYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlckxhYmVsID8gJyAoJyArIGMubnVtYmVyc0xpc3RbMF0ubnVtYmVyTGFiZWwgKyAnKScgOiAnJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRhY3QtY2FsbC1idG4gY29udGFjdC1hZGQtYnRuIG1yLTJcIiAoY2xpY2spPVwiY2FsbENvbnRhY3QoYylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhYz8uSXNDb25uZWN0ZWRcIiB0aXRsZT1cIkFkZCB0byBjYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuXCIgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciwgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhYz8uSXNDb25uZWN0ZWRcIiB0aXRsZT1cIk5ldyBDYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpbHRlcmVkTGlzdC5sZW5ndGggJiYgaXNEaXJlY3RDYWxsT3B0aW9uU2hvdyAmJiBzZWFyY2hUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiBbc3JjXT1cIidhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3sgc2VhcmNoVGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRhY3QtY2FsbC1idG4gY29udGFjdC1hZGQtYnRuIG1yLTJcIiAoY2xpY2spPVwiQ2FsbFRvVW5zYXZlZE51bWJlcihzZWFyY2hUZXh0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkFkZCB0byBjYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuXCIgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoc2VhcmNoVGV4dCwgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJOZXcgQ2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtbGlzdFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMCB0aXRsZVwiICpuZ0lmPVwidG90YWxQYXJ0aWNpcGFudHNDb3VudCA+PSAzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tzZWxlY3RlZENvbmZOYW1lfX0ncyBhY3RpdmUgcGFydGljaXBhbnRzICh7e2FjdGl2ZVBhcnRpY2lwYW50c0NvdW50fX0pXHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMCB0aXRsZVwiICpuZ0lmPVwidG90YWxQYXJ0aWNpcGFudHNDb3VudCA8IDNcIj5cclxuICAgICAgICAgICAgICAgICAgICBBY3RpdmUgcGFydGljaXBhbnRzICh7e2FjdGl2ZVBhcnRpY2lwYW50c0NvdW50fX0pXHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGhyIGNsYXNzPVwibWItMiBtdC0xXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgZmlsdGVyZWRQYXJ0aWNpcGVudExpc3RcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIiAqbmdJZj1cIiFjPy5pc0xlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiAqbmdJZj1cIiFjPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiICpuZ0lmPVwiYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cIiFjPy5jbGllbnRcIj57e2M/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b05hbWUgfHwgJ1Vua25vd24nIDogYz8uZnJvbU5hbWUgfHwgJ1Vua25vd24nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCIgKm5nSWY9XCIhYz8uY2xpZW50XCI+e3sgYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvIHx8ICdVbmtub3duJyA6IGM/LmZyb20gfHwgJ1Vua25vd24nfX08L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cImM/LmNsaWVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1NlbGZOdW1iZXIoYykgZWxzZSBzZWxmTnVtYmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbU5hbWUgfHwgJ1Vua25vd24nIDogYz8udG9OYW1lIHx8ICdVbmtub3duJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NlbGZOdW1iZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WW91PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCIgKm5nSWY9XCJjPy5jbGllbnRcIj57eyBjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbSB8fCAnVW5rbm93bicgOiBjPy50byB8fCAnVW5rbm93bid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgKm5nSWY9XCJjPy5ob3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1sYWJlbFwiPk9yZ2FuaXplcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImM/LmpvaW5lZCAmJiAhYz8uaG9zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ubmVjdGluZy13cmFwcGVyIG1yLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmluZ2luZy10ZXh0XCI+UmluZ2luZzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG90c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWM/LmpvaW5lZCB8fCBjPy5ob3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJtaWMtYnRuIG1yLTJcIiBbZGlzYWJsZWRdPVwiYz8uaXNIb2xkXCIgKGNsaWNrKT1cIm9uTXV0ZVVzZXIoYylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiYz8uaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhYz8uaXNNdXRlXCI+IG1pYyA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1ob2xkLWNvbnRhY3QgbXItMlwiIFtuZ0NsYXNzXT1cInsgJ29uLWhvbGQnOiBjPy5pc0hvbGQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ib2xkQ2FsbChjKVwiICpuZ0lmPVwiIWM/Lmhvc3RcIiBbZGlzYWJsZWRdPVwiaXNIb2xkQnRuRGlzYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYz8uaXNIb2xkXCIgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgW3RpdGxlXT1cIidIb2xkJ1wiPiBwaG9uZV9wYXVzZWQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImM/LmlzSG9sZFwiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIFt0aXRsZV09XCInUmVzdW1lJ1wiPiByZXN1bWUgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cImNvbmZpcm1MZWF2ZVBhcnRpY2lwYW50KGMpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhYz8uaG9zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cImVuZENvbmZlcmVuZWNlQ2FsbChjKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYz8uaG9zdCAmJiAoZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjPy5mcm9tKSB8fCAoZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjPy50bykgJiYgYz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8aHIgY2xhc3M9XCJtLTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgcHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMCB0aXRsZVwiPlBhcnRpY2lwYW50IGFkZGVkIHRvIHRoZSBjYWxsPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxociBjbGFzcz1cIm1iLTIgbXQtMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCJjPy5pc0xlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiAqbmdJZj1cIiFjPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiICpuZ0lmPVwiYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cIiFjPy5jbGllbnRcIj57e2M/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b05hbWUgfHwgJ1Vua25vd24nIDogYz8uZnJvbU5hbWUgfHwgJ1Vua25vd24nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiICpuZ0lmPVwiIWM/LmNsaWVudFwiPnt7IGM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50byB8fCAnVW5rbm93bicgOiBjPy5mcm9tIHx8ICdVbmtub3duJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cImM/LmNsaWVudFwiPnt7Yz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJyA6IGM/LnRvTmFtZSB8fCAnVW5rbm93bid9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIiAqbmdJZj1cImM/LmNsaWVudFwiPnt7IGM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy5mcm9tIHx8ICdVbmtub3duJyA6IGM/LnRvIHx8ICdVbmtub3duJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiAqbmdJZj1cImM/Lmhvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLWxhYmVsXCI+T3JnYW5pemVyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ubmVjdGluZy13cmFwcGVyXCIgKm5nSWY9XCJjPy5qb2luZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyaW5naW5nLXRleHRcIj5SaW5naW5nPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwib25FbmRDYWxsKGMsIGZhbHNlLCB0cnVlKVwiICpuZ0lmPVwiIWM/Lmhvc3QgJiYgYz8uam9pbmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0blwiICpuZ0lmPVwiIWM/LmNsaWVudCAmJiAhYz8uam9pbmVkICYmICFjPy5idXNpbmVzc051bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJDYWxsVG9VbnNhdmVkTnVtYmVyKGMuZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvIDogYz8uZnJvbSwgZmFsc2UsIHsgc2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlIH0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBhZGQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+UmVqb2luPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0blwiICpuZ0lmPVwiYz8uY2xpZW50ICYmICFjPy5qb2luZWQgJiYgIWM/LmJ1c2luZXNzTnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoYy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbSA6IGM/LnRvLCBmYWxzZSwgeyBza2lwRHVwbGljYXRlQ2hlY2s6IHRydWUgfSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGFkZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5SZWpvaW48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIENvbmZlcmVuY2UgV2FybmluZyBNb2RhbCAtLT5cclxuPGRpdiBjbGFzcz1cImN1c3RvbS1tb2RhbFwiICpuZ0lmPVwic2hvd0NvbmZlcmVuY2VXYXJuaW5nTW9kYWxcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudCB3YXJuaW5nLW1vZGFsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1pY29uXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPndhcm5pbmc8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxoMz5Db25mZXJlbmNlIENhbGwgV2FybmluZzwvaDM+XHJcbiAgICA8cD5cclxuICAgICAgU3RhcnRpbmcgYSBuZXcgY2FsbCB3aWxsIHB1dCB0aGUgY3VycmVudCBjb25mZXJlbmNlIG9uIGhvbGRcclxuICAgICAgYW5kIGNhbm5vdCBiZSBtZXJnZWQgbGF0ZXIuXHJcbiAgICA8L3A+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1hY3Rpb25zXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnRuXCIgKGNsaWNrKT1cImNhbmNlbE5ld0NhbGwoKVwiPlxyXG4gICAgICAgIENhbmNlbFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInByb2NlZWQtYnRuXCIgKGNsaWNrKT1cImNvbmZpcm1OZXdDYWxsKClcIj5cclxuICAgICAgICBQcm9jZWVkXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJtaW4tY2FsbC1jb250YWluZXJcIiAqbmdJZj1cImlzTWluaW1pc2VkXCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZnVsbHNjcmVlblwiIChjbGljayk9XCJtYXhpbWlzZURpYWxwYWQoKVwiPiBvcGVuX2luX2Z1bGwgPC9zcGFuPlxyXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IHdpZHRoOiAxMDAlXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi1jYWxsLWFuaW1hdGlvblwiIGlkPVwiY2FsbC1hdmF0YXJcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJtaW4tYXZhdGFyLWltZ1wiIFtzcmNdPVwiY2FsbERhdGEuaW1nXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi1jYWxsZXJEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7Y2FsbERhdGEubmFtZX19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOiAwXCI+e3tjYWxsRGF0YS5kaXNwbGF5TnVtID8gY2FsbERhdGEuZGlzcGxheU51bSA6IGNhbGxEYXRhLnBob25lIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1pbi1idG4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi10aW1lclwiPnt7dGltZXJ9fTwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJtaW4tY2FsbC1zZWMtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZU11dGUoKVwiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cImlzTXV0ZVwiPiBtaWNfb2ZmIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhaXNNdXRlXCI+IG1pYyA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pbi1jYWxsLWJ0biBlbmQtY2FsbC1idG5cIiBbZGlzYWJsZWRdPVwiZGlzYmFsZUVuZENhbGxCdG5cIiAoY2xpY2spPVwiZW5kQ2FsbCgpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbjwhLS0gQ2FsbCBEaXNjb25uZWN0IE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwiY3VzdG9tLW1vZGFsXCIgKm5nSWY9XCJzaG93RGlzY29ubmVjdE1vZGFsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudCBwLTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtaGVhZGVyIHAtMCBwYi0yXCI+XHJcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cInRpdGxlIG1iLTBcIj57e3NlbGVjdGVkQ29uZj8uY29uTmFtZSB8fCAnQ2FsbCd9fSBEaXNjb25uZWN0PC9oND5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cInNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwMDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0yNTYtMjAwLTU2LTU2IDIyNC0yMjQtMjI0LTIyNCA1Ni01NiAyMjQgMjI0IDIyNC0yMjQgNTYgNTYtMjI0IDIyNCAyMjQgMjI0LTU2IDU2LTIyNC0yMjQtMjI0IDIyNFpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFudC1ib2R5IG1iLTJcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICBFeGl0aW5nIHRoaXMgY2FsbCB3aWxsIG5vdCBlbmQgdGhlIGNvbmZlcmVuY2UuIFRoZSBzZXNzaW9uIHdpbGwgY29udGludWUsIGFuZCBjaGFyZ2VzIHdpbGwgaW5jdXIgdG9cclxuICAgICAgICAgICAgICAgIHlvdXJcclxuICAgICAgICAgICAgICAgIGFjY291bnQuXHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN0YXJ0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMCBtci0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiaXNSZWFzb25DaGVja2VkXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25SZWFzb25DaGVja0NoYW5nZWQoJGV2ZW50KVwiIGNsYXNzPVwibWUtMlwiLz5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItMjRoclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gSG91ciBwaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLXNlbGVjdFwiIFtjbGFzcy5kaXNhYmxlZC1waWNrZXJdPVwiIWlzUmVhc29uQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtZGlzcGxheVwiIChjbGljayk9XCJpc1JlYXNvbkNoZWNrZWQgJiYgdG9nZ2xlSG91ckRyb3Bkb3duKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxlYXZlSG91ciB8fCAnSEgnIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpY2tlci1hcnJvd1wiPiYjOTY2MDs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtb3B0aW9uc1wiICpuZ0lmPVwic2hvd0hvdXJEcm9wZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLW9wdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBoIG9mIGhvdXJzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImxlYXZlSG91ciA9PT0gaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RIb3VyKGgpXCI+e3sgaCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWUtc2VwXCI+Ojwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1pbnV0ZSBwaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLXNlbGVjdFwiIFtjbGFzcy5kaXNhYmxlZC1waWNrZXJdPVwiIWlzUmVhc29uQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtZGlzcGxheVwiIChjbGljayk9XCJpc1JlYXNvbkNoZWNrZWQgJiYgdG9nZ2xlTWludXRlRHJvcGRvd24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGVhdmVNaW51dGUgfHwgJ01NJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaWNrZXItYXJyb3dcIj4mIzk2NjA7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLW9wdGlvbnNcIiAqbmdJZj1cInNob3dNaW51dGVEcm9wZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLW9wdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtIG9mIG1pbnV0ZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwibGVhdmVNaW51dGUgPT09IG1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TWludXRlKG0pXCI+e3sgbSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBlbmQtYnRuXCIgKGNsaWNrKT1cImxlYXZlQ29uZmVyZW5jZSgpXCIgW2Rpc2FibGVkXT1cImlzUmVhc29uQ2hlY2tlZCAmJiAoIWxlYXZlSG91ciB8fCAhbGVhdmVNaW51dGUpXCI+XHJcbiAgICAgICAgICAgICAgICBMZWF2ZVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBlbmQtYnRuXCIgKGNsaWNrKT1cImVuZENvbmZlcmVuY2UoKVwiICpuZ0lmPVwic2hvd0VuZEFsbEJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgICAgRW5kIEFsbFxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cImN1c3RvbS1tb2RhbFwiICpuZ0lmPVwic2hvd0xlYXZlQ29uZmlybWF0aW9uTW9kYWxcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudCB3YXJuaW5nLW1vZGFsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1pY29uXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPmluZm88L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxoMz5MZWF2ZSBDb25mZXJlbmNlPC9oMz5cclxuICAgIDxwPlxyXG4gICAgICBZb3UgYXJlIGFib3V0IHRvIGxlYXZlIDxzdHJvbmc+e3sgbGVhdmVDb25mQ29uZmVyZW5jZU5hbWUgfX08L3N0cm9uZz4uIFxyXG4gICAgICBBcmUgeW91IHN1cmU/XHJcbiAgICA8L3A+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1hY3Rpb25zXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnRuXCIgKGNsaWNrKT1cImNhbmNlbExlYXZlKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInByb2NlZWQtYnRuXCIgKGNsaWNrKT1cImNvbmZpcm1MZWF2ZSgpXCI+TGVhdmU8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|
|
2244
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1wcm9ncmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2NvbXBvbmVudHMvY2FsbC1wcm9ncmVzcy9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFRLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQW1COUMsTUFBTSxPQUFPLHFCQUFxQjtJQTJIaEMsWUFBb0IsZ0JBQWtDLEVBQVUsR0FBc0IsRUFDN0UsYUFBNEIsRUFDM0IsU0FBMkIsRUFDM0IsMEJBQXNEO1FBSDVDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUM3RSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQiwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO1FBMUh2RCx5QkFBb0IsR0FBUSxFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBUSxFQUFFLENBQUM7UUFDdkIsc0JBQWlCLEdBQVEsRUFBRSxDQUFDO1FB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QUFoQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQWtCRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBaUZFLG1CQUFtQjtzQkFBM0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENhbGwsIERldmljZSB9IGZyb20gJ0B0d2lsaW8vdm9pY2Utc2RrJztcclxuaW1wb3J0IHsgRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvZXh0ZW5zaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUd2lsaW9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS90d2lsaW8uc2VydmljZSc7XHJcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50cyc7XHJcbmltcG9ydCBzd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcclxuaW1wb3J0IHsga2V5cGFkIH0gZnJvbSAnLi4vLi4vLi4va2V5cGFkJztcclxuaW1wb3J0IHsgaW50ZXJ2YWwsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBJbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvaW5jb21laW5nLWNhbGwtc29ja2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJcEFkZHJlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9pcC1hZGRyZXNzLnNlcnZpY2UnO1xyXG5pbnRlcmZhY2UgQ2FsbERldGFpbHMge1xyXG4gIGNhbGxTaWQ6IHN0cmluZztcclxuICBjYWxsU3RhdHVzOiBzdHJpbmc7XHJcbn1cclxuaW50ZXJmYWNlIENhbGxTdGF0dXNSZXNwb25zZSB7XHJcbiAgY2FsbERldGFpbHM6IENhbGxEZXRhaWxzO1xyXG4gIHJlc3BvbnNlOiBzdHJpbmc7XHJcbiAgZXJyb3JUeXBlOiBudW1iZXI7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIHN0YXR1czogbnVtYmVyO1xyXG59XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWNhbGwtcHJvZ3Jlc3MnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FsbFByb2dyZXNzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIGNhbGxEYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRDYWxsZXJJZDogYW55O1xyXG4gIEBJbnB1dCgpIG5ld0luY29taW5nQ2FsbERhdGE/OiBDYWxsOyAvL1xyXG4gIEBJbnB1dCgpIG5ld0luY29taW5nQ2FsbHNMaXN0OiBhbnkgPSBbXTtcclxuICBASW5wdXQoKSBjYWxsZXJJZExpc3Q6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIG5ld0NhbGxDb25mZXJlbmNlOiBhbnkgPSB7fTtcclxuICBASW5wdXQoKSBtaXNzQ2FsbEluZm86IGFueSA9IHt9O1xyXG4gIEBJbnB1dCgpIHVzZXJTZXR0aW5nSW5mbzogYW55ID0ge307XHJcbiAgQElucHV0KCkgZGV2aWNlSWQ6IGFueTtcclxuICBASW5wdXQoKSBjYWxsQWN0aW9uOiBhbnk7XHJcbiAgQElucHV0KCkgY29uZmVyZW5jZUNhbGxJbmZvOiBhbnk7XHJcbiAgQElucHV0KCkgaW5jb21pbmdGcm9tSW1hZ2U6c3RyaW5nID0gJydcclxuICB1c2VySWQ6IGFueTtcclxuICBAT3V0cHV0KCkgZW5kQ2FsbEV2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGluY29taW5nQ2FsbHNOZXdJbmZvOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpOy8vXHJcbiAgQE91dHB1dCgpIG1pbmltaXNlRXZlbnQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBkZXZpY2U/OiBEZXZpY2U7XHJcbiAgY2FsbCE6IENhbGwgfCBhbnk7XHJcbiAgc2hvd1JpbmdBbmltYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0aW1lcjogc3RyaW5nID0gJzAwOjAwJztcclxuICBpbnRlcnZhbElkOiBhbnk7XHJcbiAgc2hvd0tleXBhZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGtleXBhZFZhbCA9IGtleXBhZDtcclxuICBjYWxsSW5wdXQ6IHN0cmluZyA9ICcnO1xyXG4gIGlzTXV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHBlbmRpbmdNdXRlVXBkYXRlOiBib29sZWFuID0gZmFsc2U7IFxyXG4gIGludGVuZGVkTXV0ZVN0YXRlOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XHJcbiAgZGlzYmFsZUVuZENhbGxCdG46IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHNob3dDbGVhckJ0bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQ29sbG9wcyA9IGZhbHNlO1xyXG4gIGN1cnJlbnRDYWxsOiBhbnk7XHJcbiAgaXNDb25mZXJlbmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNPdXRnb2luZ0NhbGw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBPdXRwdXQoKSBpbmNvbWluZ0NhbGxJbml0aWF0ZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgaXNMb2FkZXJzaG93bjogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIEBPdXRwdXQoKSBlbmRJbmNvbWluZ0NhbGxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvLyBSZWNvcmRpbmcgdmFyaWFibGVzXHJcbiAgY2FsbFNpZDogYW55O1xyXG4gIGlzUmVjb3JkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNQYXVzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0aW1lclN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcclxuICB0aW1lRWxhcHNlZCA9IDA7IC8vIGluIHNlY29uZHNcclxuICByZWNvcmRDYWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaW5jb21pbmdDYWxsU2lkOiBhbnk7XHJcbiAgY2FsbFN0YXR1czogc3RyaW5nID0gJ3JpbmdpbmcnOyAgICAvL1xyXG4gIGluY29taW5nUmVjb3JkQ2FsbD86IGFueTtcclxuICBzZWxlY3RlZEluY29taW5nQ2FsbDogYW55O1xyXG4gIHNob3dDb250YWN0c1BhbmVsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNBZGRSZW1vdmVQYXJ0aWNpcGFudDogYm9vbGVhbiA9IGZhbHNlOyAgIC8vXHJcbiAgaXNDb25jdXJyZW50SW5jb21pbmc6IGJvb2xlYW4gPSBmYWxzZTsgICAvL1xyXG4gIGhlbGRDYWxsPzogQ2FsbDsgIC8vXHJcbiAgaXNDYWxsT25Ib2xkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY29udGFjdHM6IGFueVtdID0gW107XHJcbiAgY3VycmVudENhbGxMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIGNvbmZlcmVuY2VJZDogYW55O1xyXG4gIGFsbFBhcnRpY2lwZW50TGlzdDogYW55O1xyXG4gIGlzQ2xpY2tFeHBhbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0NhbGxJblByb2dyZXNzITogYm9vbGVhbjtcclxuICBpc0N1cnJlbnRJbmNvbWluZ0NhbGxMaXN0OiBhbnkgPSBbXTtcclxuICBpc0NvbmZlcmVuY2VDYWxsSG9sZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkVXNlckluZm86IGFueTtcclxuICBpc1NlYXJjaFZpc2libGUgPSBmYWxzZTtcclxuICBpc0V4cGFuZGVkID0gZmFsc2U7XHJcbiAgc2VhcmNoVGV4dCA9ICcnO1xyXG4gIGZpbHRlcmVkTGlzdDogYW55ID0gW107XHJcbiAgZmlsdGVyZWRQYXJ0aWNpcGVudExpc3Q6IGFueTtcclxuICBzaG93QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNSaW5naW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNEaXJlY3RDYWxsT3B0aW9uU2hvdzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRpYWxBbGVydCA9IHtcclxuICAgIG1zZzogJycsXHJcbiAgICBzaG93OiBmYWxzZVxyXG4gIH1cclxuICBsZWZ0UGFydGljaXBlbnQ6IGFueSA9IHt9O1xyXG4gIGNvbmZlcmVuY2VDYWxsTGlzdDogYW55W10gPSBbXTtcclxuICBpc0luY29taW5nQ2FsbEJ0bkRpc2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0Nvbm5lY3Rpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBob3N0bnVtYmVyOiBhbnk7XHJcbiAgaXNOZXdBZGRlZENhbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkZXZpY2VOdW1iZXJMaXN0OiBhbnkgPSBbXTtcclxuICBvdXJOdW1iZXJJbmZvOiBhbnkgPSB7fTtcclxuICBjdXJyZW50Q29uZmVyZW5jZUNhbGw6IGFueSA9IHt9O1xyXG4gIGlzUmVhc29uQ2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQWxsQWNjZXB0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBsZWF2ZVJlYXNvbjogc3RyaW5nID0gJyc7XHJcbiAgLy8gMjQtaG91ciB0aW1lIHBpY2tlclxyXG4gIGxlYXZlSG91cjogc3RyaW5nID0gJyc7XHJcbiAgbGVhdmVNaW51dGU6IHN0cmluZyA9ICcnO1xyXG4gIGhvdXJzOiBzdHJpbmdbXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDI0IH0sIChfLCBpKSA9PiBpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSk7XHJcbiAgbWludXRlczogc3RyaW5nW10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiA2MCB9LCAoXywgaSkgPT4gaS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpO1xyXG4gIHNob3dIb3VyRHJvcGRvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93TWludXRlRHJvcGRvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzZWxlY3RlZENvbmY6IGFueTtcclxuICBzaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHBlbmRpbmdDYWxsRGF0YTogYW55ID0gbnVsbDtcclxuICBjYWxsTnVtYmVyVG9hc3QgPSB7XHJcbiAgICBzaG93OiBmYWxzZSxcclxuICAgIHR5cGU6ICdhbGVydC1zdWNjZXNzJyxcclxuICAgIG51bWJlcjogJycsXHJcbiAgICBkaXNwbGF5TnVtOiAnJ1xyXG4gIH07XHJcbiAgaXNVbmhvbGRDb25mZXJlbmNlQ2FsbDogYW55OyAgLy9cclxuICBjb25mZXJlbmNlQ2FsbE51bGxDb3VudDogbnVtYmVyID0gMDtcclxuICBhbGxDb25QYXJ0aWNpcGVudExpc3Q6IGFueSA9IHt9O1xyXG4gIGNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3Q6IGFueTtcclxuICBwcml2YXRlIGFjY2VwdGVkQ2FsbExpc3Q6IGFueVtdID0gW107XHJcbiAgaXNIb2xkQnRuRGlzYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEMyQ29uZm9MaXN0OiBhbnkgPSB7fTtcclxuICBwcml2YXRlIGxhc3RBY3RpdmVDb25mZXJlbmNlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcGVuZGluZ0F1dG9VbmhvbGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzZWxlY3RlZENvbmZOYW1lOiBhbnk7XHJcbiAgcGVuZGluZ011dGVQYXJ0aWNpcGFudHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xyXG4gIGludGVuZGVkTXV0ZVN0YXRlczogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XHJcbiAgc2hvd05ld0NhbGxMb2FkZXI6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gIG5ld0NhbGxMb2FkZXJEYXRhOiB7IG5hbWU6IHN0cmluZzsgcGhvbmU6IHN0cmluZywgaW1nPzogc3RyaW5nIH0gPSB7IG5hbWU6ICcnLCBwaG9uZTogJycsIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIH07XHJcbiAgQElucHV0KCkgb3V0Z29pbmdDb250YWN0TmFtZSA9ICcnO1xyXG4gIHNob3dMZWF2ZUNvbmZpcm1hdGlvbk1vZGFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbGVhdmVDb25mUGFydGljaXBhbnQ6IGFueSA9IG51bGw7XHJcbiAgbGVhdmVDb25mQ29uZmVyZW5jZU5hbWU6IHN0cmluZyA9ICcnO1xyXG4gIGlzUGFydGljaXBhbnRQYW5lbExvYWRpbmcgPSBmYWxzZTtcclxuICBpc0Nvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZDogYW55O1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXh0ZW5zaW9uU2VydmljZTogRXh0ZW5zaW9uU2VydmljZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHVibGljIHR3aWxpb1NlcnZpY2U6IFR3aWxpb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGlwU2VydmljZTogSXBBZGRyZXNzU2VydmljZSxcclxuICAgIHByaXZhdGUgaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2U6IEluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmNhbGwgPSB0aGlzLnR3aWxpb1NlcnZpY2UuY2FsbDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gU3Vic2NyaWJlIHRvIGluY29taW5nIGNhbGxzIGZyb20gVHdpbGlvU2VydmljZVxyXG4gICAgIHRoaXMuR2V0Q29udGFjdHNMaXN0KCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZCkge1xyXG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdWJzY3JpYmluZyB0byBpbmNvbWluZyBjYWxsczonLCBlKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGV2aWNlTnVtYmVyTGlzdCA9IHRoaXMuY2FsbGVySWRMaXN0Lm1hcCgocmVzOiBhbnkpID0+IHJlcy5udW1iZXIpO1xyXG4gICBcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLnVzZXJJZCkge1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UudXNlcklkID0gdGhpcy51c2VySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ2NhbGxEYXRhJ10pIHtcclxuICAgICAgaWYgKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5pc0luY29taW5nQ2FsbCkge1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZGlzcGxheU51bSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZnJvbSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7XHJcbiAgICAgICAgICAuLi5jaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZSxcclxuICAgICAgICAgIGlkOiAnMTI1JyxcclxuICAgICAgICAgIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXHJcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IGZhbHNlLFxyXG4gICAgICAgICAgaXNBY2NlcHRDYWxsOiB0cnVlLFxyXG4gICAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICAgIHBob25lOiBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8ucGhvbmUsXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiAnMTIxJyxcclxuICAgICAgICAgIG5hbWU6IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5uYW1lIHx8IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5mcm9tTmFtZSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8udG9OYW1lIHx8ICcnLFxyXG4gICAgICAgICAgdGltZTogdGhpcy50aW1lcixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMub25BZGROZXdDYWxsKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10/LmN1cnJlbnRWYWx1ZT8ubGVuZ3RoIHx8IGNoYW5nZXNbJ25ld0luY29taW5nQ2FsbHNMaXN0J10/LnByZXZpb3VzVmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmlzUGFydGljaXBhbnRQYW5lbExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIGlmICghdGhpcy5kZXZpY2VOdW1iZXJMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuZGV2aWNlTnVtYmVyTGlzdCA9IHRoaXMuY2FsbGVySWRMaXN0Lm1hcCgocmVzOiBhbnkpID0+IHJlcy5udW1iZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmxvZygnbmV3SW5jb21pbmdDYWxsc0xpc3QnLCB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0KTtcclxuICAgICAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZvckVhY2goKGNhbGxJbmZvOiBhbnksIGk6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb25mZXJlbmNlSWQgPSBpID09IDAgPyB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0W2ldLmNvbmZlcmVuY2VJZCA6IHRoaXMuY29uZmVyZW5jZUlkO1xyXG4gICAgICAgICAgbGV0IG91ck51bWJlckluZm8gPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0W2ldPy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHJlc0RhdGE/LmNsaWVudCkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiAoIXJlc0RhdGE/LmJ1c2luZXNzTnVtYmVyIHx8IChyZXNEYXRhPy5idXNpbmVzc051bWJlciAmJiBjYWxsSW5mbz8ucGFydGljaXBhbnRzPy5sZW5ndGggPT0gMSkpKSkgJiYgIXJlc0RhdGE/LmlzTGVmdFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmdNdXRlVXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNNdXRlID0gIW91ck51bWJlckluZm8/LmlzSG9sZCA/IG91ck51bWJlckluZm8/LmlzTXV0ZSA6IHRoaXMuaXNNdXRlO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChvdXJOdW1iZXJJbmZvPy5pc011dGUgPT09IHRoaXMuaW50ZW5kZWRNdXRlU3RhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5pc011dGUgPSBvdXJOdW1iZXJJbmZvPy5pc011dGU7XHJcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ011dGVVcGRhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvL3RoaXMuaXNNdXRlID0gIW91ck51bWJlckluZm8/LmlzSG9sZCA/IG91ck51bWJlckluZm8/LmlzTXV0ZSA6IHRoaXMuaXNNdXRlO1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRjYWxsUGFydGljaXBhbnRMaXN0SUQgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKHJlcyk9PiByZXMuY29uZmVyZW5jZUlkID09IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0/LmNvbmZlcmVuY2VJZCkubWFwKChyZXMpPT4gcmVzLnBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgbGV0IHVwZGF0ZWRMaXN0ID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maWx0ZXIoKGNvbmY6IGFueSkgPT4gY29uZi5jb25mZXJlbmNlSWQgPT09IGNhbGxJbmZvLmNvbmZlcmVuY2VJZCkuZmxhdE1hcCgoY29uZjogYW55KSA9PiBjb25mLnBhcnRpY2lwYW50cy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCkpO1xyXG4gICAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdFtpXS5wYXJ0aWNpcGFudHMubWFwKChyZXM6YW55KSA9PiByZXMuaWQpO1xyXG4gICAgICAgICAgY3VycmVudGNhbGxQYXJ0aWNpcGFudExpc3RJRC5mb3JFYWNoKChwYXJ0aWNpcGFudElkOmFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZighdXBkYXRlZExpc3QuaW5jbHVkZXMocGFydGljaXBhbnRJZCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigocmVzSW5mbzphbnkpID0+IHJlc0luZm8/LnBhcnRpY2lwYW50SWQgIT09IHBhcnRpY2lwYW50SWQgfHwgKHJlc0luZm8/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgIXJlc0luZm8/LmlzQWNjZXB0Q2FsbCkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBpZiAob3VyTnVtYmVySW5mbz8uaWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVkUGFydGljaXBhbnRMaXN0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0/LnBhcnRpY2lwYW50cyk7XHJcbiAgICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0ucGFydGljaXBhbnRzLmZvckVhY2goYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlcz8uaG9zdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0bnVtYmVyID0gcmVzO1xyXG4gICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgaWYob3VyTnVtYmVySW5mbz8uaXNDb25mZXJlbmNlIHx8ICh0aGlzLmhvc3RudW1iZXI/LmlzQ29uZmVyZW5jZSAmJiB0aGlzLmhvc3RudW1iZXI/LmNvbmZlcmVuY2VJZCA9PSByZXM/LmNvbmZlcmVuY2VJZCkgfHwgY2FsbEluZm8/LnBhcnRpY2lwYW50cz8ubGVuZ3RoID4gMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBjb250YWN0OiBhbnkgPSB7fVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGFjdHM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICBjb250YWN0ID0gdGhpcy5jb250YWN0cy5maW5kKChyZXNEYXRhKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc0RhdGE/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgPT0gKHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy5mcm9tIDogcmVzPy50bylcclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtPy5pZCA9PSByZXM/LmlkKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xICYmICFyZXMuaXNMZWZ0ICYmIHJlcz8uc3RhdHVzICE9ICduby1hbnN3ZXInICYmIHJlcz8uc3RhdHVzICE9ICdjYW5jZWxlZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgIC4uLnJlcyxcclxuICAgICAgICAgICAgICAgICAgICAgIGZyb21OYW1lOiB0aGlzLmdldE5hbWUocmVzPy5mcm9tKSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHRvTmFtZTogIHRoaXMuZ2V0TmFtZShyZXM/LnRvKSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGltZzogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyAocmVzPy5mcm9tSW1hZ2UgfHwgcmVzPy5pbWcpICA6IHJlcz8udG9JbWFnZSB8fCBjb250YWN0Py5pbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0hvbGQ6IHJlcz8uaXNIb2xkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlSG9sZDogdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoID4gMSA/IG91ck51bWJlckluZm8/LmlzSG9sZCA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNOb3RpZmljYXRpb246IGNhbGxJbmZvPy5faXNOb3RpZmljYXRpb24gJiYgIXRoaXMuZ2V0U3RhdHVzKHJlcykgJiYgcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc011dGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlOiB0aGlzLmlzQ29uZmVyZW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwaG9uZTogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbExhYmVsOiBjYWxsSW5mbz8uY2FsbExhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogcmVzPy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VTaWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlU2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcz8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93Q29udGFjdHNQYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIXRoaXMudGltZXIgfHwgdGhpcy50aW1lciA9PSAnMDA6MDAnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lcihvdXJOdW1iZXJJbmZvPy5qb2luZWRBdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ICE9IC0xICYmIChyZXM/LmlzTGVmdCB8fCByZXM/LnN0YXR1cyA9PSAnbm8tYW5zd2VyJyB8fCByZXM/LnN0YXR1cyA9PSAnY2FuY2VsZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0/LmlkID09IHRoaXMuY3VycmVudENhbGw/LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93Q29udGFjdHNQYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jdXJyZW50Q2FsbD8uam9pbmVkQXQpO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ICE9IC0xICYmICFyZXM/LmlzTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cocmVzKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0aWNpcGFudElkID0gcmVzLmlkO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBhIG11dGUgdXBkYXRlIGlzIHBlbmRpbmcgZm9yIHRoaXMgcGFydGljaXBhbnRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc011dGVQZW5kaW5nID0gdGhpcy5wZW5kaW5nTXV0ZVBhcnRpY2lwYW50cy5oYXMocGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZW5kZWRNdXRlID0gdGhpcy5pbnRlbmRlZE11dGVTdGF0ZXMuZ2V0KHBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkTXV0ZTogYm9vbGVhbjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNNdXRlUGVuZGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlcnZlciBhbHJlYWR5IGNvbmZpcm1lZCBvdXIgY2hhbmdlLCBhY2NlcHQgaXQgYW5kIGNsZWFyIHBlbmRpbmdcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuaXNNdXRlID09PSBpbnRlbmRlZE11dGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZE11dGUgPSByZXMuaXNNdXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdNdXRlUGFydGljaXBhbnRzLmRlbGV0ZShwYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZXMuZGVsZXRlKHBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBrZWVwIHRoZSBjdXJyZW50IGxvY2FsIHZhbHVlIChpZ25vcmUgdGhlIHN0YWxlIHNlcnZlciBzdGF0ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZE11dGUgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0uaXNNdXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBObyBwZW5kaW5nIG11dGUg4oCTIHRydXN0IHRoZSBzZXJ2ZXIgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRNdXRlID0gcmVzLmlzTXV0ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbU5hbWU6IHRoaXMuZ2V0TmFtZShyZXM/LmZyb20pIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdG9OYW1lOiAgdGhpcy5nZXROYW1lKHJlcz8udG8pIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaW1nOiByZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IChyZXM/LmZyb21JbWFnZSB8fCByZXM/LmltZykgOiByZXM/LnRvSW1hZ2UgfHwgY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNIb2xkOiByZXM/LmlzSG9sZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZUhvbGQ6IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCA+IDEgPyBvdXJOdW1iZXJJbmZvPy5pc0hvbGQgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzTm90aWZpY2F0aW9uOiBjYWxsSW5mbz8uX2lzTm90aWZpY2F0aW9uICYmICF0aGlzLmdldFN0YXR1cyhyZXMpICYmIHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNNdXRlOiB1cGRhdGVkTXV0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZTogdGhpcy5pc0NvbmZlcmVuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwaG9uZTogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogcmVzPy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VTaWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlU2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbExhYmVsOiBjYWxsSW5mbz8uY2FsbExhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcz8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXMuaXNMZWZ0ICYmIHJlcz8uc3RhdHVzICE9ICduby1hbnN3ZXInICYmIHJlcz8uc3RhdHVzICE9ICdjYW5jZWxlZCcpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb21OYW1lOiB0aGlzLmdldE5hbWUocmVzPy5mcm9tKSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICB0b05hbWU6ICB0aGlzLmdldE5hbWUocmVzPy50bykgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1nOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gKHJlcz8uZnJvbUltYWdlIHx8IHJlcz8uaW1nKSA6IHJlcz8udG9JbWFnZSB8fCBjb250YWN0Py5pbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNIb2xkOiByZXM/LmlzSG9sZCxcclxuICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2VIb2xkOiB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGggPiAxID8gb3VyTnVtYmVySW5mbz8uaXNIb2xkIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNOb3RpZmljYXRpb246IGNhbGxJbmZvPy5faXNOb3RpZmljYXRpb24gJiYgIXRoaXMuZ2V0U3RhdHVzKHJlcykgJiYgcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNNdXRlOiByZXM/LmlzTXV0ZSxcclxuICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6IHRoaXMuaXNDb25mZXJlbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHRoaXMuZ2V0U3RhdHVzKHJlcykgOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcGhvbmU6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHJlcy5pZCxcclxuICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlU2lkOiBjYWxsSW5mbz8uY29uZmVyZW5jZVNpZCxcclxuICAgICAgICAgICAgICAgICAgICBjYWxsTGFiZWw6IGNhbGxJbmZvPy5jYWxsTGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXM/LmpvaW5lZEF0IHx8IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSksXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyID0gJzAwOjAwJztcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKHJlcz8uam9pbmVkQXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsTnVsbENvdW50ID0gMDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY29uZmVyZW5jZUNhbGxOdWxsQ291bnQgPiA1KSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NhbGwgZW5kIGluIDI5OScpXHJcbiAgICAgICAgICAgIHRoaXMuaXNSaW5naW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25jdXJyZW50SW5jb21pbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gTm8gY2FsbCBpbiBwcm9ncmVzczogcmVzZXQgdGhlIGluY29taW5nLW11dGUgc3dpdGNoIGJhY2sgdG8gZGVmYXVsdCAob2ZmKS5cclxuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLnNldEluY29taW5nTXV0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHt9XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNSaW5naW5nKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbE51bGxDb3VudCsrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLy8gUmVtb3ZlIHBhcnRpY2lwYW50IGRhdGEgZm9yIGNvbmZlcmVuY2VzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgYWN0aXZlIGxpc3RcclxuICAgICAgICBjb25zdCBhY3RpdmVDb25mZXJlbmNlSWRzID0gbmV3IFNldCh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Lm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmNvbmZlcmVuY2VJZCkpO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29uZklkIG9mIE9iamVjdC5rZXlzKHRoaXMuYWxsQ29uUGFydGljaXBlbnRMaXN0KSkge1xyXG4gICAgICAgICAgaWYgKCFhY3RpdmVDb25mZXJlbmNlSWRzLmhhcyhjb25mSWQpKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFsbENvblBhcnRpY2lwZW50TGlzdFtjb25mSWRdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdmFsaWRWYWx1ZXMgPSBuZXcgU2V0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmxhdE1hcCgoaXRlbTogYW55KSA9PiBpdGVtPy5wYXJ0aWNpcGFudHMubWFwKCh2YWw6IGFueSkgPT4gdmFsPy5pZCkpKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiB2YWxpZFZhbHVlcy5oYXMoaXRlbT8ucGFydGljaXBhbnRJZCkpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Q2FsbDphbnkgPSBbXTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmluZCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gaXRlbT8ucGFydGljaXBhbnRzPy5maW5kKChwYXJ0aWNpcGFudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py5mcm9tKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiBwYXJ0aWNpcGFudD8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcGFydGljaXBhbnQ/LmNsaWVudCkpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0ICYmICFwYXJ0aWNpcGFudD8uaXNIb2xkICYmICFwYXJ0aWNpcGFudD8uYnVzaW5lc3NOdW1iZXIpIHtcclxuICAgICAgICAgICAgICBjdXJyZW50Q2FsbC5wdXNoKHBhcnRpY2lwYW50KTtcclxuICAgICAgICAgICAgICB0aGlzLnRpbWVyID0gdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShwYXJ0aWNpcGFudD8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihwYXJ0aWNpcGFudD8uaG9zdCkge1xyXG4gICAgICAgICAgICAgIGl0ZW1bJ3RpbWVyJ10gPSB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHBhcnRpY2lwYW50Py5qb2luZWRBdCB8fCBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8uZnJvbSkgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgJiYgcGFydGljaXBhbnQ/LmNsaWVudCkgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8udG8pICYmIHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmIHBhcnRpY2lwYW50Py5jbGllbnQpKSAmJiAhcGFydGljaXBhbnQ/LmlzTGVmdCAmJiAhcGFydGljaXBhbnQ/LmlzSG9sZCAmJiAhcGFydGljaXBhbnQ/LmJ1c2luZXNzTnVtYmVyXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIERldGVjdCBkaXNjb25uZWN0IHZzLiBob2xkIHRyYW5zaXRpb24gZXhhY3RseSBvbmNlIHBlciBldmVudC5cclxuICAgICAgICAvLyBTYW1lIHBhcnRpY2lwYW50IGZpbHRlciBhcyBnZXRDdXJyZW50Q2FsbEluZm8oKSAod2l0aG91dCAhaXNIb2xkKSB0byBzdGF5IGNvbnNpc3RlbnQuXHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCAmJiAhY3VycmVudENhbGxbMF0/LmlzSG9sZCkge1xyXG4gICAgICAgICAgdGhpcy5sYXN0QWN0aXZlQ29uZmVyZW5jZUlkID0gdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGwuY29uZmVyZW5jZUlkO1xyXG4gICAgICAgICAgdGhpcy5wZW5kaW5nQXV0b1VuaG9sZCA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYXN0QWN0aXZlQ29uZmVyZW5jZUlkICYmICF0aGlzLnBlbmRpbmdBdXRvVW5ob2xkKSB7XHJcbiAgICAgICAgICBjb25zdCBsYXN0Q29uZiA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmluZCgoYzogYW55KSA9PiBjLmNvbmZlcmVuY2VJZCA9PSB0aGlzLmxhc3RBY3RpdmVDb25mZXJlbmNlSWQpO1xyXG4gICAgICAgICAgY29uc3Qgb3VyUGFydGljaXBhbnRJbkxhc3RDb25mID0gbGFzdENvbmY/LnBhcnRpY2lwYW50cz8uZmluZCgocDogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwPy5mcm9tKSAmJiBwPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHA/LmNsaWVudCkgfHxcclxuICAgICAgICAgICAgICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocD8udG8pICYmIHA/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcD8uY2xpZW50ICYmICFwPy5idXNpbmVzc051bWJlcikpICYmICFwPy5pc0xlZnRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICAvLyBDb25mZXJlbmNlIGdvbmUgT1Igb3VyIHBhcnRpY2lwYW50IG5vdCBoZWxkIOKGkiB0aGUgYWN0aXZlIGNhbGwgZGlzY29ubmVjdGVkIOKGkiBxdWV1ZSBhdXRvLXVuaG9sZFxyXG4gICAgICAgICAgaWYgKCFsYXN0Q29uZiB8fCAhb3VyUGFydGljaXBhbnRJbkxhc3RDb25mPy5pc0hvbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQXV0b1VuaG9sZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50cy5sZW5ndGggPT0gMiAmJiB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzWzBdPy5pZCkge1xyXG4gICAgICAgICAgY29uc3Qgb3duTnVtYmVycyA9IHRoaXMuZGV2aWNlTnVtYmVyTGlzdCAmJiB0aGlzLmRldmljZU51bWJlckxpc3QubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICA/IHRoaXMuZGV2aWNlTnVtYmVyTGlzdFxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgICBjb25zdCBjYWxsZXJOdW1iZXIgPSB0aGlzLmNhbGxEYXRhPy5mcm9tIHx8IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcz8uaXNDb25mZXJlbmNlSG9sZCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKG93bk51bWJlcnMpIHtcclxuICAgICAgICAgICAgICAvLyBPcmlnaW5hbCBsb2dpYyDigJMgd29ya3Mgd2hlbiB0aGUgY2FsbGVy4oCRSUQgbGlzdCBpcyBsb2FkZWRcclxuICAgICAgICAgICAgICByZXR1cm4gKHJlcz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiByZXM/LmNsaWVudCAmJiAhb3duTnVtYmVycy5pbmNsdWRlcyhyZXM/LmZyb20pKSB8fFxyXG4gICAgICAgICAgICAgICAgKHJlcz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiByZXM/LmNsaWVudCAmJiAhb3duTnVtYmVycy5pbmNsdWRlcyhyZXM/LnRvKSAmJiAhcmVzPy5idXNpbmVzc051bWJlcikgfHxcclxuICAgICAgICAgICAgICAgICghcmVzPy5jbGllbnQgJiYgcmVzPy5pc0FjY2VwdENhbGwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIFNhZmUgZmFsbGJhY2s6IGV4Y2x1ZGUgdGhlIHBhcnRpY2lwYW50IHdob3NlIG51bWJlciBtYXRjaGVzIHRoZSBjYWxsZXIgSUQgd2UgdXNlZFxyXG4gICAgICAgICAgICAgIGNvbnN0IGlzT3duID0gKHJlcz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiByZXM/LmZyb20gPT09IGNhbGxlck51bWJlcikgfHxcclxuICAgICAgICAgICAgICAgIChyZXM/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcmVzPy50byA9PT0gY2FsbGVyTnVtYmVyICYmICFyZXM/LmJ1c2luZXNzTnVtYmVyKTtcclxuICAgICAgICAgICAgICByZXR1cm4gIWlzT3duO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHsgLi4uc2VsZWN0ZWQsIGlzQWNjZXB0Q2FsbDogdHJ1ZSB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAgZWxzZSBpZiAodGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50cz8ubGVuZ3RoID4gMiAmJiB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzWzFdPy5pc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gIXJlcz8uaXNDb25mZXJlbmNlSG9sZCk7XHJcbiAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmKHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHM/Lmxlbmd0aCA9PSAxICYmIHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHNbMF0/LmlkKXtcclxuICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChjYWxsSW5mbzphbnkpPT4gY2FsbEluZm8/LmlkID09IHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5wYXJ0aWNpcGFudHNbMF0/LmlkKTtcclxuICAgICAgICAgIGlmKHRoaXMuY3VycmVudENhbGw/LmNsaWVudCAmJiB0aGlzLmN1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxbJ2NsaWVudCddPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbFsnaXNBY2NlcHRDYWxsJ109IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuY3VycmVudENhbGwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZighdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGwgJiZ0aGlzLmN1cnJlbnRDYWxsICYmIHRoaXMuY3VycmVudENhbGxMaXN0Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IHJlcz8uaWQgPT0gdGhpcy5jdXJyZW50Q2FsbD8uaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsICYmICF0aGlzLmlzTmV3QWRkZWRDYWxsKSB7XHJcbiAgICAgICAgICBsZXQgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbyA9IHRoaXMuZ2V0Q3VycmVudENhbGxJbmZvKCk7XHJcbiAgICAgICAgICBpZiAoIWN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmlkICYmIHRoaXMucGVuZGluZ0F1dG9VbmhvbGQpIHtcclxuICAgICAgICAgICAgLy8gU2VhcmNoIEFMTCBjb25mZXJlbmNlcyBleGNlcHQgdGhlIG9uZSB0aGF0IGp1c3QgZGlzY29ubmVjdGVkLlxyXG4gICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgc2luZ2xlLWNvbmZlcmVuY2UgaG9sZCAoaW5jbHVkaW5nIGJyaWVmIGlzTGVmdCByYWNlIGNvbmRpdGlvbnMpXHJcbiAgICAgICAgICAgIC8vIGZyb20gZXZlciB0cmlnZ2VyaW5nIGFuIHVuaG9sZCDigJQgd2Ugb25seSB1bmhvbGQgYSBESUZGRVJFTlQgaGVsZCBjb25mZXJlbmNlLlxyXG4gICAgICAgICAgICBsZXQgaG9sZENhbGxJbmZvOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbmYgb2YgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCkge1xyXG4gICAgICAgICAgICAgIGlmIChjb25mLmNvbmZlcmVuY2VJZCA9PSB0aGlzLmxhc3RBY3RpdmVDb25mZXJlbmNlSWQpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgIGhvbGRDYWxsSW5mbyA9IGNvbmYucGFydGljaXBhbnRzLmZpbmQoKGNhbGxJbmZvOiBhbnkpID0+ICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGNhbGxJbmZvPy5mcm9tKSAmJiBjYWxsSW5mbz8uY2xpZW50KVxyXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjYWxsSW5mbz8udG8pICYmIGNhbGxJbmZvPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSkgJiYgIWNhbGxJbmZvPy5pc0xlZnQgJiYgY2FsbEluZm8/LmlzSG9sZCAmJiAhY2FsbEluZm8/LmJ1c2luZXNzTnVtYmVyKTtcclxuICAgICAgICAgICAgICBpZiAoaG9sZENhbGxJbmZvKSBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaG9sZENhbGxJbmZvPy5pZCAmJiAhdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2hvbGRDYWxsSW5mbz8uaWRdLFxyXG4gICAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBob2xkQ2FsbEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgbXV0ZTogaG9sZENhbGxJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDM4NycsIGhvbGRJbmZvKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSBob2xkQ2FsbEluZm8/LmNvbmZlcmVuY2VJZDtcclxuICAgICAgICAgICAgICB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdBdXRvVW5ob2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5sYXN0QWN0aXZlQ29uZmVyZW5jZUlkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgICAgICBsZXQgc2VsZWN0ZWRVc2VyID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtPy5pZCA9PSB0aGlzLnNlbGVjdGVkVXNlckluZm8/LnBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgICAgaWYgKHNlbGVjdGVkVXNlcikge1xyXG4gICAgICAgICAgICBzZWxlY3RlZFVzZXIuSXNVc2VySW5mb1Nob3cgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZihzZWxlY3RlZFVzZXIuYnVzaW5lc3NOdW1iZXIgPT0gdHJ1ZSAmJiAhc2VsZWN0ZWRVc2VyLnVzZXJJbmZvSWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUMyQ0luZm9QYW5lbChzZWxlY3RlZFVzZXIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHNlbGVjdGVkVXNlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGluY29taW5nQ2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbT8uYnVzaW5lc3NOdW1iZXIpO1xyXG4gICAgICAgICAgICBpZiAoaW5jb21pbmdDYWxsPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gaW5jb21pbmdDYWxsO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzQ2xpY2tFeHBhbmQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHt9O1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCByZXNJbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiAhIWl0ZW0/LmJ1c2luZXNzTnVtYmVyICYmIHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhpdGVtPy50bykpO1xyXG4gICAgICAgICAgaWYgKHJlc0luZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3RbcmVzSW5kZXhdWydJc1VzZXJJbmZvU2hvdyddID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbcmVzSW5kZXhdO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5pc0FsbEFjY2VwdGVkID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZXZlcnkoKGNhbGw6IGFueSkgPT4gY2FsbD8uaXNBY2NlcHRDYWxsKVxyXG4gICAgICAgIGNvbnN0IHVuaXF1ZUxpc3QgPSBbXHJcbiAgICAgICAgICAuLi5uZXcgTWFwKHRoaXMuY3VycmVudENhbGxMaXN0Lm1hcChpdGVtID0+IFtpdGVtLmNvbmZlcmVuY2VJZCwgaXRlbV0pKS52YWx1ZXMoKVxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0ID0gdW5pcXVlTGlzdC5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbExpc3QuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgcGFydGljaXBhbnRMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IHJlcz8uY29uZmVyZW5jZUlkID09IGl0ZW0/LmNvbmZlcmVuY2VJZCAmJiByZXM/LmJ1c2luZXNzTnVtYmVyICYmICFyZXM/Lmhvc3QpO1xyXG4gICAgICAgICAgaWYocGFydGljaXBhbnRMaXN0Py5pZCkge1xyXG4gICAgICAgICAgICBpdGVtWydpc0J1c2luZXNzTnVtYmVyJ10gPSBwYXJ0aWNpcGFudExpc3Q/LmJ1c2luZXNzTnVtYmVyO1xyXG4gICAgICAgICAgICBpdGVtWydidXNpbmVzc1BhcnRpY2lwYW50SWQnXSA9IHBhcnRpY2lwYW50TGlzdD8ucGFydGljaXBhbnRJZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTsgXHJcbiAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbE51bGxDb3VudCA9IDA7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICBpZih0aGlzLmNvbmZlcmVuY2VDYWxsTnVsbENvdW50ID4gNSl7XHJcbiAgICAgICAgY29uc29sZS5sb2coJzQxMScpXHJcbiAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYodGhpcy5jYWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7fVxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBpZiAodGhpcy5pc1JpbmdpbmcpIHtcclxuICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgLy8gTm8gY2FsbCBpbiBwcm9ncmVzczogcmVzZXQgdGhlIGluY29taW5nLW11dGUgc3dpdGNoIGJhY2sgdG8gZGVmYXVsdCAob2ZmKS5cclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2Uuc2V0SW5jb21pbmdNdXRlZChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbE51bGxDb3VudCArPTE7XHJcbiAgICAgICAgLy8gdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ2NhbGxBY3Rpb24nXT8uY3VycmVudFZhbHVlICYmIHRoaXMuY2FsbEFjdGlvbj8udHlwZSA9PSAncmVKb2luJykge1xyXG4gICAgICB0aGlzLmRldmljZU51bWJlckxpc3QgPSB0aGlzLmNhbGxlcklkTGlzdC5tYXAoKHJlczogYW55KSA9PiByZXMubnVtYmVyKTtcclxuICAgICAgbGV0IGRhdGEgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbT8uY29uZmVyZW5jZUlkID09IHRoaXMuY2FsbEFjdGlvbj8uY29uZmVyZW5jZUlkKT8ucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT4gcmVzRGF0YT8uaG9zdCk7XHJcbiAgICAgIGlmKGRhdGE/LmlzTGVmdCB8fCAhZGF0YSkge1xyXG4gICAgICAgIHRoaXMucmVqb2luSG9zdCh0aGlzLmNhbGxBY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snbmV3Q2FsbENvbmZlcmVuY2UnXT8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuQ2FsbFRvVW5zYXZlZE51bWJlcih0aGlzLm5ld0NhbGxDb25mZXJlbmNlPy5udW1iZXIsIHRydWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWpvaW5Ib3N0KGNhbGxJbmZvOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIGxldCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvID0gdGhpcy5nZXRDdXJyZW50Q2FsbEluZm8oKTtcclxuICAgICAgICBpZiAoY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uaWQpIHtcclxuICAgICAgICAgIGxldCBob2xkSW5mbzogYW55ID0gdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2N1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gMzg3JywgaG9sZEluZm8pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHJlam9pblBhcnRpY2lwZW50SW5mbyA9IGNhbGxJbmZvPy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSlcclxuICAgICAgICAgICYmIHJlc0RhdGE/LmNsaWVudCAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnKSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LnRvKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmICFyZXNEYXRhPy5idXNpbmVzc051bWJlciAmJiByZXNEYXRhPy5ob3N0KSAmJiByZXNEYXRhPy5pc0xlZnQpXHJcbiAgICAgIClcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IHRydWU7XHJcbiAgICAgIC8vIDHvuI/ig6MgR2V0IG5ldyB0b2tlbiBmb3Igc2FtZSBjb25mZXJlbmNlXHJcbiAgICAgIGNvbnN0IHRva2VuRGF0YTogYW55ID0gYXdhaXQgdGhpcy5nZXRPdXRnb2luZ0NhbGxUb2tlbihjYWxsSW5mbz8uY29uZmVyZW5jZUlkKTtcclxuICAgICAgLy8gMu+4j+KDoyBSZWNvbm5lY3QgZGV2aWNlXHJcbiAgICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcclxuICAgICAgICBjb2RlY1ByZWZlcmVuY2VzOiBbJ29wdXMnLCAncGNtdSddLFxyXG4gICAgICAgIGNsb3NlUHJvdGVjdGlvbjogdHJ1ZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5kZXZpY2UgPSBuZXcgRGV2aWNlKHRva2VuRGF0YS50b2tlbi52YWx1ZSwgb3B0aW9ucyk7XHJcblxyXG4gICAgICB0aGlzLmNhbGwgPSBhd2FpdCB0aGlzLmRldmljZS5jb25uZWN0KHtcclxuICAgICAgICBwYXJhbXM6IHtcclxuICAgICAgICAgIEZyb206IHJlam9pblBhcnRpY2lwZW50SW5mby5mcm9tLFxyXG4gICAgICAgICAgVG86IHJlam9pblBhcnRpY2lwZW50SW5mby50byxcclxuICAgICAgICAgIEVudjogZW52aXJvbm1lbnQuYWJiLFxyXG4gICAgICAgICAgVG9rZW46IHRva2VuRGF0YS50b2tlbi5pZCxcclxuICAgICAgICAgIEV4dDogcmVqb2luUGFydGljaXBlbnRJbmZvLmV4dE51bSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogcmVqb2luUGFydGljaXBlbnRJbmZvPy5jb25mZXJlbmNlSWRcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJ0Y0NvbnN0cmFpbnRzOiB7IGF1ZGlvOiB7IGRldmljZUlkOiAnZGVmYXVsdCcgfSB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudHdpbGlvU2VydmljZS5jYWxsID0gdGhpcy5jYWxsO1xyXG4gICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgYWRkQ2xpZW50UGFydGljaXBhbnRSZXMgPSB0aGlzLmFkZENsaWVudFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgICBmcm9tOiByZWpvaW5QYXJ0aWNpcGVudEluZm8uZnJvbSxcclxuICAgICAgICAgICAgICByb3V0ZTogXCJPVVRHT0lOR1wiLFxyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiByZWpvaW5QYXJ0aWNpcGVudEluZm8/LnRvLFxyXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogcmVqb2luUGFydGljaXBlbnRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICAgICAgcHJveHk6ICcnLFxyXG4gICAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgICBjbGllbnRTaWQ6IHRoaXMuY2FsbD8ucGFyYW1ldGVyc1snQ2FsbFNpZCddLFxyXG4gICAgICAgICAgICAgIHJlY29yZElkOiByZWpvaW5QYXJ0aWNpcGVudEluZm8/LmlkXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSByZWpvaW5QYXJ0aWNpcGVudEluZm8/LmNvbmZlcmVuY2VJZDtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBhZGRDbGllbnRQYXJ0aWNpcGFudDonLCBlcnJvcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTAwMCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdSZWpvaW4gZmFpbGVkJywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWFwVXNlckluZm8ocGFydGljaXBhbnRJbmZvOiBhbnksIGNhbGxlckluZm86IGFueSkge1xyXG4gICAgcGFydGljaXBhbnRJbmZvWydlbWFpbCddID0gY2FsbGVySW5mby5lbWFpbDtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWyduYW1lJ10gPSBjYWxsZXJJbmZvLm5hbWU7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1snaW1hZ2UnXSA9IGNhbGxlckluZm8uaW1hZ2U7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1snZXh0ZW5zaW9uJ10gPSBjYWxsZXJJbmZvLmV4dGVuc2lvbjtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWyd1c2VySW5mb0lkJ10gPSBjYWxsZXJJbmZvLmlkO1xyXG4gICAgICBwYXJ0aWNpcGFudEluZm9bJ21lc3NhZ2UnXSA9IGNhbGxlckluZm8ubWVzc2FnZTtcclxuICAgICAgcGFydGljaXBhbnRJbmZvIFsnbm90ZSddID0gY2FsbGVySW5mby5ub3RlO1xyXG4gICAgICBwYXJ0aWNpcGFudEluZm9bJ251bWJlciddID0gY2FsbGVySW5mby5udW1iZXI7XHJcbiAgICAgIHBhcnRpY2lwYW50SW5mb1sncG9pbnROYW1lJ10gPSBjYWxsZXJJbmZvLnBvaW50TmFtZTtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWydzb2Z0cGhvbmVUd2lsaW9BdXRoSWQnXSA9IGNhbGxlckluZm8uc29mdHBob25lVHdpbGlvQXV0aElkO1xyXG4gICAgICBwYXJ0aWNpcGFudEluZm9bJ3NvdXJjZU5hbWUnXSA9IGNhbGxlckluZm8uc291cmNlTmFtZTtcclxuICAgICAgcGFydGljaXBhbnRJbmZvWydzdWJqZWN0J10gPSBjYWxsZXJJbmZvLnN1YmplY3Q7XHJcbiAgICAgIHJldHVybiB7Li4ucGFydGljaXBhbnRJbmZvfTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZWRQYXJ0aWNpcGFudExpc3QocGFydGljaXBhbnQ6YW55KSB7XHJcbiAgICBpZihwYXJ0aWNpcGFudD8ubGVuZ3RoKXtcclxuICAgICAgdGhpcy5hbGxDb25QYXJ0aWNpcGVudExpc3RbcGFydGljaXBhbnRbMF0/LmNvbmZlcmVuY2VJZF0gPSBwYXJ0aWNpcGFudDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmFsbENvblBhcnRpY2lwZW50TGlzdFtwYXJ0aWNpcGFudFswXT8uY29uZmVyZW5jZUlkXTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCAmJiAhIXRoaXMuYWxsQ29uUGFydGljaXBlbnRMaXN0Py5bdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0XT8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMucGFydGljaXBhbnRMaXN0SW5kbyh0aGlzLmFsbENvblBhcnRpY2lwZW50TGlzdFt0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3RdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5jb25mZXJlbmNlSWQ7XHJcbiAgICAgIHRoaXMucGFydGljaXBhbnRMaXN0SW5kbygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcGFydGljaXBhbnRMaXN0SW5kbyhwYXJ0aWNpcGFudHM/OiBhbnkpIHtcclxuICAgIGlmICghcGFydGljaXBhbnRzPy5sZW5ndGgpIHtcclxuICAgICAgaWYgKHRoaXMuYWxsUGFydGljaXBlbnRMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgcGFydGljaXBhbnRzLm1hcChhc3luYyAocDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZnJvbU5hbWUgPSBhd2FpdCB0aGlzLmdldE5hbWUocC5mcm9tKTtcclxuICAgICAgICBjb25zdCB0b05hbWUgPSBhd2FpdCB0aGlzLmdldE5hbWUocC50byk7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ucCwgZnJvbU5hbWU6IGZyb21OYW1lIHx8IHAuZnJvbU5hbWUsIHRvTmFtZTogdG9OYW1lIHx8IHAudG9OYW1lIH07XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIEJ1aWxkIGEgbG9va3VwIG1hcCBmcm9tIHRoZSBjdXJyZW50IHJlbmRlcmVkIGxpc3Qgc28gd2UgY2FuIHJldXNlIHRoZSBzYW1lXHJcbiAgICAvLyBvYmplY3QgcmVmZXJlbmNlIGZvciBwYXJ0aWNpcGFudHMgd2hvc2UgZGF0YSBoYXNuJ3QgY2hhbmdlZC5cclxuICAgIC8vIEFuZ3VsYXIncyAqbmdGb3IgdXNlcyBvYmplY3QgaWRlbnRpdHkgKD09PSkgdG8gZGVjaWRlIHdoZXRoZXIgdG8gcmUtcmVuZGVyIGEgcm93O1xyXG4gICAgLy8ga2VlcGluZyB0aGUgc2FtZSByZWZlcmVuY2UgcHJldmVudHMgRE9NIGRlc3RydWN0aW9uL3JlY3JlYXRpb24gYW5kIGVsaW1pbmF0ZXMgZmxpY2tlcmluZy5cclxuICAgIGNvbnN0IGV4aXN0aW5nTWFwID0gbmV3IE1hcDxhbnksIGFueT4oXHJcbiAgICAgICh0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCB8fCBbXSkubWFwKChwOiBhbnkpID0+IFtwLmlkLCBwXSlcclxuICAgICk7XHJcblxyXG4gICAgbGV0IGFueUNoYW5nZSA9IHJlc29sdmVkLmxlbmd0aCAhPT0gKHRoaXMuYWxsUGFydGljaXBlbnRMaXN0Py5sZW5ndGggfHwgMCk7XHJcblxyXG4gICAgY29uc3QgbWVyZ2VkOiBhbnlbXSA9IHJlc29sdmVkLm1hcCgobmV3UDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gZXhpc3RpbmdNYXAuZ2V0KG5ld1AuaWQpO1xyXG4gICAgICBpZiAoIWV4aXN0aW5nKSB7XHJcbiAgICAgICAgYW55Q2hhbmdlID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gbmV3UDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaXNNdXRlUGVuZGluZyA9IHRoaXMucGVuZGluZ011dGVQYXJ0aWNpcGFudHMuaGFzKG5ld1AuaWQpO1xyXG4gICAgICBjb25zdCBpbnRlbmRlZE11dGUgPSB0aGlzLmludGVuZGVkTXV0ZVN0YXRlcy5nZXQobmV3UC5pZCk7XHJcbiAgICAgIGlmIChpc011dGVQZW5kaW5nICYmIGludGVuZGVkTXV0ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKG5ld1AuaXNNdXRlID09PSBpbnRlbmRlZE11dGUpIHtcclxuICAgICAgICAgIHRoaXMucGVuZGluZ011dGVQYXJ0aWNpcGFudHMuZGVsZXRlKG5ld1AuaWQpO1xyXG4gICAgICAgICAgdGhpcy5pbnRlbmRlZE11dGVTdGF0ZXMuZGVsZXRlKG5ld1AuaWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXdQID0geyAuLi5uZXdQLCBpc011dGU6IGV4aXN0aW5nLmlzTXV0ZSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgY2hhbmdlZCA9IE9iamVjdC5rZXlzKG5ld1ApLnNvbWUoayA9PiBleGlzdGluZ1trXSAhPT0gbmV3UFtrXSk7XHJcbiAgICAgIGlmIChjaGFuZ2VkKSB7XHJcbiAgICAgICAgYW55Q2hhbmdlID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4geyAuLi5leGlzdGluZywgLi4ubmV3UCB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBleGlzdGluZztcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChhbnlDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbmZOYW1lID0gdGhpcy5jb25mZXJlbmNlQ2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IHJlcz8uY29uZmVyZW5jZUlkID09IHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCk/LmNhbGxMYWJlbCB8fCAnJztcclxuICAgICAgdGhpcy5hbGxQYXJ0aWNpcGVudExpc3QgPSBtZXJnZWQ7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSBbLi4ubWVyZ2VkXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dDYWxsaW5nVG9hc3QobnVtYmVyOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY2FsbE51bWJlclRvYXN0ID0ge1xyXG4gICAgICBzaG93OiB0cnVlLFxyXG4gICAgICB0eXBlOiAnYWxlcnQtc3VjY2VzcycsXHJcbiAgICAgIG51bWJlcjogbnVtYmVyLFxyXG4gICAgICBkaXNwbGF5TnVtOiBudW1iZXJcclxuICAgIH07XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2FsbE51bWJlclRvYXN0LnNob3cgPSBmYWxzZTtcclxuICAgIH0sIDcwMDApO1xyXG4gIH1cclxuICBnZXRTdGF0dXMocmVzOiBhbnkpIHtcclxuICAgIGlmIChyZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIikge1xyXG4gICAgICByZXR1cm4gcmVzPy5jYWxsU3RhdHVzID09IFwicGFydGljaXBhbnQtam9pblwiIHx8IHJlcz8uY2FsbFN0YXR1cyA9PSBcInBhcnRpY2lwYW50LW11dGVcIiB8fCByZXM/LmNhbGxTdGF0dXMgPT0gXCJwYXJ0aWNpcGFudC1ob2xkXCIgfHwgcmVzPy5jYWxsU3RhdHVzID09ICdjb25uZWN0ZWQnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmKHJlcz8uZGlyZWN0aW9uID09IFwib3V0Z29pbmctY2FsbFwiKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gJ2Fuc3dlcmVkJyAmJiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBHZXRDb250YWN0c0xpc3QoKSB7XHJcbiAgICBjb25zdCB0b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB8fCAnJztcclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5yZWFkQ29udGFjdHModG9rZW4pLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMucGhvbmVCb29rKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gcmVzLnBob25lQm9vaztcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gcmVzLnBob25lQm9vaztcclxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xyXG4gICAgICAgICAgdGhpcy5jb250YWN0cyA9IHJlcztcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gcmVzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gW107XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjb250YWN0czonLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5jb250YWN0cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGFkZFJlczogYW55O1xyXG4gIGFzeW5jIHN0YXJ0Q2FsbChjYWxsRGF0YTogYW55LCBpc05ld0NvbmZlcmVuY2U/OiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICghdGhpcy5jdXJyZW50Q2FsbExpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5zZXRJbmNvbWluZ011dGVkKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gdHJ1ZTtcclxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgICBjaGFubmVsSWQ6IGVudmlyb25tZW50LmNoYW5uZWxJZCxcclxuICAgICAgICB1c2VySWQ6IHRoaXMudXNlcklkIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VySWQnKSxcclxuICAgICAgICB0bzogY2FsbERhdGEucGhvbmUsXHJcbiAgICAgICAgZnJvbU51bWJlcjogY2FsbERhdGEuZnJvbSxcclxuICAgICAgICBzY29wZTogJ2xvY2FsJyxcclxuICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICBmaXJzdG5hbWU6IG51bGwsXHJcbiAgICAgICAgbGFzdG5hbWU6IG51bGwsXHJcbiAgICAgICAgY291bnRyeWNvZGU6IG51bGwsXHJcbiAgICAgICAgbnVtYmVyOiBudWxsLFxyXG4gICAgICAgIG51bW90cDogbnVsbCxcclxuICAgICAgICBleHRlbnNpb246IG51bGwsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7XHJcbiAgICAgICAgYnVzaW5lc3NOdW1iZXI6IGZhbHNlLFxyXG4gICAgICAgIGNhbGxTaWQ6ICcnLFxyXG4gICAgICAgIGNhbGxTdGF0dXM6ICcnLFxyXG4gICAgICAgIGNvbmZlcmVuY2VJZDogJycsXHJcbiAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICBkaXJlY3Rpb246ICdvdXRnb2luZy1jYWxsJyxcclxuICAgICAgICBmb3J3YXJkZWRUbzogJycsXHJcbiAgICAgICAgZnJvbTogY2FsbERhdGEuZnJvbSxcclxuICAgICAgICBpZDogJ3l5dWdnaGpiJyxcclxuICAgICAgICBpbWc6IGNhbGxEYXRhLmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXHJcbiAgICAgICAgaXNBY2NlcHRDYWxsOiB0cnVlLFxyXG4gICAgICAgIGlzQ29uZmVyZW5jZTogZmFsc2UsXHJcbiAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgaXNMZWZ0OiBmYWxzZSxcclxuICAgICAgICBpc011dGU6IGZhbHNlLFxyXG4gICAgICAgIGpvaW5lZEF0OiAnJyxcclxuICAgICAgICBuYW1lOiBjYWxsRGF0YT8ubmFtZSB8fCAnJyxcclxuICAgICAgICBwYXJ0aWNpcGFudElkOiAnJyxcclxuICAgICAgICBwaG9uZTogY2FsbERhdGE/LnBob25lIHx8ICcnLFxyXG4gICAgICAgIHJvbGU6ICdjYWxsZWUnLFxyXG4gICAgICAgIHN0YXR1czogJycsXHJcbiAgICAgICAgdGltZTogJycsXHJcbiAgICAgICAgdG86IGNhbGxEYXRhPy5waG9uZSB8fCAnJyxcclxuICAgICAgICB0b05hbWU6IGNhbGxEYXRhPy5uYW1lIHx8ICcnLFxyXG4gICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgY2FsbERhdGE/LnVzZXJJZFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmluaXRpYXRlQ2FsbChwYXlsb2FkKTtcclxuICAgICAgdGhpcy5jb25mZXJlbmNlSWQgPSByZXNwb25zZT8uY2FsbGF1dGg/LmlkO1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkge1xyXG4gICAgICAgIGNvbnN0IHsgaWQ6IGNhbGxBdXRoSWQsIHJlY29yZENhbGwsICB0b2tlbkRhdGF9ID0gYXdhaXQgdGhpcy5nZXRDYWxsQXV0aElkKHJlc3BvbnNlKTtcclxuICAgICAgICB0aGlzLnJlY29yZENhbGwgPSByZWNvcmRDYWxsOyAvLyBTdG9yZSB0aGUgcmVjb3JkQ2FsbCB2YWx1ZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdFRvRGV2aWNlKGNhbGxBdXRoSWQsIGNhbGxEYXRhLCB0b2tlbkRhdGEpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucG9sbENhbGxTdGF0dXMoY2FsbEF1dGhJZCk7XHJcbiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgYWRkQ2xpZW50UGFydGljaXBhbnRSZXMgPSB0aGlzLmFkZENsaWVudFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgICBmcm9tOiBjYWxsRGF0YT8uZnJvbSxcclxuICAgICAgICAgICAgICByb3V0ZTogXCJPVVRHT0lOR1wiLFxyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBjYWxsRGF0YT8ucGhvbmUsXHJcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiByZXNwb25zZT8uY2FsbGF1dGg/LmlkLFxyXG4gICAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgICAgY2xpZW50U2lkOiB0aGlzLmNhbGw/LnBhcmFtZXRlcnNbJ0NhbGxTaWQnXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5hZGRSZXMgPSBhd2FpdCB0aGlzLmFkZFBhcnRpY2lwYW50VG9DYWxsKHtcclxuICAgICAgICAgICAgICBmcm9tOiBjYWxsRGF0YT8uZnJvbSxcclxuICAgICAgICAgICAgICByb3V0ZTogXCJPVVRHT0lOR1wiLFxyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBjYWxsRGF0YT8ucGhvbmUsXHJcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiByZXNwb25zZT8uY2FsbGF1dGg/LmlkLFxyXG4gICAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgICAgICAgIHByb3h5OiAnJyxcclxuICAgICAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZihpc05ld0NvbmZlcmVuY2UpIHtcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSByZXNwb25zZT8uY2FsbGF1dGg/LmlkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmlzTmV3QWRkZWRDYWxsID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmlzTG9hZGVyc2hvdy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5pc0xvYWRlcnNob3duLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSByZXNwb25zZT8uY2FsbGF1dGg/LmlkO1xyXG4gICAgICAgICAgICAvLyBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyhyZXNwb25zZT8uY2FsbGF1dGg/LmlkKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWRkaW5nIGluaXRpYWwgcGFydGljaXBhbnQ6JywgZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTUwMClcclxuICAgICAgICAvLyBQb2xsIHRoZSBzdGF0dXMgZm9yIDMwLTQ1IHNlY29uZHNcclxuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMjAxKSB7XHJcbiAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmlzTG9hZGVyc2hvdy5uZXh0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLmlzTG9hZGVyc2hvd24uZW1pdChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgIHN3YWwoXCJFcnJvclwiLCByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnIvPlwiKSwgXCJlcnJvclwiKTtcclxuICAgICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbk11dGVVc2VyKGM6IGFueSkge1xyXG4gICAgY29uc3QgcGFydGljaXBhbnRJZCA9IGMuaWQ7XHJcbiAgICBjb25zdCBuZXdNdXRlU3RhdGUgPSAhYy5pc011dGU7XHJcblxyXG4gICAgXHJcbiAgICB0aGlzLnBlbmRpbmdNdXRlUGFydGljaXBhbnRzLmFkZChwYXJ0aWNpcGFudElkKTtcclxuICAgIHRoaXMuaW50ZW5kZWRNdXRlU3RhdGVzLnNldChwYXJ0aWNpcGFudElkLCBuZXdNdXRlU3RhdGUpO1xyXG5cclxuICAgIGMuaXNNdXRlID0gbmV3TXV0ZVN0YXRlO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5vbk11dGVQYXJ0aWNpcGFudCh7XHJcbiAgICAgIHBhcnRpY2lwYW50SWQ6IFtwYXJ0aWNpcGFudElkXSxcclxuICAgICAgY29uZmVyZW5jZUlkOiBjPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgIGhvbGQ6IGMuaXNIb2xkLFxyXG4gICAgICBtdXRlOiBuZXdNdXRlU3RhdGVcclxuICAgIH0pO1xyXG5cclxuICAgIC8vcmVtb3ZlIHBlbmRpbmcgZ3VhcmQgYWZ0ZXIgNSBzZWNvbmRzIGlmIG5vIGNvbmZpcm1hdGlvblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdNdXRlUGFydGljaXBhbnRzLmhhcyhwYXJ0aWNpcGFudElkKSkge1xyXG4gICAgICAgIHRoaXMucGVuZGluZ011dGVQYXJ0aWNpcGFudHMuZGVsZXRlKHBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgIHRoaXMuaW50ZW5kZWRNdXRlU3RhdGVzLmRlbGV0ZShwYXJ0aWNpcGFudElkKTtcclxuICAgICAgfVxyXG4gICAgfSwgNTAwMCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkhvbGRDYWxsKGM6IGFueSkge1xyXG4gICAgdGhpcy5pc0hvbGRCdG5EaXNhYmxlID0gdHJ1ZTtcclxuICAgIGlmKCgoYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyAmJiB0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoYz8uZnJvbSkpIHx8IChjPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmIHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjPy50bykpKSAmJiBjPy5jbGllbnQgJiYgIWM/LmJ1c2luZXNzTnVtYmVyKSB7XHJcbiAgICAgIGxldCB1bkhvbGRJbmZvOiBhbnkgPSB7fTtcclxuICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5mb3JFYWNoKGFzeW5jIChjYWxsOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICBpZiAoY2FsbD8uY29uZmVyZW5jZUlkID09IGM/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICAgICAgbGV0IHBhcnRpY2lwYW50SW5mbyA9IGNhbGwucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT5cclxuICAgICAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgIXJlc0RhdGE/LmJ1c2luZXNzTnVtYmVyKSkgJiYgIXJlc0RhdGE/LmlzTGVmdCAmJiByZXNEYXRhPy5jbGllbnRcclxuICAgICAgICAgIClcclxuICAgICAgICAgIGlmIChwYXJ0aWNpcGFudEluZm8/LmlkICkge1xyXG4gICAgICAgICAgICBsZXQgaG9sZEluZm86IGFueSA9IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW3BhcnRpY2lwYW50SW5mbz8uaWRdLFxyXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogcGFydGljaXBhbnRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgaG9sZDogIXBhcnRpY2lwYW50SW5mbz8uaXNIb2xkLFxyXG4gICAgICAgICAgICAgIG11dGU6IHBhcnRpY2lwYW50SW5mbz8ubXV0ZSB8fCBmYWxzZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDc4OCcsIGhvbGRJbmZvKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHVuSG9sZEluZm8gPSBhd2FpdCBjYWxsLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgICAgICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LmZyb20pKSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LnRvKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmICFyZXNEYXRhPy5idXNpbmVzc051bWJlcikpICYmICFyZXNEYXRhPy5pc0xlZnQgJiYgcmVzRGF0YT8uaXNIb2xkICE9PSBjPy5pc0hvbGQgJiYgcmVzRGF0YT8uY2xpZW50XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGluZGV4ID09IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCAtMSkge1xyXG4gICAgICAgICAgaWYgKHVuSG9sZEluZm8/LmlkICYmIHVuSG9sZEluZm8/LmlzSG9sZCAhPSBjPy5pc0hvbGQpIHtcclxuICAgICAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFt1bkhvbGRJbmZvPy5pZF0sXHJcbiAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB1bkhvbGRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgaG9sZDogIXVuSG9sZEluZm8/LmlzSG9sZCxcclxuICAgICAgICAgICAgICBtdXRlOiB1bkhvbGRJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZihob2xkSW5mbz8uc3RhdHVzICE9IDIwMCkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDgwNScsIGhvbGRJbmZvKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuaXNIb2xkQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc0hvbGRCdG5EaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBob2xkSW5mbzogYW55ID0gdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICBwYXJ0aWNpcGFudElkOiBbYy5pZF0sXHJcbiAgICAgICAgY29uZmVyZW5jZUlkOiBjPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgaG9sZDogIWMuaXNIb2xkLFxyXG4gICAgICAgIG11dGU6IGM/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gODE5JywgaG9sZEluZm8pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pc0hvbGRCdG5EaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgIGMuaXNIb2xkID0gIWMuaXNIb2xkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5jb25mZXJlbmNlQ2FsbElERm9yUGFydGljaXBhbnRMaXN0ID0gYz8uY29uZmVyZW5jZUlkO1xyXG4gICAgLy8gYXdhaXQgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHMoYz8uY29uZmVyZW5jZUlkKTtcclxuICB9XHJcbiAgYXN5bmMgb25FbmRDYWxsKGM6IGFueSwgaXNBbGxDYWxsRW5kPzogYm9vbGVhbiwgaXNDb250ZWN0PzogYm9vbGVhbikge1xyXG4gICAgbGV0IHBhcnRpY2lwYW50SWQgPSBpc0FsbENhbGxFbmQgPyAnYWxsJyA6IGMucGFydGljaXBhbnRJZCB8fCBjPy5pZDtcclxuICAgIGNvbnN0IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8gPSB0aGlzLmdldEN1cnJlbnRDYWxsSW5mbygpO1xyXG4gICAgY29uc3QgcGFydGljaXBhbnRMaXN0ID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChjYWxsSW5mbzphbnkpID0+IGNhbGxJbmZvPy5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKS5wYXJ0aWNpcGFudHMuZmlsdGVyKChyZXNEYXRhOiBhbnkpID0+ICFyZXNEYXRhPy5pc0xlZnQpO1xyXG4gICAgaWYocGFydGljaXBhbnRMaXN0Py5sZW5ndGggPD0gMiAmJiAhaXNDb250ZWN0KSB7XHJcbiAgICAgIHBhcnRpY2lwYW50SWQgPSAnYWxsJztcclxuICAgIH1cclxuICAgIGxldCBjb25mZXJlbmNlSWQgPSBjLmNvbmZlcmVuY2VJZCB8fCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5jb25mZXJlbmNlSWQ7XHJcbiAgICBsZXQgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLmdldFJlbW92ZVBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudElkLCBjb25mZXJlbmNlSWQpO1xyXG4gICAgaWYgKHJlcz8uc3RhdHVzID09IDIwMSAmJiByZXM/Lm1lc3NhZ2UgPT0gJ3BhcnRpY2lwYW50IGFscmVhZHkgbGVmdCcpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignUGFydGljaXBhbnQgYWxyZWFkeSBsZWZ0JywgcmVzKTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSBlbHNlIGlmIChyZXM/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVtb3ZpbmcgcGFydGljaXBhbnQnLCByZXMpO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSBjb25mZXJlbmNlSWQ7XHJcbiAgICAvLyBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQpO1xyXG4gICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgLy8gdGhpcy5lbmRJbmNvbWluZ0NhbGxFdmVudC5lbWl0KGMpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGluaXRpYXRlQ2FsbChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaW5pdGlhdGVDYWxsKHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaG9sZFBhcnRpY2lwYW50KHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBhZGRQYXJ0aWNpcGFudFRvQ2FsbChwYXlsb2FkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuYWRkUGFydGljaXBhbnQocGF5bG9hZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENsaWVudFBhcnRpY2lwYW50KHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5hZGRDbGllbnRQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25NdXRlUGFydGljaXBhbnQocGF5bG9hZDogYW55KSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLm9uTXV0ZVBhcnRpY2lwYW50KHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRSZW1vdmVQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZDogYW55LCBjb25mZXJlbmNlSWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRSZW1vdmVQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZCwgY29uZmVyZW5jZUlkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2FsbEF1dGhJZChyZXNwb25zZTogYW55KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogcmVzcG9uc2UuY2FsbGF1dGguaWQsXHJcbiAgICAgIHJlY29yZENhbGw6IHJlc3BvbnNlLmNhbGxhdXRoLnJlY29yZENhbGwsXHJcbiAgICAgIHRva2VuRGF0YTogcmVzcG9uc2UuY2FsbGF1dGgudG9rZW5cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldE91dGdvaW5nQ2FsbFRva2VuKGNhbGxBdXRoSWQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDb25mZXJlbmNlQ2FsbFRva2VuKHsgYXV0aElkOiBjYWxsQXV0aElkIH0pLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0VG9EZXZpY2UodG9rZW46IGFueSwgY2FsbERhdGE6IGFueSwgdG9rZW5EYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcclxuICAgICAgY29kZWNQcmVmZXJlbmNlczogWydvcHVzJywgJ3BjbXUnXSxcclxuICAgICAgY2xvc2VQcm90ZWN0aW9uOiB0cnVlLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmRldmljZSA9IG5ldyBEZXZpY2UodG9rZW5EYXRhLCBvcHRpb25zKTtcclxuICAgIHRoaXMuY2FsbCA9IGF3YWl0IHRoaXMuZGV2aWNlLmNvbm5lY3Qoe1xyXG4gICAgICBwYXJhbXM6IHtcclxuICAgICAgICBGcm9tOiBjYWxsRGF0YS5mcm9tLFxyXG4gICAgICAgIFRvOiBjYWxsRGF0YS5waG9uZSxcclxuICAgICAgICBFbnY6IGVudmlyb25tZW50LmFiYixcclxuICAgICAgICBUb2tlbjogdG9rZW4sXHJcbiAgICAgICAgRXh0OiBjYWxsRGF0YS5leHROdW1cclxuICAgICAgfSxcclxuICAgICAgcnRjQ29uc3RyYWludHM6IHsgYXVkaW86IHRydWUgfSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy50d2lsaW9TZXJ2aWNlLmNhbGwgPSB0aGlzLmNhbGw7XHJcbiAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBFdmVudExpc3RlbmVycygpIHtcclxuICAgIHRoaXMuc3RhcnRUaW1lcigpO1xyXG4gICAgdGhpcy5kZXZpY2U/Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbignZXJyb3InLCAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdkaXNjb25uZWN0JywgKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygndGVzdC1kaXNjb25uZWN0JylcclxuICAgICAgY29uc29sZS5sb2coJzgzMicpXHJcbiAgICAgIC8vIENsZWFuIHVwIHRoaXMgY2FsbCBmcm9tIGFjY2VwdGVkQ2FsbExpc3RzIHNvIGRldmljZSByZS1pbml0IGd1YXJkIHJlc2V0c1xyXG4gICAgICBjb25zdCBkaXNjb25uZWN0ZWRTaWQgPSB0aGlzLmNhbGw/LnBhcmFtZXRlcnM/LkNhbGxTaWQ7XHJcbiAgICAgIGlmIChkaXNjb25uZWN0ZWRTaWQpIHtcclxuICAgICAgICB0aGlzLmFjY2VwdGVkQ2FsbExpc3QgPSB0aGlzLmFjY2VwdGVkQ2FsbExpc3QuZmlsdGVyKGMgPT4gYy5jYWxsU2lkICE9PSBkaXNjb25uZWN0ZWRTaWQpO1xyXG4gICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5hY2NlcHRlZENhbGxMaXN0ID0gdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3QuZmlsdGVyKFxyXG4gICAgICAgICAgKGM6IGFueSkgPT4gYy5wYXJhbWV0ZXJzPy5DYWxsU2lkICE9PSBkaXNjb25uZWN0ZWRTaWRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHRoaXMuY2FsbD8uZGlzY29ubmVjdCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbigncmluZ2luZycsICgpID0+IHtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ3JlamVjdCcsICgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ3Rlc3Q1JylcclxuICAgICAgdGhpcy5lbmRDYWxsKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdhY2NlcHQnLCAoKSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvd05ld0NhbGxMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgfSwgMjAwMCk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZGlzYmFsZUVuZENhbGxCdG4gPSBmYWxzZTtcclxuICAgICAgLy8gRW5zdXJlIHRoZSBhY3RpdmUgb3V0Z29pbmcgY2FsbCBpcyBtYXJrZWQgYXMgYWNjZXB0ZWQgc28gdGhlIFVJIHN3aXRjaGVzIHRvIHRoZSBjb25uZWN0ZWQgdmlld1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB1cGRhdGluZyBhY2NlcHQgc3RhdGU6JywgZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jYWxsPy5vbignbWVzc2FnZVJlY2VpdmVkJywgKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0VGltZXIoam9pbkF0Pzogc3RyaW5nKSB7XHJcbiAgICBpZiAoIWpvaW5BdCkgcmV0dXJuO1xyXG5cclxuICBjb25zdCBqb2luVGltZSA9IG5ldyBEYXRlKGpvaW5BdCkuZ2V0VGltZSgpIHx8IDA7XHJcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICBsZXQgc2Vjb25kcyA9IE1hdGguZmxvb3IoKG5vdyAtIGpvaW5UaW1lKSAvIDEwMDApO1xyXG4gICAgaWYgKHNlY29uZHMgPCAwKSB7XHJcbiAgICAgIHNlY29uZHMgPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBzZWNvbmRzKys7XHJcbiAgICAgIC8vIHRoaXMudGltZXIgPSB0aGlzLmZvcm1hdFRpbWUoc2Vjb25kcyk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0sIDEwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdG9wVGltZXIoKSB7XHJcbiAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7XHJcbiAgICB0aGlzLnRpbWVyID0gJzAwOjAwJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0VGltZSh0b3RhbFNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDM2MDApO1xyXG4gIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKCh0b3RhbFNlY29uZHMgJSAzNjAwKSAvIDYwKTtcclxuICBjb25zdCBzZWNvbmRzID0gdG90YWxTZWNvbmRzICUgNjA7XHJcbiAgaWYgKGhvdXJzID4gMCkge1xyXG4gICAgcmV0dXJuIGAke3RoaXMucGFkKGhvdXJzKX06JHt0aGlzLnBhZChtaW51dGVzKX06JHt0aGlzLnBhZChzZWNvbmRzKX1gO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5wYWQobWludXRlcyl9OiR7dGhpcy5wYWQoc2Vjb25kcyl9YDtcclxuICB9XHJcbn1cclxuXHJcbiAgcHJpdmF0ZSBwYWQodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdmFsdWUgPCAxMCA/IGAwJHt2YWx1ZX1gIDogYCR7dmFsdWV9YDtcclxuICB9XHJcbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihlcnJvcjogYW55KSB7XHJcbiAgICBzd2FsKFwiRXJyb3JcIiwgZXJyb3IsIFwiZXJyb3JcIik7XHJcbiAgfVxyXG5cclxuICBlbmRDb25mZXJlbmVjZUNhbGwoY29uZj86IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmYgPSBjb25mO1xyXG4gICAgLy8gdGhpcy5pc1VuaG9sZENvbmZlcmVuY2VDYWxsID0gdHJ1ZTtcclxuICAgIGxldCBjb25mZXJlbmNlID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8uZmluZCgocmVzOiBhbnkpID0+IHJlcz8uY29uZmVyZW5jZUlkID09IGNvbmY/LmNvbmZlcmVuY2VJZCk7XHJcbiAgICBsZXQgaG9zdE51bWJlciA9IGNvbmZlcmVuY2U/LnBhcnRpY2lwYW50cz8uZmluZCgocGFydGljaXBhbnQ6IGFueSkgPT4gcGFydGljaXBhbnQ/Lmhvc3QgJiYgIXBhcnRpY2lwYW50Py5idXNpbmVzc051bWJlcik7XHJcbiAgICBpZiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhob3N0TnVtYmVyPy5mcm9tKSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGhvc3ROdW1iZXI/LnRvKSAmJiBob3N0TnVtYmVyPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmIGhvc3ROdW1iZXI/Lmhvc3QpKSAmJiBjb25mZXJlbmNlPy5wYXJ0aWNpcGFudHMuZmlsdGVyKChwOiBhbnkpID0+ICFwLmlzTGVmdCkubGVuZ3RoID4gMikge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29uZiA9IGhvc3ROdW1iZXI7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25mWydjb25OYW1lJ10gPSB0aGlzLmNvbmZlcmVuY2VDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gcmVzPy5jb25mZXJlbmNlSWQgPT0gY29uZj8uY29uZmVyZW5jZUlkKT8uY2FsbExhYmVsIHx8ICcnO1xyXG4gICAgICB0aGlzLm9uQ2FsbERpc2Nvbm5lY3RlZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGNvbmY/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICAgIGxldCBwYXJ0aWNpcGVudEluZm8gPSBjb25mZXJlbmNlPy5wYXJ0aWNpcGFudHM/LmZpbmQoKHBhcnRpY2lwYW50OiBhbnkpID0+ICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py5mcm9tKVxyXG4gICAgICAgICAgJiYgcGFydGljaXBhbnQ/LmNsaWVudCAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJykgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8udG8pICYmIHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmICFwYXJ0aWNpcGFudD8uYnVzaW5lc3NOdW1iZXIpICYmICFwYXJ0aWNpcGFudD8uYnVzaW5lc3NOdW1iZXIpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0KVxyXG4gICAgICAgIGlmIChwYXJ0aWNpcGVudEluZm8/LmlkKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5pc0luTXVsdGlwbGVDb25mZXJlbmNlcygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGVhdmVDb25mUGFydGljaXBhbnQgPSBwYXJ0aWNpcGVudEluZm87XHJcbiAgICAgICAgICAgIHRoaXMubGVhdmVDb25mQ29uZmVyZW5jZU5hbWUgPSB0aGlzLmNvbmZlcmVuY2VDYWxsTGlzdC5maW5kKFxyXG4gICAgICAgICAgICAgIChjOiBhbnkpID0+IGMuY29uZmVyZW5jZUlkID09PSBjb25mZXJlbmNlPy5jb25mZXJlbmNlSWRcclxuICAgICAgICAgICAgKT8uY2FsbExhYmVsIHx8ICdDb25mZXJlbmNlJztcclxuICAgICAgICAgICAgdGhpcy5zaG93TGVhdmVDb25maXJtYXRpb25Nb2RhbCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMub25FbmRDYWxsKHBhcnRpY2lwZW50SW5mbylcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5lbmRDYWxsKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGVuZENhbGwoaXNBbGxDYWxsRW5kPzogYm9vbGVhbikge1xyXG4gICAgLy8gdGhpcy5pc0NvbmZlcmVuY2UgPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgIGlmIChpc0FsbENhbGxFbmQpIHtcclxuICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgICAgdGhpcy5vbkVuZENhbGwoe30sIGlzQWxsQ2FsbEVuZCk7XHJcbiAgICAgIGlmICghdGhpcy5jdXJyZW50Q2FsbExpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKDg5NilcclxuICAgICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRQYXJ0aWNpcGFudCA9IHRoaXMuZ2V0Q3VycmVudENhbGxJbmZvKCk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAodGhpcy5pc0luTXVsdGlwbGVDb25mZXJlbmNlcygpICYmIGN1cnJlbnRQYXJ0aWNpcGFudCkge1xyXG4gICAgICAgIHRoaXMubGVhdmVDb25mUGFydGljaXBhbnQgPSBjdXJyZW50UGFydGljaXBhbnQ7XHJcbiAgICAgICAgdGhpcy5sZWF2ZUNvbmZDb25mZXJlbmNlTmFtZSA9IHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0LmZpbmQoXHJcbiAgICAgICAgICAoYzogYW55KSA9PiBjLmNvbmZlcmVuY2VJZCA9PT0gY3VycmVudFBhcnRpY2lwYW50LmNvbmZlcmVuY2VJZFxyXG4gICAgICAgICk/LmNhbGxMYWJlbCB8fCAnQ3VycmVudCBDYWxsJztcclxuICAgICAgICB0aGlzLnNob3dMZWF2ZUNvbmZpcm1hdGlvbk1vZGFsID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm47IFxyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLm9uRW5kQ2FsbChjdXJyZW50UGFydGljaXBhbnQsIGlzQWxsQ2FsbEVuZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgYXN5bmMgdG9nZ2xlTXV0ZShpc0NvbmZlcmVuY2U/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmlzTXV0ZSA9ICF0aGlzLmlzTXV0ZTtcclxuICAgIHRoaXMucGVuZGluZ011dGVVcGRhdGUgPSB0cnVlOyBcclxuICAgIHRoaXMuaW50ZW5kZWRNdXRlU3RhdGUgPSB0aGlzLmlzTXV0ZTtcclxuICAgIHRoaXMuY2FsbD8ubXV0ZSh0aGlzLmlzTXV0ZSk7XHJcbiAgICBjb25zdCBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvID0gdGhpcy5nZXRDdXJyZW50Q2FsbEluZm8oKTtcclxuICAgIHRoaXMub25NdXRlUGFydGljaXBhbnQoe1xyXG4gICAgICBwYXJ0aWNpcGFudElkOiBbY3VycmVudENvbmZlcmVuY2VDYWxsSW5mby5wYXJ0aWNpcGFudElkIHx8IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmlkXSxcclxuICAgICAgY29uZmVyZW5jZUlkOiBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgIGhvbGQ6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8uaXNIb2xkLFxyXG4gICAgICBtdXRlOiAhY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uaXNNdXRlXHJcbiAgICAgIC8vIGNvbmZlcmVuY2U6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICB9KVxyXG4gICAgdGhpcy5jdXJyZW50Q2FsbC5pc011dGUgPSB0aGlzLmlzTXV0ZTtcclxuICAgIC8vIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKTtcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRDYWxsSW5mbygpIHtcclxuICAgIHJldHVybiB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0XHJcbiAgICAgIC5mbGF0TWFwKChjYWxsSW5mbzogYW55KSA9PiBjYWxsSW5mby5wYXJ0aWNpcGFudHMpXHJcbiAgICAgIC5maW5kKChwYXJ0aWNpcGFudDogYW55KSA9PiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8uZnJvbSkgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgJiYgcGFydGljaXBhbnQ/LmNsaWVudClcclxuICAgICAgICB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcGFydGljaXBhbnQ/LmNsaWVudCAmJiAhcGFydGljaXBhbnQ/LmJ1c2luZXNzTnVtYmVyKSkgJiYgIXBhcnRpY2lwYW50Py5pc0xlZnQgJiYgIXBhcnRpY2lwYW50Py5pc0hvbGQpO1xyXG4gIH1cclxuICB0b2dnbGVLZXlwYWQoKSB7XHJcbiAgICB0aGlzLnNob3dLZXlwYWQgPSAhdGhpcy5zaG93S2V5cGFkO1xyXG4gICAgdGhpcy5jYWxsSW5wdXQgPSAnJztcclxuICB9XHJcblxyXG4gIC8vIFN3aXRjaCB0aGF0IHNpbGVuY2VzIChvciByZXN0b3JlcykgdGhlIGluY29taW5nIHJpbmcgd2hpbGUgYSBjYWxsIGlzIGluIHByb2dyZXNzLlxyXG4gIHRvZ2dsZU11dGVJbmNvbWluZ0NhbGwoKSB7XHJcbiAgICBjb25zdCBuZXdNdXRlZCA9ICF0aGlzLnR3aWxpb1NlcnZpY2UuaXNJbmNvbWluZ011dGVkO1xyXG4gICAgdGhpcy50d2lsaW9TZXJ2aWNlLnNldEluY29taW5nTXV0ZWQobmV3TXV0ZWQpO1xyXG4gICAgaWYgKG5ld011dGVkKSB7XHJcbiAgICAgIC8vIE11dGUgT046IHN0b3AgdGhlIGN1c3RvbSByaW5nIGltbWVkaWF0ZWx5IGZvciBhbnkgY3VycmVudGx5LXJpbmdpbmcgY2FsbC5cclxuICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gTXV0ZSBPRkY6IGlmIHRoZXJlIGFyZSBzdGlsbCB1bmFjY2VwdGVkIGluY29taW5nIGNhbGxzIHJpbmdpbmcsIHJlc3VtZSB0aGUgcmluZy5cclxuICAgICAgY29uc3QgaGFzUmluZ2luZyA9IHRoaXMuY3VycmVudENhbGxMaXN0LnNvbWUoKGM6IGFueSkgPT4gYy5pc05vdGlmaWNhdGlvbiAmJiAhYy5pc0FjY2VwdENhbGwpO1xyXG4gICAgICBpZiAoaGFzUmluZ2luZykge1xyXG4gICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGxheSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDb250YWN0c1BhbmVsKGNhbGxJbmZvPzogYW55LCBpc0Nsb3NlPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBpZiAoaXNDbG9zZSkge1xyXG4gICAgICB0aGlzLnNob3dDb250YWN0c1BhbmVsID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIFxyXG5cclxuICAgIH1cclxuICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSAhaXNDbG9zZTtcclxuICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IGNhbGxJbmZvPy5jb25mZXJlbmNlSWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZk5hbWUgPSB0aGlzLmNvbmZlcmVuY2VDYWxsTGlzdC5maW5kKChyZXNEYXRhOmFueSk9PiByZXNEYXRhPy5jb25mZXJlbmNlSWQgPT09IGNhbGxJbmZvPy5jb25mZXJlbmNlSWQpPy5jYWxsTGFiZWwgfHwgJyc7XHJcbiAgICAvLyB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyhjYWxsSW5mbz8uY29uZmVyZW5jZUlkKTtcclxuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cztcclxuICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICAgIHRoaXMuaXNTZWFyY2hWaXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUMyQ0luZm9QYW5lbCh1c2VySW5mbzogYW55LCBpc0Nsb3NlPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBpZiAoaXNDbG9zZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB7fTtcclxuICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoIXVzZXJJbmZvPy5idXNpbmVzc051bWJlciAmJiAhdXNlckluZm8/LmlzQnVzaW5lc3NOdW1iZXIpIHtcclxuICAgICAgLy8gTm9uLUMyQyBpdGVtOiBqdXN0IG1hcmsgaXQgYXMgc2VsZWN0ZWQgZm9yIGhpZ2hsaWdodCwgbm8gQVBJIGNhbGwgbmVlZGVkLlxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBTZXQgc2VsZWN0aW9uIGltbWVkaWF0ZWx5IHNvIHRoZSBoaWdobGlnaHQgYXBwZWFycyBiZWZvcmUgdGhlIEFQSSByZXNwb25kcy5cclxuICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHVzZXJJbmZvO1xyXG4gICAgbGV0IHBhcnRpY2lwYW50SUQgPSB1c2VySW5mbz8uYnVzaW5lc3NQYXJ0aWNpcGFudElkIHx8IHVzZXJJbmZvPy5wYXJ0aWNpcGFudElkIHx8IHVzZXJJbmZvPy5pZFxyXG4gICAgaWYoIXRoaXMuQzJDb25mb0xpc3RbdXNlckluZm8/LnBhcnRpY2lwYW50SWRdICYmICF0aGlzLkMyQ29uZm9MaXN0W3VzZXJJbmZvPy5idXNpbmVzc1BhcnRpY2lwYW50SWRdKSB7XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRVc2VySW5mb3JtYXRpb24ocGFydGljaXBhbnRJRCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzSW5mbzogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IGl0ZW0/LnBhcnRpY2lwYW50SWQgPT0gdXNlckluZm8/LmlkKVxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XSA9IHRoaXMubWFwVXNlckluZm8odGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdLCByZXNJbmZvPy5jMmNJbmZvcm1hdGlvbik7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMuQzJDb25mb0xpc3RbcGFydGljaXBhbnRJRF0gPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF07XHJcbiAgICAgIH0sIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgdXNlciBpbmZvOicsIGVycik7XHJcbiAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB0aGlzLkMyQ29uZm9MaXN0W3BhcnRpY2lwYW50SURdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFJlbW92ZVBhcnRpY2lwYW50KCkge1xyXG4gICAgdGhpcy5pc0FkZFJlbW92ZVBhcnRpY2lwYW50ID0gIXRoaXMuaXNBZGRSZW1vdmVQYXJ0aWNpcGFudDtcclxuICAgIC8vIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKTtcclxuICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICB9XHJcblxyXG4gIGFzeW5jIHdhaXRpbmdDYWxsQWNjZXB0KGluY29taW5nQ2FsbEluZm86YW55KSB7XHJcbiAgICBsZXQgb3VyTnVtYmVySW5mbzogYW55ID0ge31cclxuICAgIGxldCBjYWxsSW5mbyA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmluZCgoY2FsbEluZm86IGFueSwgaTogbnVtYmVyKSA9PiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQgPT0gY2FsbEluZm8uY29uZmVyZW5jZUlkKVxyXG4gICAgaWYgKGNhbGxJbmZvPy5wYXJ0aWNpcGFudHM/Lmxlbmd0aCkge1xyXG4gICAgICBvdXJOdW1iZXJJbmZvID0gY2FsbEluZm8ucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT5cclxuICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgIXJlc0RhdGE/LmJ1c2luZXNzTnVtYmVyKSkgJiYgIXJlc0RhdGE/LmlzTGVmdCAmJiB0aGlzLmdldFN0YXR1cyhyZXNEYXRhKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc3QgY2FwdHVyZWRDYWxsID0gdGhpcy50d2lsaW9TZXJ2aWNlLmdldEluY29taW5nQ2FsbEJ5SWQoaW5jb21pbmdDYWxsSW5mbz8uY2xpZW50U2lkKTtcclxuICAgIHRoaXMudHdpbGlvU2VydmljZS5hY2NlcHRlZENhbGxMaXN0LmZvckVhY2goKGNhbGw6IGFueSkgPT4ge1xyXG4gICAgICBjYWxsLm11dGUodHJ1ZSk7XHJcbiAgICB9KTtcclxuICAgIGlmIChvdXJOdW1iZXJJbmZvPy5pZCAmJiBvdXJOdW1iZXJJbmZvPy5jb25mZXJlbmNlSWQgIT09IGluY29taW5nQ2FsbEluZm8/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSB0cnVlO1xyXG4gICAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgICBwYXJ0aWNpcGFudElkOiBbb3VyTnVtYmVySW5mbz8uaWRdLFxyXG4gICAgICAgIGNvbmZlcmVuY2VJZDogb3VyTnVtYmVySW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgbXV0ZTogb3VyTnVtYmVySW5mbz8ubXV0ZSB8fCBmYWxzZVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5ob2xkUGFydGljaXBhbnQocGF5bG9hZCkuc3Vic2NyaWJlKChyZXM6IGFueSk9PntcclxuICAgICAgICBpZihyZXM/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgIHN3YWwoXCJFcnJvclwiLCByZXM/Lm1lc3NhZ2U/LmpvaW4/LihcIjxici8+XCIpIHx8ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLCBcImVycm9yXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZChpbmNvbWluZ0NhbGxJbmZvLCBvdXJOdW1iZXJJbmZvKTtcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkZChpbmNvbWluZ0NhbGxJbmZvLCBvdXJOdW1iZXJJbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZChkYXRhPzogYW55LCBvdXJOdW1iZXJJbmZvPzogYW55LCBjYXB0dXJlZENhbGw/OiBDYWxsKSB7XHJcbiAgICBpZiAoIXRoaXMuY3VycmVudENhbGxMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLnNldEluY29taW5nTXV0ZWQoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0Nvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZCA9IGRhdGE/LmlkO1xyXG4gICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzQ29ubmVjdGluZ0luY29taW5nQ2FsbElkLm5leHQoZGF0YT8uaWQpO1xyXG4gICAgdGhpcy5pc0luY29taW5nQ2FsbEJ0bkRpc2FibGUgPSB0cnVlO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIFxyXG4gICAgbGV0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhbGxUb0FjY2VwdCA9IHRoaXMudHdpbGlvU2VydmljZS5nZXRJbmNvbWluZ0NhbGxCeUlkKGRhdGE/LmNsaWVudFNpZCk7XHJcbiAgICAgIGlmKGNhbGxUb0FjY2VwdD8ucGFyYW1ldGVycz8uQ2FsbFNpZCkge1xyXG4gICAgICAgIGNhbGxUb0FjY2VwdC5hY2NlcHQoKTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZEVudHJ5ID0ge1xyXG4gICAgICAgICAgY2FsbDogY2FsbFRvQWNjZXB0LFxyXG4gICAgICAgICAgY2FsbFNpZDogZGF0YS5jbGllbnRTaWQsXHJcbiAgICAgICAgICBkYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmFjY2VwdGVkQ2FsbExpc3QucHVzaChhY2NlcHRlZEVudHJ5KTtcclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdC5wdXNoKGNhbGxUb0FjY2VwdCk7XHJcbiAgICAgICAgLy8gU3RhcnQgcHJlcGFyaW5nIHRoZSBzcGFyZSBkZXZpY2UgaW1tZWRpYXRlbHkgKGJlZm9yZSB0aGUgQVBJIHJvdW5kLXRyaXApXHJcbiAgICAgICAgLy8gc28gaXQgaXMgcmVnaXN0ZXJlZCB3ZWxsIGJlZm9yZSB0aGUgbmV4dCBjb25jdXJyZW50IGNhbGwgY2FuIGFycml2ZS5cclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UucHJlcGFyZURldmljZTJGb3JJbmNvbWluZ0NhbGwoKTtcclxuICAgICAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgICAgIGNoYW5uZWxJZDogZW52aXJvbm1lbnQuY2hhbm5lbElkLFxyXG4gICAgICAgICAgcmVjb3JkSWQ6IGRhdGE/LmlkLFxyXG4gICAgICAgICAgaXBBZGRyZXNzOiAnJyxcclxuICAgICAgICAgIGlwQ291bnRyeTogJycsXHJcbiAgICAgICAgICBjYWxsU3RhdHVzOiAnYW5zd2VyZWQnLFxyXG4gICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICB1c2VySWQ6ICB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICBjb21wYW55SWQ6ICcnLFxyXG4gICAgICAgICAgY2xpZW50U2lkOiBjYWxsVG9BY2NlcHQucGFyYW1ldGVycz8uQ2FsbFNpZCB8fCBkYXRhLmNsaWVudFNpZCxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogZGF0YT8uY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnNldEluY29taW5nQ2FsbFN0YXR1cyhwYXlsb2FkKS5zdWJzY3JpYmUoYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZCA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgPSBkYXRhPy5jb25mZXJlbmNlSWQ7XHJcbiAgICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UuaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdC5wdXNoKGRhdGE/LmlkKTtcclxuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaXNBY2NlcHRJSW5jb21pbmdDYWxsLm5leHQoeyBjb25mZXJlbmNlSWQ6IGRhdGE/LmNvbmZlcmVuY2VJZCwgcGFydGljaXBhbnRJZDogZGF0YT8uaWQgPz8gZGF0YT8ucGFydGljaXBhbnRJZCB9KTtcclxuICAgICAgICAgICAgdGhpcy5pc0luY29taW5nQ2FsbEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzQ29ubmVjdGluZ0luY29taW5nQ2FsbElkLm5leHQoJycpO1xyXG4gICAgICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5vbkNvbmN1cnJlbnRDYWxsQWNjZXB0ZWQoY2FsbFRvQWNjZXB0KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkU2lkID0gY2FsbFRvQWNjZXB0LnBhcmFtZXRlcnM/LkNhbGxTaWQ7XHJcbiAgICAgICAgICAgIGNhbGxUb0FjY2VwdC5vbignZGlzY29ubmVjdCcsICgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoYWNjZXB0ZWRTaWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXB0ZWRDYWxsTGlzdCA9IHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5maWx0ZXIoYyA9PiBjLmNhbGxTaWQgIT09IGFjY2VwdGVkU2lkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5hY2NlcHRlZENhbGxMaXN0ID0gdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3QuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAoYzogYW55KSA9PiBjLnBhcmFtZXRlcnM/LkNhbGxTaWQgIT09IGFjY2VwdGVkU2lkXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLnJlbGVhc2VDb25jdXJyZW50Q2FsbERldmljZShhY2NlcHRlZFNpZCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS50ZWFyZG93blNwYXJlRGV2aWNlc0lmSWRsZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpZCA9IGNhbGxUb0FjY2VwdC5wYXJhbWV0ZXJzPy5DYWxsU2lkO1xyXG4gICAgICAgICAgICB0aGlzLmFjY2VwdGVkQ2FsbExpc3QgPSB0aGlzLmFjY2VwdGVkQ2FsbExpc3QuZmlsdGVyKGMgPT4gYy5jYWxsU2lkICE9PSBzaWQpO1xyXG4gICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdCA9IHRoaXMudHdpbGlvU2VydmljZS5hY2NlcHRlZENhbGxMaXN0LmZpbHRlcihcclxuICAgICAgICAgICAgICAoYzogYW55KSA9PiBjLnBhcmFtZXRlcnM/LkNhbGxTaWQgIT09IHNpZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpXHJcbiAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5pc0Nvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZC5uZXh0KCcnKTtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChyZXMpID0+IHJlcy5wYXJ0aWNpcGFudElkID09IGRhdGEucGFydGljaXBhbnRJZClcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3Quc3BsaWNlKGluZGV4LCAxKVxyXG4gICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNTaG93SW5jb21pbmdDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbmNvbWluZ0NhbGxCdG5EaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJzEwOTYnKVxyXG4gICAgICAgICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIC8vIHN3YWwoXCJFcnJvclwiLCByZXM/Lm1lc3NhZ2U/LmpvaW4/LihcIjxici8+XCIpIHx8ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLCBcImVycm9yXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgICAgICAgICB0aGlzLmlzVW5ob2xkQ29uZmVyZW5jZUNhbGwgPSBmYWxzZTtcclxuICAgICAgICAgIH0sNTAwKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKVxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBlbHNlIGlmKHRoaXMubWlzc0NhbGxJbmZvPy5kYXRhPy5kYXRhPy5yZWNvcmRJZCA9PSBkYXRhPy5pZCAmJiAhY2FsbFRvQWNjZXB0LnBhcmFtZXRlcnM/LkNhbGxTaWQpe1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgICAgY29uc3Qgc2lkID0gY2FsbFRvQWNjZXB0LnBhcmFtZXRlcnM/LkNhbGxTaWQ7XHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZCA9ICcnO1xyXG4gICAgICAgIHRoaXMuYWNjZXB0ZWRDYWxsTGlzdCA9IHRoaXMuYWNjZXB0ZWRDYWxsTGlzdC5maWx0ZXIoYyA9PiBjLmNhbGxTaWQgIT09IHNpZCk7XHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3QgPSB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdC5maWx0ZXIoXHJcbiAgICAgICAgICAoYzogYW55KSA9PiBjLnBhcmFtZXRlcnM/LkNhbGxTaWQgIT09IHNpZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbb3VyTnVtYmVySW5mbz8uaWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiBvdXJOdW1iZXJJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICBob2xkOiBmYWxzZSxcclxuICAgICAgICAgIG11dGU6IG91ck51bWJlckluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmhvbGRQYXJ0aWNpcGFudChwYXlsb2FkKS5zdWJzY3JpYmUoKHJlczogYW55KT0+e1xyXG4gICAgICAgICAgaWYocmVzPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHN3YWwoXCJFcnJvclwiLCByZXM/Lm1lc3NhZ2U/LmpvaW4/LihcIjxici8+XCIpIHx8ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLCBcImVycm9yXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0luY29taW5nQ2FsbEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmRlc3Ryb3lEZXZpY2UyKCk7XHJcbiAgICAgICAgc3dhbChcIkVycm9yXCIsICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLCBcImVycm9yXCIpO1xyXG4gICAgICAgIHRoaXMubWlzc0NhbGxJbmZvID0ge307XHJcbiAgICAgIH1cclxuICAgIH0sIDEwMDApO1xyXG4gIH1cclxuICBhc3luYyBjYWxsQ29udGFjdChjb250YWN0OiBhbnksIGlzVW5zYXZlZE51bWJlcj86IGJvb2xlYW4sIG9wdGlvbnM/OiB7IHNraXBEdXBsaWNhdGVDaGVjaz86IGJvb2xlYW4gfSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBwaG9uZU51bWJlciA9IGlzVW5zYXZlZE51bWJlciA/IGNvbnRhY3QgOiBjb250YWN0Py5udW1iZXJzTGlzdD8uWzBdPy5udW1iZXIgfHwgY29udGFjdD8ucGhvbmU7XHJcbiAgICBcclxuICAgIGNvbnN0IHRhcmdldENvbmZlcmVuY2VJZCA9IHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCB8fCB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQ7XHJcbiAgICBpZiAoIW9wdGlvbnM/LnNraXBEdXBsaWNhdGVDaGVjaykge1xyXG4gICAgICBpZiAodGFyZ2V0Q29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgY29uc3QgYWxyZWFkeUluQ2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKHJlczogYW55KSA9PlxyXG4gICAgICAgICAgcmVzLmNvbmZlcmVuY2VJZCA9PT0gdGFyZ2V0Q29uZmVyZW5jZUlkICYmXHJcbiAgICAgICAgICAocmVzLnRvID09IHBob25lTnVtYmVyIHx8IHJlcy5mcm9tID09IHBob25lTnVtYmVyKSAmJlxyXG4gICAgICAgICAgIXJlcz8uaXNMZWZ0XHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoYWxyZWFkeUluQ2FsbCkge1xyXG4gICAgICAgICAgc3dhbCgnRXJyb3InLCBgQWxyZWFkeSAke3Bob25lTnVtYmVyfSBudW1iZXIgaW4gdGhpcyBjYWxsIDIuYCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5pc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICBsZXQgZGF0YTogYW55ID0gYXdhaXQgdGhpcy5hZGRQYXJ0aWNpcGFudFRvQ2FsbCh7XHJcbiAgICAgICAgICBmcm9tOiB0aGlzLmNhbGxEYXRhPy5mcm9tID8gdGhpcy5jYWxsRGF0YT8uZnJvbSA6IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxyXG4gICAgICAgICAgcm91dGU6IFwiT1VUR09JTkdcIixcclxuICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICBwcm94eTogJycsXHJcbiAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBob2xkSW5mbzogYW55ID0gdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtkYXRhPy5wYXJ0aWNpcGFudElkIHx8IGRhdGE/LmlkXSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgaG9sZDogbnVsbCxcclxuICAgICAgICAgIG11dGU6IHRoaXMuY3VycmVudENhbGw/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICBjb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDEyMTgnLCBob2xkSW5mbylcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcclxuICAgICAgICAgIHBob25lOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGRpc3BsYXlOdW06IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgbmFtZTogY29udGFjdD8ubmFtZSB8fCBgJHtjb250YWN0Py5maXJzdE5hbWV9ICR7Y29udGFjdD8ubGFzdE5hbWV9YCB8fCBwaG9uZU51bWJlcixcclxuICAgICAgICAgIGltZzogY29udGFjdD8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IGRhdGE/LnBhcnRpY2lwYW50SWQsXHJcbiAgICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcixcclxuICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICAgIGlzSG9sZDogZmFsc2UsXHJcbiAgICAgICAgICBpc0xlZnQ6IGZhbHNlLFxyXG4gICAgICAgICAgaXNDb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkO1xyXG4gICAgICAgIC8vIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKTtcclxuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICBsZXQgcGFydGljaXBhbnRJRHM6IGFueSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjPy5wYXJ0aWNpcGFudElkICYmICFjPy5pc0hvbGQgJiYgdGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnRJRHMucHVzaChjPy5wYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gQWRkIHBhcnRpY2lwYW50IHRvIHRoZSBjb25mZXJlbmNlXHJcbiAgICAgICAgICBsZXQgZGF0YTogYW55ID0gYXdhaXQgdGhpcy5hZGRQYXJ0aWNpcGFudFRvQ2FsbCh7XHJcbiAgICAgICAgICAgIGZyb206IHRoaXMuY2FsbERhdGE/LmZyb20gfHwgdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXHJcbiAgICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50TnVtYmVyOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgICAgICBwcm94eTogJycsXHJcbiAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWRcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgcGFydGljaXBhbnRJRHMucHVzaChkYXRhPy5wYXJ0aWNpcGFudElkKVxyXG4gICAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBwYXJ0aWNpcGFudElEcyxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogbnVsbCxcclxuICAgICAgICAgICAgbXV0ZTogbnVsbCxcclxuICAgICAgICAgICAgY29uZmVyZW5jZTogdHJ1ZVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgaWYgKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDEyNzcnLCBob2xkSW5mbylcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCk7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgICAgICAgIHRoaXMuY2FsbERhdGEgPSB7XHJcbiAgICAgICAgICAgIHBob25lOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgICAgZGlzcGxheU51bTogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICAgIG5hbWU6IGNvbnRhY3Q/Lm5hbWUgfHwgYCR7Y29udGFjdD8uZmlyc3ROYW1lfSAke2NvbnRhY3Q/Lmxhc3ROYW1lfWAgfHwgcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICAgIGltZzogY29udGFjdD8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogZGF0YT8ucGFydGljaXBhbnRJZCxcclxuICAgICAgICAgICAgZnJvbTogdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXHJcbiAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNMZWZ0OiBmYWxzZSxcclxuICAgICAgICAgICAgaXNDb25mZXJlbmNlOiBmYWxzZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWRkaW5nIHBhcnRpY2lwYW50OicsIGVycm9yKTtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIENhbGxUb1Vuc2F2ZWROdW1iZXIobnVtYmVyOiBzdHJpbmcsIGlzTmV3Q29uZmVyZW5jZT86IGJvb2xlYW4sIG9wdGlvbnM/OiB7IHNraXBEdXBsaWNhdGVDaGVjaz86IGJvb2xlYW4gfSkge1xyXG4gICAgY29uc29sZS5sb2coJ3NraXBEdXBsaWNhdGVDaGVjazonLCBvcHRpb25zPy5za2lwRHVwbGljYXRlQ2hlY2ssICdpc05ld0NvbmZlcmVuY2U6JywgaXNOZXdDb25mZXJlbmNlKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKG51bWJlcik7XHJcbiAgICAgIGlmIChpc0ludmFsaWQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGlmICghaXNOZXdDb25mZXJlbmNlICYmICFvcHRpb25zPy5za2lwRHVwbGljYXRlQ2hlY2spIHtcclxuICAgICAgICBjb25zdCB0YXJnZXRDb25mZXJlbmNlSWQgPSB0aGlzLmNvbmZlcmVuY2VDYWxsSURGb3JQYXJ0aWNpcGFudExpc3QgfHwgdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkO1xyXG4gICAgICAgIGlmICh0YXJnZXRDb25mZXJlbmNlSWQpIHtcclxuICAgICAgICAgIGxldCBhbHJlYWR5SW5DYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+XHJcbiAgICAgICAgICAgIHJlcy5jb25mZXJlbmNlSWQgPT09IHRhcmdldENvbmZlcmVuY2VJZCAmJlxyXG4gICAgICAgICAgICAoKHJlcy50byA9PSBudW1iZXIgJiYgcmVzPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSB8fFxyXG4gICAgICAgICAgICAgIChyZXMuZnJvbSA9PSBudW1iZXIgJiYgcmVzPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHJlcy5ob3N0KSkgJiZcclxuICAgICAgICAgICAgIXJlcz8uaXNMZWZ0XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKGFscmVhZHlJbkNhbGwpIHtcclxuICAgICAgICAgICAgc3dhbCgnRXJyb3InLCBgQWxyZWFkeSAke251bWJlcn0gbnVtYmVyIGluIHRoaXMgY2FsbDEuYCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGlmIChudW1iZXIgPT09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xyXG4gICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW4gbm90IGRpYWwgdGhpcyBudW1iZXInKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjb250YWN0ID0gdGhpcy5jb250YWN0cy5maW5kKChjb250YWN0OiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gY29udGFjdC5udW1iZXJzTGlzdC5zb21lKChudW06IGFueSkgPT4gbnVtLm51bWJlciA9PT0gbnVtYmVyKVxyXG4gICAgICB9KTtcclxuICAgICAgbnVtYmVyID0gYXdhaXQgdGhpcy5nZXRUb051bWJlcihudW1iZXIpO1xyXG5cclxuICAgICAgLy8gVXBkYXRlIGNhbGwgZGF0YSBpbiBhIHNpbmdsZSBvcGVyYXRpb25cclxuICAgICAgY29uc3QgY2FsbERhdGEgPSB7XHJcbiAgICAgICAgbmFtZTogY29udGFjdD8uZmlyc3ROYW1lLFxyXG4gICAgICAgIGltZzogY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgIHBob25lOiBudW1iZXIsXHJcbiAgICAgICAgZXh0TnVtOiAnJyxcclxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxyXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoaXNOZXdDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgbGV0IG91ck51bWJlckluZm86IGFueSA9IHt9XHJcbiAgICAgICAgbGV0IGNhbGxJbmZvID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChjYWxsSW5mbzogYW55LCBpOiBudW1iZXIpID0+IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkID09IGNhbGxJbmZvLmNvbmZlcmVuY2VJZClcclxuICAgICAgICBpZiAoY2FsbEluZm8pIHtcclxuICAgICAgICAgIG91ck51bWJlckluZm8gPSBjYWxsSW5mby5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgIXJlc0RhdGE/LmJ1c2luZXNzTnVtYmVyKSkgJiYgIXJlc0RhdGE/LmlzTGVmdFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG91ck51bWJlckluZm8/LmlkKSB7XHJcbiAgICAgICAgICBsZXQgaG9sZEluZm86IGFueSA9IGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtvdXJOdW1iZXJJbmZvPy5pZF0sXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogb3VyTnVtYmVySW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICBob2xkOiB0cnVlLFxyXG4gICAgICAgICAgICBtdXRlOiBvdXJOdW1iZXJJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDEzNTUnLCBob2xkSW5mbylcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5vbkFkZE5ld0NhbGwoY2FsbERhdGEsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm9uQWRkTmV3Q2FsbChjYWxsRGF0YSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgICAgIHRoaXMuY2FsbENvbnRhY3QobnVtYmVyLCB0cnVlLCBvcHRpb25zKVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ZhaWxlZCB0byBpbml0aWF0ZSBjYWxsLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkFkZE5ld0NhbGwoY2FsbERhdGE6IGFueSwgaXNOZXdDb25mZXJlbmNlQ2FsbCA9IGZhbHNlKSB7XHJcbiAgICAvLyB3YXJuaW5nIG9ubHkgZm9yIE5FVyBTRVBBUkFURSBDQUxMXHJcbiAgICBpZiAoaXNOZXdDb25mZXJlbmNlQ2FsbCAmJiB0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMucGVuZGluZ0NhbGxEYXRhID0gY2FsbERhdGE7XHJcbiAgICAgIHRoaXMuc2hvd0NvbmZlcmVuY2VXYXJuaW5nTW9kYWwgPSB0cnVlO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhcnRDYWxsKGNhbGxEYXRhLCBpc05ld0NvbmZlcmVuY2VDYWxsKTtcclxuICB9XHJcblxyXG4gIGNvbmZpcm1OZXdDYWxsKCkge1xyXG4gICAgdGhpcy5zaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMucGVuZGluZ0NhbGxEYXRhKSB7XHJcbiAgICAgIHRoaXMubmV3Q2FsbExvYWRlckRhdGEgPSB7XHJcbiAgICAgICAgbmFtZTogdGhpcy5wZW5kaW5nQ2FsbERhdGEubmFtZSB8fCAnJyxcclxuICAgICAgICBwaG9uZTogdGhpcy5wZW5kaW5nQ2FsbERhdGEucGhvbmUsXHJcbiAgICAgICAgaW1nOiB0aGlzLnBlbmRpbmdDYWxsRGF0YS5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuY2FsbE51bWJlclRvYXN0ID0ge1xyXG4gICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ2FsZXJ0LXN1Y2Nlc3MnLFxyXG4gICAgICAgIG51bWJlcjogdGhpcy5wZW5kaW5nQ2FsbERhdGEucGhvbmUsXHJcbiAgICAgICAgZGlzcGxheU51bTogdGhpcy5wZW5kaW5nQ2FsbERhdGEucGhvbmVcclxuICAgICAgfTsgIFxyXG4gICAgICBcclxuICAgICAgdGhpcy5zaG93TmV3Q2FsbExvYWRlciA9IHRydWU7XHJcbiAgICAgIFxyXG4gICAgICBcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jYWxsTnVtYmVyVG9hc3Quc2hvdyA9IGZhbHNlO1xyXG4gICAgICB9LCA3MDAwKTtcclxuICAgICAgdGhpcy5zdGFydENhbGwodGhpcy5wZW5kaW5nQ2FsbERhdGEsIHRydWUpO1xyXG4gICAgICB0aGlzLnBlbmRpbmdDYWxsRGF0YSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5jZWxOZXdDYWxsKCkge1xyXG4gICAgdGhpcy5zaG93Q29uZmVyZW5jZVdhcm5pbmdNb2RhbCA9IGZhbHNlO1xyXG4gICAgdGhpcy5wZW5kaW5nQ2FsbERhdGEgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VG9OdW1iZXIoZGlhbGVkTnVtYmVyOiBzdHJpbmcpIHtcclxuICAgIGlmIChkaWFsZWROdW1iZXJbMF0gIT09ICcrJykge1xyXG4gICAgICAvLyB0aGlzIGlzIGNhc2Ugd2hlbiB1c2VyIGdlb2xvY2F0aW9uIGRpYWwgY29kZSBpcyBvblxyXG4gICAgICBsZXQgaXBBZGRyZXNzOiBhbnkgPSBhd2FpdCB0aGlzLmlwU2VydmljZS5nZXRJcEFkZHJlc3NJbmZvKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgdGhpcy50d2lsaW9TZXJ2aWNlLmdldFRvTnVtYmVyKGRpYWxlZE51bWJlciwgaXBBZGRyZXNzLmFkZHJlc3MuY291bnRyeUNvZGUpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICByZXR1cm4gcmVzPy50b051bWJlclxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBkaWFsZWROdW1iZXJcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGRpYWxlZE51bWJlclxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgaXNJbnZhbGlkTnVtYmVyKG51bWJlcjogc3RyaW5nKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAobnVtYmVyID09ICcnKSB7XHJcbiAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZhbGlkTnVtYmVyUGF0dGVybiA9IC9eWytcXGRcXHMoKS1dKiQvOyAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggdmFsaWQgY2hhcmFjdGVyc1xyXG4gICAgICBjb25zdCBwaG9uZU51bWJlciA9IG51bWJlcjtcclxuICAgICAgaWYgKCF2YWxpZE51bWJlclBhdHRlcm4udGVzdChwaG9uZU51bWJlcikpIHtcclxuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gUmV0dXJuIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIG1lYW5pbmcgdGhlIG51bWJlciBpcyBpbnZhbGlkXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93RGlhbEFsZXJ0KG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgdGhpcy5kaWFsQWxlcnQgPSB7XHJcbiAgICAgIG1zZzogbWVzc2FnZSxcclxuICAgICAgc2hvdzogdHJ1ZVxyXG4gICAgfTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmRpYWxBbGVydC5zaG93ID0gZmFsc2U7XHJcbiAgICB9LCAzMDAwKTtcclxuICB9XHJcblxyXG5hc3luYyBnZXRBbGxQYXJ0aWNpcGFudHMoY29uZmVyZW5jZUlkOiBzdHJpbmcpIHtcclxuICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0QWxsUGFydGljaXBhbnRzKGNvbmZlcmVuY2VJZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFydGljaXBhbnRzID0gcmVzPy5wYXJ0aWNpcGFudHMgfHwgcmVzPy5wYXJ0aWNpcGFudCB8fCBbXTtcclxuICAgICAgICAvLyBpZiAoIXBhcnRpY2lwYW50cy5sZW5ndGgpIHtcclxuICAgICAgICAvLyAgIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgICAgLy8gICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gW107XHJcbiAgICAgICAgLy8gICByZXR1cm47XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGNvbnN0IHVwZGF0ZWRQYXJ0aWNpcGFudHMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAvLyAgIHBhcnRpY2lwYW50cy5tYXAoYXN5bmMgKHA6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCBmcm9tTmFtZSA9IGF3YWl0IHRoaXMuZ2V0TmFtZShwLmZyb20pO1xyXG4gICAgICAgIC8vICAgICBjb25zdCB0b05hbWUgPSBhd2FpdCB0aGlzLmdldE5hbWUocC50byk7XHJcbiAgXHJcbiAgICAgICAgLy8gICAgIHJldHVybiB7XHJcbiAgICAgICAgLy8gICAgICAgLi4ucCxcclxuICAgICAgICAvLyAgICAgICBmcm9tTmFtZTogZnJvbU5hbWUgfHwgcC5mcm9tTmFtZSxcclxuICAgICAgICAvLyAgICAgICB0b05hbWU6IHRvTmFtZSB8fCBwLnRvTmFtZSxcclxuICAgICAgICAvLyAgICAgfTtcclxuICAgICAgICAvLyAgIH0pXHJcbiAgICAgICAgLy8gKTtcclxuICBcclxuICAgICAgICAvLyB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCA9IHVwZGF0ZWRQYXJ0aWNpcGFudHM7XHJcbiAgICAgICAgLy8gdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IFsuLi51cGRhdGVkUGFydGljaXBhbnRzXTsgIFxyXG4gICAgICAgIC8vIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSBbXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfSw3MDApXHJcbn1cclxuXHJcbiAgYXN5bmMgc3dhcENhbGxzKGNhbGxJbmZvOiBhbnksIGlzQ29uZmVyZW5jZUNhbGw/OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRoaXMuaXNQYXJ0aWNpcGFudFBhbmVsTG9hZGluZyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoYz8uY29uZmVyZW5jZUlkID09IGNhbGxJbmZvPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgICB0aGlzLmlzSG9sZEJ0bkRpc2FibGUgPSB0cnVlO1xyXG4gICAgICAgIGxldCBwYXJ0aWNpcGFudEluZm8gPSBjLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5jbGllbnQpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgIXJlc0RhdGE/LmJ1c2luZXNzTnVtYmVyKSkgJiYgIXJlc0RhdGE/LmlzTGVmdFxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAocGFydGljaXBhbnRJbmZvPy5pZCkge1xyXG4gICAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbcGFydGljaXBhbnRJbmZvPy5pZF0sXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogcGFydGljaXBhbnRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBtdXRlOiBwYXJ0aWNpcGFudEluZm8/Lm11dGUgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignaG9sZEluZm8gMTUwMicsIGhvbGRJbmZvKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmlzSG9sZEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxJREZvclBhcnRpY2lwYW50TGlzdCA9IGNhbGxJbmZvPy5jb25mZXJlbmNlSWRcclxuICAgICAgICAgIC8vIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKGNhbGxJbmZvPy5jb25mZXJlbmNlSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcGFydGljaXBhbnRJbmZvID0gYy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8uY2xpZW50KSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LnRvKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmICFyZXNEYXRhPy5idXNpbmVzc051bWJlcikpICYmICFyZXNEYXRhPy5pc0xlZnRcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHBhcnRpY2lwYW50SW5mbz8uaWQgJiYgIXBhcnRpY2lwYW50SW5mbz8uaXNIb2xkKSB7XHJcbiAgICAgICAgICBsZXQgaG9sZEluZm86IGFueSA9IGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtwYXJ0aWNpcGFudEluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBwYXJ0aWNpcGFudEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgICAgbXV0ZTogcGFydGljaXBhbnRJbmZvPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmKGhvbGRJbmZvPy5zdGF0dXMgIT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDE1MjEnLCBob2xkSW5mbylcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaXNIb2xkQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChjPy5pc0NvbmZlcmVuY2UgJiYgIWM/LmlzSG9sZCAmJiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgbGV0IGhvbGRJbmZvOiBhbnkgPSBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWQgfHwgYz8uaWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiBjLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYoaG9sZEluZm8/LnN0YXR1cyAhPSAyMDApIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hvbGRJbmZvIDE1MzUnLCBob2xkSW5mbylcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBoYXNEZXRhaWxlZEluZm8oY2FsbERhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFjYWxsRGF0YSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gQ2hlY2sgaWYgdXNlckluZm8gZXhpc3RzIGFuZCBoYXMgbWVhbmluZ2Z1bCBkYXRhXHJcbiAgICBpZiAoY2FsbERhdGEudXNlckluZm8gJiYgY2FsbERhdGEudXNlckluZm8uYzJjSW5mb3JtYXRpb24pIHtcclxuICAgICAgY29uc3QgaW5mbyA9IGNhbGxEYXRhLnVzZXJJbmZvLmMyY0luZm9ybWF0aW9uO1xyXG4gICAgICByZXR1cm4gISEoXHJcbiAgICAgICAgaW5mby5zdWJqZWN0ICYmIGluZm8uc3ViamVjdCAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5lbWFpbCAmJiBpbmZvLmVtYWlsICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLm1lc3NhZ2UgJiYgaW5mby5tZXNzYWdlICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLnBvaW50TmFtZSAmJiBpbmZvLnBvaW50TmFtZSAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5zb3VyY2VOYW1lICYmIGluZm8uc291cmNlTmFtZSAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5leHRlbnNpb24gJiYgaW5mby5leHRlbnNpb24gIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8udXJsIHx8XHJcbiAgICAgICAgaW5mby5sYXRpdHVkZSB8fFxyXG4gICAgICAgIGluZm8ubG9uZ2l0dWRlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvbkNhbGxJbnB1dHMobnVtOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtID09ICcrJyB8fCBudW0gPT0gJyonIHx8IG51bSA9PSAnIycpIHtcclxuICAgICAgICBpZiAobnVtID09ICcjJykge1xyXG4gICAgICAgICAgbmV3IEF1ZGlvKGAvYXNzZXRzL2RpYWwtdG9uZXMvZHRtZi9kdG1mLWhhc2gtLm1wM2ApLnBsYXkoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG51bSA9PSAnKicpIHtcclxuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1zdGFyLS5tcDNgKS5wbGF5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi0ke251bX0tLm1wM2ApLnBsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWxsSW5wdXQgPSB0aGlzLmNhbGxJbnB1dCArIFN0cmluZyhudW0pO1xyXG4gICAgICAgIHRoaXMuc2hvd0NsZWFyQnRuID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc3RyID0gU3RyaW5nKG51bSk7XHJcbiAgICAgIHRoaXMuY2FsbD8uc2VuZERpZ2l0cyhzdHIpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH1cclxuICB9XHJcbiAgb25DYWxsSW5wdXRFbnRlcihldjogYW55KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmNhbGw/LnNlbmREaWdpdHMoU3RyaW5nKGV2LmtleSkpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFySW5wdXRzKCkge1xyXG4gICAgdGhpcy5jYWxsSW5wdXQgPSB0aGlzLmNhbGxJbnB1dC5zbGljZSgwLCAtMSk7XHJcbiAgfVxyXG4gIGlzTWluaW1pc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbWluaW1pc2VEaWFscGFkKCkge1xyXG4gICAgdGhpcy5taW5pbWlzZUV2ZW50LmVtaXQodHJ1ZSk7XHJcbiAgICB0aGlzLmlzTWluaW1pc2VkID0gdHJ1ZTtcclxuICB9XHJcbiAgbWF4aW1pc2VEaWFscGFkKCkge1xyXG4gICAgdGhpcy5taW5pbWlzZUV2ZW50LmVtaXQoZmFsc2UpO1xyXG4gICAgdGhpcy5pc01pbmltaXNlZCA9IGZhbHNlO1xyXG4gIH1cclxuICB0b2dnbGVSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5pc1JlY29yZGluZykge1xyXG4gICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhcnRSZWNvcmRpbmcoKSB7XHJcbiAgICBsZXQgc2lkO1xyXG4gICAgY29uc3QgZGV0YWlscyA9IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU2lkKCk7XHJcbiAgICB0aGlzLmluY29taW5nQ2FsbFNpZCA9IGRldGFpbHMuY2FsbFNpZDtcclxuICAgIHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsID0gZGV0YWlscy5yZWNvcmRDYWxsO1xyXG4gICAgc2lkID0gdGhpcy5pbmNvbWluZ0NhbGxTaWQgPyB0aGlzLmluY29taW5nQ2FsbFNpZCA6IHRoaXMuY2FsbFNpZCB8fCB0aGlzLmFkZFJlcz8uY29uZmVyZW5jZVNpZDtcclxuXHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFJlY29yZGluZyh7IFwiY29uZmVyZW5jZUlkXCI6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCB9KS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICB0aGlzLmlzUmVjb3JkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnRpbWVFbGFwc2VkID0gMDtcclxuICAgICAgdGhpcy5zdGFydFRpbWVyMSgpO1xyXG4gICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcFJlY29yZGluZygpIHtcclxuICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcGF1c2VSZWNvcmRpbmcoKSB7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UucGF1c2VPclJlc3VtZVJlY29yZGluZyh0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsICdwYXVzZScpLnN1YnNjcmliZShcclxuICAgICAgcmVzcG9uc2UgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcFJlY29yZGluZ1RpbWVyKCk7XHJcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhdXNpbmcgcmVjb3JkaW5nOicsIGVycm9yKTtcclxuICAgICAgICAvLyBDb25zaWRlciB1cGRhdGluZyB0aGUgVUkgdG8gc2hvdyB0aGUgZXJyb3Igc3RhdGVcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgcmVzdW1lUmVjb3JkaW5nKCkge1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnBhdXNlT3JSZXN1bWVSZWNvcmRpbmcodGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLCAncmVzdW1lJykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0YXJ0VGltZXIxKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlc3VtaW5nIHJlY29yZGluZycsIGVycm9yKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBnZXRUaW1lRGlmZmVyZW5jZShpbnB1dFRpbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXN0VGltZSA9IG5ldyBEYXRlKGlucHV0VGltZSkuZ2V0VGltZSgpO1xyXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuXHJcbiAgICBsZXQgZGlmZiA9IE1hdGguZmxvb3IoKGN1cnJlbnRUaW1lIC0gcGFzdFRpbWUpIC8gMTAwMCk7IC8vIHRvdGFsIHNlY29uZHNcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKGRpZmYgLyA2MCk7XHJcbiAgICBjb25zdCBzZWNvbmRzID0gZGlmZiAlIDYwO1xyXG5cclxuICAgIGNvbnN0IG1tID0gbWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXM7XHJcbiAgICBjb25zdCBzcyA9IHNlY29uZHMgPCAxMCA/ICcwJyArIHNlY29uZHMgOiBzZWNvbmRzO1xyXG5cclxuICAgIHJldHVybiBgJHttbX06JHtzc31gO1xyXG4gIH1cclxuICBzdGFydFRpbWVyMSgpIHtcclxuICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSBpbnRlcnZhbCgxMDAwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnRpbWVFbGFwc2VkKys7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcFJlY29yZGluZ1RpbWVyKCkge1xyXG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOyAvLyBQYXVzZSB0aGUgdGltZXJcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDsgICAgICAgIC8vIE9wdGlvbmFsbHkgcmVzZXQgdGhlIHN1YnNjcmlwdGlvblxyXG4gICAgfVxyXG4gIH1cclxuICBnZXRGb3JtYXR0ZWRUaW1lKCkge1xyXG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IodGhpcy50aW1lRWxhcHNlZCAvIDYwKTtcclxuICAgIGNvbnN0IHNlY29uZHMgPSB0aGlzLnRpbWVFbGFwc2VkICUgNjA7XHJcbiAgICByZXR1cm4gYCR7bWludXRlc306JHtzZWNvbmRzIDwgMTAgPyAnMCcgOiAnJ30ke3NlY29uZHN9YDtcclxuICB9XHJcbiAgcG9sbENhbGxTdGF0dXMoY2FsbEF1dGhJZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBtYXhUaW1lID0gMzAwMDA7IC8vIFBvbGwgZm9yIHVwIHRvIDMwIHNlY29uZHNcclxuICAgIGNvbnN0IHBvbGxJbnRlcnZhbCA9IDMwMDA7IC8vIFBvbGwgZXZlcnkgMyBzZWNvbmRzXHJcbiAgICBsZXQgZWxhcHNlZFRpbWUgPSAwO1xyXG4gICAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcclxuICAgICAgZWxhcHNlZFRpbWUgKz0gcG9sbEludGVydmFsO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHN0YXR1c1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxTdGF0dXMoY2FsbEF1dGhJZCkudG9Qcm9taXNlKCkgYXMgQ2FsbFN0YXR1c1Jlc3BvbnNlO1xyXG4gICAgICAgIGlmIChzdGF0dXNSZXNwb25zZSAmJiBzdGF0dXNSZXNwb25zZS5jYWxsRGV0YWlscykge1xyXG4gICAgICAgICAgdGhpcy5jYWxsU3RhdHVzID0gc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMuY2FsbFN0YXR1cztcclxuICAgICAgICAgIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdpbi1wcm9ncmVzcycpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU2lkID0gc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMuY2FsbFNpZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVjb3JkQ2FsbCAmJiAhdGhpcy5pc1JlY29yZGluZykge1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdjb21wbGV0ZWQnKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZWxhcHNlZFRpbWUgPj0gbWF4VGltZSkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdNYXggcG9sbGluZyB0aW1lIHJlYWNoZWQuIFN0b3BwaW5nIHBvbGwuJyk7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgfVxyXG4gICAgfSwgcG9sbEludGVydmFsKTtcclxuICB9XHJcblxyXG4gIC8vIGdldFVzZXJJbmZvcm1hdGlvbihpZDogYW55KSB7XHJcbiAgLy8gICBpZihpZCkge1xyXG4gIC8vICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbihpZCkuc3Vic2NyaWJlKFxyXG4gIC8vICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLCAndXNlckluZm9ybWF0aW9uJyk7XHJcbiAgLy8gICAgIH0sIGVycm9yID0+IHtcclxuICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuICBzZWxlY3RlZEluY29taW5nQ2FsbEluZm8oZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsID0gZGF0YTtcclxuICB9XHJcblxyXG4gIC8vIGdldEhvbGRDYWxsTGlzdCgpIHtcclxuICAvLyAgIGxldCBob2xkTGlzdDogYW55W10gPSBbXTtcclxuICAvLyAgIGxldCBpc0NvbmZlcmVuY2UgPSBmYWxzZTtcclxuICAvLyAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goKGM6IGFueSkgPT4ge1xyXG4gIC8vICAgICBpZiAoYz8uaXNIb2xkICYmICFjPy5pc0NvbmZlcmVuY2UpIHtcclxuICAvLyAgICAgICBob2xkTGlzdC5wdXNoKGMpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGlmIChjPy5pc0NvbmZlcmVuY2UgJiYgIWlzQ29uZmVyZW5jZSkge1xyXG4gIC8vICAgICAgIGlzQ29uZmVyZW5jZSA9IHRydWU7XHJcbiAgLy8gICAgICAgY1snaXNDb25mZXJlbmNlQ2FsbEhvbGQnXSA9IHRydWU7XHJcbiAgLy8gICAgICAgaG9sZExpc3QucHVzaChjKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSk7XHJcbiAgLy8gICByZXR1cm4gaG9sZExpc3Q7XHJcbiAgLy8gfVxyXG5cclxuICBvbkNsaWNrRXhwYW5kKGRhdGE6IGFueSkge1xyXG4gICAgaWYgKGRhdGEuaWQgIT0gdGhpcy5zZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGRhdGE7XHJcbiAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSAhdGhpcy5pc0NsaWNrRXhwYW5kO1xyXG4gICAgICBpZiAodGhpcy5pc0NsaWNrRXhwYW5kKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gZGF0YTtcclxuICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBzZXRJbmNvbWluZ0NhbGxTdGF0dXMoZGF0YTogYW55KSB7XHJcbiAgLy8gICBsZXQgcGF5bG9hZCA9IHtcclxuICAvLyAgICAgcmVjb3JkSWQ6IGRhdGE/LmlkLFxyXG4gIC8vICAgICBpcEFkZHJlc3M6ICcnLFxyXG4gIC8vICAgICBpcENvdW50cnk6ICcnLFxyXG4gIC8vICAgICBjYWxsU3RhdHVzOiAnYW5zd2VyZWQnLFxyXG4gIC8vICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcclxuICAvLyAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQgfHwgZGF0YS5jb25mZXJlbmNlSWQgfHwgJ25vJ1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnNldEluY29taW5nQ2FsbFN0YXR1cyhwYXlsb2FkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgLy8gICAgIGNvbnNvbGUubG9nKHJlcylcclxuICAvLyAgIH0pXHJcbiAgLy8gfVxyXG5cclxuICB0b2dnbGVTZWFyY2goKSB7XHJcbiAgICB0aGlzLmlzU2VhcmNoVmlzaWJsZSA9ICF0aGlzLmlzU2VhcmNoVmlzaWJsZTtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgaWYgKCF0aGlzLmlzU2VhcmNoVmlzaWJsZSkge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuY29udGFjdHM7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVyKCkge1xyXG4gICAgY29uc3QgdGV4dCA9IHRoaXMuc2VhcmNoVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHRoaXMuaXNEaXJlY3RDYWxsT3B0aW9uU2hvdyA9IC9eXFwrP1xcZCskLy50ZXN0KHRleHQpXHJcbiAgICBpZiAoIXRleHQubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cztcclxuICAgICAgLy8gdGhpcy5maWx0ZXJlZExpc3QuZm9yRWFjaCgoYzogYW55KSA9PiB7XHJcbiAgICAgIC8vICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChjYzogYW55KSA9PiAhY2M/LklzQ29ubmVjdGVkICYmIChjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciB8fCBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlcikpO1xyXG4gICAgICAvLyAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgIC8vICAgICBjWydJc0Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAgICAgLy8gICB9IGVsc2Uge1xyXG4gICAgICAvLyAgICAgY1snSXNDb25uZWN0ZWQnXSA9IGZhbHNlO1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzTnVtZXJpY1NlYXJjaCA9IC9eXFwrP1xcZCskLy50ZXN0KHRleHQpO1xyXG4gICAgY29uc3QgZXhwYW5kZWQ6IGFueVtdID0gW107XHJcbiAgICB0aGlzLmNvbnRhY3RzLmZvckVhY2goKGM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXNOdW1lcmljU2VhcmNoKSB7XHJcbiAgICAgICAgKGM/Lm51bWJlcnNMaXN0IHx8IFtdKS5mb3JFYWNoKChuOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICgobj8ubnVtYmVyIHx8ICcnKS5pbmNsdWRlcyh0ZXh0KSkge1xyXG4gICAgICAgICAgICBleHBhbmRlZC5wdXNoKHsgLi4uYywgbnVtYmVyc0xpc3Q6IFtuXSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBuYW1lTWF0Y2ggPSAoYz8uZmlyc3ROYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8XHJcbiAgICAgICAgICAoYz8ubGFzdE5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHxcclxuICAgICAgICAgIChjPy5taWRkbGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8XHJcbiAgICAgICAgICAoYz8ubmlja05hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCk7XHJcbiAgICAgICAgaWYgKG5hbWVNYXRjaCkge1xyXG4gICAgICAgICAgY29uc3QgbnVtYmVycyA9IGM/Lm51bWJlcnNMaXN0O1xyXG4gICAgICAgICAgaWYgKG51bWJlcnMgJiYgbnVtYmVycy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIG51bWJlcnMuZm9yRWFjaCgobnVtT2JqOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBleHBhbmRlZC5wdXNoKHsgLi4uYywgbnVtYmVyc0xpc3Q6IFtudW1PYmpdIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGV4cGFuZGVkLnB1c2goYyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gZXhwYW5kZWQ7XHJcbiAgICB0aGlzLmZpbHRlcmVkTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcclxuICAgICAgY1snZnJvbU5hbWUnXSA9IHRoaXMuZ2V0TmFtZShjLmZyb20pIHx8ICcnO1xyXG4gICAgICBjWyd0b05hbWUnXSA9IHRoaXMuZ2V0TmFtZShjLnRvKSB8fCAnJztcclxuICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChjYzogYW55KSA9PiBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlcik7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgY2hlY2tUZXh0SGVpZ2h0KCkge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGV4dC1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChlbD8uc2Nyb2xsSGVpZ2h0ID4gZWw/LmNsaWVudEhlaWdodCkge1xyXG4gICAgICB0aGlzLnNob3dCdXR0b24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuICB0b2dnbGVUZXh0KCkge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gIXRoaXMuaXNFeHBhbmRlZDtcclxuICB9XHJcbiAgc2hvd0Rpc2Nvbm5lY3RNb2RhbCA9IGZhbHNlO1xyXG4gIC8vIENhbGwgdGhpcyB3aGVuIGNhbGwgZGlzY29ubmVjdHNcclxuICBvbkNhbGxEaXNjb25uZWN0ZWQoKSB7XHJcbiAgICB0aGlzLnJlc2V0TGVhdmVUaW1lcigpO1xyXG4gICAgdGhpcy5zaG93RGlzY29ubmVjdE1vZGFsID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGVuZENvbmZlcmVuY2UoKSB7XHJcbiAgICB0aGlzLnNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29uZj8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgIHRoaXMub25FbmRDYWxsKHRoaXMuc2VsZWN0ZWRDb25mLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZW5kQ2FsbCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBDb21iaW5lcyB0aGUgdHdvIDI0LWhvdXIgc2VsZWN0cyBpbnRvIGxlYXZlUmVhc29uIChISDpNTSkgKi9cclxuICBvblRpbWVDaGFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5sZWF2ZUhvdXIgIT09ICcnICYmIHRoaXMubGVhdmVNaW51dGUgIT09ICcnKSB7XHJcbiAgICAgIHRoaXMubGVhdmVSZWFzb24gPSBgJHt0aGlzLmxlYXZlSG91cn06JHt0aGlzLmxlYXZlTWludXRlfWA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVIb3VyRHJvcGRvd24oKSB7XHJcbiAgICB0aGlzLnNob3dIb3VyRHJvcGRvd24gPSAhdGhpcy5zaG93SG91ckRyb3Bkb3duO1xyXG4gICAgdGhpcy5zaG93TWludXRlRHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZU1pbnV0ZURyb3Bkb3duKCkge1xyXG4gICAgdGhpcy5zaG93TWludXRlRHJvcGRvd24gPSAhdGhpcy5zaG93TWludXRlRHJvcGRvd247XHJcbiAgICB0aGlzLnNob3dIb3VyRHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdEhvdXIoaDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmxlYXZlSG91ciA9IGg7XHJcbiAgICB0aGlzLnNob3dIb3VyRHJvcGRvd24gPSBmYWxzZTtcclxuICAgIHRoaXMub25UaW1lQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RNaW51dGUobTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmxlYXZlTWludXRlID0gbTtcclxuICAgIHRoaXMuc2hvd01pbnV0ZURyb3Bkb3duID0gZmFsc2U7XHJcbiAgICB0aGlzLm9uVGltZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgbGVhdmVDb25mZXJlbmNlKCkge1xyXG4gICAgdGhpcy5zaG93RGlzY29ubmVjdE1vZGFsID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5pc1JlYXNvbkNoZWNrZWQpIHtcclxuICAgICAgbGV0IHBheWxvYWQgPSB7IGNvbmZlcmVuY2VJZDogdGhpcy5zZWxlY3RlZENvbmY/LmNvbmZlcmVuY2VJZCB8fCB0aGlzLmhvc3RudW1iZXI/LmNvbmZlcmVuY2VJZCwgdGltZTogdGhpcy5jb252ZXJ0SEhNTVRvTWludXRlcyh0aGlzLmxlYXZlUmVhc29uKSwgdGltZXJEYXRlOiBuZXcgRGF0ZSgpLnRvU3RyaW5nKCkgfVxyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2Uuc2V0VGltZXJGb3JFbmRDb25mZXJlbmNlQ2FsbChwYXlsb2FkKS5zdWJzY3JpYmUoKHJlcykgPT4geyB9KVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb25mPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgbGV0IGNvbmZlcmVuY2UgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5maW5kKChyZXM6IGFueSkgPT4gcmVzPy5jb25mZXJlbmNlSWQgPT0gdGhpcy5zZWxlY3RlZENvbmY/LmNvbmZlcmVuY2VJZClcclxuICAgICAgbGV0IHBhcnRpY2lwZW50SW5mbyA9IGNvbmZlcmVuY2U/LnBhcnRpY2lwYW50cz8uZmluZCgocGFydGljaXBhbnQ6IGFueSkgPT4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LmZyb20pXHJcbiAgICAgICAgJiYgcGFydGljaXBhbnQ/LmNsaWVudCAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJykgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwYXJ0aWNpcGFudD8udG8pICYmIHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnICYmICFwYXJ0aWNpcGFudD8uYnVzaW5lc3NOdW1iZXIgJiYgcGFydGljaXBhbnQ/Lmhvc3QpICYmIHBhcnRpY2lwYW50Py5jbGllbnQpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0KVxyXG4gICAgICBpZiAocGFydGljaXBlbnRJbmZvPy5pZCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5NdWx0aXBsZUNvbmZlcmVuY2VzKCkpIHtcclxuICAgICAgICAgIC8vIFNob3cgcG9wdXAgaW5zdGVhZCBvZiBkaXJlY3RseSBsZWF2aW5nXHJcbiAgICAgICAgICB0aGlzLmxlYXZlQ29uZlBhcnRpY2lwYW50ID0gcGFydGljaXBlbnRJbmZvO1xyXG4gICAgICAgICAgdGhpcy5sZWF2ZUNvbmZDb25mZXJlbmNlTmFtZSA9IHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0LmZpbmQoKGM6IGFueSkgPT4gYy5jb25mZXJlbmNlSWQgPT09IGNvbmZlcmVuY2UuY29uZmVyZW5jZUlkKT8uY2FsbExhYmVsIHx8ICdDb25mZXJlbmNlJztcclxuICAgICAgICAgIHRoaXMuc2hvd0xlYXZlQ29uZmlybWF0aW9uTW9kYWwgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm9uRW5kQ2FsbChwYXJ0aWNpcGVudEluZm8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vbkVuZENhbGwodGhpcy5ob3N0bnVtYmVyKTtcclxuICAgIH1cclxuICB9XHJcbiAgY29udmVydEhITU1Ub01pbnV0ZXModGltZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IFtob3VycywgbWludXRlc10gPSB0aW1lLnNwbGl0KCc6JykubWFwKE51bWJlcik7XHJcbiAgICByZXR1cm4gKGhvdXJzICogNjApICsgbWludXRlcztcclxuICB9XHJcblxyXG4gIG9uUmVqZWN0Q2FsbChjYWxsSW5mbzogYW55KSB7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgY2hhbm5lbElkOiBlbnZpcm9ubWVudC5jaGFubmVsSWQsXHJcbiAgICAgIHJlY29yZElkOiBjYWxsSW5mbz8uaWQsXHJcbiAgICAgIGlwQWRkcmVzczogJycsXHJcbiAgICAgIGlwQ291bnRyeTogJycsXHJcbiAgICAgIGNhbGxTdGF0dXM6ICdubycsXHJcbiAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICB1c2VySWQ6ICB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgIGNvbXBhbnlJZDogJycsXHJcbiAgICAgIGNsaWVudFNpZDogY2FsbEluZm8/LmNsaWVudFNpZCxcclxuICAgICAgY29uZmVyZW5jZUlkOiBjYWxsSW5mbz8uY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAgIH1cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5zZXRJbmNvbWluZ0NhbGxTdGF0dXMocGF5bG9hZCkuc3Vic2NyaWJlKGFzeW5jIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigocmVzOiBhbnkpID0+IHJlcz8uaWQgIT0gY2FsbEluZm8/LmlkKTtcclxuICAgICAgdGhpcy5vbkNsb3NlQzJDSW5mb1BhbmVsKCk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pXHJcbiAgfVxyXG4gIFxyXG4gIGlzU2VsZk51bWJlcihwYXJ0aWNpcGFudDogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VOdW1iZXJMaXN0LmZpbmQoKHJlczogYW55KSA9PiByZXMgPT0gKHBhcnRpY2lwYW50Py5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gcGFydGljaXBhbnQ/LmZyb20gOiBwYXJ0aWNpcGFudD8udG8pKTtcclxuICB9XHJcblxyXG4gIHNob3VsZFNob3dTZXBhcmF0b3IoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdmlzaWJsZUNvdW50ID0gdGhpcy5jdXJyZW50Q2FsbExpc3Quc2xpY2UoMCwgaW5kZXgpLmZpbHRlcigoY2FsbDogYW55KSA9PiAhY2FsbD8uaXNDb25mZXJlbmNlSG9sZCkubGVuZ3RoO1xyXG4gICAgcmV0dXJuIHZpc2libGVDb3VudCA+IDA7XHJcbiAgfVxyXG5cclxuICBvbkNsb3NlQzJDSW5mb1BhbmVsKCkge1xyXG4gICAgLy8gdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICBsZXQgYnVzaW5lc3NJbmZvID0gdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGw/LnBhcnRpY2lwYW50cy5maW5kKChpdGVtOiBhbnkpID0+ICEhaXRlbT8uYnVzaW5lc3NOdW1iZXIgJiYgdGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGl0ZW0/LnRvKSAmJiAhaXRlbT8uaG9zdCk7XHJcbiAgICBpZihidXNpbmVzc0luZm8pIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZChyZXMgPT4gYnVzaW5lc3NJbmZvPy5pZCA9PSByZXM/LmlkKTtcclxuICAgICAgdGhpcy50b2dnbGVDMkNJbmZvUGFuZWwodGhpcy5zZWxlY3RlZFVzZXJJbmZvKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZShudW1iZXI6IGFueSkge1xyXG4gICAgICBsZXQgY29udGFjdEluZm8gPSB0aGlzLmNvbnRhY3RzLmZpbmQoKGM6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyICA9PSBudW1iZXIgfHwgYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlciA9PSBudW1iZXI7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gY29udGFjdEluZm8/LmZpcnN0TmFtZSB8fCBjb250YWN0SW5mbz8ubGFzdE5hbWUgPyBgJHtjb250YWN0SW5mbz8uZmlyc3ROYW1lIHx8ICcnfSAke2NvbnRhY3RJbmZvPy5sYXN0TmFtZSB8fCAnJ31gIDogbnVsbFxyXG4gIH1cclxuICBcclxuICBnZXRJbWcobnVtYmVyOiBhbnkpIHtcclxuICAgIGxldCBjb250YWN0SW5mbyA9IHRoaXMuY29udGFjdHMuZmluZCgoYzogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyICA9PSBudW1iZXIgfHwgYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlciA9PSBudW1iZXI7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb250YWN0SW5mbz8uaW1hZ2UgfHwgbnVsbFxyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3dFbmRBbGxCdXR0b24oKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhY3RpdmVQYXJ0aWNpcGFudHMgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKGM6IGFueSkgPT4gIWMuaXNMZWZ0KTtcclxuICAgIHJldHVybiBhY3RpdmVQYXJ0aWNpcGFudHMubGVuZ3RoID4gMjtcclxuICB9XHJcbiAgY29uZmlybUxlYXZlUGFydGljaXBhbnQoYzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5pc0luTXVsdGlwbGVDb25mZXJlbmNlcygpKSB7XHJcbiAgICAgIHRoaXMubGVhdmVDb25mUGFydGljaXBhbnQgPSBjO1xyXG4gICAgICB0aGlzLmxlYXZlQ29uZkNvbmZlcmVuY2VOYW1lID0gdGhpcy5jb25mZXJlbmNlQ2FsbExpc3QuZmluZChcclxuICAgICAgICAoY29uZjogYW55KSA9PiBjb25mLmNvbmZlcmVuY2VJZCA9PT0gYy5jb25mZXJlbmNlSWRcclxuICAgICAgKT8uY2FsbExhYmVsIHx8ICdDb25mZXJlbmNlJztcclxuICAgICAgdGhpcy5zaG93TGVhdmVDb25maXJtYXRpb25Nb2RhbCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9uRW5kQ2FsbChjLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzSW5NdWx0aXBsZUNvbmZlcmVuY2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNvdW50ID0gMDtcclxuICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZm9yRWFjaCgoY29uZjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGNvbmYpO1xyXG4gICAgICBjb25zdCBvdXJQYXJ0aWNpcGFudCA9IGNvbmYucGFydGljaXBhbnRzPy5maW5kKChwOiBhbnkpID0+XHJcbiAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocD8uZnJvbSkgJiYgcD8uY2xpZW50KSB8fFxyXG4gICAgICAgICAgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhwPy50bykgJiYgcD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiAhcD8uYnVzaW5lc3NOdW1iZXIpKSAmJlxyXG4gICAgICAgICFwPy5pc0xlZnRcclxuICAgICAgKTtcclxuICAgICAgY29uc29sZS5sb2cob3VyUGFydGljaXBhbnQpO1xyXG4gICAgICBpZiAob3VyUGFydGljaXBhbnQpIGNvdW50Kys7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb3VudCA+IDE7XHJcbiAgfVxyXG4gIGNvbmZpcm1MZWF2ZSgpIHtcclxuICAgIGlmICh0aGlzLmxlYXZlQ29uZlBhcnRpY2lwYW50KSB7XHJcbiAgICAgIHRoaXMub25FbmRDYWxsKHRoaXMubGVhdmVDb25mUGFydGljaXBhbnQsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd0xlYXZlQ29uZmlybWF0aW9uTW9kYWwgPSBmYWxzZTtcclxuICAgIHRoaXMubGVhdmVDb25mUGFydGljaXBhbnQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsTGVhdmUoKSB7XHJcbiAgICB0aGlzLnNob3dMZWF2ZUNvbmZpcm1hdGlvbk1vZGFsID0gZmFsc2U7XHJcbiAgICB0aGlzLmxlYXZlQ29uZlBhcnRpY2lwYW50ID0gbnVsbDtcclxuICB9XHJcbiAgZ2V0IGFjdGl2ZVBhcnRpY2lwYW50c0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q/LmZpbHRlcigocDogYW55KSA9PiAhcC5pc0xlZnQpLmxlbmd0aCB8fCAwO1xyXG4gIH1cclxuICB0cnVuY2F0ZVRleHQodGV4dDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRleHQpIHJldHVybiAnJztcclxuICAgIHJldHVybiB0ZXh0Lmxlbmd0aCA+IG1heExlbmd0aCA/IHRleHQuc3Vic3RyaW5nKDAsIG1heExlbmd0aCkgKyAnLi4uJyA6IHRleHQ7XHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxQYXJ0aWNpcGFudHNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsUGFydGljaXBlbnRMaXN0Py5sZW5ndGggfHwgMDtcclxuICB9XHJcbiAgb25SZWFzb25DaGVja0NoYW5nZWQobmV3VmFsdWU6Ym9vbGVhbikge1xyXG4gICAgaWYgKCFuZXdWYWx1ZSkge1xyXG4gICAgICB0aGlzLnNob3dIb3VyRHJvcGRvd24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zaG93TWludXRlRHJvcGRvd24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5sZWF2ZUhvdXIgPSAnJztcclxuICAgICAgdGhpcy5sZWF2ZU1pbnV0ZSA9ICcnO1xyXG4gICAgICB0aGlzLmxlYXZlUmVhc29uID0gJyc7IFxyXG4gICAgfVxyXG4gIH1cclxuICByZXNldExlYXZlVGltZXIoKSB7XHJcbiAgICB0aGlzLmlzUmVhc29uQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5sZWF2ZUhvdXIgPSAnJztcclxuICAgIHRoaXMubGVhdmVNaW51dGUgPSAnJztcclxuICAgIHRoaXMubGVhdmVSZWFzb24gPSAnJztcclxuICAgIHRoaXMuc2hvd0hvdXJEcm9wZG93biA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93TWludXRlRHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmNhbGxEYXRhLmRpYWwgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsbC1jb250YWluZXJcIiAqbmdJZj1cIiFpc01pbmltaXNlZCAmJiBjdXJyZW50Q2FsbExpc3Q/Lmxlbmd0aFwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydjb2xsb3BzJzogaXNDb2xsb3BzLCAnaW5jb21pbmctY2FsbC1jb250YWluZXInOiBpc0NsaWNrRXhwYW5kLCAnY29udGFjdHMtb3Blbic6IHNob3dDb250YWN0c1BhbmVsIH1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGVyLXdyYXBwZXIgb3V0Z29pbmctY2FsbC1sb2FkZXJcIlxyXG4gICAgICAgICAgICAqbmdJZj1cInNob3dOZXdDYWxsTG9hZGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3RpdmUtY2FsbFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgcG9zaXRpb246IHJlbGF0aXZlO1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYW5pbWF0aW9uIGNhbGwtYW5pbWF0aW9uLXBsYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiIFtzcmNdPVwibmV3Q2FsbExvYWRlckRhdGE/LmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbGVyRGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMSBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDtcIj5Db25uZWN0aW5nLi4uPC9oMT5cclxuICAgICAgICAgICAgICAgICAgICA8cCBzdHlsZT1cInRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1wiPnt7IG5ld0NhbGxMb2FkZXJEYXRhPy5uYW1lIHx8IG5ld0NhbGxMb2FkZXJEYXRhPy5waG9uZSB8fCAnVW5rbm93bicgfX08L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFjdGlvbi1idG5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0biBlbmQtY2FsbC1idG5cIiBkaXNhYmxlZCAoY2xpY2spPVwiZW5kQ2FsbCgpXCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbHBhZC1hbGVydHNcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAnY29uZmVyZW5jZS1hbGVydCc6IGlzQ29uZmVyZW5jZSAmJiBjdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlLFxyXG4gICAgICAgICdub3JtYWwtY2FsbC1hbGVydCc6ICFpc0NvbmZlcmVuY2VcclxuICAgICAgICB9XCIgKm5nSWY9XCJjYWxsTnVtYmVyVG9hc3Quc2hvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbGJveC1wb3AxIGFsZXJ0IGZhZGUgc2hvd1wiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjYWxsTnVtYmVyVG9hc3QudHlwZVwiXHJcbiAgICAgICAgICAgICAgICByb2xlPVwiYWxlcnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgdGV4dC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgWW91J3IgY2FsbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3tjYWxsTnVtYmVyVG9hc3QuZGlzcGxheU51bX19PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tZGlzYyBwLTAgcHgtMVwiPiBDYW5jZWwgQ2FsbCA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gQWxsIHR5cGUgQ2FsbCBIb2xkIGxpc3QgIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtYmFubmVyXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIoY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgISFjdXJyZW50Q2FsbCAmJiAoKGlzQ29uZmVyZW5jZUNhbGxIb2xkIHx8IGlzQ29uZmVyZW5jZSkgfHwgIWlzQ29uZmVyZW5jZSkpIHx8ICFpc0FsbEFjY2VwdGVkXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbmYgb2YgY3VycmVudENhbGxMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsLWNvbnRlbnRcIiAqbmdJZj1cIiFjb25mPy5pc0FjY2VwdENhbGwgJiYgY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjb25mPy50bykgJiYgY29uZj8uaXNOb3RpZmljYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaGVsZC1jYWxsLXNlbGVjdGVkJzogc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCAmJiBzZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkID09PSBjb25mPy5wYXJ0aWNpcGFudElkfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmY/LmJ1c2luZXNzTnVtYmVyID8gdG9nZ2xlQzJDSW5mb1BhbmVsKGNvbmYpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjdXJzb3InOiBjb25mPy5idXNpbmVzc051bWJlciA/ICdwb2ludGVyJyA6ICdkZWZhdWx0J31cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nLXdyYXBwZXIgYm9yZGVyLXJhZGl1cy01MFwiIFtzcmNdPVwiY29uZj8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIHdpZHRoPVwiMzVcIiBoZWlnaHQ9XCIzNVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsZXJcIiAqbmdJZj1cIiFjb25mPy5idXNpbmVzc051bWJlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLWxhYmVsXCI+e3tjb25mPy5mcm9tfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPnt7Y29uZj8uZnJvbU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGxlclwiICpuZ0lmPVwiY29uZj8uYnVzaW5lc3NOdW1iZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1tYWluLWxhYmVsXCI+Q2FsbCBmcm9tIEMyQzo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbGFiZWxcIiA+PHNwYW4gW3RpdGxlXT1cImNvbmY/LnNvdXJjZU5hbWVcIj57eyB0cnVuY2F0ZVRleHQoY29uZj8uc291cmNlTmFtZSwgMTApIH19PC9zcGFuPnxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbdGl0bGVdPVwiY29uZj8ucG9pbnROYW1lXCI+e3sgdHJ1bmNhdGVUZXh0KGNvbmY/LnBvaW50TmFtZSwgMTApIH19PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1sYWJlbFwiPnt7IHRydW5jYXRlVGV4dChjb25mPy5uYW1lLCAyNikgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQ29ubmVjdGluZ0luY29taW5nQ2FsbElkID09IGNvbmY/LmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ubmVjdGluZy13cmFwcGVyICBtci0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyaW5naW5nLXRleHRcIj5Db25uZWN0aW5nPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG90c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IHJlY2VpdmUtYnRuXCIgKGNsaWNrKT1cIndhaXRpbmdDYWxsQWNjZXB0KGNvbmYpXCIgW2Rpc2FibGVkXT1cImlzQ29ubmVjdGluZyB8fCBpc0luY29taW5nQ2FsbEJ0bkRpc2FibGVcIiAqbmdJZj1cImlzQ29ubmVjdGluZ0luY29taW5nQ2FsbElkICE9PSBjb25mPy5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtY29udGFjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgdGl0bGU9XCJDYWxsIEVuZFwiIChjbGljayk9XCJvblJlamVjdENhbGwoY29uZik7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbmY/LmJ1c2luZXNzTnVtYmVyXCIgY2xhc3M9XCJ0b2dnbGVhcnJvdy1hcnJvdyBtZS0yXCIgaWQ9XCJ0b2dnbGVhcnJvd1wiIChjbGljayk9XCJ0b2dnbGVDMkNJbmZvUGFuZWwoY29uZilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mb1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbmYgb2YgY29uZmVyZW5jZUNhbGxMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsLWNvbnRlbnRcIiAqbmdJZj1cImNvbmY/LmlzQ29uZmVyZW5jZUhvbGQgJiYgY29uZmVyZW5jZUNhbGxMaXN0Lmxlbmd0aCA+IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaGVsZC1jYWxsLXNlbGVjdGVkJzogY29uZj8uaXNCdXNpbmVzc051bWJlciAmJiBzZWxlY3RlZFVzZXJJbmZvPy5wYXJ0aWNpcGFudElkID09PSBjb25mPy5idXNpbmVzc1BhcnRpY2lwYW50SWQgJiYgaXNDbGlja0V4cGFuZH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25mPy5pc0J1c2luZXNzTnVtYmVyID8gdG9nZ2xlQzJDSW5mb1BhbmVsKGNvbmYpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjdXJzb3InOiBjb25mPy5pc0J1c2luZXNzTnVtYmVyID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGhvbGQtaWNvblwiPnBhdXNlX2NpcmNsZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbGFiZWxcIj5Ib2xkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLW5hbWVcIj57e2NvbmY/LmNhbGxMYWJlbH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWhvbGQtY29udGFjdFwiIFtuZ0NsYXNzXT1cInsgJ29uLWhvbGQnOiBjb25mPy5pc0NvbmZlcmVuY2VIb2xkIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN3YXBDYWxscyhjb25mLHRydWUpXCIgW2Rpc2FibGVkXT1cImlzSG9sZEJ0bkRpc2FibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29uZj8uaXNDb25mZXJlbmNlSG9sZFwiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIFt0aXRsZV09XCInUmVzdW1lJ1wiPiByZXN1bWUgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtY29udGFjdFwiIChjbGljayk9XCJlbmRDb25mZXJlbmVjZUNhbGwoY29uZik7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZWFycm93LWFycm93IG1lLTJcIiBpZD1cInRvZ2dsZWFycm93XCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwoY29uZilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtcmlnaHRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEZvciBzaW5nbGUgaW5jb21pbmcgY2FsbCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaC0xMDAgcHktNVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIlxyXG4gICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPT09IDEgJiYgY3VycmVudENhbGxMaXN0WzBdPy5pc0luY29taW5nQ2FsbCAmJiAhY3VycmVudENhbGxMaXN0WzBdPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY2FsbFRvTnVtXCI+SW5jb21pbmcgY2FsbCBvbiA8YnIgLz48c3Bhbj57e2N1cnJlbnRDYWxsTGlzdFswXT8udG8gfHwgJ1Vua25vd24gTnVtYmVyJ319PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsVG9OdW1cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50Q2FsbExpc3RbMF0/LmJ1c2luZXNzTnVtYmVyOyBlbHNlIG5vcm1hbENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICBDMkMgQ0FMTFxyXG4gICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPiBGcm9tIDoge3sgY3VycmVudENhbGxMaXN0WzBdPy5zb3VyY2VOYW1lIH19IHwge3sgY3VycmVudENhbGxMaXN0WzBdPy5wb2ludE5hbWUgfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxDYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIEluY29taW5nIGNhbGwgb25cclxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjdXJyZW50Q2FsbExpc3RbMF0/LnRvIHx8ICdVbmtub3duIE51bWJlcicgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYW5pbWF0aW9uXCIgW25nQ2xhc3NdPVwieydjYWxsLWFuaW1hdGlvbi1wbGF5Jzogc2hvd1JpbmdBbmltYXRpb259XCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiIFtzcmNdPVwiaW5jb21pbmdGcm9tSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgd2lkdGg9XCIxMjBcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIiAqbmdJZj1cIiFjdXJyZW50Q2FsbExpc3RbMF0/LmJ1c2luZXNzTnVtYmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8aDE+e3sgY3VycmVudENhbGxMaXN0WzBdPy5uYW1lID8gY3VycmVudENhbGxMaXN0WzBdPy5uYW1lIDogY3VycmVudENhbGxMaXN0WzBdPy5waG9uZSB8fCAnVW5rbm93biBOdW1iZXInIH19PC9oMT5cclxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiISFjdXJyZW50Q2FsbExpc3RbMF0/Lm5hbWVcIj57eyBjdXJyZW50Q2FsbExpc3RbMF0/LnBob25lIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIiAqbmdJZj1cImN1cnJlbnRDYWxsTGlzdFswXT8uYnVzaW5lc3NOdW1iZXJcIj5cclxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiISFjdXJyZW50Q2FsbExpc3RbMF0/Lm5hbWVcIj57eyB0cnVuY2F0ZVRleHQoY3VycmVudENhbGxMaXN0WzBdPy5uYW1lLCA0NSkgfX08L3A+XHJcbiAgICAgICAgICAgICAgICA8cCA+e3sgY3VycmVudENhbGxMaXN0WzBdPy5udW1iZXIgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIENvbm5lY3Rpbmcgb3ZlcmxheSAoc2hvd24gYWZ0ZXIgYWNjZXB0IGJ0biBjbGljaywgaGlkZGVuIG9uIEFQSSByZXNwb25zZSkgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25uZWN0aW5nLW92ZXJsYXkgbXQtYXV0b1wiICpuZ0lmPVwiaXNDb25uZWN0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ubmVjdGluZy1kb3RzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY29ubmVjdGluZy10ZXh0XCI+Q29ubmVjdGluZy4uLjwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hY3Rpb24tYnRucyBtdC1hdXRvXCIgKm5nSWY9XCIhaXNDb25uZWN0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gcmVjZWl2ZS1idG5cIiAqbmdJZj1cIiFuZXdJbmNvbWluZ0NhbGxzTGlzdFswXT8uaXNDYWxsQ29ubmVjdGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNJbmNvbWluZ0NhbGxCdG5EaXNhYmxlXCIgKGNsaWNrKT1cImFkZChjdXJyZW50Q2FsbExpc3RbMF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gcmVqZWN0LWJ0blwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIChjbGljayk9XCJvblJlamVjdENhbGwoY3VycmVudENhbGxMaXN0WzBdKVwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gRm9yIHNpbmdsZSBhY3RpdmUgY2FsbCAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiKCFpc0NvbmZlcmVuY2UgfHwgaXNDb25mZXJlbmNlQ2FsbEhvbGQpICYmICghIWN1cnJlbnRDYWxsPy5pZCAmJiAhY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZSkgJiYgY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnZGlzcGxheSc6ICdmbGV4JywgJ2ZsZXgtZGlyZWN0aW9uJzogJ2NvbHVtbicsICdwb3NpdGlvbic6ICdyZWxhdGl2ZSd9XCIgY2xhc3M9XCJhY3RpdmUtY2FsbFwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRVc2VySW5mbz8uYnVzaW5lc3NOdW1iZXI7XCIgY2xhc3M9XCJjYWxsVG9OdW1cIj5cclxuICAgICAgICAgICAgICAgICAgICBDMkMgQ0FMTFxyXG4gICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPiBGcm9tIDoge3sgc2VsZWN0ZWRVc2VySW5mbz8uc291cmNlTmFtZSB9fSB8IHt7IHNlbGVjdGVkVXNlckluZm8/LnBvaW50TmFtZSB9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hbmltYXRpb25cIiBbbmdDbGFzc109XCJ7J2NhbGwtYW5pbWF0aW9uLXBsYXknOiBzaG93UmluZ0FuaW1hdGlvbn1cIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nXCIgKm5nSWY9XCIhY3VycmVudENhbGw/LmNsaWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGN1cnJlbnRDYWxsPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGN1cnJlbnRDYWxsPy5mcm9tSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nXCIgKm5nSWY9XCJjdXJyZW50Q2FsbD8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY3VycmVudENhbGw/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycgOiBjdXJyZW50Q2FsbD8udG9JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIj5cclxuICAgICAgICAgICAgPCEtLSBDMkMgQnVzaW5lc3MgQ2FsbCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFVzZXJJbmZvPy5idXNpbmVzc051bWJlcjsgZWxzZSBub3JtYWxDYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgxPnt7IHNlbGVjdGVkVXNlckluZm8/Lm5hbWUgfX08L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPnt7IHNlbGVjdGVkVXNlckluZm8/Lm51bWJlciB9fTwvcD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gTm9ybWFsIENhbGwgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vcm1hbENhbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgxICpuZ0lmPVwiIWN1cnJlbnRDYWxsPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOic4cHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjdXJyZW50Q2FsbD8udG9OYW1lIHx8IG91dGdvaW5nQ29udGFjdE5hbWUgfHwgJ1Vua25vd24nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN1cnJlbnRDYWxsPy5mcm9tTmFtZSB8fCAnVW5rbm93bicgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMSAqbmdJZj1cImN1cnJlbnRDYWxsPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOic4cHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjdXJyZW50Q2FsbD8uZnJvbU5hbWUgfHwgJ1Vua25vd24nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN1cnJlbnRDYWxsPy50b05hbWUgfHwgJ1Vua25vd24nIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9oMT5cclxuICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIiFjdXJyZW50Q2FsbD8uY2xpZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGN1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGN1cnJlbnRDYWxsPy50b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50Q2FsbD8uZnJvbSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImN1cnJlbnRDYWxsPy5jbGllbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY3VycmVudENhbGw/LmZyb21cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudENhbGw/LnRvIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGgxICpuZ0lmPVwiIWN1cnJlbnRDYWxsPy5jbGllbnRcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnOHB4J31cIj57e2N1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY3VycmVudENhbGw/LnRvTmFtZSB8fCBvdXRnb2luZ0NvbnRhY3ROYW1lIHx8ICdVbmtub3duJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENhbGw/LmZyb21OYW1lIHx8ICdVbmtub3duJ319PC9oMT5cclxuICAgICAgICAgICAgICAgIDxoMSAqbmdJZj1cImN1cnJlbnRDYWxsPy5jbGllbnRcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnOHB4J31cIj57e2N1cnJlbnRDYWxsPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gY3VycmVudENhbGw/LmZyb21OYW1lIHx8ICdVbmtub3duJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENhbGw/LnRvTmFtZSB8fCAnVW5rbm93bid9fTwvaDE+XHJcbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIiFjdXJyZW50Q2FsbD8uY2xpZW50XCI+e3sgY3VycmVudENhbGw/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjdXJyZW50Q2FsbD8udG8gfHwgJ1Vua25vd24nIDogY3VycmVudENhbGw/LmZyb20gfHwgJ1Vua25vd24nfX08L3A+XHJcbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImN1cnJlbnRDYWxsPy5jbGllbnRcIj57eyBjdXJyZW50Q2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGN1cnJlbnRDYWxsPy5mcm9tIHx8ICdVbmtub3duJyA6IGN1cnJlbnRDYWxsPy50byB8fCAnVW5rbm93bid9fTwvcD4gLS0+XHJcbiAgICAgICAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW4tdG9wOiA0cHhcIj57eyB0aW1lcn19PC9oND5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYWN0aW9uLWJ0bnNcIiAqbmdJZj1cIiFzaG93S2V5cGFkXCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzIwcHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1idG4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gc3RhcnQtc3RvcFwiICpuZ0lmPVwiIWlzUmVjb3JkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydyZWNvcmRpbmcnOiBpc1JlY29yZGluZywgJ3N0b3BwZWQnOiAhaXNSZWNvcmRpbmcsICdkaXNhYmxlZCc6IHVzZXJTZXR0aW5nSW5mbz8uY2FsbFJlY29yZGluZyA9PSAnTid9XCIgKGNsaWNrKT1cInRvZ2dsZVJlY29yZGluZygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImlzUmVjb3JkaW5nID8gJ1N0b3AgUmVjb3JkaW5nJyA6ICdTdGFydCBSZWNvcmRpbmcnXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsIHx8IHVzZXJTZXR0aW5nSW5mbz8uY2FsbFJlY29yZGluZyA9PSAnTidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWNvcmRpbmctaWNvblwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGF1c2UtcmVzdW1lLWJ0bnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJpc1JlY29yZGluZyAmJiAhaXNQYXVzZWRcIiAoY2xpY2spPVwicGF1c2VSZWNvcmRpbmcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBhdXNlIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwbGF5X2Fycm93IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1JlY29yZGluZ1wiIGNsYXNzPVwidGltZXItZGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZFRpbWUoKSB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIE11dGUvdW5tdXRlIGluY29taW5nIGNhbGwgIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXV0ZS1pbmNvbWluZy1yb3dcIiAqbmdJZj1cImN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGwgJiYgIXNob3dLZXlwYWRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXV0ZS1pbmNvbWluZy1sYWJlbFwiPk11dGUgaW5jb21pbmcgY2FsbHM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzd2l0Y2ggbWItMFwiIHRpdGxlPVwiU2lsZW5jZSB0aGUgcmluZ3RvbmUgb2YgbmV3IGluY29taW5nIGNhbGxzIGR1cmluZyB0aGlzIGNhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwidHdpbGlvU2VydmljZS5pc0luY29taW5nTXV0ZWRcIiAoY2hhbmdlKT1cInRvZ2dsZU11dGVJbmNvbWluZ0NhbGwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3dpdGNoLXNsaWRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0tleXBhZFwiIGNsYXNzPVwic2VuZERpZ2l0XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2FsbC1pbnB1dHNcIiBpZD1cImNhbGwtaW5wdXRcIiBbKG5nTW9kZWwpXT1cImNhbGxJbnB1dFwiIChrZXl1cCk9XCJvbkNhbGxJbnB1dEVudGVyKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpbnB1dC1jbGVhci1idG5cIiAqbmdJZj1cImNhbGxJbnB1dFwiIChjbGljayk9XCJjbGVhcklucHV0cygpXCI+Y2xvc2Vfc21hbGw8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRhaW5lciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJzaG93S2V5cGFkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5LWJ0blwiICpuZ0Zvcj1cImxldCBrZXkgb2Yga2V5cGFkVmFsXCIgKGNsaWNrKT1cIm9uQ2FsbElucHV0cyhrZXkubnVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7a2V5Lm51bX19XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidG4tYWxiaGFiZXRzXCI+e3trZXkudGV4dCA/IGtleS50ZXh0IDogJyZuYnNwOyd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFjdGlvbi1idG5zXCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzcyM3gnfVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1ldmVubHkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLXNlYy1idG4gbXItM1wiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiIChjbGljayk9XCJ0b2dnbGVNdXRlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJpc011dGVcIj4gbWljX29mZiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiIWlzTXV0ZVwiPiBtaWMgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLXNlYy1idG4gbXItM1wiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwidG9nZ2xlS2V5cGFkKClcIj4gdHJhbnNpdGlvbl9kaXNzb2x2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtc2VjLWJ0blwiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKGN1cnJlbnRDYWxsKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzXzIgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0biBlbmQtY2FsbC1idG5cIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIiAoY2xpY2spPVwiZW5kQ2FsbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gY29uZmVyZW5jZSBjYWxsIHZpZXcgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZlcmVuY2UtY2FsbC12aWV3XCIgKm5nSWY9XCJpc0NvbmZlcmVuY2VcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmYtaGVhZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25mLWljb24gbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBncm91cHMgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25mLXRpdGxlXCI+Q29uZmVyZW5jZSBDYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGwtdGV4dCBjb25mLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYWxsIG9mIGN1cnJlbnRDYWxsTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNhbGw/LmlzQ29uZmVyZW5jZUhvbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvdWxkU2hvd1NlcGFyYXRvcihpKVwiPiAmIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY2FsbD8uY2xpZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1NlbGZOdW1iZXIoY2FsbCkgZWxzZSBzZWxmTnVtYmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7Y2FsbD8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGNhbGw/LmZyb21OYW1lIHx8IGNhbGw/LmZyb20gOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsPy50b05hbWUgfHwgY2FsbD8udG99fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NlbGZOdW1iZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPllvdTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhY2FsbD8uY2xpZW50XCI+e3tjYWxsPy5kaXJlY3Rpb24gPT0gXCJvdXRnb2luZy1jYWxsXCIgPyBjYWxsPy50b05hbWUgfHwgY2FsbD8udG8gOiBjYWxsPy5mcm9tTmFtZSB8fCBjYWxsPy5mcm9tIHx8ICdVbmtub3duIG51bWJlcid9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLXRpbWVyXCI+e3sgY3VycmVudENvbmZlcmVuY2VDYWxsPy50aW1lciB8fCB0aW1lciB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWFjdGlvbi1idG5zIG10LWF1dG9cIiAqbmdJZj1cIiFzaG93S2V5cGFkXCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzIwcHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1idG4tY29udGFpbmVyXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHN0YXJ0LXN0b3BcIiAqbmdJZj1cIiFpc1JlY29yZGluZ1wiIFtkaXNhYmxlZF09XCJ1c2VyU2V0dGluZ0luZm8uY2FsbFJlY29yZGluZyA9PSAnTidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3JlY29yZGluZyc6IGlzUmVjb3JkaW5nLCAnc3RvcHBlZCc6ICFpc1JlY29yZGluZywgJ2Rpc2FibGVkJzogdXNlclNldHRpbmdJbmZvPy5jYWxsUmVjb3JkaW5nID09ICdOJ31cIiAoY2xpY2spPVwidG9nZ2xlUmVjb3JkaW5nKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXNSZWNvcmRpbmcgPyAnU3RvcCBSZWNvcmRpbmcnIDogJ1N0YXJ0IFJlY29yZGluZydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWNvcmRpbmctaWNvblwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGF1c2UtcmVzdW1lLWJ0bnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJpc1JlY29yZGluZyAmJiAhaXNQYXVzZWRcIiAoY2xpY2spPVwicGF1c2VSZWNvcmRpbmcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBhdXNlIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwbGF5X2Fycm93IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1JlY29yZGluZ1wiIGNsYXNzPVwidGltZXItZGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZFRpbWUoKSB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIE11dGUvdW5tdXRlIGluY29taW5nIGNhbGwgIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXV0ZS1pbmNvbWluZy1yb3dcIiAqbmdJZj1cImN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGwgJiYgIXNob3dLZXlwYWRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXV0ZS1pbmNvbWluZy1sYWJlbFwiPk11dGUgaW5jb21pbmcgY2FsbHM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzd2l0Y2ggbWItMFwiIHRpdGxlPVwiU2lsZW5jZSB0aGUgcmluZ3RvbmUgb2YgbmV3IGluY29taW5nIGNhbGxzIGR1cmluZyB0aGlzIGNhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwidHdpbGlvU2VydmljZS5pc0luY29taW5nTXV0ZWRcIiAoY2hhbmdlKT1cInRvZ2dsZU11dGVJbmNvbWluZ0NhbGwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3dpdGNoLXNsaWRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0tleXBhZFwiIGNsYXNzPVwic2VuZERpZ2l0IG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJjYWxsLWlucHV0c1wiIGlkPVwiY2FsbC1pbnB1dFwiIFsobmdNb2RlbCldPVwiY2FsbElucHV0XCIgKGtleXVwKT1cIm9uQ2FsbElucHV0RW50ZXIoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGlucHV0LWNsZWFyLWJ0blwiICpuZ0lmPVwiY2FsbElucHV0XCIgKGNsaWNrKT1cImNsZWFySW5wdXRzKClcIj5jbG9zZV9zbWFsbDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29udGFpbmVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cInNob3dLZXlwYWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXktYnRuXCIgKm5nRm9yPVwibGV0IGtleSBvZiBrZXlwYWRWYWxcIiAoY2xpY2spPVwib25DYWxsSW5wdXRzKGtleS5udW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3trZXkubnVtfX1cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1hbGJoYWJldHNcIj57e2tleS50ZXh0ID8ga2V5LnRleHQgOiAnJm5ic3A7J319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0blwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNNdXRlfVwiIChjbGljayk9XCJ0b2dnbGVNdXRlKHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHt7IGlzTXV0ZSA/ICdtaWNfb2ZmJyA6ICdtaWMnIH19IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlS2V5cGFkKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gdHJhbnNpdGlvbl9kaXNzb2x2ZSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZUNvbnRhY3RzUGFuZWwoY3VycmVudENhbGwpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGdyb3Vwc18yIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmYtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0biBkYW5nZXJcIiAoY2xpY2spPVwiZW5kQ29uZmVyZW5lY2VDYWxsKGN1cnJlbnRDb25mZXJlbmNlQ2FsbD8ucGFydGljaXBhbnRzWzBdKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3YXZlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwid2F2ZXNcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcclxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDI0IDE1MCAyOFwiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJub25lXCIgc2hhcGUtcmVuZGVyaW5nPVwiYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggaWQ9XCJnZW50bGUtd2F2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNLTE2MCA0NGMzMCAwIDU4LTE4IDg4LTE4cyA1OCAxOCA4OCAxOCA1OC0xOCA4OC0xOCA1OCAxOCA4OCAxOCB2NDRoLTM1MnpcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgPGcgY2xhc3M9XCJwYXJhbGxheFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCIwXCIgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC43KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjNcIiBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjUpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiN1wiIGZpbGw9XCIjZmZmXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEluY29taW5nIGNhbGwgdXNlciBkZXRhaWxzIHNob3duIGluIG1vZGVsIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGwtY29udGFpbmVyLW1vZGVsIHAtMyB0ZXh0LXdoaXRlIG1vZGVsLWNvbnRlbnQgY2FsbC1jb250YWluZXJcIiAqbmdJZj1cImlzQ2xpY2tFeHBhbmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2xvc2UtaW5mby1wYW5lbC1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIiAqbmdJZj1cImN1cnJlbnRDb25mZXJlbmNlQ2FsbD8uY29uZmVyZW5jZUlkICE9IHNlbGVjdGVkVXNlckluZm8/LmNvbmZlcmVuY2VJZCAmJiBuZXdJbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoID4gMVwiPlxyXG4gICAgICAgICAgICAgICAgPHA+PC9wPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuIFwiIChjbGljayk9XCJvbkNsb3NlQzJDSW5mb1BhbmVsKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIyNHB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNmZmZmZmZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJtMjU2LTIwMC01Ni01NiAyMjQtMjI0LTIyNC0yMjQgNTYtNTYgMjI0IDIyNCAyMjQtMjI0IDU2IDU2LTIyNCAyMjQgMjI0IDIyNC01NiA1Ni0yMjQtMjI0LTIyNCAyMjRaXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgdXNlci1pbmZvLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTNcIj5cclxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtd2hpdGVcIj5DMkMgQ0FMTCA6IHt7c2VsZWN0ZWRVc2VySW5mbz8uc291cmNlTmFtZX19IHwge3tzZWxlY3RlZFVzZXJJbmZvPy5wb2ludE5hbWV9fTwvaDM+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwidGV4dC13aGl0ZSBtYi0xXCI+TmFtZTo8L2g1PlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwidGV4dC13aGl0ZSB1c2VyTmFtZVwiPnt7c2VsZWN0ZWRVc2VySW5mbz8ubmFtZX19PC9oND5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmLTEzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPkV4dGVuc2lvbjo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTJcIj57e3NlbGVjdGVkVXNlckluZm8/LmV4dGVuc2lvbn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5OdW1iZXI6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj57e3NlbGVjdGVkVXNlckluZm8/Lm51bWJlcn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTJcIj5FbWFpbDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tzZWxlY3RlZFVzZXJJbmZvPy5lbWFpbH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiPlN1YmplY3Q6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yIHN1YmplY3QtdGV4dFwiIHRpdGxlPVwie3tzZWxlY3RlZFVzZXJJbmZvPy5zdWJqZWN0fX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRVc2VySW5mbz8uc3ViamVjdH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMiBtYi0xXCI+SW1hZ2U6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVsbGlwc2lzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFVzZXJJbmZvPy5pbWFnZSAmJiBzZWxlY3RlZFVzZXJJbmZvPy5pbWFnZSAhPT0gJy0nOyBlbHNlIG5vSW1hZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cInt7c2VsZWN0ZWRVc2VySW5mbz8uaW1hZ2V9fVwiIGFsdD1cIlwiIHdpZHRoPVwiMTUwXCIgY2xhc3M9XCJtbC0yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ltYWdlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMlwiPk5vIEltYWdlIEF2YWlsYWJsZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+TWVzc2FnZTo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNvbnRhaW5lclwiIFtjbGFzcy5leHBhbmRlZF09XCJpc0V4cGFuZGVkXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5tZXNzYWdlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidG9nZ2xlLWJ0blwiICpuZ0lmPVwic2hvd0J1dHRvblwiIChjbGljayk9XCJ0b2dnbGVUZXh0KClcIj57eyBpc0V4cGFuZGVkID8gJ1NlZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MnIDogJ1NlZSBtb3JlJyB9fTwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBjb250YWN0IGxpc3QgcGFuZWwgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtcGFuZWxcIiAqbmdJZj1cInNob3dDb250YWN0c1BhbmVsICYmICFzaG93TmV3Q2FsbExvYWRlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1sb2FkZXItb3ZlcmxheSBwLTMgdGV4dC1jZW50ZXJcIiAqbmdJZj1cImlzUGFydGljaXBhbnRQYW5lbExvYWRpbmdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHRleHQtc2Vjb25kYXJ5XCIgcm9sZT1cInN0YXR1c1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+TG9hZGluZy4uLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMlwiPjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidG90YWxQYXJ0aWNpcGFudHNDb3VudCA8IDM7IGVsc2UgY29uZkhlYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICBDYWxsIFBhcnRpY2lwYW50c1xyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbmZIZWFkaW5nPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHNlbGVjdGVkQ29uZk5hbWUgfHwgJ0NvbmZlcmVuY2UnIH19IFBhcnRpY2lwYW50c1xyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgIDxwPjwvcD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBkaWFsLWNsb3NlLWJ0blwiIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKHt9LCB0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwMDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0yNTYtMjAwLTU2LTU2IDIyNC0yMjQtMjI0LTIyNCA1Ni01NiAyMjQgMjI0IDIyNC0yMjQgNTYgNTYtMjI0IDIyNCAyMjQgMjI0LTU2IDU2LTIyNC0yMjQtMjI0IDIyNFpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTRUFSQ0ggSU5QVVQgKHZpc2libGUgd2hlbiBpc1NlYXJjaFZpc2libGUgPSB0cnVlKSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWJhciBwLTMgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJBZGQgYSBwYXJ0aWNpcGFudCBieSBOYW1lIG9yIE51bWJlclwiIHRpdGxlPVwiQWRkIGEgcGFydGljaXBhbnQgYnkgTmFtZSBvciBOdW1iZXJcIiBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIiAoaW5wdXQpPVwiYXBwbHlGaWx0ZXIoKVwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtY29udGFjdHMtbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZExpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCJzZWFyY2hUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiIFtzcmNdPVwiYz8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtbmFtZVwiPnt7Yz8uZmlyc3ROYW1lfX0ge3tjPy5taWRkbGVOYW1lfX0ge3tjPy5sYXN0TmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IChjPy5udW1iZXJzTGlzdCAmJiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyKSB9fXt7IGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXJMYWJlbCA/ICcgKCcgKyBjLm51bWJlcnNMaXN0WzBdLm51bWJlckxhYmVsICsgJyknIDogJycgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0biBtci0yXCIgKGNsaWNrKT1cImNhbGxDb250YWN0KGMpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWM/LklzQ29ubmVjdGVkXCIgdGl0bGU9XCJBZGQgdG8gY2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGFkZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0blwiIChjbGljayk9XCJDYWxsVG9VbnNhdmVkTnVtYmVyKGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIsIHRydWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWM/LklzQ29ubmVjdGVkXCIgdGl0bGU9XCJOZXcgQ2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWx0ZXJlZExpc3QubGVuZ3RoICYmIGlzRGlyZWN0Q2FsbE9wdGlvblNob3cgJiYgc2VhcmNoVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCInYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IHNlYXJjaFRleHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0biBtci0yXCIgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoc2VhcmNoVGV4dClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJBZGQgdG8gY2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGFkZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0blwiIChjbGljayk9XCJDYWxsVG9VbnNhdmVkTnVtYmVyKHNlYXJjaFRleHQsIHRydWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiTmV3IENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3RzLWxpc3RcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTAgdGl0bGVcIj5BY3RpdmUgcGFydGljaXBhbnRzICh7eyBhY3RpdmVQYXJ0aWNpcGFudHNDb3VudCB9fSk8L2g1PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGhyIGNsYXNzPVwibWItMiBtdC0xXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgZmlsdGVyZWRQYXJ0aWNpcGVudExpc3RcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIiAqbmdJZj1cIiFjPy5pc0xlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiAqbmdJZj1cIiFjPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiICpuZ0lmPVwiYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cIiFjPy5jbGllbnRcIj57e2M/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b05hbWUgfHwgJ1Vua25vd24nIDogYz8uZnJvbU5hbWUgfHwgJ1Vua25vd24nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCIgKm5nSWY9XCIhYz8uY2xpZW50XCI+e3sgYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvIHx8ICdVbmtub3duJyA6IGM/LmZyb20gfHwgJ1Vua25vd24nfX08L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cImM/LmNsaWVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1NlbGZOdW1iZXIoYykgZWxzZSBzZWxmTnVtYmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbU5hbWUgfHwgJ1Vua25vd24nIDogYz8udG9OYW1lIHx8ICdVbmtub3duJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NlbGZOdW1iZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WW91PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCIgKm5nSWY9XCJjPy5jbGllbnRcIj57eyBjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbSB8fCAnVW5rbm93bicgOiBjPy50byB8fCAnVW5rbm93bid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgKm5nSWY9XCJjPy5ob3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1sYWJlbFwiPk9yZ2FuaXplcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImM/LmpvaW5lZCAmJiAhYz8uaG9zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ubmVjdGluZy13cmFwcGVyIG1yLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmluZ2luZy10ZXh0XCI+UmluZ2luZzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG90c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWM/LmpvaW5lZCB8fCBjPy5ob3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJtaWMtYnRuIG1yLTJcIiBbZGlzYWJsZWRdPVwiYz8uaXNIb2xkXCIgKGNsaWNrKT1cIm9uTXV0ZVVzZXIoYylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiYz8uaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhYz8uaXNNdXRlXCI+IG1pYyA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1ob2xkLWNvbnRhY3QgbXItMlwiIFtuZ0NsYXNzXT1cInsgJ29uLWhvbGQnOiBjPy5pc0hvbGQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ib2xkQ2FsbChjKVwiICpuZ0lmPVwiIWM/Lmhvc3RcIiBbZGlzYWJsZWRdPVwiaXNIb2xkQnRuRGlzYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYz8uaXNIb2xkXCIgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgW3RpdGxlXT1cIidIb2xkJ1wiPiBwaG9uZV9wYXVzZWQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImM/LmlzSG9sZFwiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIFt0aXRsZV09XCInUmVzdW1lJ1wiPiByZXN1bWUgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cImNvbmZpcm1MZWF2ZVBhcnRpY2lwYW50KGMpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhYz8uaG9zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cImVuZENvbmZlcmVuZWNlQ2FsbChjKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYz8uaG9zdCAmJiAoZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjPy5mcm9tKSB8fCAoZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhjPy50bykgJiYgYz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8aHIgY2xhc3M9XCJtLTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgcHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMCB0aXRsZVwiPlBhcnRpY2lwYW50IGFkZGVkIHRvIHRoZSBjYWxsPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxociBjbGFzcz1cIm1iLTIgbXQtMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCJjPy5pc0xlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiAqbmdJZj1cIiFjPy5jbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b0ltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiICpuZ0lmPVwiYz8uY2xpZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyA6IGM/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cIiFjPy5jbGllbnRcIj57e2M/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b05hbWUgfHwgJ1Vua25vd24nIDogYz8uZnJvbU5hbWUgfHwgJ1Vua25vd24nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiICpuZ0lmPVwiIWM/LmNsaWVudFwiPnt7IGM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50byB8fCAnVW5rbm93bicgOiBjPy5mcm9tIHx8ICdVbmtub3duJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIiAqbmdJZj1cImM/LmNsaWVudFwiPnt7Yz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJyA6IGM/LnRvTmFtZSB8fCAnVW5rbm93bid9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIiAqbmdJZj1cImM/LmNsaWVudFwiPnt7IGM/LmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy5mcm9tIHx8ICdVbmtub3duJyA6IGM/LnRvIHx8ICdVbmtub3duJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiAqbmdJZj1cImM/Lmhvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLWxhYmVsXCI+T3JnYW5pemVyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ubmVjdGluZy13cmFwcGVyXCIgKm5nSWY9XCJjPy5qb2luZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyaW5naW5nLXRleHRcIj5SaW5naW5nPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwib25FbmRDYWxsKGMsIGZhbHNlLCB0cnVlKVwiICpuZ0lmPVwiIWM/Lmhvc3QgJiYgYz8uam9pbmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0blwiICpuZ0lmPVwiIWM/LmNsaWVudCAmJiAhYz8uam9pbmVkICYmICFjPy5idXNpbmVzc051bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJDYWxsVG9VbnNhdmVkTnVtYmVyKGMuZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvIDogYz8uZnJvbSwgZmFsc2UsIHsgc2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlIH0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBhZGQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+UmVqb2luPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0blwiICpuZ0lmPVwiYz8uY2xpZW50ICYmICFjPy5qb2luZWQgJiYgIWM/LmJ1c2luZXNzTnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoYy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8uZnJvbSA6IGM/LnRvLCBmYWxzZSwgeyBza2lwRHVwbGljYXRlQ2hlY2s6IHRydWUgfSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGFkZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5SZWpvaW48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIENvbmZlcmVuY2UgV2FybmluZyBNb2RhbCAtLT5cclxuPGRpdiBjbGFzcz1cImN1c3RvbS1tb2RhbFwiICpuZ0lmPVwic2hvd0NvbmZlcmVuY2VXYXJuaW5nTW9kYWxcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudCB3YXJuaW5nLW1vZGFsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1pY29uXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPndhcm5pbmc8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxoMz5Db25mZXJlbmNlIENhbGwgV2FybmluZzwvaDM+XHJcbiAgICA8cD5cclxuICAgICAgU3RhcnRpbmcgYSBuZXcgY2FsbCB3aWxsIHB1dCB0aGUgY3VycmVudCBjb25mZXJlbmNlIG9uIGhvbGRcclxuICAgICAgYW5kIGNhbm5vdCBiZSBtZXJnZWQgbGF0ZXIuXHJcbiAgICA8L3A+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1hY3Rpb25zXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnRuXCIgKGNsaWNrKT1cImNhbmNlbE5ld0NhbGwoKVwiPlxyXG4gICAgICAgIENhbmNlbFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInByb2NlZWQtYnRuXCIgKGNsaWNrKT1cImNvbmZpcm1OZXdDYWxsKClcIj5cclxuICAgICAgICBQcm9jZWVkXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJtaW4tY2FsbC1jb250YWluZXJcIiAqbmdJZj1cImlzTWluaW1pc2VkXCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZnVsbHNjcmVlblwiIChjbGljayk9XCJtYXhpbWlzZURpYWxwYWQoKVwiPiBvcGVuX2luX2Z1bGwgPC9zcGFuPlxyXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IHdpZHRoOiAxMDAlXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi1jYWxsLWFuaW1hdGlvblwiIGlkPVwiY2FsbC1hdmF0YXJcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJtaW4tYXZhdGFyLWltZ1wiIFtzcmNdPVwiY2FsbERhdGEuaW1nXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi1jYWxsZXJEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7Y2FsbERhdGEubmFtZX19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOiAwXCI+e3tjYWxsRGF0YS5kaXNwbGF5TnVtID8gY2FsbERhdGEuZGlzcGxheU51bSA6IGNhbGxEYXRhLnBob25lIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1pbi1idG4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi10aW1lclwiPnt7dGltZXJ9fTwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJtaW4tY2FsbC1zZWMtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZU11dGUoKVwiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cImlzTXV0ZVwiPiBtaWNfb2ZmIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhaXNNdXRlXCI+IG1pYyA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pbi1jYWxsLWJ0biBlbmQtY2FsbC1idG5cIiBbZGlzYWJsZWRdPVwiZGlzYmFsZUVuZENhbGxCdG5cIiAoY2xpY2spPVwiZW5kQ2FsbCgpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbjwhLS0gQ2FsbCBEaXNjb25uZWN0IE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwiY3VzdG9tLW1vZGFsXCIgKm5nSWY9XCJzaG93RGlzY29ubmVjdE1vZGFsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudCBwLTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtaGVhZGVyIHAtMCBwYi0yXCI+XHJcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cInRpdGxlIG1iLTBcIj57e3NlbGVjdGVkQ29uZj8uY29uTmFtZSB8fCAnQ2FsbCd9fSBEaXNjb25uZWN0PC9oND5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cInNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwMDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0yNTYtMjAwLTU2LTU2IDIyNC0yMjQtMjI0LTIyNCA1Ni01NiAyMjQgMjI0IDIyNC0yMjQgNTYgNTYtMjI0IDIyNCAyMjQgMjI0LTU2IDU2LTIyNC0yMjQtMjI0IDIyNFpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFudC1ib2R5IG1iLTJcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICBFeGl0aW5nIHRoaXMgY2FsbCB3aWxsIG5vdCBlbmQgdGhlIGNvbmZlcmVuY2UuIFRoZSBzZXNzaW9uIHdpbGwgY29udGludWUsIGFuZCBjaGFyZ2VzIHdpbGwgaW5jdXIgdG9cclxuICAgICAgICAgICAgICAgIHlvdXJcclxuICAgICAgICAgICAgICAgIGFjY291bnQuXHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN0YXJ0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMCBtci0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiaXNSZWFzb25DaGVja2VkXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25SZWFzb25DaGVja0NoYW5nZWQoJGV2ZW50KVwiIGNsYXNzPVwibWUtMlwiLz5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItMjRoclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gSG91ciBwaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLXNlbGVjdFwiIFtjbGFzcy5kaXNhYmxlZC1waWNrZXJdPVwiIWlzUmVhc29uQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtZGlzcGxheVwiIChjbGljayk9XCJpc1JlYXNvbkNoZWNrZWQgJiYgdG9nZ2xlSG91ckRyb3Bkb3duKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxlYXZlSG91ciB8fCAnSEgnIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpY2tlci1hcnJvd1wiPiYjOTY2MDs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtb3B0aW9uc1wiICpuZ0lmPVwic2hvd0hvdXJEcm9wZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLW9wdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBoIG9mIGhvdXJzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImxlYXZlSG91ciA9PT0gaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RIb3VyKGgpXCI+e3sgaCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWUtc2VwXCI+Ojwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1pbnV0ZSBwaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLXNlbGVjdFwiIFtjbGFzcy5kaXNhYmxlZC1waWNrZXJdPVwiIWlzUmVhc29uQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWUtZGlzcGxheVwiIChjbGljayk9XCJpc1JlYXNvbkNoZWNrZWQgJiYgdG9nZ2xlTWludXRlRHJvcGRvd24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGVhdmVNaW51dGUgfHwgJ01NJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaWNrZXItYXJyb3dcIj4mIzk2NjA7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLW9wdGlvbnNcIiAqbmdJZj1cInNob3dNaW51dGVEcm9wZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lLW9wdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtIG9mIG1pbnV0ZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwibGVhdmVNaW51dGUgPT09IG1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TWludXRlKG0pXCI+e3sgbSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBlbmQtYnRuXCIgKGNsaWNrKT1cImxlYXZlQ29uZmVyZW5jZSgpXCIgW2Rpc2FibGVkXT1cImlzUmVhc29uQ2hlY2tlZCAmJiAoIWxlYXZlSG91ciB8fCAhbGVhdmVNaW51dGUpXCI+XHJcbiAgICAgICAgICAgICAgICBMZWF2ZVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBlbmQtYnRuXCIgKGNsaWNrKT1cImVuZENvbmZlcmVuY2UoKVwiICpuZ0lmPVwic2hvd0VuZEFsbEJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgICAgRW5kIEFsbFxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cImN1c3RvbS1tb2RhbFwiICpuZ0lmPVwic2hvd0xlYXZlQ29uZmlybWF0aW9uTW9kYWxcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudCB3YXJuaW5nLW1vZGFsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1pY29uXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPmluZm88L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxoMz5MZWF2ZSBDb25mZXJlbmNlPC9oMz5cclxuICAgIDxwPlxyXG4gICAgICBZb3UgYXJlIGFib3V0IHRvIGxlYXZlIDxzdHJvbmc+e3sgbGVhdmVDb25mQ29uZmVyZW5jZU5hbWUgfX08L3N0cm9uZz4uIFxyXG4gICAgICBBcmUgeW91IHN1cmU/XHJcbiAgICA8L3A+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1hY3Rpb25zXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnRuXCIgKGNsaWNrKT1cImNhbmNlbExlYXZlKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInByb2NlZWQtYnRuXCIgKGNsaWNrKT1cImNvbmZpcm1MZWF2ZSgpXCI+TGVhdmU8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|