@sunbird-cb/toc 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -670,7 +670,7 @@ export class AppTocHomeV2Component {
670
670
  this.autoEnrollCuratedProgram(NsContent.ECourseCategory.MODERATED_PROGRAM, moderatedBatchData);
671
671
  }
672
672
  else if (this.content.courseCategory === NsContent.ECourseCategory.LEARNING_PATHWAY) {
673
- this.autoEnrollLearningPathway();
673
+ this.autoEnrollLearningPathway(batchData);
674
674
  }
675
675
  else {
676
676
  this.autoAssignEnroll();
@@ -678,12 +678,23 @@ export class AppTocHomeV2Component {
678
678
  }
679
679
  this.contentViewEventForNetCore('enroll');
680
680
  }
681
- autoEnrollLearningPathway() {
682
- this.contentSvc.autoEnrollLP(this.content?.identifier).subscribe((res) => {
683
- if (res) {
684
- this.navigateToPlayerPage(res);
685
- }
686
- });
681
+ autoEnrollLearningPathway(batchData) {
682
+ let batchId = batchData?.batchId;
683
+ if (batchId) {
684
+ this.contentSvc.autoEnrollLP(this.content?.identifier).subscribe((res) => {
685
+ if (res) {
686
+ this.navigateToPlayerPage(batchId);
687
+ this.enrollBtnLoading = false;
688
+ }
689
+ }, () => {
690
+ this.snackBar.open('Something went wrong');
691
+ this.enrollBtnLoading = false;
692
+ });
693
+ }
694
+ else {
695
+ this.snackBar.open('No bacthes found');
696
+ this.enrollBtnLoading = false;
697
+ }
687
698
  }
688
699
  autoEnrollCuratedProgram(programType, batchData) {
689
700
  if (!batchData) {
@@ -1361,7 +1372,7 @@ export class AppTocHomeV2Component {
1361
1372
  this.checkForCompletionSurveyTrigger();
1362
1373
  }
1363
1374
  else {
1364
- if (this.contentReadData && this.contentReadData.cumulativeTracking) {
1375
+ if (this.contentReadData && this.contentReadData.cumulativeTracking && this.contentReadData.courseCategory !== NsContent.ECourseCategory.LEARNING_PATHWAY) {
1365
1376
  await this.tocSvc.mapCompletionPercentageProgram(this.content, this.userEnrollmentList);
1366
1377
  this.checkForCompletionSurveyTrigger();
1367
1378
  this.resumeDataSubscription = this.tocSvc.resumeData.subscribe((res) => {
@@ -2148,6 +2159,7 @@ export class AppTocHomeV2Component {
2148
2159
  this.appTocV2Svc.mapContentHierarchyProgressUpdate(this.content, this.userEnrollmentList);
2149
2160
  // Create hashmap and compute milestone locking after progress is updated
2150
2161
  this.tocSvc.callHirarchyProgressHashmap(this.content);
2162
+ console.log('hashmap', this.tocSvc.hashmap);
2151
2163
  // Compute milestone locking status with updated progress data
2152
2164
  this.tocSvc.computeMilestoneLockingStatus();
2153
2165
  // Sync content tree's isLocked with computed values
@@ -2809,11 +2821,11 @@ export class AppTocHomeV2Component {
2809
2821
  this.location.back();
2810
2822
  }
2811
2823
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeV2Component, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.WidgetContentService }, { token: i3.AppTocService }, { token: i4.LoggerService }, { token: i4.ConfigurationsService }, { token: i5.DomSanitizer }, { token: i6.MatLegacySnackBar }, { token: i7.MatLegacyDialog }, { token: i8.MobileAppsService }, { token: i4.UtilityService }, { token: i9.ContentLanguageService }, { token: i10.ActionService }, { token: i11.ViewerUtilService }, { token: i12.RatingService }, { token: i4.TelemetryService }, { token: i13.TranslateService }, { token: i4.MultilingualTranslationsService }, { token: i4.EventService }, { token: i14.LoadCheckService }, { token: i15.HandleClaimService }, { token: i16.ResetRatingsService }, { token: i17.TimerService }, { token: i4.WidgetEnrollService }, { token: i9.WidgetContentLibService }, { token: i4.DataTransferService }, { token: i18.MatSnackBar }, { token: i9.WidgetUserServiceLib }, { token: i19.NetCoreService }, { token: i20.AppTocV2Service }, { token: i21.Location }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
2812
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocHomeV2Component, selector: "ws-app-app-toc-home-v2", inputs: { forPreview: "forPreview", inputContent: "inputContent" }, host: { listeners: { "window:scroll": "handleScroll($event)" } }, viewQueries: [{ propertyName: "menuElement", first: true, predicate: ["stickyMenu"], descendants: true, static: true }, { propertyName: "rcElement", first: true, predicate: ["rightContainer"], descendants: true }, { propertyName: "bannerElem", first: true, predicate: ["bannerDetails"], descendants: true, static: true }, { propertyName: "contentSource", first: true, predicate: ["contentSource"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"courseID else noDataFound\">\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- Course block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n contentReadData?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ content?.completionPercentage >= 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"firstResourceLink?.url\" class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </button>\n\n <!-- <div\n *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100 || certData)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div> -->\n\n <!-- <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\" [ngClass]=\"{'disable-start-btn': !canEnroll()}\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n <!-- <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <!-- PRogram & mandatory course block -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.PROGRAM || contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\"\n (programEnrollCall)=\"programEnrollCall($event)\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n <ng-container\n *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && contentReadData?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ (resumeData) || content?.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </a>\n <!-- <div *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100)\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating}\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div>\n <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"isBatchInProgress && (contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- Curated program block -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- STANDALONE_ASSESSMENT black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\"\n *ngIf=\"!forPreview || isInIFrame\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- INVITE ONLY STANDALONE ASSESSMENT block-->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvitedForAssessment' | translate }}\n </span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n\n <!-- STANDALONE_ASSESSMENT enrolled black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <!-- BLENDED_PROGRAM block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n <ng-container>\n <a *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \"\n (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\">{{\n 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\">\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"contentCompletionPercent >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\"\n (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"mobile-back-btn\" (click)=\"goBack()\">\n <mat-icon class=\"text-white\">arrow_back</mat-icon>\n </div>\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\"\n *ngIf=\"contentReadData?.additionalTags?.includes('iGOT Specialization')\">\n <img class=\"approved-icon\" src=\"./assets/icons/approved.svg\" alt=\"approved\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n 'cardcontentv2.iGOTSpecializationProgram' | translate }}</div>\n </div>\n <!-- Knowledge level block for search box -->\n <!-- {{content?.difficultyLevel}} -->\n <div *ngIf=\"contentReadData?.difficultyLevel\" class=\"knowledge-level-container\">\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'beginner'\"\n class=\"level-badge beginner\">\n <!-- <span *ngIf=\"false\" class=\"level-badge beginner\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#DBF4DC\" />\n <path\n d=\"M7.42267 5C7.67927 4.55555 8.32077 4.55556 8.57737 5L12.0415 11C12.2981 11.4444 11.9773 12 11.4641 12H4.53592C4.02272 12 3.70197 11.4444 3.95857 11L7.42267 5Z\"\n fill=\"#49C951\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'intermediate'\"\n class=\"level-badge intermediate\">\n <!-- <span *ngIf=\"true\" class=\"level-badge intermediate\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#D1DBEC\" />\n <path\n d=\"M7.42267 2.66666C7.67927 2.22221 8.32077 2.22221 8.57737 2.66666L12.0415 8.66666C12.2981 9.1111 11.9773 9.66666 11.4641 9.66666H4.53592C4.02272 9.66666 3.70197 9.1111 3.95857 8.66666L7.42267 2.66666Z\"\n fill=\"#1B4CA1\" />\n <path\n d=\"M7.42267 5.66666C7.67927 5.22221 8.32077 5.22221 8.57737 5.66666L12.0415 11.6667C12.2981 12.1111 11.9773 12.6667 11.4641 12.6667H4.53592C4.02272 12.6667 3.70197 12.1111 3.95857 11.6667L7.42267 5.66666Z\"\n fill=\"#1B4CA1\" stroke=\"#D1DBEC\" stroke-width=\"0.5\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'advanced'\"\n class=\"level-badge advanced\">\n <!-- <span *ngIf=\"false\" class=\"level-badge advanced\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <g clip-path=\"url(#clip0)\">\n <rect width=\"16\" height=\"16\" fill=\"#FFE6E1\" />\n <path\n d=\"M7.42264 2.33334C7.67924 1.8889 8.32074 1.8889 8.57734 2.33334L12.0414 8.33334C12.298 8.77779 11.9773 9.33334 11.4641 9.33334H4.53589C4.02269 9.33334 3.70194 8.77779 3.95854 8.33334L7.42264 2.33334Z\"\n fill=\"#FF8268\" />\n <path\n d=\"M7.42264 5C7.67924 4.55555 8.32074 4.55556 8.57734 5L12.0414 11C12.298 11.4444 11.9773 12 11.4641 12H4.53589C4.02269 12 3.70194 11.4444 3.95854 11L7.42264 5Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n <path\n d=\"M7.42264 7.66669C7.67924 7.22224 8.32074 7.22224 8.57734 7.66669L12.0414 13.6667C12.298 14.1111 11.9773 14.6667 11.4641 14.6667H4.53589C4.02269 14.6667 3.70194 14.1111 3.95854 13.6667L7.42264 7.66669Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n </g>\n <defs>\n <clipPath id=\"clip0\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n </div>\n\n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\"\n [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\">\n {{ 'common.dueBy' | translate }} - &nbsp;<span class=\"font-bold\">{{ cbPlanEndDate | date: 'd\n MMM,y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\">\n <div class=\"new-version-chip rounded-2xl\" (click)=\"navigateToNewVersion()\"\n (keydown)=\"navigateToNewVersion()\">\n <span class=\"new-version-text nodtranslate\">{{ 'apptoc.newVersion' | translate }}</span>\n </div>\n </ng-container>\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{\n handleCapitalize(contentReadData?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{ 'cardcontentv2.by'\n | translate }} {{ contentReadData?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\"\n (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' |\n translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' |\n translate }}</span>\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"contentReadData?.retirementDate\">\n <div class=\"new-version-pill text-xs leading-3\" *ngIf=\"contentReadData?.status !== 'Retired'\">\n <span>{{ 'apptoc.pendingRetirement' | translate }}</span>\n </div>\n <div class=\"new-version-retire-pill text-xs leading-3\" *ngIf=\"contentReadData?.status === 'Retired'\">\n <span>{{ 'apptoc.retired' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{\n contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n <ng-container>\n <div class=\"flex flex-row gap-2\" *ngIf=\"languageList?.length > 1\">\n <mat-chip-list class=\"lang-chips\">\n <!-- Show up to 6 chips -->\n <ng-container *ngFor=\"let lang of languageList | slice:0:5; let i = index\">\n <mat-chip class=\"matchip-custom\" selectable=\"true\"\n [selected]=\"lang?.identifier === selectedLanguage?.identifier\" (click)=\"onLanguageSelect(lang)\">\n {{ lang.name || lang.value }}\n </mat-chip>\n </ng-container>\n\n <!-- \"More\" chip if there are more than 6 languages -->\n <ng-container *ngIf=\"languageList.length > 5\">\n <mat-chip [matMenuTriggerFor]=\"moreLanguagesMenu\" selectable=\"false\" class=\"more-chip matchip-custom\"\n [selected]=\"isSelectedInMoreDropdown()\">\n More <mat-icon class=\"mat-icon\">keyboard_arrow_down</mat-icon>\n </mat-chip>\n <mat-menu #moreLanguagesMenu=\"matMenu\">\n <mat-radio-group class=\"mat-radio-group flex flex-col gap-2 p-3\" [value]=\"selectedLanguage\">\n <mat-radio-button *ngFor=\"let lang of languageList | slice:5\" [value]=\"lang\"\n [checked]=\"lang?.identifier === selectedLanguage?.identifier\" (change)=\"onLanguageSelect(lang)\">\n {{ lang.displayName || lang.name || lang }}\n </mat-radio-button>\n </mat-radio-group>\n </mat-menu>\n </ng-container>\n </mat-chip-list>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate\n }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate\n }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\" (mouseleave)=\"isReleventBtnHovered = false\"\n (click)=\"handleAcceptRelevent()\">\n <img [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n\n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\"\n *ngIf=\"contentReadData?.identifier && content?.identifier && baseContentReadData?.identifier\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\"\n [tocStructure]=\"tocStructure\" [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\"\n [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\"\n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"\n [kparray]=\"kparray\" (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\" [languageList]=\"languageList\"\n [lockCertificate]=\"lockCertificate\" (trigerCompletionSurveyForm)=\"openSurveyFormPopup($event)\"\n (resumeContent)=\"resumeContentData()\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n\n\n <div class=\"right-container\">\n\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\"\n [ngStyle]=\"{\n 'background-image': 'url(' + contentReadData?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\"\n [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\"\n [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\"\n *ngIf=\"canShare && !forPreview\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(contentReadData?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{\n 'cardcontentv2.by' | translate }} {{ contentReadData?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-1 cursor-pointer switch-version\"\n *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\"\n (click)=\"navigateToNewVersion()\" (keydown)=\"navigateToNewVersion()\">\n <span class=\"btn-switch\">{{ 'apptoc.switchToNewVersion' | translate }}</span>\n </div>\n\n <div class=\"flex flex-col gap-4\"\n *ngIf=\"contentReadData && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize\n || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\"\n *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container>\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container>\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\"\n class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"timer && timer.days >= 0 && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && (\n !contentReadData?.preEnrolmentResources?.length ||\n (contentReadData?.preEnrolmentResources?.length && (preAssessmentCompletionStatus || !preAssessmentRequiredFlag))\n )\">\n\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container>{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container>{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container>{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container\n *ngIf=\"actionBtnStatus !== 'wait' && contentReadData?.status !== 'Deleted' && contentReadData?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"\n [content]=\"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\"\n [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author?.photo || ''\" [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.creators' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let creeator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creeator?.photo || ''\" [name]=\"creeator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creeator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.creator' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\"\n *ngIf=\"contentReadData?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"contentReadData?.creatorLogo\" [src]=\"contentReadData?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!contentReadData?.creatorLogo\" class=\"mat-icon\"\n src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"contentReadData?.createdFor?.length\"\n (click)=\"raiseTelemeteryForProvider(contentReadData?.source, contentReadData?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', contentReadData?.source, contentReadData?.createdFor[0], 'micro-sites']\">\n {{ handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!contentReadData?.createdFor?.length\">{{\n handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n\n\n </div>\n </div>\n <div class=\"mobile-enroll-div\"\n [ngClass]=\"{'bg-white': contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\"\n (resetEnableShare)=\"resetEnableShare($event)\" [baseContentReadData]=\"baseContentReadData\"></ws-app-share-toc>\n</ng-container>\n<ng-template #noDataFound>\n <div\n class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\">\n The page you requested cannot be found\n </div>\n </div>\n <!-- <div class=\"error-support\">\n <div class=\"support-message\" >We have updated our web site and many URLs have changed.</div>\n <div class=\"support-message\" >You might want to:</div>\n </div> -->\n </div>\n\n</ng-template>\n\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <a (click)=\"raiseTelemetryForPublic($event)\"\n [routerLink]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url)\"\n [queryParams]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START'))\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n</ng-template>\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container *ngIf=\"forPreview && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>", styles: [".source-text{color:#ffffffb3}.approved-icon{width:12px;height:12px}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}@media screen and (max-width: 576px){.toc-banner .banner-details{padding-top:10px;padding-bottom:20px}}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.toc-banner .new-version-pill{background-color:#f9cb97;border:1px solid rgb(249,203,151);padding:4px;border-radius:2px}.toc-banner .new-version-retire-pill{background-color:#d13924;border:1px solid #d13924;padding:4px;color:#fff;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#1b4ca1;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#1b4ca1!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media only screen and (max-width: 768px){.new-version-text{font-size:12px!important}.new-version-chip{padding-top:0!important}}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom{background:transparent;border:1px solid #fff;color:#fff!important;cursor:pointer;margin:0!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon{color:#fff!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon:hover{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected{background:#fff!important;border:1px solid #fff;color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover mat-icon,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected mat-icon{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:after{opacity:0!important;background:transparent}.new-version-chip{gap:10px;padding:2px 8px;background-color:#f3962f;cursor:pointer;position:relative;overflow:hidden}.new-version-chip:before{content:\"\";position:absolute;top:0;left:-100%;width:25%;height:100%;background:linear-gradient(314deg,transparent,rgba(213,210,210,.6),transparent);animation:shimmer 1s infinite}.new-version-chip .new-version-text{font-family:Lato;font-weight:400;font-size:20px;line-height:100%}.btn-switch{font-family:Lato,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:none;border:1px solid rgb(243,150,47);color:#f3962f;background:#ef951e29!important}@keyframes shimmer{0%{left:-100%}to{left:100%}}.knowledge-level-container{margin-left:auto}.level-badge{display:inline-flex;height:24px;padding:2px 8px;align-items:center;gap:4px;flex-shrink:0;border-radius:12px;font-weight:600;font-size:12px;line-height:16px;white-space:nowrap}.level-badge.beginner{border:1px solid #49C951;background:linear-gradient(0deg,#49c95133 0% 100%),#fff;color:#2f8132;border-radius:16px}.level-badge.intermediate{border:1px solid #1B4CA1;background:linear-gradient(0deg,#1b4ca133 0% 100%),#fff;color:#1b4ca1;border-radius:16px}.level-badge.advanced{border:1px solid #FF8268;background:linear-gradient(0deg,#ff826833 0% 100%),#fff;color:#ff4b25;border-radius:16px}.level-badge svg{flex-shrink:0}\n"], dependencies: [{ kind: "directive", type: i21.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i21.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i21.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i21.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i21.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i22.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i23.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i24.MatLegacyMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "directive", type: i24.MatLegacyMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i25.MatLegacyChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i25.MatLegacyChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i26.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i26.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i27.SkeletonLoaderComponent, selector: "ws-widget-skeleton-loader", inputs: ["bindingClass", "height", "width"] }, { kind: "component", type: i28.ContentProgressComponent, selector: "ws-widget-content-progress", inputs: ["contentId", "progress", "progressType", "forPreview", "className", "customClassName"] }, { kind: "component", type: i29.AvatarPhotoComponent, selector: "ws-widget-avatar-photo", inputs: ["datalen", "photoUrl", "name", "size", "randomColor", "initials", "showBadge"] }, { kind: "component", type: i30.ContentTocComponent, selector: "ws-widget-content-toc", inputs: ["content", "contentReadData", "initialRouteData", "changeTab", "baseContentReadData", "forPreview", "contentTabFlag", "resumeData", "batchData", "skeletonLoader", "tocStructure", "pathSet", "fromViewer", "hierarchyMapData", "condition", "kparray", "selectedBatchData", "config", "componentName", "isEnrolled", "playResourceId", "sideNavBarOpened", "languageList", "lockCertificate"], outputs: ["playResumeForAI", "enrollUserToAI", "trigerCompletionSurveyForm", "resumeContent"] }, { kind: "component", type: i31.ShareTocComponent, selector: "ws-app-share-toc", inputs: ["rootOrgId", "content", "contentLink", "baseContentReadData"], outputs: ["resetEnableShare"] }, { kind: "component", type: i32.TocKpiValuesComponent, selector: "ws-widget-toc-kpi-values", inputs: ["tocStructure", "content", "contentReadData", "isMobile", "showInstructorLedMsg", "baseContentReadData", "languageList"] }, { kind: "component", type: i33.KarmaPointsComponent, selector: "ws-widget-karma-points", inputs: ["content", "data", "pCategory", "condition", "btnCategory"], outputs: ["clickClaimKarmaPoints"] }, { kind: "component", type: i34.TipsForLearnerCardComponent, selector: "ws-widget-tips-for-learner-card", inputs: ["learnAdvisoryData"] }, { kind: "component", type: i35.AppTocBannerComponent, selector: "ws-app-toc-banner", inputs: ["banners", "content", "resumeData", "analytics", "forPreview", "batchData", "userEnrollmentList", "contentReadData", "clickToShare"], outputs: ["withdrawOrEnroll", "programEnrollCall"] }, { kind: "pipe", type: i21.SlicePipe, name: "slice" }, { kind: "pipe", type: i21.DatePipe, name: "date" }, { kind: "pipe", type: i4.PipeCountTransformPipe, name: "pipeCountTransform" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
2824
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocHomeV2Component, selector: "ws-app-app-toc-home-v2", inputs: { forPreview: "forPreview", inputContent: "inputContent" }, host: { listeners: { "window:scroll": "handleScroll($event)" } }, viewQueries: [{ propertyName: "menuElement", first: true, predicate: ["stickyMenu"], descendants: true, static: true }, { propertyName: "rcElement", first: true, predicate: ["rightContainer"], descendants: true }, { propertyName: "bannerElem", first: true, predicate: ["bannerDetails"], descendants: true, static: true }, { propertyName: "contentSource", first: true, predicate: ["contentSource"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"courseID else noDataFound\">\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- Course block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n contentReadData?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ content?.completionPercentage >= 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"firstResourceLink?.url\" class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </button>\n\n <!-- <div\n *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100 || certData)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div> -->\n\n <!-- <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\" [ngClass]=\"{'disable-start-btn': !canEnroll()}\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n <!-- <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <!-- PRogram & mandatory course block -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.PROGRAM || contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\"\n (programEnrollCall)=\"programEnrollCall($event)\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n <ng-container\n *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && contentReadData?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ (resumeData) || content?.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </a>\n <!-- <div *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100)\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating}\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div>\n <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"isBatchInProgress && (contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- Curated program block -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- STANDALONE_ASSESSMENT black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\"\n *ngIf=\"!forPreview || isInIFrame\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- INVITE ONLY STANDALONE ASSESSMENT block-->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvitedForAssessment' | translate }}\n </span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n\n <!-- STANDALONE_ASSESSMENT enrolled black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <!-- BLENDED_PROGRAM block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n <ng-container>\n <a *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \"\n (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\">{{\n 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\">\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"contentCompletionPercent >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\"\n (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"mobile-back-btn\" (click)=\"goBack()\">\n <mat-icon class=\"text-white\">arrow_back</mat-icon>\n </div>\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\"\n *ngIf=\"contentReadData?.additionalTags?.includes('iGOT Specialization')\">\n <img class=\"approved-icon\" src=\"./assets/icons/approved.svg\" alt=\"approved\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n 'cardcontentv2.iGOTSpecializationProgram' | translate }}</div>\n </div>\n <!-- Knowledge level block for search box -->\n <!-- {{content?.difficultyLevel}} -->\n <div *ngIf=\"contentReadData?.difficultyLevel\" class=\"knowledge-level-container\">\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'beginner'\"\n class=\"level-badge beginner\">\n <!-- <span *ngIf=\"false\" class=\"level-badge beginner\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#DBF4DC\" />\n <path\n d=\"M7.42267 5C7.67927 4.55555 8.32077 4.55556 8.57737 5L12.0415 11C12.2981 11.4444 11.9773 12 11.4641 12H4.53592C4.02272 12 3.70197 11.4444 3.95857 11L7.42267 5Z\"\n fill=\"#49C951\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'intermediate'\"\n class=\"level-badge intermediate\">\n <!-- <span *ngIf=\"true\" class=\"level-badge intermediate\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#D1DBEC\" />\n <path\n d=\"M7.42267 2.66666C7.67927 2.22221 8.32077 2.22221 8.57737 2.66666L12.0415 8.66666C12.2981 9.1111 11.9773 9.66666 11.4641 9.66666H4.53592C4.02272 9.66666 3.70197 9.1111 3.95857 8.66666L7.42267 2.66666Z\"\n fill=\"#1B4CA1\" />\n <path\n d=\"M7.42267 5.66666C7.67927 5.22221 8.32077 5.22221 8.57737 5.66666L12.0415 11.6667C12.2981 12.1111 11.9773 12.6667 11.4641 12.6667H4.53592C4.02272 12.6667 3.70197 12.1111 3.95857 11.6667L7.42267 5.66666Z\"\n fill=\"#1B4CA1\" stroke=\"#D1DBEC\" stroke-width=\"0.5\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'advanced'\"\n class=\"level-badge advanced\">\n <!-- <span *ngIf=\"false\" class=\"level-badge advanced\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <g clip-path=\"url(#clip0)\">\n <rect width=\"16\" height=\"16\" fill=\"#FFE6E1\" />\n <path\n d=\"M7.42264 2.33334C7.67924 1.8889 8.32074 1.8889 8.57734 2.33334L12.0414 8.33334C12.298 8.77779 11.9773 9.33334 11.4641 9.33334H4.53589C4.02269 9.33334 3.70194 8.77779 3.95854 8.33334L7.42264 2.33334Z\"\n fill=\"#FF8268\" />\n <path\n d=\"M7.42264 5C7.67924 4.55555 8.32074 4.55556 8.57734 5L12.0414 11C12.298 11.4444 11.9773 12 11.4641 12H4.53589C4.02269 12 3.70194 11.4444 3.95854 11L7.42264 5Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n <path\n d=\"M7.42264 7.66669C7.67924 7.22224 8.32074 7.22224 8.57734 7.66669L12.0414 13.6667C12.298 14.1111 11.9773 14.6667 11.4641 14.6667H4.53589C4.02269 14.6667 3.70194 14.1111 3.95854 13.6667L7.42264 7.66669Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n </g>\n <defs>\n <clipPath id=\"clip0\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n </div>\n\n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\"\n [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\">\n {{ 'common.dueBy' | translate }} - &nbsp;<span class=\"font-bold\">{{ cbPlanEndDate | date: 'd\n MMM,y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\">\n <div class=\"new-version-chip rounded-2xl\" (click)=\"navigateToNewVersion()\"\n (keydown)=\"navigateToNewVersion()\">\n <span class=\"new-version-text nodtranslate\">{{ 'apptoc.newVersion' | translate }}</span>\n </div>\n </ng-container>\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{\n handleCapitalize(contentReadData?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{ 'cardcontentv2.by'\n | translate }} {{ contentReadData?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\"\n (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' |\n translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' |\n translate }}</span>\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"contentReadData?.retirementDate\">\n <div class=\"new-version-pill text-xs leading-3\" *ngIf=\"contentReadData?.status !== 'Retired'\">\n <span>{{ 'apptoc.pendingRetirement' | translate }}</span>\n </div>\n <div class=\"new-version-retire-pill text-xs leading-3\" *ngIf=\"contentReadData?.status === 'Retired'\">\n <span>{{ 'apptoc.retired' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{\n contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n <ng-container>\n <div class=\"flex flex-row gap-2\" *ngIf=\"languageList?.length > 1\">\n <mat-chip-list class=\"lang-chips\">\n <!-- Show up to 6 chips -->\n <ng-container *ngFor=\"let lang of languageList | slice:0:5; let i = index\">\n <mat-chip class=\"matchip-custom\" selectable=\"true\"\n [selected]=\"lang?.identifier === selectedLanguage?.identifier\" (click)=\"onLanguageSelect(lang)\">\n {{ lang.name || lang.value }}\n </mat-chip>\n </ng-container>\n\n <!-- \"More\" chip if there are more than 6 languages -->\n <ng-container *ngIf=\"languageList.length > 5\">\n <mat-chip [matMenuTriggerFor]=\"moreLanguagesMenu\" selectable=\"false\" class=\"more-chip matchip-custom\"\n [selected]=\"isSelectedInMoreDropdown()\">\n More <mat-icon class=\"mat-icon\">keyboard_arrow_down</mat-icon>\n </mat-chip>\n <mat-menu #moreLanguagesMenu=\"matMenu\">\n <mat-radio-group class=\"mat-radio-group flex flex-col gap-2 p-3\" [value]=\"selectedLanguage\">\n <mat-radio-button *ngFor=\"let lang of languageList | slice:5\" [value]=\"lang\"\n [checked]=\"lang?.identifier === selectedLanguage?.identifier\" (change)=\"onLanguageSelect(lang)\">\n {{ lang.displayName || lang.name || lang }}\n </mat-radio-button>\n </mat-radio-group>\n </mat-menu>\n </ng-container>\n </mat-chip-list>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate\n }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate\n }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\" (mouseleave)=\"isReleventBtnHovered = false\"\n (click)=\"handleAcceptRelevent()\">\n <img [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n\n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\"\n *ngIf=\"contentReadData?.identifier && content?.identifier && baseContentReadData?.identifier\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\"\n [tocStructure]=\"tocStructure\" [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\"\n [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\"\n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"\n [kparray]=\"kparray\" (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\" [languageList]=\"languageList\"\n [lockCertificate]=\"lockCertificate\" (trigerCompletionSurveyForm)=\"openSurveyFormPopup($event)\"\n (resumeContent)=\"resumeContentData()\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n\n\n <div class=\"right-container\">\n\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\"\n [ngStyle]=\"{\n 'background-image': 'url(' + contentReadData?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\"\n [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\"\n [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\"\n *ngIf=\"canShare && !forPreview\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(contentReadData?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{\n 'cardcontentv2.by' | translate }} {{ contentReadData?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-1 cursor-pointer switch-version\"\n *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\"\n (click)=\"navigateToNewVersion()\" (keydown)=\"navigateToNewVersion()\">\n <span class=\"btn-switch\">{{ 'apptoc.switchToNewVersion' | translate }}</span>\n </div>\n\n <div class=\"flex flex-col gap-4\"\n *ngIf=\"contentReadData && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize\n || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\"\n *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container>\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container>\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\"\n class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"timer && timer.days >= 0 && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && (\n !contentReadData?.preEnrolmentResources?.length ||\n (contentReadData?.preEnrolmentResources?.length && (preAssessmentCompletionStatus || !preAssessmentRequiredFlag))\n )\">\n\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container>{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container>{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container>{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container\n *ngIf=\"actionBtnStatus !== 'wait' && contentReadData?.status !== 'Deleted' && contentReadData?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"\n [content]=\"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\"\n [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author?.photo || ''\" [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.creators' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let creeator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creeator?.photo || ''\" [name]=\"creeator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creeator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.creator' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\"\n *ngIf=\"contentReadData?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"contentReadData?.creatorLogo\" [src]=\"contentReadData?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!contentReadData?.creatorLogo\" class=\"mat-icon\"\n src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"contentReadData?.createdFor?.length\"\n (click)=\"raiseTelemeteryForProvider(contentReadData?.source, contentReadData?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', contentReadData?.source, contentReadData?.createdFor[0], 'micro-sites']\">\n {{ handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!contentReadData?.createdFor?.length\">{{\n handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n\n\n </div>\n </div>\n <div class=\"mobile-enroll-div\"\n [ngClass]=\"{'bg-white': contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\"\n (resetEnableShare)=\"resetEnableShare($event)\" [baseContentReadData]=\"baseContentReadData\"></ws-app-share-toc>\n</ng-container>\n<ng-template #noDataFound>\n <div\n class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\">\n The page you requested cannot be found\n </div>\n </div>\n <!-- <div class=\"error-support\">\n <div class=\"support-message\" >We have updated our web site and many URLs have changed.</div>\n <div class=\"support-message\" >You might want to:</div>\n </div> -->\n </div>\n\n</ng-template>\n\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <a (click)=\"raiseTelemetryForPublic($event)\"\n [routerLink]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url)\"\n [queryParams]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START'))\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n</ng-template>\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container *ngIf=\"forPreview && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>", styles: [".source-text{color:#ffffffb3}.approved-icon{width:12px;height:12px}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}@media screen and (max-width: 576px){.toc-banner .banner-details{padding-top:10px;padding-bottom:20px}}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.toc-banner .new-version-pill{background-color:#f9cb97;border:1px solid rgb(249,203,151);padding:4px;border-radius:2px}.toc-banner .new-version-retire-pill{background-color:#d13924;border:1px solid #d13924;padding:4px;color:#fff;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.mobile-back-btn{display:flex!important;align-items:center;justify-content:flex-start;cursor:pointer;padding:0;margin-bottom:8px;color:#fff!important}.mobile-back-btn mat-icon{font-size:24px!important;width:24px!important;height:24px!important}@media screen and (min-width: 577px){.mobile-back-btn{display:none!important}}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#1b4ca1;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#1b4ca1!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media only screen and (max-width: 768px){.new-version-text{font-size:12px!important}.new-version-chip{padding-top:0!important}}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom{background:transparent;border:1px solid #fff;color:#fff!important;cursor:pointer;margin:0!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon{color:#fff!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon:hover{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected{background:#fff!important;border:1px solid #fff;color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover mat-icon,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected mat-icon{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:after{opacity:0!important;background:transparent}.new-version-chip{gap:10px;padding:2px 8px;background-color:#f3962f;cursor:pointer;position:relative;overflow:hidden}.new-version-chip:before{content:\"\";position:absolute;top:0;left:-100%;width:25%;height:100%;background:linear-gradient(314deg,transparent,rgba(213,210,210,.6),transparent);animation:shimmer 1s infinite}.new-version-chip .new-version-text{font-family:Lato;font-weight:400;font-size:20px;line-height:100%}.btn-switch{font-family:Lato,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:none;border:1px solid rgb(243,150,47);color:#f3962f;background:#ef951e29!important}@keyframes shimmer{0%{left:-100%}to{left:100%}}.knowledge-level-container{margin-left:auto}.level-badge{display:inline-flex;height:24px;padding:2px 8px;align-items:center;gap:4px;flex-shrink:0;border-radius:12px;font-weight:600;font-size:12px;line-height:16px;white-space:nowrap}.level-badge.beginner{border:1px solid #49C951;background:linear-gradient(0deg,#49c95133 0% 100%),#fff;color:#2f8132;border-radius:16px}.level-badge.intermediate{border:1px solid #1B4CA1;background:linear-gradient(0deg,#1b4ca133 0% 100%),#fff;color:#1b4ca1;border-radius:16px}.level-badge.advanced{border:1px solid #FF8268;background:linear-gradient(0deg,#ff826833 0% 100%),#fff;color:#ff4b25;border-radius:16px}.level-badge svg{flex-shrink:0}\n"], dependencies: [{ kind: "directive", type: i21.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i21.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i21.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i21.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i21.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i22.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i23.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i24.MatLegacyMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "directive", type: i24.MatLegacyMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i25.MatLegacyChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i25.MatLegacyChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i26.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i26.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i27.SkeletonLoaderComponent, selector: "ws-widget-skeleton-loader", inputs: ["bindingClass", "height", "width"] }, { kind: "component", type: i28.ContentProgressComponent, selector: "ws-widget-content-progress", inputs: ["contentId", "progress", "progressType", "forPreview", "className", "customClassName"] }, { kind: "component", type: i29.AvatarPhotoComponent, selector: "ws-widget-avatar-photo", inputs: ["datalen", "photoUrl", "name", "size", "randomColor", "initials", "showBadge"] }, { kind: "component", type: i30.ContentTocComponent, selector: "ws-widget-content-toc", inputs: ["content", "contentReadData", "initialRouteData", "changeTab", "baseContentReadData", "forPreview", "contentTabFlag", "resumeData", "batchData", "skeletonLoader", "tocStructure", "pathSet", "fromViewer", "hierarchyMapData", "condition", "kparray", "selectedBatchData", "config", "componentName", "isEnrolled", "playResourceId", "sideNavBarOpened", "languageList", "lockCertificate"], outputs: ["playResumeForAI", "enrollUserToAI", "trigerCompletionSurveyForm", "resumeContent"] }, { kind: "component", type: i31.ShareTocComponent, selector: "ws-app-share-toc", inputs: ["rootOrgId", "content", "contentLink", "baseContentReadData"], outputs: ["resetEnableShare"] }, { kind: "component", type: i32.TocKpiValuesComponent, selector: "ws-widget-toc-kpi-values", inputs: ["tocStructure", "content", "contentReadData", "isMobile", "showInstructorLedMsg", "baseContentReadData", "languageList"] }, { kind: "component", type: i33.KarmaPointsComponent, selector: "ws-widget-karma-points", inputs: ["content", "data", "pCategory", "condition", "btnCategory"], outputs: ["clickClaimKarmaPoints"] }, { kind: "component", type: i34.TipsForLearnerCardComponent, selector: "ws-widget-tips-for-learner-card", inputs: ["learnAdvisoryData"] }, { kind: "component", type: i35.AppTocBannerComponent, selector: "ws-app-toc-banner", inputs: ["banners", "content", "resumeData", "analytics", "forPreview", "batchData", "userEnrollmentList", "contentReadData", "clickToShare"], outputs: ["withdrawOrEnroll", "programEnrollCall"] }, { kind: "pipe", type: i21.SlicePipe, name: "slice" }, { kind: "pipe", type: i21.DatePipe, name: "date" }, { kind: "pipe", type: i4.PipeCountTransformPipe, name: "pipeCountTransform" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
2813
2825
  }
2814
2826
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeV2Component, decorators: [{
2815
2827
  type: Component,
2816
- args: [{ selector: 'ws-app-app-toc-home-v2', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"courseID else noDataFound\">\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- Course block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n contentReadData?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ content?.completionPercentage >= 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"firstResourceLink?.url\" class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </button>\n\n <!-- <div\n *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100 || certData)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div> -->\n\n <!-- <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\" [ngClass]=\"{'disable-start-btn': !canEnroll()}\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n <!-- <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <!-- PRogram & mandatory course block -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.PROGRAM || contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\"\n (programEnrollCall)=\"programEnrollCall($event)\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n <ng-container\n *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && contentReadData?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ (resumeData) || content?.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </a>\n <!-- <div *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100)\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating}\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div>\n <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"isBatchInProgress && (contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- Curated program block -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- STANDALONE_ASSESSMENT black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\"\n *ngIf=\"!forPreview || isInIFrame\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- INVITE ONLY STANDALONE ASSESSMENT block-->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvitedForAssessment' | translate }}\n </span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n\n <!-- STANDALONE_ASSESSMENT enrolled black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <!-- BLENDED_PROGRAM block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n <ng-container>\n <a *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \"\n (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\">{{\n 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\">\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"contentCompletionPercent >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\"\n (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"mobile-back-btn\" (click)=\"goBack()\">\n <mat-icon class=\"text-white\">arrow_back</mat-icon>\n </div>\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\"\n *ngIf=\"contentReadData?.additionalTags?.includes('iGOT Specialization')\">\n <img class=\"approved-icon\" src=\"./assets/icons/approved.svg\" alt=\"approved\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n 'cardcontentv2.iGOTSpecializationProgram' | translate }}</div>\n </div>\n <!-- Knowledge level block for search box -->\n <!-- {{content?.difficultyLevel}} -->\n <div *ngIf=\"contentReadData?.difficultyLevel\" class=\"knowledge-level-container\">\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'beginner'\"\n class=\"level-badge beginner\">\n <!-- <span *ngIf=\"false\" class=\"level-badge beginner\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#DBF4DC\" />\n <path\n d=\"M7.42267 5C7.67927 4.55555 8.32077 4.55556 8.57737 5L12.0415 11C12.2981 11.4444 11.9773 12 11.4641 12H4.53592C4.02272 12 3.70197 11.4444 3.95857 11L7.42267 5Z\"\n fill=\"#49C951\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'intermediate'\"\n class=\"level-badge intermediate\">\n <!-- <span *ngIf=\"true\" class=\"level-badge intermediate\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#D1DBEC\" />\n <path\n d=\"M7.42267 2.66666C7.67927 2.22221 8.32077 2.22221 8.57737 2.66666L12.0415 8.66666C12.2981 9.1111 11.9773 9.66666 11.4641 9.66666H4.53592C4.02272 9.66666 3.70197 9.1111 3.95857 8.66666L7.42267 2.66666Z\"\n fill=\"#1B4CA1\" />\n <path\n d=\"M7.42267 5.66666C7.67927 5.22221 8.32077 5.22221 8.57737 5.66666L12.0415 11.6667C12.2981 12.1111 11.9773 12.6667 11.4641 12.6667H4.53592C4.02272 12.6667 3.70197 12.1111 3.95857 11.6667L7.42267 5.66666Z\"\n fill=\"#1B4CA1\" stroke=\"#D1DBEC\" stroke-width=\"0.5\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'advanced'\"\n class=\"level-badge advanced\">\n <!-- <span *ngIf=\"false\" class=\"level-badge advanced\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <g clip-path=\"url(#clip0)\">\n <rect width=\"16\" height=\"16\" fill=\"#FFE6E1\" />\n <path\n d=\"M7.42264 2.33334C7.67924 1.8889 8.32074 1.8889 8.57734 2.33334L12.0414 8.33334C12.298 8.77779 11.9773 9.33334 11.4641 9.33334H4.53589C4.02269 9.33334 3.70194 8.77779 3.95854 8.33334L7.42264 2.33334Z\"\n fill=\"#FF8268\" />\n <path\n d=\"M7.42264 5C7.67924 4.55555 8.32074 4.55556 8.57734 5L12.0414 11C12.298 11.4444 11.9773 12 11.4641 12H4.53589C4.02269 12 3.70194 11.4444 3.95854 11L7.42264 5Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n <path\n d=\"M7.42264 7.66669C7.67924 7.22224 8.32074 7.22224 8.57734 7.66669L12.0414 13.6667C12.298 14.1111 11.9773 14.6667 11.4641 14.6667H4.53589C4.02269 14.6667 3.70194 14.1111 3.95854 13.6667L7.42264 7.66669Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n </g>\n <defs>\n <clipPath id=\"clip0\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n </div>\n\n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\"\n [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\">\n {{ 'common.dueBy' | translate }} - &nbsp;<span class=\"font-bold\">{{ cbPlanEndDate | date: 'd\n MMM,y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\">\n <div class=\"new-version-chip rounded-2xl\" (click)=\"navigateToNewVersion()\"\n (keydown)=\"navigateToNewVersion()\">\n <span class=\"new-version-text nodtranslate\">{{ 'apptoc.newVersion' | translate }}</span>\n </div>\n </ng-container>\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{\n handleCapitalize(contentReadData?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{ 'cardcontentv2.by'\n | translate }} {{ contentReadData?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\"\n (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' |\n translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' |\n translate }}</span>\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"contentReadData?.retirementDate\">\n <div class=\"new-version-pill text-xs leading-3\" *ngIf=\"contentReadData?.status !== 'Retired'\">\n <span>{{ 'apptoc.pendingRetirement' | translate }}</span>\n </div>\n <div class=\"new-version-retire-pill text-xs leading-3\" *ngIf=\"contentReadData?.status === 'Retired'\">\n <span>{{ 'apptoc.retired' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{\n contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n <ng-container>\n <div class=\"flex flex-row gap-2\" *ngIf=\"languageList?.length > 1\">\n <mat-chip-list class=\"lang-chips\">\n <!-- Show up to 6 chips -->\n <ng-container *ngFor=\"let lang of languageList | slice:0:5; let i = index\">\n <mat-chip class=\"matchip-custom\" selectable=\"true\"\n [selected]=\"lang?.identifier === selectedLanguage?.identifier\" (click)=\"onLanguageSelect(lang)\">\n {{ lang.name || lang.value }}\n </mat-chip>\n </ng-container>\n\n <!-- \"More\" chip if there are more than 6 languages -->\n <ng-container *ngIf=\"languageList.length > 5\">\n <mat-chip [matMenuTriggerFor]=\"moreLanguagesMenu\" selectable=\"false\" class=\"more-chip matchip-custom\"\n [selected]=\"isSelectedInMoreDropdown()\">\n More <mat-icon class=\"mat-icon\">keyboard_arrow_down</mat-icon>\n </mat-chip>\n <mat-menu #moreLanguagesMenu=\"matMenu\">\n <mat-radio-group class=\"mat-radio-group flex flex-col gap-2 p-3\" [value]=\"selectedLanguage\">\n <mat-radio-button *ngFor=\"let lang of languageList | slice:5\" [value]=\"lang\"\n [checked]=\"lang?.identifier === selectedLanguage?.identifier\" (change)=\"onLanguageSelect(lang)\">\n {{ lang.displayName || lang.name || lang }}\n </mat-radio-button>\n </mat-radio-group>\n </mat-menu>\n </ng-container>\n </mat-chip-list>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate\n }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate\n }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\" (mouseleave)=\"isReleventBtnHovered = false\"\n (click)=\"handleAcceptRelevent()\">\n <img [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n\n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\"\n *ngIf=\"contentReadData?.identifier && content?.identifier && baseContentReadData?.identifier\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\"\n [tocStructure]=\"tocStructure\" [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\"\n [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\"\n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"\n [kparray]=\"kparray\" (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\" [languageList]=\"languageList\"\n [lockCertificate]=\"lockCertificate\" (trigerCompletionSurveyForm)=\"openSurveyFormPopup($event)\"\n (resumeContent)=\"resumeContentData()\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n\n\n <div class=\"right-container\">\n\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\"\n [ngStyle]=\"{\n 'background-image': 'url(' + contentReadData?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\"\n [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\"\n [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\"\n *ngIf=\"canShare && !forPreview\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(contentReadData?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{\n 'cardcontentv2.by' | translate }} {{ contentReadData?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-1 cursor-pointer switch-version\"\n *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\"\n (click)=\"navigateToNewVersion()\" (keydown)=\"navigateToNewVersion()\">\n <span class=\"btn-switch\">{{ 'apptoc.switchToNewVersion' | translate }}</span>\n </div>\n\n <div class=\"flex flex-col gap-4\"\n *ngIf=\"contentReadData && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize\n || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\"\n *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container>\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container>\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\"\n class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"timer && timer.days >= 0 && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && (\n !contentReadData?.preEnrolmentResources?.length ||\n (contentReadData?.preEnrolmentResources?.length && (preAssessmentCompletionStatus || !preAssessmentRequiredFlag))\n )\">\n\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container>{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container>{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container>{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container\n *ngIf=\"actionBtnStatus !== 'wait' && contentReadData?.status !== 'Deleted' && contentReadData?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"\n [content]=\"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\"\n [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author?.photo || ''\" [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.creators' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let creeator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creeator?.photo || ''\" [name]=\"creeator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creeator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.creator' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\"\n *ngIf=\"contentReadData?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"contentReadData?.creatorLogo\" [src]=\"contentReadData?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!contentReadData?.creatorLogo\" class=\"mat-icon\"\n src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"contentReadData?.createdFor?.length\"\n (click)=\"raiseTelemeteryForProvider(contentReadData?.source, contentReadData?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', contentReadData?.source, contentReadData?.createdFor[0], 'micro-sites']\">\n {{ handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!contentReadData?.createdFor?.length\">{{\n handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n\n\n </div>\n </div>\n <div class=\"mobile-enroll-div\"\n [ngClass]=\"{'bg-white': contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\"\n (resetEnableShare)=\"resetEnableShare($event)\" [baseContentReadData]=\"baseContentReadData\"></ws-app-share-toc>\n</ng-container>\n<ng-template #noDataFound>\n <div\n class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\">\n The page you requested cannot be found\n </div>\n </div>\n <!-- <div class=\"error-support\">\n <div class=\"support-message\" >We have updated our web site and many URLs have changed.</div>\n <div class=\"support-message\" >You might want to:</div>\n </div> -->\n </div>\n\n</ng-template>\n\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <a (click)=\"raiseTelemetryForPublic($event)\"\n [routerLink]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url)\"\n [queryParams]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START'))\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n</ng-template>\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container *ngIf=\"forPreview && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>", styles: [".source-text{color:#ffffffb3}.approved-icon{width:12px;height:12px}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}@media screen and (max-width: 576px){.toc-banner .banner-details{padding-top:10px;padding-bottom:20px}}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.toc-banner .new-version-pill{background-color:#f9cb97;border:1px solid rgb(249,203,151);padding:4px;border-radius:2px}.toc-banner .new-version-retire-pill{background-color:#d13924;border:1px solid #d13924;padding:4px;color:#fff;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#1b4ca1;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#1b4ca1!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media only screen and (max-width: 768px){.new-version-text{font-size:12px!important}.new-version-chip{padding-top:0!important}}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom{background:transparent;border:1px solid #fff;color:#fff!important;cursor:pointer;margin:0!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon{color:#fff!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon:hover{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected{background:#fff!important;border:1px solid #fff;color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover mat-icon,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected mat-icon{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:after{opacity:0!important;background:transparent}.new-version-chip{gap:10px;padding:2px 8px;background-color:#f3962f;cursor:pointer;position:relative;overflow:hidden}.new-version-chip:before{content:\"\";position:absolute;top:0;left:-100%;width:25%;height:100%;background:linear-gradient(314deg,transparent,rgba(213,210,210,.6),transparent);animation:shimmer 1s infinite}.new-version-chip .new-version-text{font-family:Lato;font-weight:400;font-size:20px;line-height:100%}.btn-switch{font-family:Lato,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:none;border:1px solid rgb(243,150,47);color:#f3962f;background:#ef951e29!important}@keyframes shimmer{0%{left:-100%}to{left:100%}}.knowledge-level-container{margin-left:auto}.level-badge{display:inline-flex;height:24px;padding:2px 8px;align-items:center;gap:4px;flex-shrink:0;border-radius:12px;font-weight:600;font-size:12px;line-height:16px;white-space:nowrap}.level-badge.beginner{border:1px solid #49C951;background:linear-gradient(0deg,#49c95133 0% 100%),#fff;color:#2f8132;border-radius:16px}.level-badge.intermediate{border:1px solid #1B4CA1;background:linear-gradient(0deg,#1b4ca133 0% 100%),#fff;color:#1b4ca1;border-radius:16px}.level-badge.advanced{border:1px solid #FF8268;background:linear-gradient(0deg,#ff826833 0% 100%),#fff;color:#ff4b25;border-radius:16px}.level-badge svg{flex-shrink:0}\n"] }]
2828
+ args: [{ selector: 'ws-app-app-toc-home-v2', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"courseID else noDataFound\">\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- Course block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n contentReadData?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ content?.completionPercentage >= 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"firstResourceLink?.url\" class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </button>\n\n <!-- <div\n *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100 || certData)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div> -->\n\n <!-- <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\" [ngClass]=\"{'disable-start-btn': !canEnroll()}\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n <!-- <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <!-- PRogram & mandatory course block -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.PROGRAM || contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\"\n (programEnrollCall)=\"programEnrollCall($event)\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n <ng-container\n *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && contentReadData?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ (resumeData) || content?.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </a>\n <!-- <div *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100)\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating}\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div>\n <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"isBatchInProgress && (contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- Curated program block -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- STANDALONE_ASSESSMENT black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\"\n *ngIf=\"!forPreview || isInIFrame\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- INVITE ONLY STANDALONE ASSESSMENT block-->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvitedForAssessment' | translate }}\n </span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n\n <!-- STANDALONE_ASSESSMENT enrolled black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <!-- BLENDED_PROGRAM block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n <ng-container>\n <a *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \"\n (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\">{{\n 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\">\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"contentCompletionPercent >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\"\n (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"mobile-back-btn\" (click)=\"goBack()\">\n <mat-icon class=\"text-white\">arrow_back</mat-icon>\n </div>\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\"\n *ngIf=\"contentReadData?.additionalTags?.includes('iGOT Specialization')\">\n <img class=\"approved-icon\" src=\"./assets/icons/approved.svg\" alt=\"approved\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n 'cardcontentv2.iGOTSpecializationProgram' | translate }}</div>\n </div>\n <!-- Knowledge level block for search box -->\n <!-- {{content?.difficultyLevel}} -->\n <div *ngIf=\"contentReadData?.difficultyLevel\" class=\"knowledge-level-container\">\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'beginner'\"\n class=\"level-badge beginner\">\n <!-- <span *ngIf=\"false\" class=\"level-badge beginner\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#DBF4DC\" />\n <path\n d=\"M7.42267 5C7.67927 4.55555 8.32077 4.55556 8.57737 5L12.0415 11C12.2981 11.4444 11.9773 12 11.4641 12H4.53592C4.02272 12 3.70197 11.4444 3.95857 11L7.42267 5Z\"\n fill=\"#49C951\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'intermediate'\"\n class=\"level-badge intermediate\">\n <!-- <span *ngIf=\"true\" class=\"level-badge intermediate\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#D1DBEC\" />\n <path\n d=\"M7.42267 2.66666C7.67927 2.22221 8.32077 2.22221 8.57737 2.66666L12.0415 8.66666C12.2981 9.1111 11.9773 9.66666 11.4641 9.66666H4.53592C4.02272 9.66666 3.70197 9.1111 3.95857 8.66666L7.42267 2.66666Z\"\n fill=\"#1B4CA1\" />\n <path\n d=\"M7.42267 5.66666C7.67927 5.22221 8.32077 5.22221 8.57737 5.66666L12.0415 11.6667C12.2981 12.1111 11.9773 12.6667 11.4641 12.6667H4.53592C4.02272 12.6667 3.70197 12.1111 3.95857 11.6667L7.42267 5.66666Z\"\n fill=\"#1B4CA1\" stroke=\"#D1DBEC\" stroke-width=\"0.5\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'advanced'\"\n class=\"level-badge advanced\">\n <!-- <span *ngIf=\"false\" class=\"level-badge advanced\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <g clip-path=\"url(#clip0)\">\n <rect width=\"16\" height=\"16\" fill=\"#FFE6E1\" />\n <path\n d=\"M7.42264 2.33334C7.67924 1.8889 8.32074 1.8889 8.57734 2.33334L12.0414 8.33334C12.298 8.77779 11.9773 9.33334 11.4641 9.33334H4.53589C4.02269 9.33334 3.70194 8.77779 3.95854 8.33334L7.42264 2.33334Z\"\n fill=\"#FF8268\" />\n <path\n d=\"M7.42264 5C7.67924 4.55555 8.32074 4.55556 8.57734 5L12.0414 11C12.298 11.4444 11.9773 12 11.4641 12H4.53589C4.02269 12 3.70194 11.4444 3.95854 11L7.42264 5Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n <path\n d=\"M7.42264 7.66669C7.67924 7.22224 8.32074 7.22224 8.57734 7.66669L12.0414 13.6667C12.298 14.1111 11.9773 14.6667 11.4641 14.6667H4.53589C4.02269 14.6667 3.70194 14.1111 3.95854 13.6667L7.42264 7.66669Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n </g>\n <defs>\n <clipPath id=\"clip0\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n </div>\n\n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\"\n [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\">\n {{ 'common.dueBy' | translate }} - &nbsp;<span class=\"font-bold\">{{ cbPlanEndDate | date: 'd\n MMM,y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\">\n <div class=\"new-version-chip rounded-2xl\" (click)=\"navigateToNewVersion()\"\n (keydown)=\"navigateToNewVersion()\">\n <span class=\"new-version-text nodtranslate\">{{ 'apptoc.newVersion' | translate }}</span>\n </div>\n </ng-container>\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{\n handleCapitalize(contentReadData?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{ 'cardcontentv2.by'\n | translate }} {{ contentReadData?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\"\n (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' |\n translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' |\n translate }}</span>\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"contentReadData?.retirementDate\">\n <div class=\"new-version-pill text-xs leading-3\" *ngIf=\"contentReadData?.status !== 'Retired'\">\n <span>{{ 'apptoc.pendingRetirement' | translate }}</span>\n </div>\n <div class=\"new-version-retire-pill text-xs leading-3\" *ngIf=\"contentReadData?.status === 'Retired'\">\n <span>{{ 'apptoc.retired' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{\n contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n <ng-container>\n <div class=\"flex flex-row gap-2\" *ngIf=\"languageList?.length > 1\">\n <mat-chip-list class=\"lang-chips\">\n <!-- Show up to 6 chips -->\n <ng-container *ngFor=\"let lang of languageList | slice:0:5; let i = index\">\n <mat-chip class=\"matchip-custom\" selectable=\"true\"\n [selected]=\"lang?.identifier === selectedLanguage?.identifier\" (click)=\"onLanguageSelect(lang)\">\n {{ lang.name || lang.value }}\n </mat-chip>\n </ng-container>\n\n <!-- \"More\" chip if there are more than 6 languages -->\n <ng-container *ngIf=\"languageList.length > 5\">\n <mat-chip [matMenuTriggerFor]=\"moreLanguagesMenu\" selectable=\"false\" class=\"more-chip matchip-custom\"\n [selected]=\"isSelectedInMoreDropdown()\">\n More <mat-icon class=\"mat-icon\">keyboard_arrow_down</mat-icon>\n </mat-chip>\n <mat-menu #moreLanguagesMenu=\"matMenu\">\n <mat-radio-group class=\"mat-radio-group flex flex-col gap-2 p-3\" [value]=\"selectedLanguage\">\n <mat-radio-button *ngFor=\"let lang of languageList | slice:5\" [value]=\"lang\"\n [checked]=\"lang?.identifier === selectedLanguage?.identifier\" (change)=\"onLanguageSelect(lang)\">\n {{ lang.displayName || lang.name || lang }}\n </mat-radio-button>\n </mat-radio-group>\n </mat-menu>\n </ng-container>\n </mat-chip-list>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate\n }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate\n }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\" (mouseleave)=\"isReleventBtnHovered = false\"\n (click)=\"handleAcceptRelevent()\">\n <img [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n\n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\"\n *ngIf=\"contentReadData?.identifier && content?.identifier && baseContentReadData?.identifier\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\"\n [tocStructure]=\"tocStructure\" [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\"\n [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\"\n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"\n [kparray]=\"kparray\" (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\" [languageList]=\"languageList\"\n [lockCertificate]=\"lockCertificate\" (trigerCompletionSurveyForm)=\"openSurveyFormPopup($event)\"\n (resumeContent)=\"resumeContentData()\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n\n\n <div class=\"right-container\">\n\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\"\n [ngStyle]=\"{\n 'background-image': 'url(' + contentReadData?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\"\n [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\"\n [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\"\n *ngIf=\"canShare && !forPreview\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(contentReadData?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{\n 'cardcontentv2.by' | translate }} {{ contentReadData?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-1 cursor-pointer switch-version\"\n *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\"\n (click)=\"navigateToNewVersion()\" (keydown)=\"navigateToNewVersion()\">\n <span class=\"btn-switch\">{{ 'apptoc.switchToNewVersion' | translate }}</span>\n </div>\n\n <div class=\"flex flex-col gap-4\"\n *ngIf=\"contentReadData && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize\n || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\"\n *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container>\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container>\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\"\n class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"timer && timer.days >= 0 && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && (\n !contentReadData?.preEnrolmentResources?.length ||\n (contentReadData?.preEnrolmentResources?.length && (preAssessmentCompletionStatus || !preAssessmentRequiredFlag))\n )\">\n\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container>{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container>{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container>{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container\n *ngIf=\"actionBtnStatus !== 'wait' && contentReadData?.status !== 'Deleted' && contentReadData?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"\n [content]=\"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\"\n [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author?.photo || ''\" [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.creators' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let creeator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creeator?.photo || ''\" [name]=\"creeator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creeator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.creator' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\"\n *ngIf=\"contentReadData?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"contentReadData?.creatorLogo\" [src]=\"contentReadData?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!contentReadData?.creatorLogo\" class=\"mat-icon\"\n src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"contentReadData?.createdFor?.length\"\n (click)=\"raiseTelemeteryForProvider(contentReadData?.source, contentReadData?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', contentReadData?.source, contentReadData?.createdFor[0], 'micro-sites']\">\n {{ handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!contentReadData?.createdFor?.length\">{{\n handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n\n\n </div>\n </div>\n <div class=\"mobile-enroll-div\"\n [ngClass]=\"{'bg-white': contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\"\n (resetEnableShare)=\"resetEnableShare($event)\" [baseContentReadData]=\"baseContentReadData\"></ws-app-share-toc>\n</ng-container>\n<ng-template #noDataFound>\n <div\n class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\">\n The page you requested cannot be found\n </div>\n </div>\n <!-- <div class=\"error-support\">\n <div class=\"support-message\" >We have updated our web site and many URLs have changed.</div>\n <div class=\"support-message\" >You might want to:</div>\n </div> -->\n </div>\n\n</ng-template>\n\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <a (click)=\"raiseTelemetryForPublic($event)\"\n [routerLink]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url)\"\n [queryParams]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START'))\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n</ng-template>\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container *ngIf=\"forPreview && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>", styles: [".source-text{color:#ffffffb3}.approved-icon{width:12px;height:12px}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}@media screen and (max-width: 576px){.toc-banner .banner-details{padding-top:10px;padding-bottom:20px}}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.toc-banner .new-version-pill{background-color:#f9cb97;border:1px solid rgb(249,203,151);padding:4px;border-radius:2px}.toc-banner .new-version-retire-pill{background-color:#d13924;border:1px solid #d13924;padding:4px;color:#fff;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.mobile-back-btn{display:flex!important;align-items:center;justify-content:flex-start;cursor:pointer;padding:0;margin-bottom:8px;color:#fff!important}.mobile-back-btn mat-icon{font-size:24px!important;width:24px!important;height:24px!important}@media screen and (min-width: 577px){.mobile-back-btn{display:none!important}}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#1b4ca1;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#1b4ca1!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media only screen and (max-width: 768px){.new-version-text{font-size:12px!important}.new-version-chip{padding-top:0!important}}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom{background:transparent;border:1px solid #fff;color:#fff!important;cursor:pointer;margin:0!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon{color:#fff!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon:hover{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected{background:#fff!important;border:1px solid #fff;color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover mat-icon,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected mat-icon{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:after{opacity:0!important;background:transparent}.new-version-chip{gap:10px;padding:2px 8px;background-color:#f3962f;cursor:pointer;position:relative;overflow:hidden}.new-version-chip:before{content:\"\";position:absolute;top:0;left:-100%;width:25%;height:100%;background:linear-gradient(314deg,transparent,rgba(213,210,210,.6),transparent);animation:shimmer 1s infinite}.new-version-chip .new-version-text{font-family:Lato;font-weight:400;font-size:20px;line-height:100%}.btn-switch{font-family:Lato,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:none;border:1px solid rgb(243,150,47);color:#f3962f;background:#ef951e29!important}@keyframes shimmer{0%{left:-100%}to{left:100%}}.knowledge-level-container{margin-left:auto}.level-badge{display:inline-flex;height:24px;padding:2px 8px;align-items:center;gap:4px;flex-shrink:0;border-radius:12px;font-weight:600;font-size:12px;line-height:16px;white-space:nowrap}.level-badge.beginner{border:1px solid #49C951;background:linear-gradient(0deg,#49c95133 0% 100%),#fff;color:#2f8132;border-radius:16px}.level-badge.intermediate{border:1px solid #1B4CA1;background:linear-gradient(0deg,#1b4ca133 0% 100%),#fff;color:#1b4ca1;border-radius:16px}.level-badge.advanced{border:1px solid #FF8268;background:linear-gradient(0deg,#ff826833 0% 100%),#fff;color:#ff4b25;border-radius:16px}.level-badge svg{flex-shrink:0}\n"] }]
2817
2829
  }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.WidgetContentService }, { type: i3.AppTocService }, { type: i4.LoggerService }, { type: i4.ConfigurationsService }, { type: i5.DomSanitizer }, { type: i6.MatLegacySnackBar }, { type: i7.MatLegacyDialog }, { type: i8.MobileAppsService }, { type: i4.UtilityService }, { type: i9.ContentLanguageService }, { type: i10.ActionService }, { type: i11.ViewerUtilService }, { type: i12.RatingService }, { type: i4.TelemetryService }, { type: i13.TranslateService }, { type: i4.MultilingualTranslationsService }, { type: i4.EventService }, { type: i14.LoadCheckService }, { type: i15.HandleClaimService }, { type: i16.ResetRatingsService }, { type: i17.TimerService }, { type: i4.WidgetEnrollService }, { type: i9.WidgetContentLibService }, { type: i4.DataTransferService }, { type: i18.MatSnackBar }, { type: i9.WidgetUserServiceLib }, { type: i19.NetCoreService }, { type: i20.AppTocV2Service }, { type: i21.Location }, { type: undefined, decorators: [{
2818
2830
  type: Inject,
2819
2831
  args: ['environment']
@@ -2837,4 +2849,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
2837
2849
  type: HostListener,
2838
2850
  args: ['window:scroll', ['$event']]
2839
2851
  }] } });
2840
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1ob21lLXYyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9jb21wb25lbnRzL2FwcC10b2MtaG9tZS12Mi9hcHAtdG9jLWhvbWUtdjIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1ob21lLXYyL2FwcC10b2MtaG9tZS12Mi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFBYyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUM3RCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUE7QUFHdEIsT0FBTyxFQUF1QyxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHL0QsT0FBTyxFQUE0QixPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDeEUsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLDJCQUEyQjtBQUMzQixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sY0FBYyxNQUFNLDZCQUE2QixDQUFBO0FBRXhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUVoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUV4RSxPQUFPLEVBSWdDLFFBQVEs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RUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNoQixhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBb0MxQixZQUFZO3NCQURYLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uLCBJbnB1dCxcbiAgSW5qZWN0LCBPcHRpb25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuaW1wb3J0IHsgU2FmZUh0bWwsIERvbVNhbml0aXplciwgU2FmZVN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlcidcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBFdmVudCwgRGF0YSwgUm91dGVyLCBOYXZpZ2F0aW9uRW5kIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG4vLyBpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUsIFN1YmplY3QsIG9mLCBmcm9tIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHNoYXJlLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5kYXlqcy5leHRlbmQoaXNTYW1lT3JCZWZvcmUpXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCBpc1NhbWVPckJlZm9yZSBmcm9tICdkYXlqcy9wbHVnaW4vaXNTYW1lT3JCZWZvcmUnXG5cbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5tb2RlbCdcbmltcG9ydCB7IFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50LnNlcnZpY2UnXG5pbXBvcnQgeyB2aWV3ZXJSb3V0ZUdlbmVyYXRvciB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy92aWV3ZXItcm91dGUtdXRpbCdcbmltcG9ydCB7IE5zV2lkZ2V0UmVzb2x2ZXIgfSBmcm9tICdAc3VuYmlyZC1jYi9yZXNvbHZlci12MidcbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25zU2VydmljZSwgRGF0YVRyYW5zZmVyU2VydmljZSwgRXZlbnRTZXJ2aWNlLFxuICBMb2dnZXJTZXJ2aWNlLCBNdWx0aWxpbmd1YWxUcmFuc2xhdGlvbnNTZXJ2aWNlLFxuICBOc1BhZ2UsIFRGZXRjaFN0YXR1cywgVGVsZW1ldHJ5U2VydmljZSxcbiAgVXRpbGl0eVNlcnZpY2UsIFdpZGdldEVucm9sbFNlcnZpY2UsIFdzRXZlbnRzLFxufSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12MidcblxuaW1wb3J0IHsgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlLCBUT0NNdWx0aUxpbmd1YWxEaWFsb2dDb21wb25lbnQsIFdpZGdldENvbnRlbnRMaWJTZXJ2aWNlLCBXaWRnZXRVc2VyU2VydmljZUxpYiB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xuaW1wb3J0IHsgTnNBcHBUb2MgfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwLXRvYy5tb2RlbCdcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHAtdG9jLnNlcnZpY2UnXG5pbXBvcnQgeyBNb2JpbGVBcHBzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vYmlsZS1hcHBzLnNlcnZpY2UnXG5pbXBvcnQgeyBIYW5kbGVDbGFpbVNlcnZpY2UgfSBmcm9tICcuLi8uLi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtdG9jL2NvbnRlbnQtc2VydmljZXMvaGFuZGxlLWNsYWltLnNlcnZpY2UnXG5pbXBvcnQgeyBBY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWN0aW9uLnNlcnZpY2UnXG5pbXBvcnQgeyBSYXRpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3JhdGluZy5zZXJ2aWNlJ1xuaW1wb3J0IHsgVmlld2VyVXRpbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92aWV3ZXItdXRpbC5zZXJ2aWNlJ1xuaW1wb3J0IHsgTG9hZENoZWNrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xvYWQtY2hlY2suc2VydmljZSdcbmltcG9ydCB7IFJlc2V0UmF0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXNldC1yYXRpbmdzLnNlcnZpY2UnXG5cbmltcG9ydCB7IEFwcFRvY0RpYWxvZ0ludHJvVmlkZW9Db21wb25lbnQgfSBmcm9tICcuLi9hcHAtdG9jLWRpYWxvZy1pbnRyby12aWRlby9hcHAtdG9jLWRpYWxvZy1pbnRyby12aWRlby5jb21wb25lbnQnXG5pbXBvcnQgeyBDb250ZW50UmF0aW5nVjJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtcmF0aW5nLXYyLWRpYWxvZy9jb250ZW50LXJhdGluZy12Mi1kaWFsb2cuY29tcG9uZW50J1xuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGltZXIuc2VydmljZSdcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJ1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgYXMgTWF0U25hY2tiYXJOZXcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInXG5pbXBvcnQgeyBOZXRDb3JlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ldGNvcmUuc2VydmljZSdcbmltcG9ydCB7IEVucm9sbExhbmd1YWdlRGlhbG9ndWVDb21wb25lbnQgfSBmcm9tICcuLi9lbnJvbGwtbGFuZ3VhZ2UtZGlhbG9ndWUvZW5yb2xsLWxhbmd1YWdlLWRpYWxvZ3VlLmNvbXBvbmVudCdcbmltcG9ydCB7IENvbXBsZXRpb25TdXJ2ZXlGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcGxldGlvbi1zdXJ2ZXktZm9ybS9jb21wbGV0aW9uLXN1cnZleS1mb3JtLmNvbXBvbmVudCdcbmltcG9ydCB7IFB1YmxpY1N1cnZleUZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9wdWJsaWMtc3VydmV5LWZvcm0vcHVibGljLXN1cnZleS1mb3JtLmNvbXBvbmVudCdcbmltcG9ydCB7IE5zQ2FyZENvbnRlbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FyZC1jb250ZW50Lm1vZGVsJ1xuaW1wb3J0IHsgTm9uUmVsZXZlbnRGZWVkYmFja0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL25vbi1yZWxldmVudC1mZWVkYmFjay1kaWFsb2cvbm9uLXJlbGV2ZW50LWZlZWRiYWNrLWRpYWxvZy5jb21wb25lbnQnXG5pbXBvcnQgeyBBcHBUb2NWMlNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHAtdG9jLXYyLnNlcnZpY2UnXG5cbmV4cG9ydCBlbnVtIEVycm9yVHlwZSB7XG4gIGludGVybmFsU2VydmVyID0gJ2ludGVybmFsU2VydmVyJyxcbiAgc2VydmljZVVuYXZhaWxhYmxlID0gJ3NlcnZpY2VVbmF2YWlsYWJsZScsXG4gIHNvbWV0aGluZ1dyb25nID0gJ3NvbWV0aGluZ1dyb25nJyxcbn1cblxuY29uc3QgZmxhdHRlbkl0ZW1zID0gKGl0ZW1zOiBhbnlbXSwga2V5OiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoZmxhdHRlbmVkSXRlbXMsIGl0ZW0pID0+IHtcbiAgICBmbGF0dGVuZWRJdGVtcy5wdXNoKGl0ZW0pXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbVtrZXldKSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICBmbGF0dGVuZWRJdGVtcyA9IGZsYXR0ZW5lZEl0ZW1zLmNvbmNhdChmbGF0dGVuSXRlbXMoaXRlbVtrZXldLCBrZXkpKVxuICAgIH1cbiAgICByZXR1cm4gZmxhdHRlbmVkSXRlbXNcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgfSwgW10pXG59XG5jb25zdCBTTkFDS0JBUl9EVVJBVElPTiA9IDMwMDBcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzLWFwcC1hcHAtdG9jLWhvbWUtdjInLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1ob21lLXYyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXBwLXRvYy1ob21lLXYyLmNvbXBvbmVudC5zY3NzJ10sXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdXNlLWNvbXBvbmVudC12aWV3LWVuY2Fwc3VsYXRpb25cbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwVG9jSG9tZVYyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQge1xuICBxdWVyeVBhcmFtc0RhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTsgLy8gSW5pdGlhbGl6ZSBxdWVyeVBhcmFtc0RhdGFcbiAgc2hvdyA9IGZhbHNlXG4gIGNoYW5nZVRhYiA9IGZhbHNlXG4gIHNrZWxldG9uTG9hZGVyID0gdHJ1ZVxuICBiYW5uZXJzOiBOc0FwcFRvYy5JVG9jQmFubmVyIHwgbnVsbCA9IG51bGxcbiAgc2hvd01vcmVHbGFuY2UgPSBmYWxzZVxuICBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICBjb250ZW50UmVhZERhdGE6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIGJhc2VDb250ZW50UmVhZERhdGE6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIGVycm9yQ29kZTogTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlIHwgbnVsbCA9IG51bGxcbiAgcmVzdW1lRGF0YTogYW55ID0gbnVsbFxuICBuc0NhcmRDb250ZW50RGF0YTogYW55ID0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3RcbiAgYmF0Y2hEYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlIHwgbnVsbCA9IG51bGxcbiAgY3VycmVudENvdXJzZUJhdGNoSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIHVzZXJFbnJvbGxtZW50TGlzdCE6IE5zQ29udGVudC5JQ291cnNlW11cbiAgcm91dGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHBhZ2VOYXZiYXI6IFBhcnRpYWw8TnNQYWdlLklOYXZCYWNrZ3JvdW5kPiA9IHRoaXMuY29uZmlnU3ZjLnBhZ2VOYXZCYXJcbiAgaXNDb2hvcnRzUmVzdHJpY3RlZCA9IGZhbHNlXG4gIHN0aWNreSA9IGZhbHNlXG4gIGlzSW5JZnJhbWUgPSBmYWxzZVxuICBjYlBsYW5FbmREYXRlOiBhbnlcbiAgY2JQbGFuRHVyYXRpb246IGFueVxuICBlbnJvbGxlZENvdXJzZURhdGE6IGFueVxuICBASW5wdXQoKSBmb3JQcmV2aWV3OiBhbnkgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL2F1dGhvci8nKVxuICBASW5wdXQoKSBpbnB1dENvbnRlbnQ6IGFueVxuICAvLyBmb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9hdXRob3IvJylcbiAgYW5hbHl0aWNzID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhPy5wYWdlRGF0YT8uZGF0YT8uYW5hbHl0aWNzXG4gIGVycm9yV2lkZ2V0RGF0YTogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aFR5cGVkRGF0YTxhbnk+ID0ge1xuICAgIHdpZGdldFR5cGU6ICdlcnJvclJlc29sdmVyJyxcbiAgICB3aWRnZXRTdWJUeXBlOiAnZXJyb3JSZXNvbHZlcicsXG4gICAgd2lkZ2V0RGF0YToge1xuICAgICAgZXJyb3JUeXBlOiAnaW50ZXJuYWxTZXJ2ZXInLFxuICAgIH0sXG4gIH1cbiAgaXNBdXRob3IgPSBmYWxzZVxuICBhdXRob3JCdG5XaWRnZXQ6IE5zUGFnZS5JTmF2TGluayA9IHtcbiAgICBhY3Rpb25CdG5JZDogJ2ZlYXR1cmVfYXV0aG9yaW5nJyxcbiAgICBjb25maWc6IHtcbiAgICAgIHR5cGU6ICdtYXQtYnV0dG9uJyxcbiAgICB9LFxuICB9XG4gIHRvY0NvbmZpZzogYW55ID0gbnVsbFxuICBwcmltYXJ5Q2F0ZWdvcnkgPSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeVxuICBjb3Vyc2VDYXRlZ29yeSA9IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnlcbiAgV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cyA9IE5zQ29udGVudC5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzXG4gIGFza0F1dGhvckVuYWJsZWQgPSB0cnVlXG4gIHRyYWluaW5nTEh1YkVuYWJsZWQgPSBmYWxzZVxuICB0cmFpbmluZ0xIdWJDb3VudCQ/OiBPYnNlcnZhYmxlPG51bWJlcj5cbiAgYm9keTogU2FmZUh0bWwgfCBudWxsID0gbnVsbFxuICB2aWV3TW9yZVJlbGF0ZWRUb3BpY3MgPSBmYWxzZVxuICBoYXNUb2NTdHJ1Y3R1cmUgPSBmYWxzZVxuICB0b2NTdHJ1Y3R1cmU6IE5zQXBwVG9jLklUb2NTdHJ1Y3R1cmUgfCBudWxsID0gbnVsbFxuICBjb250ZW50UGFyZW50czogeyBba2V5OiBzdHJpbmddOiBOc0FwcFRvYy5JQ29udGVudFBhcmVudFJlc3BvbnNlW10gfSA9IHt9XG4gIG9iaktleXMgPSBPYmplY3Qua2V5c1xuICBmcmFnbWVudCE6IHN0cmluZ1xuICBhY3RpdmVGcmFnbWVudCA9IHRoaXMucm91dGUuZnJhZ21lbnQucGlwZShzaGFyZSgpKVxuICBjdXJyZW50RnJhZ21lbnQgPSAnb3ZlcnZpZXcnXG4gIHNob3dTY3JvbGwhOiBib29sZWFuXG4gIHNob3dTY3JvbGxIZWlnaHQgPSAzMDBcbiAgaGlkZVNjcm9sbEhlaWdodCA9IDEwXG4gIGVsZW1lbnRQb3NpdGlvbjogYW55XG4gIGJhdGNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBiYXRjaERhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHJlc3VtZURhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHRyYW5zbGF0aW9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBAVmlld0NoaWxkKCdzdGlja3lNZW51JywgeyBzdGF0aWM6IHRydWUgfSkgbWVudUVsZW1lbnQhOiBFbGVtZW50UmVmXG4gIGJhdGNoQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gIGNvbnRlbnRQcm9ncmVzcyA9IDBcbiAgYmFubmVyVXJsOiBTYWZlU3R5bGUgfCBudWxsID0gbnVsbFxuICByb3V0ZVBhdGggPSAnb3ZlcnZpZXcnXG4gIHZhbGlkUGF0aHMgPSBuZXcgU2V0KFsnb3ZlcnZpZXcnLCAnY29udGVudHMnLCAnYW5hbHl0aWNzJ10pXG4gIHJvdXRlclBhcmFtU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBpbml0aWFscm91dGVEYXRhOiBhbnlcbiAgYWN0aW9uQnRuU3RhdHVzID0gJ3dhaXQnXG4gIGlzUmVnaXN0cmF0aW9uU3VwcG9ydGVkID0gZmFsc2VcbiAgc2hvd0ludHJhbmV0TWVzc2FnZSA9IGZhbHNlXG4gIGZpcnN0UmVzb3VyY2VMaW5rOiB7IHVybDogc3RyaW5nOyBxdWVyeVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB9IHwgbnVsbCA9IG51bGxcbiAgcmVzdW1lRGF0YUxpbms6IHsgdXJsOiBzdHJpbmc7IHF1ZXJ5UGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH0gfCBudWxsID0gbnVsbFxuICBjZXJ0RGF0YTogYW55ID0gbnVsbFxuICBzaG93VGFrZUFzc2Vzc21lbnQ6IE5zQXBwVG9jLklQb3N0QXNzZXNzbWVudCB8IG51bGwgPSBudWxsXG4gIGNoZWNrUmVnaXN0cmF0aW9uU291cmNlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAnU2tpbGxTb2Z0IERpZ2l0YWxpemF0aW9uJyxcbiAgICAnU2tpbGxTb2Z0IExlYWRlcnNoaXAnLFxuICAgICdQbHVyYWxzaWdodCcsXG4gIF0pXG4gIGV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzOiBURmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgcmVnaXN0ZXJGb3JFeHRlcm5hbCA9IGZhbHNlXG4gIGlzR29hbHNFbmFibGVkID0gZmFsc2VcbiAgY29udGV4dElkPzogc3RyaW5nXG4gIGNvbnRleHRQYXRoPzogc3RyaW5nXG4gIGRlZmF1bHRTTG9nbyA9ICcnXG4gIGRpc2FibGVFbnJvbGxCdG4gPSBmYWxzZVxuICBpc0Fzc2Vzc1Zpc2libGUgPSBmYWxzZVxuICBpc1ByYWN0aWNlVmlzaWJsZSA9IGZhbHNlXG4gIGNlcnRpZmljYXRlT3BlbiA9IGZhbHNlXG4gIGJyZWFkY3J1bWJzOiBhbnlcbiAgaGlzdG9yeURhdGE6IGFueVxuICBjb3Vyc2VDb21wbGV0ZVN0YXRlID0gMlxuICB1c2VySWQ6IGFueVxuICB1c2VyUmF0aW5nOiBhbnlcbiAgZGFrc2h0YU5hbWUgPSB0aGlzLmVudmlyb25tZW50LmRha3NodGFOYW1lXG4gIGNzY21zVXJsID0gdGhpcy5lbnZpcm9ubWVudC5jc2Ntc1VybFxuICBzaG93QnRuID0gZmFsc2VcbiAgY2hhbm5lbElkOiBhbnlcbiAgc2VsZWN0ZWRCYXRjaERhdGE6IGFueVxuICBzZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uOiBhbnlcbiAgc2VydmVyRGF0ZVN1YnNjcmlwdGlvbjogYW55XG4gIHNlcnZlckRhdGU6IGFueVxuICBrcGFycmF5OiBhbnkgPSBbXVxuICBlbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgaXNBY2JwQ291cnNlID0gZmFsc2VcbiAgaXNBY2JwQ2xhaW0gPSBmYWxzZVxuICBjb3Vyc2VJRDogYW55XG4gIGlzQ2xhaW1lZCA9IGZhbHNlXG4gIG1vbnRobHlDYXBFeGNlZWQgPSBmYWxzZVxuICBpc0NvbXBsZXRlZFRoaXNNb250aCA9IGZhbHNlXG4gIHN0YXJ0RGF0ZTogYW55XG4gIGVuZERhdGU6IGFueVxuICBzdGFydERhdGVEaWZmZXJlbmNlOiBhbnlcbiAgZW5kRGF0ZURpZmZlcmVuY2U6IGFueVxuICBAVmlld0NoaWxkKCdyaWdodENvbnRhaW5lcicpIHJjRWxlbWVudCE6IEVsZW1lbnRSZWZcbiAgQFZpZXdDaGlsZCgnYmFubmVyRGV0YWlscycsIHsgc3RhdGljOiB0cnVlIH0pIGJhbm5lckVsZW0hOiBFbGVtZW50UmVmXG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnRTb3VyY2UnKSBjb250ZW50U291cmNlITogRWxlbWVudFJlZlxuICBzb3VyY2VFbGxpcHNpcyA9IGZhbHNlXG4gIHNjcm9sbExpbWl0ID0gMFxuICByY0VsZW0gPSB7XG4gICAgb2ZmU2V0VG9wOiAwLFxuICAgIEJvdHRvbVBvczogMCxcbiAgfVxuICBzY3JvbGxlZCA9IGZhbHNlXG4gIHBhdGhTZXQgPSBuZXcgU2V0KClcbiAgY2FuU2hhcmUgPSBmYWxzZVxuICBlbmFibGVTaGFyZSA9IGZhbHNlXG4gIHJvb3RPcmdJZDogYW55XG4gIGNlcnRJZDogYW55XG4gIG1vYmlsZTEyMDA6IGFueVxuICBhc3Nlc3NtZW50U3RyaXA6IGFueVxuICBsZWFybkFkdmlzb3J5RGF0YTogYW55XG4gIGNvbnRlbnRDcmVhdG9yRGF0YTogYW55ID0gW11cbiAgLy8gcmFuZG9tbGVhcm5BZHZpc29yeU9iajogYW55XG4gIC8vIGxlYXJuQWR2aXNvcnlEYXRhTGVuZ3RoOiBhbnlcblxuICBwcml2YXRlIGRlc3Ryb3lTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PGFueT4oKVxuICB0aW1lclVuc3Vic2NyaWJlOiBhbnlcbiAgdGltZXI6IGFueVxuICBpc1JlbGV2ZW50QnRuSG92ZXJlZCA9IGZhbHNlXG4gIFNBS1NIQU1BSV9JQ09OX05PUk1BTCA9ICcvYXNzZXRzL2ltYWdlcy9zYWtzaGFtQUkvYWktaWNvbi5zdmcnXG4gIFNBS1NIQU1BSV9JQ09OX0xPQURFUiA9ICcvYXNzZXRzL2ltYWdlcy9zYWtzaGFtQUkvc2Frc2hhbV9haV9sb2FkZXIuZ2lmJ1xuICByZWNvbW1lbmRlZENvdXJzZXNJZCA9ICcnXG4gIGZlZWRiYWNrR2l2ZW46IGFueVxuICBwcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IGZhbHNlXG4gIGZyb21BSVR1dG9yID0gZmFsc2VcbiAgbGFuZ3VhZ2VMaXN0OiBhbnkgPSBbXVxuICBzZWxlY3RlZExhbmd1YWdlOiBhbnlcbiAgbGFuZ3VhZ2VNYXBQcm9ncmVzczogYW55XG4gIHByZUFzc2Vzc21lbnRSZXF1aXJlZEZsYWc6IGFueSA9IGZhbHNlXG4gIGxvY2tDZXJ0aWZpY2F0ZSA9IGZhbHNlXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnLCBbJyRldmVudCddKVxuICBoYW5kbGVTY3JvbGwoKSB7XG4gICAgY29uc3Qgd2luZG93U2Nyb2xsID0gd2luZG93LnBhZ2VZT2Zmc2V0XG4gICAgaWYgKHdpbmRvd1Njcm9sbCA+PSB0aGlzLmVsZW1lbnRQb3NpdGlvbiAtIDEwMCkge1xuICAgICAgdGhpcy5zdGlja3kgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RpY2t5ID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY3JvbGxMaW1pdCkge1xuICAgICAgaWYgKCh3aW5kb3cuc2Nyb2xsWSArIHRoaXMucmNFbGVtLkJvdHRvbVBvcykgPj0gdGhpcy5zY3JvbGxMaW1pdCkge1xuICAgICAgICB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3N0aWNreSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJjRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnXG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIzNi4uLiAoT2Zmc2V0VG9wIG9mIHJpZ2h0IGNvbnRhaW5lciArIDEwNClcbiAgICBpZiAod2luZG93LnNjcm9sbFkgPiAodGhpcy5yY0VsZW0ub2ZmU2V0VG9wICsgMTA0KSkge1xuICAgICAgdGhpcy5zY3JvbGxlZCA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxlZCA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGNvbnRlbnRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXJTdmM6IExvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBtb2JpbGVBcHBzU3ZjOiBNb2JpbGVBcHBzU2VydmljZSxcbiAgICBwcml2YXRlIHV0aWxpdHlTdmM6IFV0aWxpdHlTZXJ2aWNlLFxuICAgIC8vIHByaXZhdGUgcHJvZ3Jlc3NTdmM6IENvbnRlbnRQcm9ncmVzc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZW50TGFuZ1N2YzogQ29udGVudExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGlvblNWQzogQWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHZpZXdlclN2YzogVmlld2VyVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByYXRpbmdTdmM6IFJhdGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0ZWxlbWV0cnlTZXJ2aWNlOiBUZWxlbWV0cnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3RyYW5zbGF0aW9uczogTXVsdGlsaW5ndWFsVHJhbnNsYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50czogRXZlbnRTZXJ2aWNlLFxuICAgIC8vIHByaXZhdGUgbWF0U25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgbG9hZENoZWNrU2VydmljZTogTG9hZENoZWNrU2VydmljZSxcbiAgICBwcml2YXRlIGhhbmRsZUNsYWltU2VydmljZTogSGFuZGxlQ2xhaW1TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVzZXRSYXRpbmdzU2VydmljZTogUmVzZXRSYXRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIHRpbWVyU2VydmljZTogVGltZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyBlbnJvbGxTdmM6IFdpZGdldEVucm9sbFNlcnZpY2UsXG4gICAgcHVibGljIGNvbnRlbnRMaWJTdmM6IFdpZGdldENvbnRlbnRMaWJTZXJ2aWNlLFxuICAgIHB1YmxpYyBkYXRhVHJhbnNmZXJTdmM6IERhdGFUcmFuc2ZlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYXRTbmFja2Jhck5ldzogTWF0U25hY2tiYXJOZXcsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZUxpYjogV2lkZ2V0VXNlclNlcnZpY2VMaWIsXG4gICAgcHVibGljIG5ldENvcmVTZXJ2aWNlOiBOZXRDb3JlU2VydmljZSxcbiAgICBwdWJsaWMgYXBwVG9jVjJTdmM6IEFwcFRvY1YyU2VydmljZSxcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIHB1YmxpYyBlbnZpcm9ubWVudDogYW55XG4gICkge1xuICAgIHRoaXMuaGlzdG9yeURhdGEgPSBoaXN0b3J5LnN0YXRlXG4gICAgdGhpcy5oYW5kbGVCcmVhZGNydW1icygpXG4gICAgdGhpcy5tb2JpbGVBcHBzU3ZjLm1vYmlsZVRvcEhlYWRlclZpc2liaWxpdHlTdGF0dXMubmV4dCh0cnVlKVxuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykpIHtcbiAgICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKCdlbicpXG4gICAgICBjb25zdCBsYW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpIVxuICAgICAgdGhpcy50cmFuc2xhdGUudXNlKGxhbmcpXG4gICAgfVxuXG4gICAgdGhpcy5sb2FkQ2hlY2tTZXJ2aWNlLmNoaWxkQ29tcG9uZW50TG9hZGVkJC5zdWJzY3JpYmUoX2lzTG9hZGVkID0+IHtcbiAgICAgIC8vIFByZXNlbnQgaW4gYXBwLXRvYy1hYm91dC5jb21wb25lbnRcbiAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmF0aW5nc0RpdicpKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhdGluZ3NEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmF0aW5nc0RpdicpIGFzIGFueVxuICAgICAgICAgIGlmIChyYXRpbmdzRGl2KSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbExpbWl0ID0gcmF0aW5nc0Rpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gYXMgYW55XG4gICAgICAgICAgfVxuICAgICAgICB9LCA1MDApXG4gICAgICB9XG5cbiAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudENvbnRhaW5lcicpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudENvbnRhaW5lcicpIGFzIGFueVxuICAgICAgICBpZiAoY29udGVudERpdikge1xuICAgICAgICAgIHRoaXMuc2Nyb2xsTGltaXQgPSBjb250ZW50RGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLmhhbmRsZUNsYWltU2VydmljZS5nZXRDbGFpbURhdGEoKS5zdWJzY3JpYmUoKF9ldmVudERhdGE6IGFueSkgPT4ge1xuICAgICAgdGhpcy5vbkNsaWNrT2ZDbGFpbShfZXZlbnREYXRhKVxuICAgIH0pXG4gIH1cblxuICBnZXRLYXJtYXBvaW50c0xpbWl0KCkge1xuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmMudXNlckthcm1hUG9pbnRzKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzICYmIHJlcy5rcExpc3QpIHtcbiAgICAgICAgICBjb25zdCBpbmZvID0gcmVzLmtwTGlzdC5hZGRpbmZvXG4gICAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgIHRoaXMubW9udGhseUNhcEV4Y2VlZCA9IEpTT04ucGFyc2UoaW5mbykuY2xhaW1lZE5vbkFDQlBDb3Vyc2VLYXJtYVF1b3RhID49IDRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaXNDb3Vyc2VDb21wbGV0ZWRPblRoaXNNb250aCgpIHtcbiAgICBjb25zdCBub3cgPSBtb21lbnQodGhpcy5zZXJ2ZXJEYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGNvdXJzZURhdGEgPSB0aGlzLmVucm9sbGVkQ291cnNlRGF0YVxuICAgICAgaWYgKGNvdXJzZURhdGEgJiYgY291cnNlRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwICYmIGNvdXJzZURhdGEuY29tcGxldGVkT24pIHtcbiAgICAgICAgY29uc3QgY29tcGxldGVkT24gPSBtb21lbnQoY291cnNlRGF0YS5jb21wbGV0ZWRPbikuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgY29uc3QgY29tcGxldGVkTW9udGggPSBtb21lbnQoY29tcGxldGVkT24sICdZWVlZLU1NLUREJykubW9udGgoKVxuICAgICAgICBjb25zdCBjdXJyZW50TW9udGggPSBtb21lbnQobm93LCAnWVlZWS1NTS1ERCcpLm1vbnRoKClcbiAgICAgICAgdGhpcy5pc0NvbXBsZXRlZFRoaXNNb250aCA9IGNvbXBsZXRlZE1vbnRoID09PSBjdXJyZW50TW9udGhcbiAgICAgICAgdGhpcy5jb250ZW50Wyd2aWV3TW9yZSddID0gZmFsc2VcbiAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0ZWRPbiddID0gY291cnNlRGF0YS5jb21wbGV0ZWRPblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZpbHRlcmVkQWNicExpc3QocmVzOiBhbnkpIHtcbiAgICByZXR1cm4gcmVzLmZpbHRlcigodjogYW55KSA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuY291cnNlSUQpXG4gIH1cblxuICBmaW5kQUNQQigpIHtcbiAgICBjb25zdCBsb2NhbENicCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYnBEYXRhJylcbiAgICBpZiAobG9jYWxDYnApIHtcbiAgICAgIGNvbnN0IHN0b3JlYWdlQ2JwID0gSlNPTi5wYXJzZShsb2NhbENicClcbiAgICAgIGNvbnN0IGNicCA9IHRoaXMuZmlsdGVyZWRBY2JwTGlzdChzdG9yZWFnZUNicClcbiAgICAgIGlmIChjYnAubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGFjYnAgPSAnY2JQbGFuJ1xuICAgICAgICB0aGlzLmNiUGxhbkVuZERhdGUgPSBjYnBbMF0uZW5kRGF0ZVxuICAgICAgICBjb25zdCBzRGF0ZSA9IGRheWpzKHRoaXMuc2VydmVyRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgY29uc3QgZGF5c0NvdW50ID0gZGF5anModGhpcy5jYlBsYW5FbmREYXRlKS5kaWZmKHRoaXMuc2VydmVyRGF0ZSwgJ2RheScpXG4gICAgICAgIHRoaXMuY2JQbGFuRHVyYXRpb24gPSBkYXlzQ291bnQgPCAwID8gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSA6IGRheXNDb3VudCA+IDI5XG4gICAgICAgICAgPyBOc0NhcmRDb250ZW50LkFDQlBDb25zdC5TVUNDRVNTIDogTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuVVBDT01JTkdcbiAgICAgICAgaWYgKGFjYnAgJiYgdGhpcy5jYlBsYW5FbmREYXRlICYmIGFjYnAgPT09ICdjYlBsYW4nKSB7XG4gICAgICAgICAgdGhpcy5pc0FjYnBDb3Vyc2UgPSB0cnVlXG4gICAgICAgICAgY29uc3QgZURhdGUgPSBkYXlqcyh0aGlzLmNiUGxhbkVuZERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICAgICAgaWYgKGRheWpzKHNEYXRlKS5pc1NhbWVPckJlZm9yZShlRGF0ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RPYmogPSB7XG4gICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0VHlwZTogJ0NvdXJzZScsXG4gICAgICAgICAgICAgICAgICBjb250ZXh0SWQ6IHRoaXMuY291cnNlSUQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGVudFN2Yy5nZXRDb3Vyc2VLYXJtYVBvaW50cyhyZXF1ZXN0T2JqKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmtwTGlzdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHJlcy5rcExpc3RcbiAgICAgICAgICAgICAgICBpZiAocm93LmFkZGluZm8pIHtcbiAgICAgICAgICAgICAgICAgIGlmIChKU09OLnBhcnNlKHJvdy5hZGRpbmZvKS5BQ0JQKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2xhaW1lZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSB0cnVlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmFpc2VUZWxlbWV0ZXJ5Rm9yUHJvdmlkZXIocHJvdmlkZXJOYW1lOiBzdHJpbmcsIHByaXZpZGVySWQ6IHN0cmluZykge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIGlkOiAnYnRuLXByb3ZpZGVyJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBwcm92aWRlck5hbWUsXG4gICAgICAgIHR5cGU6IHByaXZpZGVySWQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWRFeHQ6ICdidG4tcHJvdmlkZXInLFxuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkNPTlRFTlQsXG4gICAgICB9KVxuXG4gIH1cblxuICByYWlzZVRlbGVtZXRyeSgpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBzdWJUeXBlOiAna2FybWFwb2ludHMtY2xhaW0nLFxuICAgICAgICBpZDogdGhpcy5jb3Vyc2VJRCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNvdXJzZUlELFxuICAgICAgICB0eXBlOiAnY291cnNlJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZEV4dDogJ2J0bi1hY2JwLWNsYWltJyxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5LQVJNQVBPSU5UUyxcbiAgICAgIH0pXG4gIH1cblxuICBvbkNsaWNrT2ZDbGFpbShldmVudDogYW55KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHVzZXJJZDogdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIsXG4gICAgICBjb3Vyc2VJZDogdGhpcy5jb3Vyc2VJRCxcbiAgICB9XG4gICAgdGhpcy5yYWlzZVRlbGVtZXRyeSgpXG4gICAgdGhpcy5jb250ZW50U3ZjLmNsYWltS2FybWFwb2ludHMocmVxdWVzdCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5pc0NsYWltZWQgPSB0cnVlXG4gICAgICB0aGlzLm9wZW5TbmFja2JhcignS2FybWEgcG9pbnRzIGFyZSBzdWNjZXNzZnVsbHkgY2xhaW1lZC4nKVxuICAgICAgLy8gdGhpcy5nZXRVc2VyRW5yb2xsbWVudExpc3QoKVxuICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ3NvbWV0aGluZyB3ZW50IHdyb25nLicpXG4gICAgfSlcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5yY0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucmNFbGVtLkJvdHRvbVBvcyA9IHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wICsgdGhpcy5yY0VsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcbiAgICAgIHRoaXMucmNFbGVtLm9mZlNldFRvcCA9IHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wXG4gICAgfVxuICAgIC8vIEdldCBUaW1lIGZvciB0aGUgYmF0Y2hcbiAgICB0aGlzLnRpbWVyVW5zdWJzY3JpYmUgPSB0aGlzLnRpbWVyU2VydmljZS5nZXRUaW1lckRhdGEoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSlcbiAgICAgIC5zdWJzY3JpYmUoKF90aW1lcjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGltZXIgPSBfdGltZXJcbiAgICAgIH0pXG4gIH1cblxuICBoYW5kbGVCcmVhZGNydW1icygpIHtcbiAgICBpZiAodGhpcy5oaXN0b3J5RGF0YSkge1xuICAgICAgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ1NlYXJjaCcpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNodXJsID0gYC9hcHAvZ2xvYmFsc2VhcmNoYFxuICAgICAgICBjb25zdCBxUGFyYW0gPSB7XG4gICAgICAgICAgcTogdGhpcy5oaXN0b3J5RGF0YS5wYXJhbSxcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnU2VhcmNoJywgdXJsOiBzZWFyY2h1cmwsIHF1ZXJ5UGFyYW1zOiBxUGFyYW0gfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ2NvbXBldGVuY3ktZGV0YWlscycpIHtcbiAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgL2FwcC9sZWFybi9icm93c2UtYnkvY29tcGV0ZW5jeS8ke3RoaXMuaGlzdG9yeURhdGEucGFyYW19YFxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLmJyZWFkY3J1bWJzID0geyB1cmw6ICdob21lJywgdGl0bGVzOiBbeyB0aXRsZTogdGhpcy5oaXN0b3J5RGF0YS5wYXJhbSwgdXJsOiBmaW5hbFVybCB9LCB7IHRpdGxlOiAnRGV0YWlscycsIHVybDogJ25vbmUnIH1dIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5oaXN0b3J5RGF0YS5wYXRoID09PSAnYWxsLUNCUCcpIHtcbiAgICAgICAgY29uc3QgZmluYWxVUkwgPSBgL2FwcC9sZWFybi9icm93c2UtYnkvcHJvdmlkZXIvJHt0aGlzLmhpc3RvcnlEYXRhLnBhcmFtfWBcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6IGBhbGwgQ0JQJ3NgLCB1cmw6IGZpbmFsVVJMIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdhbGwtY29tcGV0ZW5jaWVzJykge1xuICAgICAgICBjb25zdCBmaW5hbFVybCA9IGAvYXBwL2xlYXJuL2Jyb3dzZS1ieS9jb21wZXRlbmN5L2FsbC1jb21wZXRlbmNpZXNgXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnYWxsIGNvbXBldGVuY2llcycsIHVybDogZmluYWxVcmwgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ2N1cmF0ZWRDb2xsZWN0aW9ucycpIHtcbiAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgL2FwcC9jdXJhdGVkQ29sbGVjdGlvbnMvaG9tZWBcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6ICdjdXJhdGVkIGNvbGxlY3Rpb25zJywgdXJsOiBmaW5hbFVybCB9LCB7IHRpdGxlOiAnRGV0YWlscycsIHVybDogJ25vbmUnIH1dIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6ICdMZWFybicsIHVybDogJy9wYWdlL2xlYXJuJywgaWNvbjogJ3NjaG9vbCcgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5mcmFnbWVudCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBkb2N1bWVudCEucXVlcnlTZWxlY3RvcihgIyR7dGhpcy5mcmFnbWVudH1gKSEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogODAsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgfVxuICB9XG5cbiAgZ2V0IGVuYWJsZUFuYWx5dGljcygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XG4gICAgICByZXR1cm4gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ3RvY0FuYWx5dGljcycpXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IGlzUmVzb3VyY2UoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgY29uc3QgaXNSZXNvdXJjZSA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LktOT1dMRURHRV9BUlRJRkFDVCB8fFxuICAgICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRVxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRVxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICAgIHx8IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVFxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT05cbiAgICAgICAgfHwgISh0aGlzLmNvbnRlbnQuY2hpbGRyZW4gJiYgdGhpcy5jb250ZW50LmNoaWxkcmVuLmxlbmd0aClcbiAgICAgIGlmIChpc1Jlc291cmNlKSB7XG4gICAgICAgIHRoaXMubW9iaWxlQXBwc1N2Yy5zZW5kVmlld2VyRGF0YSh0aGlzLmNvbnRlbnQpXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNSZXNvdXJjZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBnZXRTdGFydERhdGUoKSB7XG4gICAgaWYgKHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhKSB7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgLy8gY29uc3QgYmF0Y2ggPSBfLmZpcnN0KF8uZmlsdGVyKHRoaXMuY29udGVudFsnYmF0Y2hlcyddLCB7IGJhdGNoSWQ6IHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgfSkgfHwgW10pXG4gICAgICBjb25zdCBiYXRjaCA9IHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhLmJhdGNoXG4gICAgICB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkID0gYmF0Y2guYmF0Y2hJZFxuICAgICAgaWYgKGJhdGNoICYmIHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQpIHtcbiAgICAgICAgdGhpcy5zdGFydERhdGUgPSAoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSlcbiAgICAgICAgLy8gY29uc3QgcGFyc2VkRGF0ZSA9IG1vbWVudCh0aGlzLnN0YXJ0RGF0ZSk7XG4gICAgICAgIC8vIGNvbnN0IGRhdGVPbmx5ID0gcGFyc2VkRGF0ZS5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICBjb25zdCBzdGFydERhdGVUaW1lID0gdGhpcy5zdGFydERhdGUgJiYgbmV3IERhdGUodGhpcy5zdGFydERhdGUpLmdldFRpbWUoKVxuICAgICAgICB0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgPSBzdGFydERhdGVUaW1lIC0gbm93XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgJiYgdGhpcy5zdGFydERhdGVEaWZmZXJlbmNlID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSlcbiAgICAgICAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoKHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSAlICgxMDAwICogNjAgKiA2MCAqIDI0KSkgLyAoMTAwMCAqIDYwICogNjApKVxuICAgICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKCh0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgJSAoMTAwMCAqIDYwICogNjApKSAvICgxMDAwICogNjApKVxuICAgICAgICAgIHJldHVybiAoYCR7ZGF5c30gRGF5cyA6ICR7aG91cnN9IEhvdXJzIDogJHttaW51dGVzfSBNaW51dGVzYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ05BJ1xuICAgICAgfVxuICAgICAgcmV0dXJuICdOQSdcbiAgICAgIC8vIGlmIChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpICYmIG1vbWVudChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpKS5pc0FmdGVyKCkpIHtcbiAgICAgIC8vICAgcmV0dXJuIG1vbWVudChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpKS5mcm9tKG5vdylcbiAgICAgIC8vIH1cbiAgICAgIC8vIGlmIChfLmdldChiYXRjaCwgJ2VuZERhdGUnKSAmJiBtb21lbnQoXy5nZXQoYmF0Y2gsICdlbmREYXRlJykpLmlzQmVmb3JlKCkpIHtcbiAgICAgIC8vICAgcmV0dXJuICdOQSdcbiAgICAgIC8vIH1cbiAgICAgIC8vIGlmIChzdGFydERhdGVUaW1lICYmIG1vbWVudChzdGFydERhdGVUaW1lKS5pc0FmdGVyKCkpICB7XG4gICAgICAvLyAgIHJldHVybiBtb21lbnQoc3RhcnREYXRlVGltZSkuZnJvbShub3cpXG4gICAgICAvLyB9XG4gICAgICAvLyBpZiAoZW5kRGF0ZVRpbWUgJiYgbW9tZW50KGVuZERhdGVUaW1lKS5pc0JlZm9yZSgpKSB7XG4gICAgICAvLyAgICAgcmV0dXJuICdOQSdcbiAgICAgIC8vICAgfVxuICAgICAgLy8gcmV0dXJuICdOQSdcbiAgICB9IHJldHVybiAnTkEnXG4gIH1cblxuICBnZXQgaXNCYXRjaEluUHJvZ3Jlc3MoKSB7XG4gICAgLy8gaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnRbJ2JhdGNoZXMnXSkge1xuICAgIC8vIGNvbnN0IGJhdGNoZXMgPSB0aGlzLmNvbnRlbnRbJ2JhdGNoZXMnXSBhcyBOc0NvbnRlbnQuSUJhdGNoXG4gICAgLy8gaWYgKHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQpIHtcbiAgICAvLyAgIC8vIGNvbnN0IG5vdyA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpXG4gICAgLy8gICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgIC8vICAgaWYgKHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQpIHtcbiAgICAvLyAgICAgY29uc3QgYmF0Y2ggPSBfLmZpcnN0KF8uZmlsdGVyKHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQsIHsgYmF0Y2hJZDogdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCB9KSB8fCBbXSlcbiAgICAvLyAgICAgaWYgKGJhdGNoKSB7XG4gICAgLy8gICAgICAgLy8gY29uc3Qgc3RhcnREYXRlID0gbW9tZW50KGJhdGNoLnN0YXJ0RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJylcbiAgICAvLyAgICAgICAvLyBjb25zdCBlbmREYXRlID0gYmF0Y2guZW5kRGF0ZSA/IG1vbWVudChiYXRjaC5lbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKSA6IG5vd1xuICAgIC8vICAgICAgIC8vIHJldHVybiAoXG4gICAgLy8gICAgICAgLy8gICAvLyBiYXRjaC5zdGF0dXMgJiZcbiAgICAvLyAgICAgICAvLyAgIG1vbWVudChzdGFydERhdGUpLmlzU2FtZU9yQmVmb3JlKG5vdylcbiAgICAvLyAgICAgICAvLyAgICYmIG1vbWVudChlbmREYXRlKS5pc1NhbWVPckFmdGVyKG5vdylcbiAgICAvLyAgICAgICAvLyApXG4gICAgLy8gICAgICAgdGhpcy5zdGFydERhdGUgPSBiYXRjaCAmJiAoXy5nZXQoYmF0Y2gsICdzdGFydFRpbWUnKSlcbiAgICAvLyAgICAgICB0aGlzLmVuZERhdGUgPSBiYXRjaCAmJiAoXy5nZXQoYmF0Y2gsICdlbmRUaW1lJykpXG4gICAgLy8gICAgICAgY29uc3QgZW5kRGF0ZVRpbWUgPSBuZXcgRGF0ZSh0aGlzLmVuZERhdGUpLmdldFRpbWUoKVxuICAgIC8vICAgICAgIHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPSBlbmREYXRlVGltZSAtIG5vd1xuICAgIC8vICAgICAgIGlmKHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPiAwKSB7XG4gICAgLy8gICAgICAgcmV0dXJuICBiYXRjaC5zdGF0dXNcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gZmFsc2VcbiAgICAvLyB9IHJldHVybiBmYWxzZVxuXG4gICAgaWYgKHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhKSB7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmVucm9sbGVkQ291cnNlRGF0YS5iYXRjaFxuICAgICAgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCA9IGJhdGNoLmJhdGNoSWRcbiAgICAgIGlmIChiYXRjaCAmJiB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkKSB7XG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gKF8uZ2V0KGJhdGNoLCAnc3RhcnREYXRlJykpXG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IChfLmdldChiYXRjaCwgJ2VuZERhdGUnKSlcbiAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZVRpbWUgPSB0aGlzLnN0YXJ0RGF0ZSAmJiBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgICAgbGV0IGVuZERhdGUgPSB0aGlzLmVuZERhdGUgJiYgbmV3IERhdGUodGhpcy5lbmREYXRlKVxuICAgICAgICAgIGVuZERhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KVxuICAgICAgICAgIGNvbnN0IGVuZERhdGVUaW1lID0gZW5kRGF0ZS5nZXRUaW1lKClcbiAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgPSBub3cgLSBzdGFydERhdGVUaW1lXG4gICAgICAgICAgdGhpcy5lbmREYXRlRGlmZmVyZW5jZSA9IGVuZERhdGVUaW1lIC0gbm93XG4gICAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPiAwICYmIHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSA+IDAgJiYgYmF0Y2guc3RhdHVzICE9PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cblxuXG4gIGdldFVzZXJSYXRpbmcoZmlyZVVwZGF0ZTogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUpIHtcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgfHwgJydcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSkge1xuICAgICAgICB0aGlzLnJhdGluZ1N2Yy5nZXRSYXRpbmcodGhpcy5jb250ZW50LmlkZW50aWZpZXIsIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnksIHRoaXMudXNlcklkKS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlczogYW55KSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LnJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIHRoaXMudXNlclJhdGluZyA9IHJlcy5yZXN1bHQucmVzcG9uc2VcbiAgICAgICAgICAgICAgaWYgKGZpcmVVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvY1N2Yy5jaGFuZ2VVcGRhdGVSZXZpZXdzKHRydWUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGVudFZpZXdFdmVudEZvck5ldENvcmUoJ3ZpZXcnKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignVVNFUiBSQVRJTkcgRkVUQ0ggRVJST1IgPicsIGVycilcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRTb3VyY2UgJiYgdGhpcy5jb250ZW50U291cmNlLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNDQpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VFbGxpcHNpcyA9IHRydWVcbiAgICAgIH1cbiAgICB9LCAyNTApXG4gIH1cblxuXG5cbiAgcHVibGljIGZldGNoVXNlcldGRm9yQmxlbmRlZCgpIHtcbiAgICBjb25zdCBhcHBsaWNhdGlvbklkcyA9ICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQubWFwKGUgPT4gZS5iYXRjaElkKSkgfHwgW11cbiAgICBjb25zdCByZXEgPSB7XG4gICAgICBhcHBsaWNhdGlvbklkcyxcbiAgICAgIHNlcnZpY2VOYW1lOiAnYmxlbmRlZHByb2dyYW0nLFxuICAgICAgbGltaXQ6IDEwMCxcbiAgICAgIG9mZnNldDogMCxcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRlbnRTdmMuZmV0Y2hCbGVuZGVkVXNlcldGKHJlcSkudGhlbihcbiAgICAgIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBsYXRlc3RXRiA9IF8ubWF4QnkoZGF0YS5yZXN1bHQuZGF0YVswXS53ZkluZm8sIChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZWwubGFzdFVwZGF0ZWRPbikuZ2V0VGltZSgpXG4gICAgICAgICAgfSlcbiAgICAgICAgICAvLyBsYXRlc3RXRi5jdXJyZW50U3RhdHVzID0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFSkVDVEVEXG4gICAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgdGhpcy5iYXRjaERhdGEhLndvcmtGbG93ID0ge1xuICAgICAgICAgICAgd2ZJbml0aWF0ZWQ6IHRydWUsXG4gICAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgIGJhdGNoOiB0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQuZmluZCgoZTogYW55KSA9PiBlLmJhdGNoSWQgPT09IGxhdGVzdFdGLmFwcGxpY2F0aW9uSWQpLFxuICAgICAgICAgICAgd2ZJdGVtOiBsYXRlc3RXRixcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50b2NTdmMuc2V0V0ZEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuaW5mbygnZmV0Y2hCbGVuZGVkVXNlcldGIGRhdGEgPT0gJywgZGF0YSlcbiAgICAgIH0sXG4gICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignQ09OVEVOVCBISVNUT1JZIEZFVENIIEVSUk9SID4nLCBlcnJvcilcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgcHVibGljIGNoZWNrSWZCYXRjaEV4aXN0cyhsYXRlc3Q6IGFueSkge1xuICAgIGlmICghdGhpcy5iYXRjaERhdGEgfHwgIXRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXRjaERhdGEuY29udGVudC5maW5kKGIgPT4gYi5iYXRjaElkID09PSBsYXRlc3QuYmF0Y2hJZClcbiAgfVxuXG4gIHB1YmxpYyBnZXRCYXRjaElkKCk6IHN0cmluZyB7XG4gICAgbGV0IGJhdGNoSWQgPSAnJ1xuICAgIGlmICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQpIHtcbiAgICAgICAgYmF0Y2hJZCA9IGJhdGNoLmJhdGNoSWRcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhdGNoSWRcbiAgfVxuXG5cbiAgcHVibGljIGhhbmRsZUF1dG9CYXRjaEFzc2lnbigpIHtcbiAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICB0aGlzLm5hdmlnYXRlVG9QbGF5ZXJQYWdlKCcnKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSB0cnVlXG4gICAgICB0aGlzLmNoYW5nZVRhYiA9ICF0aGlzLmNoYW5nZVRhYlxuICAgICAgdGhpcy5yYWlzZUVucm9sbFRlbGVtZXRyeSgpXG4gICAgICBpZiAodGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCkge1xuICAgICAgICB0aGlzLnJhaXNlRW5yb2xsVGVsZW1lbnRyeUZvclNha3NoYW1BSUdlbmVyYXRlZCgpXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCkge1xuICAgICAgICB0aGlzLnJhaXNlRW5yb2xsVGVsZW1lbnRyeUZvclNha3NoYW1BSUdlbmVyYXRlZCgpXG4gICAgICB9XG4gICAgICBjb25zdCBiYXRjaERhdGEgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5iYXRjaGVzICYmIHRoaXMuY29udGVudFJlYWREYXRhLmJhdGNoZXNbMF1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNKSB7XG4gICAgICAgIHRoaXMuYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNLCBiYXRjaERhdGEpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0pIHtcbiAgICAgICAgbGV0IG1vZGVyYXRlZEJhdGNoRGF0YTogYW55XG4gICAgICAgIGlmICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQubGVuZ3RoID4gMSkge1xuICAgICAgICAgIG1vZGVyYXRlZEJhdGNoRGF0YSA9IHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgJiYgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1vZGVyYXRlZEJhdGNoRGF0YSA9IHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudFswXVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0sIG1vZGVyYXRlZEJhdGNoRGF0YSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkxFQVJOSU5HX1BBVEhXQVkpIHtcbiAgICAgICAgdGhpcy5hdXRvRW5yb2xsTGVhcm5pbmdQYXRod2F5KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXV0b0Fzc2lnbkVucm9sbCgpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29udGVudFZpZXdFdmVudEZvck5ldENvcmUoJ2Vucm9sbCcpXG4gIH1cblxuICBhdXRvRW5yb2xsTGVhcm5pbmdQYXRod2F5KCkge1xuICAgIHRoaXMuY29udGVudFN2Yy5hdXRvRW5yb2xsTFAodGhpcy5jb250ZW50Py5pZGVudGlmaWVyKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUb1BsYXllclBhZ2UocmVzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKHByb2dyYW1UeXBlOiBhbnksIGJhdGNoRGF0YTogYW55KSB7XG4gICAgaWYgKCFiYXRjaERhdGEpIHtcbiAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ05vIGJhY3RoZXMgZm91bmQnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgIGxldCB1c2VySWQgPSAnJ1xuICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCkge1xuICAgICAgICB1c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWRcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBwcm9ncmFtSWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICAgIC8vIGFzIG9mIG5vdyBjdXJhdGVkIHByb2dyYW0gb25seSBvbmUgYmF0Y2ggaXMgY29taW5nIG5lZWQgdG8gY2hlY2sgYW5kIG1vZGlmeVxuICAgICAgICAgIGJhdGNoSWQ6IGJhdGNoRGF0YT8uYmF0Y2hJZCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFN2Yy5hdXRvQXNzaWduQ3VyYXRlZEJhdGNoQXBpKHJlcSwgcHJvZ3JhbVR5cGUpLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKHByb2dyYW1UeXBlID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNICYmIGJhdGNoRGF0YS5lbmREYXRlKSB7XG4gICAgICAgICAgICAgIHRoaXMuYmF0Y2hEYXRhID0ge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFtiYXRjaERhdGFdLFxuICAgICAgICAgICAgICAgIGVucm9sbGVkOiB0cnVlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMucm91dGVyQ2hhbmdlSGFuZGxlcih0cnVlKVxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmdldFVzZXJFbnJvbGxtZW50TGlzdCgpXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgICAgICAgICAgfSwgMjAwMClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb1BsYXllclBhZ2UocmVxLnJlcXVlc3QuYmF0Y2hJZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChfZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdfZXJyb3InLCBfZXJyb3IpXG4gICAgICAgICAgLy8gaWYoX2Vycm9yICYmIF9lcnJvci5lcnJvciAmJiBfZXJyb3IuZXJyb3IucGFyYW1zICYmIF9lcnJvci5lcnJvci5wYXJhbXMuZXJyICYmIF9lcnJvci5lcnJvci5wYXJhbXMuZXJyLmVycm1zZykge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihfLmdldChfZXJyb3IsICdlcnJvci5wYXJhbXMuZXJybXNnJykgfHwgJ1BsZWFzZSB0cnkgYWdhaW4gbGF0ZXInKVxuICAgICAgICAgIC8vIH1cbiAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGF1dG9Bc3NpZ25FbnJvbGwoKSB7XG4vKioqKioqKioqKioqKiAg4pyoIFdpbmRzdXJmIENvbW1hbmQg4q2QICAqKioqKioqKioqKioqL1xuICAvKipcbiAgICogSWYgdGhlIHVzZXIgaXMgbm90IGVucm9sbGVkIGluIHRoZSBjb3Vyc2UsIGF1dG8tYXNzaWducyBhIGJhdGNoIGFuZCBuYXZpZ2F0ZXMgdG8gdGhlIHBsYXllciBwYWdlLlxuICAgKiBJZiB0aGUgdXNlciBpcyBhbHJlYWR5IGVucm9sbGVkLCBkb2VzIG5vdGhpbmcuXG4gICAqL1xuLyoqKioqKiogIDZkOTRjNjQ2LTI1NGMtNDRkNi1hN2MzLTkwYmRiOTUwNzMxOCAgKioqKioqKi8gICAgaWYgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllcikge1xuICAgICAgdGhpcy5jb250ZW50U3ZjLmF1dG9Bc3NpZ25CYXRjaEFwaSh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllciwgdGhpcy5zZWxlY3RlZExhbmd1YWdlKS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5iYXRjaERhdGEgPSB7XG4gICAgICAgICAgICBjb250ZW50OiBkYXRhLmNvbnRlbnQsXG4gICAgICAgICAgICBlbnJvbGxlZDogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmF0Y2hJZCA9IHRoaXMuZ2V0QmF0Y2hJZCgpXG4gICAgICAgICAgaWYgKGJhdGNoSWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb1BsYXllclBhZ2UoYmF0Y2hJZClcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgKF9lcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKF8uZ2V0KF9lcnJvciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKSB8fCAnUGxlYXNlIHRyeSBhZ2FpbiBsYXRlcicpXG4gICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5hdmlnYXRlVG9QbGF5ZXJQYWdlKGJhdGNoSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IHRydWVcbiAgICAgIGxldCBmaXJzdFBsYXlhYmxlQ29udGVudFxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZExhbmd1YWdlLmlkZW50aWZpZXIpIHtcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZldGNoIGhpZXJhcmNoeSBmb3IgdGhlIHNlbGVjdGVkIGxhbmd1YWdlIGluIHBvcHVwIGZpcnN0LCB0aGVuIGdldCBmaXJzdCBwbGF5YWJsZSBjb250ZW50IGFuZCByZWRpcmVjdCB0byBpdFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ29udGVudEhpZXJhcmNoeSh0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UuaWRlbnRpZmllcilcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgIH1cbiAgICAgIGxldCBwcmltYXJ5Q2F0ZWdvcnlcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2VjdXJlU2V0dGluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSAnTGVhcm5pbmcgUmVzb3VyY2UnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSBmaXJzdFBsYXlhYmxlQ29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeVxuICAgICAgfVxuICAgICAgdGhpcy5maXJzdFJlc291cmNlTGluayA9IHRoaXMuZ2V0UmVzdW1lVXJsKGZpcnN0UGxheWFibGVDb250ZW50LCBiYXRjaElkLCBwcmltYXJ5Q2F0ZWdvcnkpXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dGhpcy5maXJzdFJlc291cmNlTGluay51cmx9YF0sIHsgcXVlcnlQYXJhbXM6IHsgLi4udGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcywgZnJvbUFJVHV0b3I6IHRoaXMuZnJvbUFJVHV0b3IgfSB9KVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmZXRjaEJhdGNoRGV0YWlscygpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgICBjb3Vyc2VJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgICAgICBzdGF0dXM6IFsnMCcsICcxJywgJzInXSxcbiAgICAgICAgICAgIC8vIGNyZWF0ZWRCeTogJ2ZjYTI5MjVmLTFlZWUtNDY1NC05MTc3LWZlY2UzZmQ2YWZjOScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzb3J0X2J5OiB7IGNyZWF0ZWREYXRlOiAnZGVzYycgfSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFN2Yy5mZXRjaENvdXJzZUJhdGNoZXMocmVxKS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5iYXRjaERhdGEgPSBkYXRhXG4gICAgICAgICAgdGhpcy5iYXRjaERhdGEuZW5yb2xsZWQgPSBmYWxzZVxuICAgICAgICAgIHRoaXMudG9jU3ZjLnNldEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgICB0aGlzLnJvdXRlckNoYW5nZUhhbmRsZXIoZmFsc2UpXG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NPTlRFTlQgSElTVE9SWSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfVxuICB9XG5cblxuICBzY3JvbGxUb1RvcCgpIHtcbiAgICAoZnVuY3Rpb24gc21vb3Roc2Nyb2xsKCkge1xuICAgICAgY29uc3QgY3VycmVudFNjcm9sbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3BcbiAgICAgIGlmIChjdXJyZW50U2Nyb2xsID4gMCkge1xuICAgICAgICAvLyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHNtb290aHNjcm9sbClcbiAgICAgICAgLy8gd2luZG93LnNjcm9sbFRvKDAsIGN1cnJlbnRTY3JvbGwgLSAoY3VycmVudFNjcm9sbCAvIDUpKVxuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSkoKVxuICB9XG5cbiAgcHVibGljIGdldENvbXBldGVuY2llcyhjb21wZXRlbmNpZXM6IGFueSkge1xuICAgIGNvbnN0IGNvbXBldGVuY2llc0FycmF5ID0gSlNPTi5wYXJzZShjb21wZXRlbmNpZXMpXG4gICAgY29uc3QgY29tcGV0ZW5jeVN0cmluZ0FycmF5OiBhbnlbXSA9IFtdXG4gICAgY29tcGV0ZW5jaWVzQXJyYXkubWFwKChjOiBhbnkpID0+IHtcbiAgICAgIGNvbXBldGVuY3lTdHJpbmdBcnJheS5wdXNoKGMubmFtZSlcbiAgICB9KVxuICAgIHJldHVybiBjb21wZXRlbmN5U3RyaW5nQXJyYXlcbiAgfVxuXG4gIGdldCBzaG93SW50cmFuZXRNc2coKSB7XG4gICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3dJbnRyYW5ldE1lc3NhZ2VcbiAgfVxuXG4gIGdldCBzaG93U3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9jU3ZjLnNob3dTdGFydEJ1dHRvbih0aGlzLmNvbnRlbnQpXG4gIH1cblxuICBnZXQgaXNQb3N0QXNzZXNzbWVudCgpOiBib29sZWFuIHtcbiAgICBpZiAoISh0aGlzLnRvY0NvbmZpZyAmJiB0aGlzLnRvY0NvbmZpZy5wb3N0QXNzZXNzbWVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiZcbiAgICAgICAgdGhpcy5jb250ZW50LmxlYXJuaW5nTW9kZSA9PT0gJ0luc3RydWN0b3ItTGVkJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51dGlsaXR5U3ZjLmlzTW9iaWxlXG4gIH1cblxuICBnZXQgc2hvd1N1YnRpdGxlT25CYW5uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9jU3ZjLnN1YnRpdGxlT25CYW5uZXJzXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRW5yb2xsbWVudEVuZERhdGUoYmF0Y2g6IGFueSkge1xuICAgIGNvbnN0IGVucm9sbG1lbnRFbmREYXRlID0gZGF5anMoXy5nZXQoYmF0Y2gsICdlbnJvbGxtZW50RW5kRGF0ZScpKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgIGNvbnN0IHN5c3RlbURhdGUgPSBkYXlqcygpXG4gICAgcmV0dXJuIGVucm9sbG1lbnRFbmREYXRlID8gZGF5anMoZW5yb2xsbWVudEVuZERhdGUpLmlzQmVmb3JlKHN5c3RlbURhdGUpIDogZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgb3BlblNuYWNrYmFyKHByaW1hcnlNc2c6IHN0cmluZywgZHVyYXRpb246IG51bWJlciA9IDUwMDApIHtcbiAgICB0aGlzLnNuYWNrQmFyLm9wZW4ocHJpbWFyeU1zZywgJ1gnLCB7XG4gICAgICBkdXJhdGlvbixcbiAgICB9KVxuICB9XG5cbiAgZ2V0IHNob3dJbnN0cnVjdG9yTGVkTXNnKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnNob3dBY3Rpb25CdXR0b25zICYmXG4gICAgICB0aGlzLmNvbnRlbnQgJiZcbiAgICAgIHRoaXMuY29udGVudC5sZWFybmluZ01vZGUgPT09ICdJbnN0cnVjdG9yLUxlZCcgJiZcbiAgICAgICF0aGlzLmNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAhdGhpcy5jb250ZW50LmFydGlmYWN0VXJsXG4gICAgKVxuICB9XG5cbiAgZ2V0IGlzSGVhZGVySGlkZGVuKCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVzb3VyY2UgJiYgdGhpcy5jb250ZW50ICYmICF0aGlzLmNvbnRlbnQuYXJ0aWZhY3RVcmwubGVuZ3RoXG4gIH1cblxuICBnZXQgc2hvd0FjdGlvbkJ1dHRvbnMoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzICE9PSAnd2FpdCcgJiZcbiAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgdGhpcy5jb250ZW50LnN0YXR1cyAhPT0gJ0RlbGV0ZWQnICYmXG4gICAgICB0aGlzLmNvbnRlbnQuc3RhdHVzICE9PSAnRXhwaXJlZCdcbiAgICApXG4gIH1cblxuICBnZXQgc2hvd0J1dHRvbkNvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiZcbiAgICAgICEodGhpcy5pc01vYmlsZSAmJiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlzSW5JbnRyYW5ldCkgJiZcbiAgICAgICEoXG4gICAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgICB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUgPT09ICdDb3Vyc2UnICYmXG4gICAgICAgIHRoaXMuY29udGVudC5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybFxuICAgICAgKSAmJlxuICAgICAgISh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvbnRlbnRUeXBlID09PSAnUmVzb3VyY2UnICYmICF0aGlzLmNvbnRlbnQuYXJ0aWZhY3RVcmwpXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXN1bWVEYXRhRnJvbUxpc3QodHlwZT86IHN0cmluZyk6IGFueSB8IHZvaWQge1xuICAgIGNvbnN0IHJlc3VtZUNvcHkgPSBbLi4udGhpcy5yZXN1bWVEYXRhXVxuICAgIGlmIChyZXN1bWVDb3B5ICYmIHJlc3VtZUNvcHkubGVuZ3RoKSB7XG4gICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuXG4gICAgICAgIGNvbnN0IGxhc3RJdGVtID0gcmVzdW1lQ29weSAmJiByZXN1bWVDb3B5LnNvcnQoKGE6IGFueSwgYjogYW55KSA9PlxuICAgICAgICAgIG5ldyBEYXRlKGIubGFzdEFjY2Vzc1RpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEubGFzdEFjY2Vzc1RpbWUpLmdldFRpbWUoKSkuc2hpZnQoKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkZW50aWZpZXI6IGxhc3RJdGVtLmNvbnRlbnRJZCxcbiAgICAgICAgICBtaW1lVHlwZTogbGFzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzICYmIGxhc3RJdGVtLnByb2dyZXNzZGV0YWlscy5taW1lVHlwZSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZmlyc3RJdGVtID0gcmVzdW1lQ29weSAmJiByZXN1bWVDb3B5Lmxlbmd0aCAmJiByZXN1bWVDb3B5WzBdXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZGVudGlmaWVyOiBmaXJzdEl0ZW0uY29udGVudElkLFxuICAgICAgICBtaW1lVHlwZTogZmlyc3RJdGVtLnByb2dyZXNzZGV0YWlscyAmJiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHByaXZhdGUgbW9kaWZ5U2Vuc2libGVDb250ZW50UmF0aW5nKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgJiZcbiAgICAgIHR5cGVvZiB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZyAhPT0gJ251bWJlcidcbiAgICApIHtcbiAgICAgIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nID0gKHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nIGFzIGFueSlbdGhpcy5jb25maWdTdmMucm9vdE9yZyB8fCAnJ11cbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQudG90YWxSYXRpbmcgJiYgdHlwZW9mIHRoaXMuY29udGVudC50b3RhbFJhdGluZyAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuY29udGVudC50b3RhbFJhdGluZyA9ICh0aGlzLmNvbnRlbnQudG90YWxSYXRpbmcgYXMgYW55KVt0aGlzLmNvbmZpZ1N2Yy5yb290T3JnIHx8ICcnXVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGVhcm5pbmdVcmxzKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuaXNQcmFjdGljZVZpc2libGUgPSBCb29sZWFuKFxuICAgICAgICB0aGlzLnRvY1N2Yy5maWx0ZXJUb2ModGhpcy5jb250ZW50LCBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LlBSQUNUSUNFKSxcbiAgICAgIClcblxuICAgICAgdGhpcy5pc0Fzc2Vzc1Zpc2libGUgPSBCb29sZWFuKFxuICAgICAgICB0aGlzLnRvY1N2Yy5maWx0ZXJUb2ModGhpcy5jb250ZW50LCBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkFTU0VTUyksXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGZpcnN0UGxheWFibGVDb250ZW50ID0gdGhpcy5jb250ZW50U3ZjLmdldEZpcnN0Q2hpbGRJbkhpZXJhcmNoeSh0aGlzLmNvbnRlbnQpXG4gICAgICBsZXQgcHJpbWFyeUNhdGVnb3J5XG4gICAgICBpZiAodGhpcy5jb250ZW50LnNlY3VyZVNldHRpbmdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5ID0gJ0xlYXJuaW5nIFJlc291cmNlJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5ID0gZmlyc3RQbGF5YWJsZUNvbnRlbnQucHJpbWFyeUNhdGVnb3J5IHx8IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnlcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlyc3RSZXNvdXJjZUxpbmsgPSB0aGlzLmdldFJlc3VtZVVybChmaXJzdFBsYXlhYmxlQ29udGVudCwgbnVsbCwgcHJpbWFyeUNhdGVnb3J5KVxuXG4gICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgIC8vIGlmIChmaXJzdFBsYXlhYmxlQ29udGVudC5vcHRpb25hbFJlYWRpbmcgJiYgZmlyc3RQbGF5YWJsZUNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUmVzb3VyY2UnKSB7XG4gICAgICAvLyAgIHRoaXMudXBkYXRlUHJvZ3Jlc3MoMiwgZmlyc3RQbGF5YWJsZUNvbnRlbnQuaWRlbnRpZmllcilcbiAgICAgIC8vIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXRoID0gdXJsLnNwbGl0KCcvJykucG9wKClcbiAgICBpZiAocGF0aCAmJiB0aGlzLnZhbGlkUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgICB0aGlzLnJvdXRlUGF0aCA9IHBhdGhcbiAgICAgIHRoaXMudXBkYXRlQmFubmVyVXJsKClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUJhbm5lclVybCgpIHtcbiAgICBpZiAodGhpcy5iYW5uZXJzKSB7XG4gICAgICB0aGlzLmJhbm5lclVybCA9IHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShcbiAgICAgICAgYHVybCgke3RoaXMuYmFubmVyc1t0aGlzLnJvdXRlUGF0aF19KWAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcGxheUludHJvVmlkZW8oKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5kaWFsb2cub3BlbihBcHBUb2NEaWFsb2dJbnRyb1ZpZGVvQ29tcG9uZW50LCB7XG4gICAgICAgIGRhdGE6IHRoaXMuY29udGVudC5pbnRyb2R1Y3RvcnlWaWRlbyxcbiAgICAgICAgaGVpZ2h0OiAnMzUwcHgnLFxuICAgICAgICB3aWR0aDogJzYyMHB4JyxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZ2V0IHNhbml0aXplZEludHJvZHVjdG9yeVZpZGVvSWNvbigpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pbnRyb2R1Y3RvcnlWaWRlb0ljb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoYHVybCgke3RoaXMuY29udGVudC5pbnRyb2R1Y3RvcnlWaWRlb0ljb259KWApXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBwcml2YXRlIGZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnJlZ2lzdHJhdGlvblVybCkge1xuICAgICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdmZXRjaGluZydcbiAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gZmFsc2VcbiAgICAgICAgdGhpcy50b2NTdmMuZmV0Y2hFeHRlcm5hbENvbnRlbnRBY2Nlc3ModGhpcy5jb250ZW50LmlkZW50aWZpZXIpLnN1YnNjcmliZShcbiAgICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXh0ZXJuYWxDb250ZW50RmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJGb3JFeHRlcm5hbCA9IGRhdGEuaGFzQWNjZXNzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBfZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gZmFsc2VcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgIHRoaXMucmVnaXN0ZXJGb3JFeHRlcm5hbCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRSYXRpbmdJY29uKHJhdGluZ0luZGV4OiBudW1iZXIpOiAnc3RhcicgfCAnc3Rhcl9ib3JkZXInIHwgJ3N0YXJfaGFsZicge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcpIHtcbiAgICAgIGNvbnN0IGF2Z1JhdGluZyA9IHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nXG4gICAgICBjb25zdCByYXRpbmdGbG9vciA9IE1hdGguZmxvb3IoYXZnUmF0aW5nKVxuICAgICAgaWYgKHJhdGluZ0luZGV4IDw9IHJhdGluZ0Zsb29yKSB7XG4gICAgICAgIHJldHVybiAnc3RhcidcbiAgICAgIH1cbiAgICAgIGlmIChyYXRpbmdGbG9vciA9PT0gcmF0aW5nSW5kZXggLSAxICYmIGF2Z1JhdGluZyAlIDEgPiAwKSB7XG4gICAgICAgIHJldHVybiAnc3Rhcl9oYWxmJ1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ3N0YXJfYm9yZGVyJ1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1JlZ2lzdHJhdGlvblN0YXR1cygpIHtcbiAgICBjb25zdCBzb3VyY2UgPSAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5zb3VyY2VTaG9ydE5hbWUpIHx8ICcnXG4gICAgaWYgKFxuICAgICAgIXRoaXMuZm9yUHJldmlldyAmJlxuICAgICAgIXRoaXMuaXNSZWdpc3RyYXRpb25TdXBwb3J0ZWQgJiZcbiAgICAgIHRoaXMuY2hlY2tSZWdpc3RyYXRpb25Tb3VyY2VzLmhhcyhzb3VyY2UpXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmNcbiAgICAgICAgLmdldFJlZ2lzdHJhdGlvblN0YXR1cyhzb3VyY2UpXG4gICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5oYXNBY2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzID0gJ2dyYW50J1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9ICdyZWplY3QnXG4gICAgICAgICAgICBpZiAocmVzLnJlZ2lzdHJhdGlvblVybCAmJiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50LnJlZ2lzdHJhdGlvblVybCA9IHJlcy5yZWdpc3RyYXRpb25VcmxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChfZXJyID0+IHsgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPSAnZ3JhbnQnXG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVRdWVyeSh0eXBlOiAnUkVTVU1FJyB8ICdTVEFSVF9PVkVSJyB8ICdTVEFSVCcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodGhpcy5maXJzdFJlc291cmNlTGluayAmJiAodHlwZSA9PT0gJ1NUQVJUJyB8fCB0eXBlID09PSAnU1RBUlRfT1ZFUicpKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsXG4gICAgICB9XG4gICAgICByZXR1cm4gcVBhcmFtc1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc3VtZURhdGFMaW5rICYmIHR5cGUgPT09ICdSRVNVTUUnKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5yZXN1bWVEYXRhTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICAgIHZpZXdNb2RlOiAnUkVTVU1FJyxcbiAgICAgICAgLy8gY291cnNlTmFtZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50Lm5hbWUgOiAnJyxcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHRJZCAmJiB0aGlzLmNvbnRleHRQYXRoKSB7XG4gICAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgICBjb2xsZWN0aW9uSWQ6IHRoaXMuY29udGV4dElkLFxuICAgICAgICAgIGNvbGxlY3Rpb25UeXBlOiB0aGlzLmNvbnRleHRQYXRoLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIGRlbGV0ZSBxUGFyYW1zLnZpZXdNb2RlXG4gICAgICB9XG4gICAgICBxUGFyYW1zID0ge1xuICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbElkLFxuICAgICAgfVxuICAgICAgcmV0dXJuIHFQYXJhbXNcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgIHZpZXdNb2RlOiB0eXBlLFxuICAgIH1cbiAgfVxuXG4gIGdldCBpc0luSUZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gd2luZG93LnNlbGYgIT09IHdpbmRvdy50b3BcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIG9wZW5GZWVkYmFja0RpYWxvZyhjb250ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbnRlbnRSYXRpbmdWMkRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc3NjhweCcsXG4gICAgICBkYXRhOiB7IGNvbnRlbnQsIHVzZXJJZDogdGhpcy51c2VySWQsIHVzZXJSYXRpbmc6IHRoaXMudXNlclJhdGluZyB9LFxuICAgIH0pXG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuZ2V0VXNlclJhdGluZyh0cnVlKVxuICAgICAgICAvLyB0aGlzLmdldFVzZXJFbnJvbGxtZW50TGlzdCgpXG4gICAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICAgIHRoaXMucmVzZXRSYXRpbmdzU2VydmljZS5zZXRSYXRpbmdTZXJ2aWNlVXBkYXRlKHRydWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZVByb2dyZXNzKHN0YXR1czogbnVtYmVyLCByZXNvdXJjZUlkOiBhbnkpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uSWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtcy5pZCA/XG4gICAgICB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtcy5pZCA6ICcnXG4gICAgY29uc3QgYmF0Y2hJZCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA/XG4gICAgICB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLmJhdGNoSWQgOiAnJ1xuICAgIGNvbnN0IGlzUHJlQXNzZXNzbWVudCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMucHJlQXNzZXNzbWVudFxuICAgIGlmIChpc1ByZUFzc2Vzc21lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpZXdlclN2Y1xuICAgICAgICAucmVhbFRpbWVQcm9ncmVzc1VwZGF0ZUZvclByZUFzc2Vzc21lbnRRdWl6KHJlc291cmNlSWQsIHN0YXR1cylcblxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWV3ZXJTdmMucmVhbFRpbWVQcm9ncmVzc1VwZGF0ZVF1aXoocmVzb3VyY2VJZCwgY29sbGVjdGlvbklkLCBiYXRjaElkLCBzdGF0dXMpXG4gIH1cblxuICBnZXRQcm9ncmFtRHVyYXRpb24oYmF0Y2hEYXRhOiBhbnkpIHtcbiAgICBpZiAoYmF0Y2hEYXRhKSB7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSBkYXlqcyhkYXlqcyhiYXRjaERhdGEuc3RhcnREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSlcbiAgICAgIGNvbnN0IGVuZERhdGUgPSBkYXlqcyhkYXlqcyhiYXRjaERhdGEuZW5kRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJykpXG4gICAgICAvLyBhZGRpbmcgMSB0byBpbmNsdWRlIHRoZSBzdGFydCBkYXRlXG4gICAgICByZXR1cm4gKGVuZERhdGUuZGlmZihzdGFydERhdGUsICdkYXlzJykgKyAxKVxuICAgIH1cbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHdpdGhkcmF3T3JFbnJvbGwoZGF0YTogc3RyaW5nKSB7XG4gICAgaWYgKGRhdGEgPT09IE5zQ29udGVudC5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLklOSVRJQVRFKSB7XG4gICAgICB0aGlzLmZldGNoVXNlcldGRm9yQmxlbmRlZCgpXG4gICAgfVxuICB9XG5cblxuXG4gIGhhbmRsZUNhcGl0YWxpemUoc3RyOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnXG4gICAgaWYgKHN0cikge1xuICAgICAgaWYgKHR5cGUgPT09ICduYW1lJykge1xuICAgICAgICByZXR1cm5WYWx1ZSA9IHN0ci5zcGxpdCgnICcpLm1hcChfc3RyID0+IHtcbiAgICAgICAgICByZXR1cm4gX3N0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIF9zdHIuc2xpY2UoMSlcbiAgICAgICAgfSkuam9pbignICcpXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIHJldHVyblZhbHVlID0gc3RyICYmIChzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZVxuICB9XG5cbiAgcHVibGljIGhhbmRsZVBhcnNlSnNvbkRhdGEoczogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZFN0cmluZyA9IEpTT04ucGFyc2UocylcbiAgICAgIHJldHVybiBwYXJzZWRTdHJpbmdcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU5hdmlnYXRlVG9SZXZpZXdzKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnRUb1ZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aWV3Q29udGFpbmVyJykgYXMgYW55XG5cbiAgICBpZiAoZWxlbWVudFRvVmlldykge1xuICAgICAgd2luZG93LnNjcm9sbFRvKHtcbiAgICAgICAgdG9wOiBlbGVtZW50VG9WaWV3Lm9mZnNldFRvcCxcbiAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByYWlzZUNlcnRJbnRyZWFjdFRlbGVtZXRyeSgpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiBXc0V2ZW50cy5FbnVtSW50ZXJhY3RUeXBlcy5DTElDSyxcbiAgICAgICAgaWQ6ICd2aWV3LWNlcnRpZmljYXRlJyxcbiAgICAgICAgc3ViVHlwZTogV3NFdmVudHMuRW51bUludGVyYWN0U3ViVHlwZXMuQ0VSVElGSUNBVEUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jZXJ0SWQsICAgLy8gaWQgb2YgdGhlIGNlcnRpZmljYXRlXG4gICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFN1YlR5cGVzLkNFUlRJRklDQVRFLFxuICAgICAgfSlcbiAgfVxuXG4gIHRyYW5zbGF0ZUxhYmVscyhsYWJlbDogc3RyaW5nLCB0eXBlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5sYW5ndHJhbnNsYXRpb25zLnRyYW5zbGF0ZUxhYmVsKGxhYmVsLCB0eXBlLCAnJylcbiAgfVxuXG5cblxuICBnZXRMYXN0UGxheWVkUmVzb3VyY2UoKSB7XG4gICAgbGV0IGZpcnN0UGxheWFibGVDb250ZW50XG4gICAgbGV0IHJlc3VtZURhdGFWMjogYW55XG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YSAmJiB0aGlzLnJlc3VtZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgnc3RhcnQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoKVxuICAgICAgfVxuICAgICAgdGhpcy5leHBhbmRUaGVQYXRoKHJlc3VtZURhdGFWMi5pZGVudGlmaWVyKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICAgIGZpcnN0UGxheWFibGVDb250ZW50ID0gdGhpcy5jb250ZW50U3ZjLmdldEZpcnN0Q2hpbGRJbkhpZXJhcmNoeSh0aGlzLmNvbnRlbnQpXG4gICAgICAgIHRoaXMuZXhwYW5kVGhlUGF0aChmaXJzdFBsYXlhYmxlQ29udGVudC5pZGVudGlmaWVyKVxuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXhwYW5kVGhlUGF0aChyZXNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHJlc291cmNlSWQpIHtcbiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnV0aWxpdHlTdmMuZ2V0UGF0aCh0aGlzLmNvbnRlbnQsIHJlc291cmNlSWQpXG4gICAgICB0aGlzLnBhdGhTZXQgPSBuZXcgU2V0KHBhdGgubWFwKCh1OiB7IGlkZW50aWZpZXI6IGFueSB9KSA9PiB1LmlkZW50aWZpZXIpKVxuICAgIH1cbiAgfVxuXG4gIHJhaXNlRW5yb2xsVGVsZW1ldHJ5KCkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIHN1YlR5cGU6ICdlbnJvbGwnLFxuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgICB0eXBlOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5IDogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWRFeHQ6IGBidG4tZW5yb2xsYCxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5DT05URU5ULFxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHJhaXNlRW5yb2xsVGVsZW1lbnRyeUZvclNha3NoYW1BSUdlbmVyYXRlZCgpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBzdWJUeXBlOiAnZW5yb2xsJyxcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIGlkOiB0aGlzLnJlY29tbWVuZGVkQ291cnNlc0lkLFxuICAgICAgICAgIHZlcjogXCIxLjBcIixcbiAgICAgICAgICB0eXBlOiBcImlnb3QtYWlcIlxuICAgICAgICB9LFxuICAgICAgfSBhcyBhbnksXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgICB0eXBlOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5IDogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWQ6IGAvYXBwL3RvYy8ke3RoaXMuY29udGVudD8uaWRlbnRpZmllcn0vb3ZlcnZpZXdfYnRuLWVucm9sbGAsXG4gICAgICAgIG1vZHVsZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeW1vZHVsZXMuQ09OVEVOVCxcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICBvbkNsaWNrT2ZTaGFyZSgpIHtcbiAgICB0aGlzLmVuYWJsZVNoYXJlID0gdHJ1ZVxuICAgIHRoaXMucmFpc2VUZWxlbWV0cnlGb3JTaGFyZSgnc2hhcmVDb250ZW50JylcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlICovXG4gIHJhaXNlVGVsZW1ldHJ5Rm9yU2hhcmUoc3ViVHlwZTogYW55KSB7XG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgc3ViVHlwZSxcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgICAgdHlwZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcGFnZUlkRXh0OiBgYnRuLSR7c3ViVHlwZX1gLFxuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkNPTlRFTlQsXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgcmVzZXRFbmFibGVTaGFyZSgpIHtcbiAgICB0aGlzLmVuYWJsZVNoYXJlID0gZmFsc2VcbiAgfVxuXG4gIHRyYW5zbGF0ZUxhYmVsKGxhYmVsOiBzdHJpbmcsIHR5cGU6IGFueSkge1xuICAgIGlmIChsYWJlbCAmJiB0eXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndHJhbnNsYXRpb25zLnRyYW5zbGF0ZUxhYmVsKGxhYmVsLCB0eXBlLCAnJylcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5yb3V0ZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLmJhdGNoU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmJhdGNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMuYmF0Y2hEYXRhU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmJhdGNoRGF0YVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIHRoaXMudG9jU3ZjLmFuYWx5dGljc0ZldGNoU3RhdHVzID0gJ25vbmUnXG4gICAgaWYgKHRoaXMucm91dGVyUGFyYW1TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucm91dGVyUGFyYW1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy50aW1lclVuc3Vic2NyaWJlKSB7XG4gICAgICB0aGlzLnRpbWVyVW5zdWJzY3JpYmUudW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgfVxuXG4gIHByb2dyYW1FbnJvbGxDYWxsKGJhdGNoRGF0YTogYW55KSB7XG4gICAgdGhpcy5hdXRvRW5yb2xsQ3VyYXRlZFByb2dyYW0oTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfUFJPR1JBTSwgYmF0Y2hEYXRhKVxuICB9XG5cbiAgcmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoJGV2ZW50OiBhbnkpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgZmlyc3QgcHJldmVudCBuYXZpZ2F0aW9uIHRvIHBsYXllciBwYWdlXG4gICAgY29uc3Qgc2hvdWxkUHJldmVudE5hdmlnYXRpb24gPSB0aGlzLnNob3VsZFNob3dTdXJ2ZXlQb3B1cCgpXG4gICAgaWYgKHNob3VsZFByZXZlbnROYXZpZ2F0aW9uKSB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfVxuXG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgaWQ6IFwidmlldy1hc3Nlc3NtZW50XCIsXG4gICAgICAgIHN1YlR5cGU6IFwiYW5vbnltb3VzLWFzc2Vzc21lbnRcIixcbiAgICAgIH0sIHt9LFxuICAgICAge1xuICAgICAgICBtb2R1bGU6ICdMYW5kaW5nIFBhZ2UnLFxuICAgICAgfSlcblxuICAgIGlmIChzaG91bGRQcmV2ZW50TmF2aWdhdGlvbikge1xuICAgICAgLy8gUHJlcGFyZSBuYXZpZ2F0aW9uIGRldGFpbHNcbiAgICAgIGNvbnN0IG5hdmlnYXRpb25VcmwgPSAodGhpcy5yZXN1bWVEYXRhICYmICF0aGlzLmNlcnREYXRhKSA/IHRoaXMucmVzdW1lRGF0YUxpbms/LnVybCA6IHRoaXMuZmlyc3RSZXNvdXJjZUxpbms/LnVybFxuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSAodGhpcy5yZXN1bWVEYXRhICYmICF0aGlzLmNlcnREYXRhKSA/IHRoaXMuZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiB0aGlzLmdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcblxuICAgICAgLy8gT3BlbiBzdXJ2ZXkgcG9wdXAgZGlyZWN0bHkgd2l0aCBuYXZpZ2F0aW9uIGRldGFpbHNcbiAgICAgIGlmIChuYXZpZ2F0aW9uVXJsKSB7XG4gICAgICAgIHRoaXMub3BlblB1YmxpY1N1cnZleVBvcHVwKG5hdmlnYXRpb25VcmwsIHF1ZXJ5UGFyYW1zKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgc2hvdWxkU2hvd1N1cnZleVBvcHVwKCk6IGJvb2xlYW4ge1xuICAgIC8vIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHN1cnZleSBwb3B1cCBjb25kaXRpb25cbiAgICAvLyBDaGVjayBpZiBpdCdzIHB1YmxpYyB2aWV3IGFuZCBjb250ZW50IGlzIGEgY2FzZSBzdHVkeVxuICAgIHJldHVybiB0aGlzLmZvclByZXZpZXcgJiYgdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudFJlYWREYXRhXG4gICAgICAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5jb3Vyc2VDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5DQVNFX1NUVURZXG4gIH1cblxuXG4gIGFzeW5jIGNoZWNrSWZVc2VyRW5yb2xsZWQoKSB7XG4gICAgdGhpcy5jb250ZW50TGliU3ZjLm9uZVN0ZXBSZXN1bWVFbmFibGUgPSBmYWxzZVxuICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IHRydWVcbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICAvLyBvbmx5IGZvciAgcmVzb3VyY2VcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJlxuICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSAmJlxuICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMICYmXG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgJiZcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSAmJlxuICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNKSB7XG4gICAgICAvLyBjb25zdCBjb2xsZWN0aW9uSWQgPSB0aGlzLmlzUmVzb3VyY2UgPyAnJyA6IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyXG4gICAgICByZXR1cm4gdGhpcy5nZXRDb250aW51ZUxlYXJuaW5nRGF0YSh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllcilcbiAgICB9XG5cbiAgICBsZXQgZW5yb2xsZWRDb3Vyc2U6IE5zQ29udGVudC5JQ291cnNlIHwgdW5kZWZpbmVkXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmlkZW50aWZpZXIgJiYgIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgaWYgKHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmIHRoaXMudXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aCkge1xuICAgICAgICBlbnJvbGxlZENvdXJzZSA9IHRoaXMudXNlckVucm9sbG1lbnRMaXN0LmZpbmQoKGNvdXJzZTogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllciB8fCAnJ1xuICAgICAgICAgIGlmIChjb3Vyc2UuY291cnNlSWQgIT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvdXJzZVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBjdXJyZW50IGNvdXJzZSBpcyBwcmVzZW50IGluIHRoZSBsaXN0IG9mIHVzZXIgZW5yb2xsZWQgY291cnNlXG4gICAgICBpZiAoZW5yb2xsZWRDb3Vyc2UgJiYgZW5yb2xsZWRDb3Vyc2UuYmF0Y2hJZCkge1xuICAgICAgICB0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5yZXN1bWVEYXRhLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSByZXNcbiAgICAgICAgICAgIHRoaXMuZ2V0TGFzdFBsYXllZFJlc291cmNlKClcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnRvY1N2Yy5jaGVja01vZHVsZVdpc2VEYXRhKHRoaXMuY29udGVudClcbiAgICAgICAgdGhpcy5lbnJvbGxlZENvdXJzZURhdGEgPSBlbnJvbGxlZENvdXJzZVxuICAgICAgICB0aGlzLmlzQ291cnNlQ29tcGxldGVkT25UaGlzTW9udGgoKVxuICAgICAgICB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkID0gZW5yb2xsZWRDb3Vyc2UuYmF0Y2hJZFxuICAgICAgICAvLyB0aGlzLmRvd25sb2FkQ2VydChlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMpXG4gICAgICAgIGlmIChlbnJvbGxlZENvdXJzZSAmJiBlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMgJiZcbiAgICAgICAgICBlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgY2VydGlmaWNhdGU6IGFueSA9IGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT5cbiAgICAgICAgICAgIG5ldyBEYXRlKGIubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShhLmxhc3RJc3N1ZWRPbikuZ2V0VGltZSgpKVxuICAgICAgICAgIGNvbnN0IGNlcnRJZCA9IGNlcnRpZmljYXRlWzBdLmlkZW50aWZpZXJcbiAgICAgICAgICB0aGlzLmNlcnRJZCA9IGNlcnRJZFxuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudFsnY2VydGlmaWNhdGVPYmonXSA9IHtcbiAgICAgICAgICAgICAgY2VydElkLFxuICAgICAgICAgICAgICBjZXJ0RGF0YTogJycsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGVucm9sbGVkIGNvdXJzZSBpcyBjb21wbGV0ZWQgdGhlbiB0byBtYWtlIGFsbCBsYW5ndWFnZXMgY291cnNlcyBhcyB3ZWxsIGFzIGFsbCBjb250ZW50IGFzIGNvbXBsZXRlZFxuICAgICAgICBpZiAoZW5yb2xsZWRDb3Vyc2Uuc3RhdHVzID09PSAyKSB7XG4gICAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gMTAwXG4gICAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0aW9uU3RhdHVzJ10gPSAyXG4gICAgICAgICAgYXdhaXQgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvbkNoaWxkUGVyY2VudGFnZVByb2dyYW0odGhpcy5jb250ZW50KVxuICAgICAgICAgIGxldCBjb250ZW50TGFnID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRDb250ZW50TGFuZ3VhZ2UodGhpcy5jb250ZW50UmVhZERhdGEpXG4gICAgICAgICAgdGhpcy5nZXRDb250aW51ZUxlYXJuaW5nRGF0YSh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllciwgZW5yb2xsZWRDb3Vyc2UuYmF0Y2hJZCwgY29udGVudExhZylcbiAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KHRoaXMuY29udGVudClcbiAgICAgICAgICB0aGlzLmNoZWNrRm9yQ29tcGxldGlvblN1cnZleVRyaWdnZXIoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5jdW11bGF0aXZlVHJhY2tpbmcpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudG9jU3ZjLm1hcENvbXBsZXRpb25QZXJjZW50YWdlUHJvZ3JhbSh0aGlzLmNvbnRlbnQsIHRoaXMudXNlckVucm9sbG1lbnRMaXN0KVxuICAgICAgICAgICAgdGhpcy5jaGVja0ZvckNvbXBsZXRpb25TdXJ2ZXlUcmlnZ2VyKClcbiAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLnJlc3VtZURhdGEuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhID0gcmVzXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRMYXN0UGxheWVkUmVzb3VyY2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAvLyB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50TGFnID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRDb250ZW50TGFuZ3VhZ2UodGhpcy5jb250ZW50UmVhZERhdGEpXG4gICAgICAgICAgICB0aGlzLmdldENvbnRpbnVlTGVhcm5pbmdEYXRhKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyLCBlbnJvbGxlZENvdXJzZS5iYXRjaElkLCBjb250ZW50TGFnKVxuICAgICAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gZW5yb2xsZWRDb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5tYXBNb2R1bGVDb3VudCh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICAvLyB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmF0Y2hEYXRhID0ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtlbnJvbGxlZENvdXJzZS5iYXRjaF0sXG4gICAgICAgICAgZW5yb2xsZWQ6IHRydWUsXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2NTdmMuc2V0QmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgICAgICB0aGlzLnRvY1N2Yy5nZXRTZWxlY3RlZEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgdGhpcy50b2NTdmMubWFwU2Vzc2lvbkNvbXBsZXRpb25QZXJjZW50YWdlKHRoaXMuYmF0Y2hEYXRhLCB0aGlzLnJlc3VtZURhdGEpXG4gICAgICAgIHRoaXMucm91dGVyQ2hhbmdlSGFuZGxlcih0cnVlKVxuICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvY1N2Yy5jaGVja01vZHVsZVdpc2VEYXRhKHRoaXMuY29udGVudClcbiAgICAgICAgdGhpcy50b2NTdmMubWFwTW9kdWxlQ291bnQodGhpcy5jb250ZW50KVxuICAgICAgICAvLyBJdCdzIHVuZGVyc3Rvb2QgdGhhdCB1c2VyIGlzIG5vdCBhbHJlYWR5IGVucm9sbGVkXG4gICAgICAgIC8vIEZldGNoIHRoZSBhdmFpbGFibGUgYmF0Y2hlcyBhbmQgcHJlc2VudCB0byB1c2VyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DT1VSU0VcbiAgICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5QUk9HUkFNKSB7XG4gICAgICAgICAgLy8gRGlzYWJsaW5nIGF1dG8gZW5yb2xsbWVudCB0byBiYXRjaFxuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pIHtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hCYXRjaERldGFpbHMoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZldGNoQmF0Y2hEZXRhaWxzKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvY1N2Yy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAodGhpcy5jb250ZW50KVxuICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICB9XG5cblxuICAgIH1cblxuICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuICB9XG5cbiAgYmluZENvbXBsZXRpb25QZXJjZW50YWdlKCkge1xuICAgIGxldCBjb21wbGV0aW9uUGVyY2VudGFnZSA9IDBcbiAgICBsZXQgY29tcGxldGlvblN0YXR1cyA9IDBcbiAgICBpZiAodGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzICYmIE9iamVjdC5rZXlzKHRoaXMubGFuZ3VhZ2VNYXBQcm9ncmVzcykubGVuZ3RoKSB7XG4gICAgICBsZXQgbGFuZ1BlcmNlbnRhZ2UgPSB0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3NbdGhpcy5zZWxlY3RlZExhbmd1YWdlLmxhbmdJZF0gfHwgMFxuICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2UgPSBsYW5nUGVyY2VudGFnZVxuICAgICAgY29tcGxldGlvblN0YXR1cyA9IGxhbmdQZXJjZW50YWdlID49IDEwMCA/IDIgOiAwXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlbnJvbGxlZERhdGEgPSB0aGlzLnRvY1N2Yy5maW5kRW5yb2xtZW50QnlDb2xsZWN0aW9uSWQodGhpcy51c2VyRW5yb2xsbWVudExpc3QsICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgJycpKVxuICAgICAgaWYgKGVucm9sbGVkRGF0YSAmJiBlbnJvbGxlZERhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UpIHtcbiAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2UgPSBlbnJvbGxlZERhdGEuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgY29tcGxldGlvblN0YXR1cyA9IGVucm9sbGVkRGF0YS5zdGF0dXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBjb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgdGhpcy5jb250ZW50LmNvbXBsZXRpb25TdGF0dXMgPSBjb21wbGV0aW9uU3RhdHVzXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQWNjZXB0UmVsZXZlbnQoKSB7XG4gICAgdGhpcy5zYXZlRmVlZGJhY2soJycsIDEpXG4gIH1cblxuICBoYW5kbGVEZWNsaW5lUmVsZXZlbnQoKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihOb25SZWxldmVudEZlZWRiYWNrRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICB3aWR0aDogJzUwMnB4JyxcbiAgICAgIHBhbmVsQ2xhc3M6IFsncmVsZXZlbnQtZmVlZGJhY2stZGlhbG9nJ10sXG4gICAgfSlcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc2F2ZUZlZWRiYWNrKHJlc3VsdCwgMClcbiAgICAgICAgZGlhbG9nUmVmLmNsb3NlKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpYWxvZ1JlZi5jbG9zZSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKGV2ZW50VHlwZTogYW55KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnICAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuaXNBY3RpdmUgLy8gTk9TT05BUlxuICAgICAgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnLmV2ZW50cyAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuZXZlbnRzLmNvbnRlbnRfdmlldyAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuZXZlbnRzLmNvbnRlbnRfdmlldy5pc0FjdGl2ZSAvLyBOT1NPTkFSXG4gICAgKSB7XG4gICAgICBsZXQgcGF5bG9hZDogYW55ID0ge31cbiAgICAgIC8vIGlmICh0aGlzLmNvbmZpZ1N2YyAmJiB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIgJiYgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIpIHsgLy8gTk9TT05BUlxuICAgICAgLy8gICBwYXlsb2FkWydwa151c2VyaWQnXSA9IHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5uYW1lKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfbmFtZSddID0gdGhpcy5jb250ZW50Lm5hbWVcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5KSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfY2F0ZWdvcnknXSA9IHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2lkJ10gPSB0aGlzLmNvbnRlbnQuaWRlbnRpZmllclxuICAgICAgfVxuICAgICAgLy8gaWYodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5uYW1lKSB7XG4gICAgICBwYXlsb2FkWydjb250ZW50X3VybCddID0gd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICAgIC8vIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmFwcEljb24pIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9pbWFnZSddID0gdGhpcy5jb250ZW50LmFwcEljb25cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmR1cmF0aW9uKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfZHVyYXRpb24nXSA9IHRoaXMuY29udGVudC5kdXJhdGlvbiAmJiBOdW1iZXIodGhpcy5jb250ZW50LmR1cmF0aW9uKSA+IDAgPyBOdW1iZXIodGhpcy5jb250ZW50LmR1cmF0aW9uKSA6IDBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfZHVyYXRpb24nXSA9IDBcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmF2Z1JhdGluZ1xuICAgICAgKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfcmF0aW5nJ10gPSB0aGlzLmNvbnRlbnQuYXZnUmF0aW5nXG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnQgcmF0aW5nJ10gPSB0aGlzLmNvbnRlbnQuYXZnUmF0aW5nXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC50b3RhbE5vT2ZSYXRpbmcpIHtcbiAgICAgICAgcGF5bG9hZFsnbm9fdXNlcnNfcmF0ZWQnXSA9IHRoaXMuY29udGVudC50b3RhbE5vT2ZSYXRpbmdcbiAgICAgIH1cbiAgICAgIC8vIGlmKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQubmFtZSkge1xuICAgICAgcGF5bG9hZFsnbGVhcm5pbmdfcGF0aF9jb250ZW50J10gPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJiB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGggPyB0cnVlIDogZmFsc2VcbiAgICAgIHBheWxvYWRbJ2xlYXJuaW5nIHBhdGggY29udGVudCddID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5zb3VyY2UpIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9wcm92aWRlcl9uYW1lJ10gPSB0aGlzLmNvbnRlbnQuc291cmNlXG4gICAgICB9XG4gICAgICAvLyBjb25zb2xlLmxvZygncGF5bG9hZCcsIHBheWxvYWQpXG4gICAgICBpZiAoZXZlbnRUeXBlID09PSAndmlldycpIHtcbiAgICAgICAgdGhpcy5uZXRDb3JlU2VydmljZS50cmFja0V2ZW50Rm9yQ29udGVudEFuZEV2ZW50KCdjb250ZW50X3ZpZXcnLCB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllci50cmltKCkudG9Mb3dlckNhc2UoKSwgcGF5bG9hZClcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnZW5yb2xsJykge1xuICAgICAgICB0aGlzLm5ldENvcmVTZXJ2aWNlLnRyYWNrRXZlbnRGb3JDb250ZW50QW5kRXZlbnQoJ2NvbnRlbnRfZW5yb2xtZW50JywgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIudHJpbSgpLnRvTG93ZXJDYXNlKCksIHBheWxvYWQpXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICB0aGlzLm5ldENvcmVTZXJ2aWNlLnRyYWNrRXZlbnRGb3JDb250ZW50QW5kRXZlbnQoJ2NvbnRlbnRfY29tcGxldGlvbicsIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBwYXlsb2FkKVxuICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgc2Vjb25kc1RvVGltZShkOiBhbnkpIHtcbiAgICBkID0gTnVtYmVyKGQpXG4gICAgdmFyIGggPSBNYXRoLmZsb29yKGQgLyAzNjAwKVxuICAgIHZhciBtID0gTWF0aC5mbG9vcihkICUgMzYwMCAvIDYwKVxuICAgIHZhciBzID0gTWF0aC5mbG9vcihkICUgMzYwMCAlIDYwKVxuXG4gICAgdmFyIGhEaXNwbGF5ID0gaCA+IDAgPyBoICsgKGggPT0gMSA/IFwiIGhvdXIsIFwiIDogXCIgaG91cnMsIFwiKSA6IFwiXCJcbiAgICB2YXIgbURpc3BsYXkgPSBtID4gMCA/IG0gKyAobSA9PSAxID8gXCIgbWludXRlLCBcIiA6IFwiIG1pbnV0ZXMsIFwiKSA6IFwiXCJcbiAgICB2YXIgc0Rpc3BsYXkgPSBzID4gMCA/IHMgKyAocyA9PSAxID8gXCIgc2Vjb25kXCIgOiBcIiBzZWNvbmRzXCIpIDogXCJcIlxuICAgIHJldHVybiBoRGlzcGxheSArIG1EaXNwbGF5ICsgc0Rpc3BsYXlcbiAgfVxuXG5cbiAgYXN5bmMgc2F2ZUZlZWRiYWNrKGNvbW1lbnQ6IHN0cmluZywgcmF0aW5nID0gMCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBcInJlY29tbWVuZGF0aW9uX2lkXCI6IHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQsXG4gICAgICBcImNvdXJzZV9pZFwiOiB0aGlzLmNvdXJzZUlELFxuICAgICAgXCJyYXRpbmdcIjogcmF0aW5nLFxuICAgICAgXCJjb21tZW50c1wiOiBjb21tZW50LFxuICAgICAgXCJ1c2VyX2lkXCI6IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlPy51c2VySWQgfHwgJydcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbnRlbnRMaWJTdmMuc2F2ZUZlZWRiYWNrU2Frc2hhbUFJKHBheWxvYWQpLnRvUHJvbWlzZSgpLmNhdGNoKCgpID0+IHsgfSlcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2U/Lm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMubWF0U25hY2tiYXJOZXcub3BlbihcbiAgICAgICAgJ1RoYW5rIHlvdSBmb3IgeW91ciBmZWVkYmFjay4nLCAnWCcsXG4gICAgICAgIHsgZHVyYXRpb246IFNOQUNLQkFSX0RVUkFUSU9OLCBwYW5lbENsYXNzOiBbJ3N1Y2Nlc3MnXSB9XG4gICAgICApXG4gICAgICB0aGlzLmZlZWRiYWNrR2l2ZW4gPSB7IGNvdXJzZV9pZDogdGhpcy5jb3Vyc2VJRCwgcmF0aW5nOiByYXRpbmcsIGNvbW1lbnRzOiBjb21tZW50IH1cblxuICAgIH0gZWxzZSBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICB0aGlzLm1hdFNuYWNrYmFyTmV3Lm9wZW4oXG4gICAgICAgICdTb21ldGhpbmcgaXMgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJywgJ1gnLFxuICAgICAgICB7IGR1cmF0aW9uOiBTTkFDS0JBUl9EVVJBVElPTiwgcGFuZWxDbGFzczogWydlcnJvciddIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwbGF5UmVzdW1lRm9yQUkoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgaWYgKHRoaXMuZmlyc3RSZXNvdXJjZUxpbmspIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZmlyc3RSZXNvdXJjZUxpbmsudXJsXSwgeyBxdWVyeVBhcmFtczogdGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcyB9KVxuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgZW5yb2xsVXNlclRvQUkoKSB7XG4gICAgdGhpcy5mcm9tQUlUdXRvciA9IHRydWVcbiAgICB0aGlzLmhhbmRsZUF1dG9CYXRjaEFzc2lnbigpXG4gIH1cblxuICBvcGVuU3VydmV5Rm9ybVBvcHVwKGV2ZW50OiBib29sZWFuKSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLm9wZW5Db21wbGV0aW9uU3VydmV5Rm9ybVBvcHVwKClcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZVByZUFzc2Vzc21lbnRRdWVyeSh0eXBlOiAnUkVTVU1FJyB8ICdTVEFSVF9PVkVSJyB8ICdTVEFSVCcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodGhpcy5maXJzdFJlc291cmNlTGluayAmJiAodHlwZSA9PT0gJ1NUQVJUJyB8fCB0eXBlID09PSAnU1RBUlRfT1ZFUicpKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsXG4gICAgICB9XG4gICAgICByZXR1cm4gcVBhcmFtc1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc3VtZURhdGFMaW5rICYmIHR5cGUgPT09ICdSRVNVTUUnKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5yZXN1bWVEYXRhTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICAgIHZpZXdNb2RlOiAnUkVTVU1FJyxcbiAgICAgICAgLy8gY291cnNlTmFtZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50Lm5hbWUgOiAnJyxcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHRJZCAmJiB0aGlzLmNvbnRleHRQYXRoKSB7XG4gICAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgICBjb2xsZWN0aW9uSWQ6IHRoaXMuY29udGV4dElkLFxuICAgICAgICAgIGNvbGxlY3Rpb25UeXBlOiB0aGlzLmNvbnRleHRQYXRoLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIGRlbGV0ZSBxUGFyYW1zLnZpZXdNb2RlXG4gICAgICB9XG4gICAgICBxUGFyYW1zID0ge1xuICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbElkLFxuICAgICAgfVxuICAgICAgcmV0dXJuIHFQYXJhbXNcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgIHZpZXdNb2RlOiB0eXBlLFxuICAgIH1cbiAgfVxuXG4gIHJvdXRlVG9QcmVBc3Nlc3NlbnQoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhKSB7XG4gICAgICAvLyB0aGlzLmdlbmVyYXRlUHJlQXNzZXNzbWVudFF1ZXJ5KCdTVEFSVCcpXG4gICAgICBsZXQgZmlyc3RSZXNvdXJjZSA9IHRoaXMuY29udGVudFJlYWREYXRhLnByZUVucm9sbWVudFJlc291cmNlc1swXVxuICAgICAgbGV0IG1pbWVUeXBlID0gZmlyc3RSZXNvdXJjZT8uY291cnNlQ2F0ZWdvcnkgPT09ICdQcmUgRW5yb2xtZW50IEFzc2Vzc21lbnQnID8gJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0JyA6IGZpcnN0UmVzb3VyY2UubWltZVR5cGVcbiAgICAgIHRoaXMuZmlyc3RSZXNvdXJjZUxpbmsgPSB2aWV3ZXJSb3V0ZUdlbmVyYXRvcihcbiAgICAgICAgZmlyc3RSZXNvdXJjZS5pZGVudGlmaWVyLFxuICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIsXG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSxcbiAgICAgICAgdGhpcy5mb3JQcmV2aWV3LFxuICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5wcmVFbnJvbG1lbnRSZXNvdXJjZXNbMF0/LnByaW1hcnlDYXRlZ29yeSB8fCAnJyxcbiAgICAgICAgJycsXG4gICAgICApXG4gICAgICBsZXQgcm91dGVyTGluayA9IHRoaXMuZmlyc3RSZXNvdXJjZUxpbms/LnVybFxuICAgICAgbGV0IHF1ZXJ5UGFyYW1zID0gdGhpcy5nZW5lcmF0ZVByZUFzc2Vzc21lbnRRdWVyeSgnU1RBUlQnKVxuICAgICAgcXVlcnlQYXJhbXMgPSB7IC4uLnF1ZXJ5UGFyYW1zLCBwcmVBc3Nlc3NtZW50OiAndHJ1ZScgfVxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3JvdXRlckxpbmt9YF0sIHsgcXVlcnlQYXJhbXMgfSlcbiAgICB9XG4gIH1cblxuICBnZXRQcmVBc3Nlc3NtZW50UmVxdWlyZWQoKSB7XG4gICAgdGhpcy5wcmVBc3Nlc3NtZW50UmVxdWlyZWRGbGFnID0gZmFsc2VcbiAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YT8ucHJlRW5yb2xtZW50UmVzb3VyY2VzPy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbT8uaXNNYW5kYXRvcnkpIHtcbiAgICAgICAgICB0aGlzLnByZUFzc2Vzc21lbnRSZXF1aXJlZEZsYWcgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZ2V0UHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMoKSB7XG4gICAgdGhpcy5wcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IGZhbHNlXG4gICAgbGV0IHByZUVucm9sbG1lbnRSZXNvdXJjZXNBcnI6IGFueSA9IFtdXG4gICAgbGV0IHByZUVucm9sbG1lbnRNYW5kYXRvcnlSZXNvdXJjZXNBcnI6IGFueSA9IFtdXG4gICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8uZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIHByZUVucm9sbG1lbnRSZXNvdXJjZXNBcnIucHVzaChpdGVtPy5pZGVudGlmaWVyKVxuICAgICAgICBpZiAoaXRlbSAmJiBpdGVtPy5pc01hbmRhdG9yeSkge1xuICAgICAgICAgIHByZUVucm9sbG1lbnRNYW5kYXRvcnlSZXNvdXJjZXNBcnIucHVzaChpdGVtPy5pZGVudGlmaWVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAocHJlRW5yb2xsbWVudFJlc291cmNlc0FyciAmJiBwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyLmxlbmd0aCkge1xuICAgICAgbGV0IHJlcSA9IHtcbiAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICBcImNvbnRlbnRJZHNcIjogcHJlRW5yb2xsbWVudFJlc291cmNlc0FycixcbiAgICAgICAgICBcImZpZWxkc1wiOiBbXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnRvY1N2Yy5yZWFkUHJlRW5yb2xsbWVudFJlc291cmNlc1N0YXRlKHJlcSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IG1hbmRhdG9yeUlkc0NvbXBsZXRlZCA9IFtdXG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0ICYmIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5yZXN1bHQuY29udGVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkYXRhLnJlc3VsdC5jb250ZW50TGlzdFtpXVsnc3RhdHVzJ10gPT09IDIgJiYgcHJlRW5yb2xsbWVudE1hbmRhdG9yeVJlc291cmNlc0Fyci5pbmNsdWRlcyhkYXRhLnJlc3VsdC5jb250ZW50TGlzdFtpXVsnY29udGVudElkJ10pKSB7XG4gICAgICAgICAgICAgIG1hbmRhdG9yeUlkc0NvbXBsZXRlZC5wdXNoKGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0W2ldWydjb250ZW50SWQnXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZUVucm9sbG1lbnRSZXNvdXJjZXNBcnI/Lmxlbmd0aCA9PT0gZGF0YS5yZXN1bHQuY29udGVudExpc3Q/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IHRydWVcbiAgICAgICAgICB9IGVsc2UgaWYgKG1hbmRhdG9yeUlkc0NvbXBsZXRlZC5sZW5ndGggPT09IHByZUVucm9sbG1lbnRNYW5kYXRvcnlSZXNvdXJjZXNBcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzID0gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXJTdmMuc2V0RW5yb2xsRGF0YShudWxsKVxuICAgIHRoaXMuZ2V0U2VydmVyRGF0ZVRpbWUoKVxuICAgIHRoaXMubW9iaWxlMTIwMCA9IHdpbmRvdy5pbm5lcldpZHRoIDwgMTIwMVxuICAgIHRoaXMuZ2V0STE4TlRyYW5zbGF0aW9ucygpXG4gICAgdGhpcy5sb2FkTGVhcm5lckFkdmlzb3J5RGF0YSgpXG4gICAgdGhpcy5zZXR1cFNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24oKVxuICAgIHRoaXMuc2V0Q2hhbm5lbElkKClcbiAgICB0aGlzLmNoZWNrSWZyYW1lQ29udGV4dCgpXG4gICAgdGhpcy5xdWVyeVBhcmFtc0RhdGEgPSB0aGlzLnNldHVwUm91dGVTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLnNldHVwRnJhZ21lbnRTdWJzY3JpcHRpb24oKVxuICAgIHRoaXMuc2V0dXBCYXRjaFN1YnNjcmlwdGlvbnMoKVxuICAgIHRoaXMuY29uZmlndXJlRGVmYXVsdExvZ28oKVxuICAgIHRoaXMuY29uZmlndXJlRmVhdHVyZUZsYWdzKClcbiAgICB0aGlzLmNoZWNrUmVnaXN0cmF0aW9uU3RhdHVzKClcbiAgICB0aGlzLnNldHVwUm91dGVyRXZlbnRTdWJzY3JpcHRpb24oKVxuICAgIHRoaXMuZ2V0Q29udGVudENyZWF0b3JEYXRhKClcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERhdGEoZGF0YTogRGF0YSkge1xuICAgIGNvbnN0IGluaXREYXRhOiBhbnkgPSB0aGlzLnRvY1N2Yy5pbml0RGF0YShkYXRhLCB0cnVlKVxuICAgIHRoaXMuc2V0RXJyb3JDb2RlKGluaXREYXRhLmVycm9yQ29kZSlcbiAgICB0aGlzLmluaXRpYWxpemVUb2NTdHJ1Y3R1cmUoKVxuICAgIHRoaXMuc2V0dXBCYXRjaENvbnRyb2xTdWJzY3JpcHRpb24oKVxuICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0RXJyb3JDb2RlKGVycm9yQ29kZTogTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlKSB7XG4gICAgdGhpcy5lcnJvckNvZGUgPSBlcnJvckNvZGVcbiAgICBzd2l0Y2ggKHRoaXMuZXJyb3JDb2RlKSB7XG4gICAgICBjYXNlIE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZS5BUElfRkFJTFVSRTpcbiAgICAgIGNhc2UgTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlLklOVkFMSURfREFUQTpcbiAgICAgIGNhc2UgTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlLk5PX0RBVEE6XG4gICAgICAgIHRoaXMuZXJyb3JXaWRnZXREYXRhLndpZGdldERhdGEuZXJyb3JUeXBlID0gRXJyb3JUeXBlLmludGVybmFsU2VydmVyXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmVycm9yV2lkZ2V0RGF0YS53aWRnZXREYXRhLmVycm9yVHlwZSA9IEVycm9yVHlwZS5zb21ldGhpbmdXcm9uZ1xuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG5cblxuICBwcml2YXRlIGluaXRpYWxpemVUb2NTdHJ1Y3R1cmUoKSB7XG4gICAgdGhpcy5jb250ZW50UGFyZW50cyA9IHt9XG4gICAgdGhpcy50b2NTdHJ1Y3R1cmUgPSB7XG4gICAgICBhc3Nlc3NtZW50OiAwLFxuICAgICAgY291cnNlOiAwLFxuICAgICAgaGFuZHNPbjogMCxcbiAgICAgIGludGVyYWN0aXZlVmlkZW86IDAsXG4gICAgICBsZWFybmluZ01vZHVsZTogMCxcbiAgICAgIG90aGVyOiAwLFxuICAgICAgcGRmOiAwLFxuICAgICAgc3VydmV5OiAwLFxuICAgICAgcG9kY2FzdDogMCxcbiAgICAgIHByYWN0aWNlVGVzdDogMCxcbiAgICAgIGZpbmFsVGVzdDogMCxcbiAgICAgIHF1aXo6IDAsXG4gICAgICB2aWRlbzogMCxcbiAgICAgIHdlYk1vZHVsZTogMCxcbiAgICAgIHdlYlBhZ2U6IDAsXG4gICAgICB5b3V0dWJlOiAwLFxuICAgICAgaW50ZXJhY3RpdmVjb250ZW50OiAwLFxuICAgICAgb2ZmbGluZVNlc3Npb246IDAsXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEJhdGNoQ29udHJvbFN1YnNjcmlwdGlvbigpIHtcbiAgICB0aGlzLmJhdGNoQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChiYXRjaDogTnNDb250ZW50LklCYXRjaCkgPT4ge1xuICAgICAgaWYgKGJhdGNoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQmF0Y2hFbnJvbGxtZW50KGJhdGNoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUJhdGNoRW5yb2xsbWVudChiYXRjaDogTnNDb250ZW50LklCYXRjaCkge1xuICAgIHRoaXMuZGlzYWJsZUVucm9sbEJ0biA9IHRydWVcbiAgICBsZXQgdXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGU/LnVzZXJJZCB8fCAnJ1xuXG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgcmVxdWVzdDoge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIGNvdXJzZUlkOiBiYXRjaC5jb3Vyc2VJZCxcbiAgICAgICAgYmF0Y2hJZDogYmF0Y2guYmF0Y2hJZCxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgdGhpcy5jb250ZW50U3ZjLmVucm9sbFVzZXJUb0JhdGNoKHJlcSkudGhlbigoZGF0YWI6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGFiPy5yZXN1bHQ/LnJlc3BvbnNlID09PSAnU1VDQ0VTUycpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsRW5yb2xsbWVudChiYXRjaClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRW5yb2xsbWVudEZhaWx1cmUoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1Y2Nlc3NmdWxFbnJvbGxtZW50KGJhdGNoOiBOc0NvbnRlbnQuSUJhdGNoKSB7XG4gICAgdGhpcy5iYXRjaERhdGEgPSB7XG4gICAgICBjb250ZW50OiBbYmF0Y2hdLFxuICAgICAgZW5yb2xsZWQ6IHRydWUsXG4gICAgfVxuICAgIHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgIHRoaXMudG9jU3ZjLm1hcFNlc3Npb25Db21wbGV0aW9uUGVyY2VudGFnZSh0aGlzLmJhdGNoRGF0YSlcbiAgICB0aGlzLnJvdXRlckNoYW5nZUhhbmRsZXIodHJ1ZSlcbiAgICB0aGlzLm9wZW5TbmFja2JhcignRW5yb2xsZWQgU3VjY2Vzc2Z1bGx5IScpXG4gICAgdGhpcy5kaXNhYmxlRW5yb2xsQnRuID0gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRW5yb2xsbWVudEZhaWx1cmUoKSB7XG4gICAgdGhpcy5vcGVuU25hY2tiYXIoJ1NvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIScpXG4gICAgdGhpcy5kaXNhYmxlRW5yb2xsQnRuID0gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgbG9hZExlYXJuZXJBZHZpc29yeURhdGEoKSB7XG4gICAgaWYgKHRoaXMucm91dGUuc25hcHNob3QuZGF0YS5wYWdlRGF0YSAmJiB0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEuZGF0YSkge1xuICAgICAgdGhpcy5sZWFybkFkdmlzb3J5RGF0YSA9IHRoaXMucm91dGUuc25hcHNob3QuZGF0YS5wYWdlRGF0YS5kYXRhLmxlYXJuZXJBZHZpc29yeVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBTZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2guc3Vic2NyaWJlKGJhdGNoRGF0YSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhID0gYmF0Y2hEYXRhXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2hhbm5lbElkKCkge1xuICAgIHRoaXMuY2hhbm5lbElkID0gdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeUNvbmZpZ1xuICAgICAgPyB0aGlzLnRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5Q29uZmlnLmNoYW5uZWxcbiAgICAgIDogJydcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJZnJhbWVDb250ZXh0KCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmlzSW5JZnJhbWUgPSB3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcFxuICAgIH0gY2F0Y2ggKF9leCkge1xuICAgICAgdGhpcy5pc0luSWZyYW1lID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwUm91dGVTdWJzY3JpcHRpb25zKCkge1xuICAgIGxldCBxdWVyeVBhcmFtc3RlbXA6IGFueSA9IHt9XG4gICAgaWYgKHRoaXMucm91dGUpIHtcbiAgICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSB0cnVlXG4gICAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZS5kYXRhLnN1YnNjcmliZShhc3luYyAoZGF0YTogRGF0YSkgPT4ge1xuICAgICAgICBpZiAoZGF0YT8uY29udGVudD8uZGF0YT8uaWRlbnRpZmllcikge1xuICAgICAgICAgIHF1ZXJ5UGFyYW1zdGVtcCA9IGF3YWl0IHRoaXMucHJvY2Vzc1JvdXRlRGF0YShkYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRlbXBEYXRhID0ge1xuICAgICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgICBkYXRhOiB0aGlzLmlucHV0Q29udGVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBxdWVyeVBhcmFtc3RlbXAgPSBhd2FpdCB0aGlzLnByb2Nlc3NSb3V0ZURhdGEodGVtcERhdGEpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBxdWVyeVBhcmFtc3RlbXBcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1JvdXRlRGF0YShkYXRhOiBEYXRhKSB7XG4gICAgdGhpcy5jb3Vyc2VJRCA9IGRhdGEuY29udGVudC5kYXRhLmlkZW50aWZpZXJcbiAgICBjb25zdCBpbml0RGF0YSA9IHRoaXMudG9jU3ZjLmluaXREYXRhKGRhdGEsIHRydWUpXG5cbiAgICAvLyBHZXQgcXVlcnkgcGFyYW1ldGVyc1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zRGF0YVRlbXAgPSBhd2FpdCB0aGlzLmdldFF1ZXJ5UGFyYW1zKClcbiAgICAvLyBIYW5kbGUgbXVsdGlsaW5ndWFsIGNvbnRlbnQgaWYgbWxJZCBpcyBwcmVzZW50IGluIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICBpZiAocXVlcnlQYXJhbXNEYXRhVGVtcC5NTElkKSB7XG4gICAgICAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgY29udGVudCBkYXRhIGZvciByZWZlcmVuY2VcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSA9IGluaXREYXRhLmNvbnRlbnRcblxuICAgICAgLy8gRmV0Y2ggdGhlIG11bHRpbGluZ3VhbCBjb250ZW50XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5mZXRjaENvbnRlbnRSZWFkKHF1ZXJ5UGFyYW1zRGF0YVRlbXAuTUxJZClcbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgLy8gSWYgbXVsdGlsaW5ndWFsIGNvbnRlbnQgZmV0Y2ggZmFpbHMsIGZhbGwgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGVudFxuICAgICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhID0gaW5pdERhdGEuY29udGVudFxuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLndhcm4oJ0ZhaWxlZCB0byBsb2FkIG11bHRpbGluZ3VhbCBjb250ZW50LCB1c2luZyBvcmlnaW5hbCBjb250ZW50IGluc3RlYWQnKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBPbiBlcnJvciwgdXNlIHRoZSBvcmlnaW5hbCBjb250ZW50XG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhID0gaW5pdERhdGEuY29udGVudFxuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgbG9hZGluZyBtdWx0aWxpbmd1YWwgY29udGVudDonLCBlcnJvcilcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gbG9hZCBjb250ZW50IGluIHNlbGVjdGVkIGxhbmd1YWdlJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIG11bHRpbGluZ3VhbCBjb250ZW50IHJlcXVlc3RlZCwgdXNlIHRoZSBvcmlnaW5hbCBjb250ZW50XG4gICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YSA9IGluaXREYXRhLmNvbnRlbnRcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSA9IGluaXREYXRhLmNvbnRlbnRcbiAgICB9XG4gICAgLy8gQWRkZWQgdG8gbWFrZSBzdXJlIHRoaXMgcmVmZXJlbmNlIHdhcyBpbmNvcnJlY3QsIGFzc2lnbmluZyBhZ2FpbiB0byBtYWtlIHN1cmUgZ2xvYmFsIHZhcmlhYmxlIGlzIHByb3Blcmx5IHVwZGF0ZWRcbiAgICB0aGlzLnF1ZXJ5UGFyYW1zRGF0YSA9IHF1ZXJ5UGFyYW1zRGF0YVRlbXBcblxuICAgIC8vIENvbnRpbnVlIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHByb2Nlc3NpbmdcbiAgICB0aGlzLmxvYWRMYW5ndWFnZURhdGEoKVxuICAgIHRoaXMuZ2V0UHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMoKVxuICAgIHRoaXMuZ2V0UHJlQXNzZXNzbWVudFJlcXVpcmVkKClcblxuICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29udGVudFByZXZpZXdPckVucm9sbG1lbnQoKVxuXG4gICAgdGhpcy5pbml0aWFscm91dGVEYXRhID0gZGF0YVxuICAgIHRoaXMubG9hZEJhbm5lckFuZFRvY0NvbmZpZyhkYXRhKVxuICAgIHRoaXMuZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1c0lmTmVlZGVkKClcbiAgICB0aGlzLmluaXREYXRhKGRhdGEpXG5cbiAgICAvLyB0byBjbGVhciBwdWJsaWMgc3VydmV5IGRhdGEgaWYgYW55IG9uIGxvYWQsXG4gICAgLy8gaWYgbm90IGNsZWFyZWQgdGhlbiBpdCB3aWxsIGJlIGNsZWFyZWQgb24gcG9wdXAgY2xvc2UsXG4gICAgLy8gIGJ1dCB0aGUgdGVhY2hlcnMgbm90ZXMgd2lsbCBiZSB2aXNpYmxlIG9uIGNpbWluZyBiYWNrIGZyb20gcGxheWVyIHBhZ2VcbiAgICBjb25zdCBzdXJ2ZXlJZCA9IHRoaXMuZW52aXJvbm1lbnQucHVibGljQ29udGVudFN1cnZleUlkIHx8ICcnXG4gICAgY29uc3QgY291cnNlSWQgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJ1xuICAgIHRoaXMuY2xlYXJFeGlzdGluZ1B1YmxpY1N1cnZleURhdGEoc3VydmV5SWQsIGNvdXJzZUlkKVxuXG4gICAgcmV0dXJuIHF1ZXJ5UGFyYW1zRGF0YVRlbXBcbiAgfVxuXG4gIG9wZW5Db21wbGV0aW9uU3VydmV5Rm9ybVBvcHVwKCkge1xuICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgXy5nZXQodGhpcy5iYXNlQ29udGVudFJlYWREYXRhLCAnY29tcGxldGlvblN1cnZleUxpbmsnKSkge1xuICAgICAgY29uc3Qgc0lEID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmNvbXBsZXRpb25TdXJ2ZXlMaW5rLnNwbGl0KCdzdXJ2ZXlzLycpXG4gICAgICBjb25zdCBzdXJ2ZXlJZCA9IHNJRFsxXVxuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgc3VydmV5SWQsXG4gICAgICAgIGNvdXJzZU5hbWU6IHRoaXMuY29udGVudFJlYWREYXRhPy5uYW1lIHx8ICcnLFxuICAgICAgICBjb3Vyc2VJRDogdGhpcy5jb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgJycsXG4gICAgICAgIGNvbnRleHRPcmdJZDogdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3IgJiYgdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3IubGVuZ3RoID4gMCA/XG4gICAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3JbMF0gOiAnJ1xuICAgICAgfVxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb21wbGV0aW9uU3VydmV5Rm9ybUNvbXBvbmVudCwge1xuICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICAgIHdpZHRoOiAnNzUwcHgnLFxuICAgICAgICBtYXhXaWR0aDogJzkwdncnLFxuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgfSlcbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICB0aGlzLm9wZW5Db25maXJtYXRpb25EaWFsb2coKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9ja0NlcnRpZmljYXRlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG9wZW5Db25maXJtYXRpb25EaWFsb2coKSB7XG4gICAgY29uc3QgZGlhbG9nRGF0YSA9IHtcbiAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhcHB0b2Muc3VydmV5U3VibWl0dGVkJyksXG4gICAgICAgICAgY2xhc3NlczogJ2RpYWxvZy10aXRsZSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2FwcHRvYy5zdXJ2ZXlDb21wbGV0ZWRDZXJ0aWZpY2F0ZUdlbmVyYXRpbmcnKSxcbiAgICAgICAgICBjbGFzc2VzOiAnZGlhbG9nLWRlc2NyaXB0aW9uIG1iLTInXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBpY29uTmFtZTogJ2NoZWNrX2NpcmNsZScsXG4gICAgICB0eXBlOiAncHJpbWFyeScsXG4gICAgICBidXR0b25zUG9zaXRpb25DbGFzczogJ2p1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlcicsXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiAnc3VjY2VzLWJ1dHRvbiB3aWR0aC1mdWxsJyxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhcHB0b2MucmV0dXJuVG9Qcm9ncmFtUGFnZScpLFxuICAgICAgICAgIHJlc3BvbnNlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIG1heFdpZHRoOiAnOTB2dydcbiAgICB9KVxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMubG9ja0NlcnRpZmljYXRlID0gZmFsc2VcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTGFuZ3VhZ2VEYXRhKCkge1xuICAgIHRoaXMubGFuZ3VhZ2VMaXN0ID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRBbGxDb250ZW50TGFuZ3VhZ2VzKHRoaXMuY29udGVudFJlYWREYXRhKVxuICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0U2VsZWN0ZWRMYW5ndWFnZSh0aGlzLmNvbnRlbnRSZWFkRGF0YSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ29udGVudFByZXZpZXdPckVucm9sbG1lbnQoKSB7XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkQ29udGVudEZvclByZXZpZXcoKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAvLyBJZiB3ZSdyZSB3b3JraW5nIHdpdGggbXVsdGlsaW5ndWFsIGNvbnRlbnQsIG1ha2Ugc3VyZSB0byBmZXRjaCBpdHMgaGllcmFyY2h5XG4gICAgICAvLyBpZiAodGhpcy5xdWVyeVBhcmFtc0RhdGEubWxJZCAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJlxuICAgICAgLy8gICAgIHRoaXMuY29udGVudFJlYWREYXRhLmlkZW50aWZpZXIgPT09IHRoaXMucXVlcnlQYXJhbXNEYXRhLm1sSWQpIHtcbiAgICAgIC8vICAgLy8gRmV0Y2ggY29udGVudCBoaWVyYXJjaHkgZm9yIHRoZSBtdWx0aWxpbmd1YWwgY29udGVudFxuICAgICAgLy8gICB0cnkge1xuICAgICAgLy8gICAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGllcmFyY2h5KHRoaXMuY29udGVudFJlYWREYXRhLmlkZW50aWZpZXIpO1xuICAgICAgLy8gICAgIC8vIEFmdGVyIGZldGNoaW5nIGhpZXJhcmNoeSwgdXBkYXRlIFVJIGNvbXBvbmVudHNcbiAgICAgIC8vICAgICB0aGlzLmdldExlYXJuaW5nVXJscygpO1xuICAgICAgLy8gICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdFcnJvciBmZXRjaGluZyBoaWVyYXJjaHkgZm9yIG11bHRpbGluZ3VhbCBjb250ZW50OicsIGVycm9yKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuXG4gICAgICAvLyBDb250aW51ZSB3aXRoIHJlZ3VsYXIgZW5yb2xsbWVudCBmbG93XG4gICAgICB0aGlzLmZldGNoVXNlckVucm9sbG1lbnREYXRhVjIoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZENvbnRlbnRGb3JQcmV2aWV3KCkge1xuICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGllcmFyY2h5KHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnKVxuICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICB0aGlzLnRvY1N2Yy5jaGVja01vZHVsZVdpc2VEYXRhKHRoaXMuY29udGVudClcbiAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJhbm5lckFuZFRvY0NvbmZpZyhkYXRhOiBEYXRhKSB7XG4gICAgdGhpcy5iYW5uZXJzID0gZGF0YT8ucGFnZURhdGE/LmRhdGE/LmJhbm5lcnMgfHwgW11cbiAgICB0aGlzLnRvY1N2Yy5zdWJ0aXRsZU9uQmFubmVycyA9IGRhdGE/LnBhZ2VEYXRhPy5kYXRhPy5zdWJ0aXRsZU9uQmFubmVycyB8fCBmYWxzZVxuICAgIHRoaXMudG9jU3ZjLnNob3dEZXNjcmlwdGlvbiA9IGRhdGE/LnBhZ2VEYXRhPy5kYXRhPy5zaG93RGVzY3JpcHRpb24gfHwgZmFsc2VcbiAgICB0aGlzLnRvY0NvbmZpZyA9IGRhdGE/LnBhZ2VEYXRhPy5kYXRhIHx8IHt9XG4gICAgdGhpcy5rcGFycmF5ID0gdGhpcy50b2NDb25maWcua2FybWFQb2ludHNcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1c0lmTmVlZGVkKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5pc1Bvc3RBc3Nlc3NtZW50KSB7XG4gICAgICB0aGlzLnRvY1N2Yy5mZXRjaFBvc3RBc3Nlc3NtZW50U3RhdHVzKHRoaXMuY29udGVudC5pZGVudGlmaWVyKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgY29uc3QgYXNzZXNzbWVudERhdGEgPSByZXMucmVzdWx0XG4gICAgICAgIGZvciAoY29uc3QgbyBvZiBhc3Nlc3NtZW50RGF0YSkge1xuICAgICAgICAgIGlmIChvLmNvbnRlbnRJZCA9PT0gKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1Rha2VBc3Nlc3NtZW50ID0gb1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEZyYWdtZW50U3Vic2NyaXB0aW9uKCkge1xuICAgIHRoaXMuY3VycmVudEZyYWdtZW50ID0gJ292ZXJ2aWV3J1xuICAgIHRoaXMucm91dGUuZnJhZ21lbnQuc3Vic2NyaWJlKChmcmFnbWVudDogYW55KSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRGcmFnbWVudCA9IGZyYWdtZW50IHx8ICdvdmVydmlldydcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEJhdGNoU3Vic2NyaXB0aW9ucygpIHtcbiAgICB0aGlzLmJhdGNoU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuYmF0Y2hSZXBsYXlTdWJqZWN0LnN1YnNjcmliZShcbiAgICAgICgpID0+IHRoaXMuaGFuZGxlQmF0Y2hVcGRhdGUoKSxcbiAgICAgICgpID0+IHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdlcnJvciBvbiBiYXRjaFN1YnNjcmlwdGlvbicpXG4gICAgKVxuXG4gICAgdGhpcy5iYXRjaERhdGFTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5zZXRCYXRjaERhdGFTdWJqZWN0LnN1YnNjcmliZShcbiAgICAgICgpID0+IHRoaXMuaGFuZGxlQmxlbmRlZFByb2dyYW1VcGRhdGUoKSxcbiAgICAgICgpID0+IHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdlcnJvciBvbiBiYXRjaERhdGFTdWJzY3JpcHRpb24nKVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQmF0Y2hVcGRhdGUoKSB7XG4gICAgdGhpcy5mZXRjaEJhdGNoRGV0YWlscygpXG4gICAgaWYgKHRoaXMuY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pIHtcbiAgICAgIHRoaXMuZmV0Y2hVc2VyV0ZGb3JCbGVuZGVkKClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUJsZW5kZWRQcm9ncmFtVXBkYXRlKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XG4gICAgICB0aGlzLmZldGNoVXNlcldGRm9yQmxlbmRlZCgpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25maWd1cmVEZWZhdWx0TG9nbygpIHtcbiAgICBjb25zdCBpbnN0YW5jZUNvbmZpZyA9IHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnXG4gICAgaWYgKGluc3RhbmNlQ29uZmlnPy5sb2dvcz8uZGVmYXVsdFNvdXJjZUxvZ28pIHtcbiAgICAgIHRoaXMuZGVmYXVsdFNMb2dvID0gaW5zdGFuY2VDb25maWcubG9nb3MuZGVmYXVsdFNvdXJjZUxvZ29cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZUZlYXR1cmVGbGFncygpIHtcbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XG4gICAgICB0aGlzLmlzR29hbHNFbmFibGVkID0gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ2dvYWxzJylcbiAgICAgIHRoaXMuaXNSZWdpc3RyYXRpb25TdXBwb3J0ZWQgPSB0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKCdyZWdpc3RyYXRpb25FeHRlcm5hbCcpXG4gICAgICB0aGlzLnNob3dJbnRyYW5ldE1lc3NhZ2UgPSAhdGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzLmhhcygnc2hvd0ludHJhbmV0TWVzc2FnZURlc2t0b3AnKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBSb3V0ZXJFdmVudFN1YnNjcmlwdGlvbigpIHtcbiAgICB0aGlzLnJvdXRlclBhcmFtU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgocm91dGVyRXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBpZiAocm91dGVyRXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgIHRoaXMuYXNzaWduUGF0aEFuZFVwZGF0ZUJhbm5lcihyb3V0ZXJFdmVudC51cmwpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG5cblxuICBmZXRjaFVzZXJFbnJvbGxtZW50RGF0YVYyKCkge1xuXG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJ1xuICAgIGlmICghaWRlbnRpZmllcikge1xuICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0Nhbm5vdCBmZXRjaCBlbnJvbGxtZW50IGRhdGE6IGNvbnRlbnQgaWRlbnRpZmllciBpcyBtaXNzaW5nJylcbiAgICAgIHRoaXMudXNlckVucm9sbG1lbnRMaXN0ID0gW11cbiAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgcmVxdWVzdDoge1xuICAgICAgICByZXRpcmVkQ291cnNlc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIGNvdXJzZUlkOiBbaWRlbnRpZmllcl1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVucm9sbFN2Yy5mZXRjaEVucm9sbENvbnRlbnREYXRhKHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95U3ViamVjdCQpLFxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzPy5yZXN1bHQ/LmNvdXJzZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMudXNlckVucm9sbG1lbnRMaXN0ID0gcmVzLnJlc3VsdC5jb3Vyc2VzXG4gICAgICAgICAgLy8gQ2hlY2sgZm9yIGNvbXBsZXRlZCBjb250ZW50XG4gICAgICAgICAgY29uc3QgY29tcGxldGVkQ29udGVudERhdGEgPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5maW5kKFxuICAgICAgICAgICAgKGVsOiBhbnkpID0+IGVsLmNvbGxlY3Rpb25JZCA9PT0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyICYmXG4gICAgICAgICAgICAgIGVsLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDBcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKGNvbXBsZXRlZENvbnRlbnREYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKCdjb21wbGV0ZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZGF0YVRyYW5zZmVyU3ZjLnNldEVucm9sbERhdGEodGhpcy51c2VyRW5yb2xsbWVudExpc3QpXG4gICAgICAgICAgLy8gaW4gY2FzZSBvZiBiYWNrIGZyb20gcGxheWVyIHdlIG5lZWQgdG8gY2hlY2sgcmVjZW50IGxhbmd1YWdlIGFuZCBsb2FkXG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRMaWJTdmM/Lm9uZVN0ZXBSZXN1bWVFbmFibGUgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyID09PSB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllcikge1xuICAgICAgICAgICAgbGV0IGxhbmcgPSB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/Lmxhbmd1YWdlLmxlbmd0aCA/IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8ubGFuZ3VhZ2VbMF0gOiAnJ1xuICAgICAgICAgICAgbGV0IGJhc2VDb250ZW50RnJvbUVucm9sbERhdGEgPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllcilcbiAgICAgICAgICAgIGlmIChsYW5nICYmIGJhc2VDb250ZW50RnJvbUVucm9sbERhdGEgJiYgYmFzZUNvbnRlbnRGcm9tRW5yb2xsRGF0YT8ucmVjZW50X2xhbmd1YWdlPy50b0xvd2VyQ2FzZSgpICE9PSBsYW5nKSB7XG4gICAgICAgICAgICAgIGxldCBsb2NhbExhbmcgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldFJlcXVpcmVkTGFuZ3VhZ2VEZXRhaWxzKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSwgYmFzZUNvbnRlbnRGcm9tRW5yb2xsRGF0YT8ucmVjZW50X2xhbmd1YWdlKVxuICAgICAgICAgICAgICBpZiAobG9jYWxMYW5nICYmIE9iamVjdC5rZXlzKGxvY2FsTGFuZykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGFuZ3VhZ2VTZWxlY3Rpb24odGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRSZXF1aXJlZExhbmd1YWdlRGV0YWlscyh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEsIGJhc2VDb250ZW50RnJvbUVucm9sbERhdGE/LnJlY2VudF9sYW5ndWFnZSkpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGFuZ3VhZ2VTZWxlY3Rpb24odGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRTZWxlY3RlZExhbmd1YWdlKHRoaXMuY29udGVudFJlYWREYXRhKSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBbHdheXMgY2FsbCBmZXRjaENvbnRlbnRIaWVyYXJjaHkgZmlyc3RcbiAgICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMuZmV0Y2hDb250ZW50SGllcmFyY2h5KHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnKSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCA9IFtdXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBjb250ZW50IElEIGZyb20gZWl0aGVyIGNvbnRlbnQgb3IgY29udGVudFJlYWREYXRhXG4gICAgICAgICAgY29uc3QgY29udGVudElkID0gdGhpcy5jb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnXG4gICAgICAgICAgaWYgKCFjb250ZW50SWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdDYW5ub3QgZmV0Y2ggaGllcmFyY2h5OiBjb250ZW50IGlkZW50aWZpZXIgaXMgbWlzc2luZycpXG4gICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZldGNoIGhpZXJhcmNoeSBjb250ZW50IGZvciBhZGRpdGlvbmFsIGRhdGFcbiAgICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoQ29udGVudEhpZXJhcmNoeShjb250ZW50SWQpKVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIC8vIEFkZCBjYXRjaEVycm9yIGhlcmUgdG8gaGFuZGxlIGVycm9ycyBmcm9tIGZldGNoQ29udGVudEhpZXJhcmNoeVxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdFcnJvciBpbiBlbnJvbGxtZW50IGRhdGEgcHJvY2Vzc2luZycsIGVycm9yKVxuICAgICAgICByZXR1cm4gb2YoZmFsc2UpXG4gICAgICB9KVxuICAgICkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudXNlckVucm9sbG1lbnRMaXN0Py5sZW5ndGggJiYgdGhpcy5jb250ZW50TGliU3ZjPy5vbmVTdGVwUmVzdW1lRW5hYmxlKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVPbmVTdGVwUmVzdW1lKClcbiAgICAgICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggdXNlciBlbnJvbGxtZW50IGRhdGEnLCBlcnJvcilcbiAgICAgICAgdGhpcy51c2VyRW5yb2xsbWVudExpc3QgPSBbXVxuICAgICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgfSxcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgIC8vIE9wdGlvbmFsIGNvbXBsZXRpb24gaGFuZGxlciBpZiBuZWVkZWRcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVPbmVTdGVwUmVzdW1lKCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuY29udGVudCkge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignQ29udGVudCBub3QgYXZhaWxhYmxlIGZvciBvbmUtc3RlcCByZXN1bWUnKVxuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvdW5kQ29udGVudCA9IHRoaXMudXNlckVucm9sbG1lbnRMaXN0LmZpbmQoXG4gICAgICAgIChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllclxuICAgICAgKVxuXG4gICAgICBpZiAoIWZvdW5kQ29udGVudCkge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy53YXJuKCdObyBtYXRjaGluZyBlbnJvbGxlZCBjb250ZW50IGZvdW5kIGZvciBvbmUtc3RlcCByZXN1bWUnKVxuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVybERhdGEgPSBhd2FpdCB0aGlzLmNvbnRlbnRMaWJTdmMuZ2V0UmVzb3Vyc2VMaW5rKFxuICAgICAgICB0aGlzLmNvbnRlbnQsXG4gICAgICAgIFtmb3VuZENvbnRlbnRdLFxuICAgICAgICB0cnVlLFxuICAgICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEsXG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXVybERhdGEpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMud2FybignTm8gVVJMIGRhdGEgcmV0dXJuZWQgZm9yIG9uZS1zdGVwIHJlc3VtZScpXG5cbiAgICAgIH1cblxuICAgICAgaWYgKHVybERhdGE/LnVybCkge1xuICAgICAgICBpZiAodXJsRGF0YS51cmwuaW5jbHVkZXMoJ2FwcC90b2MnKSkge1xuICAgICAgICAgIHRoaXMuY29udGVudExpYlN2Yy5vbmVTdGVwUmVzdW1lRW5hYmxlID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRMaWJTdmMub25lU3RlcFJlc3VtZUVuYWJsZSA9IGZhbHNlXG4gICAgICAgICAgLy8gV2hlbiBjb21pbmcgZnJvbSBzZWFyY2ggcGFnZSBmb3IgcGFydGljdWxhciBsYW5ndWFnZSBjb250ZW50LCBjb25maXJtIGZpcnN0IHRvIG9uZSBzdGVwIHJlc3VtZSBvciBsb2FkIHRoZSBzZWFyY2hlZCBsYW5ndWFnZVxuICAgICAgICAgIGlmICh1cmxEYXRhPy5xdWVyeVBhcmFtcz8uTUwgJiYgKHVybERhdGE/LnF1ZXJ5UGFyYW1zPy5NTCAhPT0gdGhpcy5xdWVyeVBhcmFtc0RhdGFbJ01MJ10pKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dPbmVTdGVwUmVzdW1lQ29uZmlybSh1cmxEYXRhKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICAgICAgW3VybERhdGEudXJsXSxcbiAgICAgICAgICAgICAgeyBxdWVyeVBhcmFtczogdXJsRGF0YS5xdWVyeVBhcmFtcyB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdFcnJvciBpbiBoYW5kbGVPbmVTdGVwUmVzdW1lJywgZXJyb3IpXG4gICAgICB0aGlzLmNvbnRlbnRMaWJTdmMub25lU3RlcFJlc3VtZUVuYWJsZSA9IGZhbHNlXG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmV0Y2hDb250ZW50SGllcmFyY2h5KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheScpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhXG4gICAgICAgIHRoaXMuY29udGVudCA9IHRoaXMuYXBwVG9jVjJTdmMuY29uc3RydWN0SGVpcmFyY2h5RGF0YShjb250ZW50KVxuICAgICAgICB0aGlzLmFwcFRvY1YyU3ZjLm1hcENvbnRlbnRIaWVyYXJjaHlQcm9ncmVzc1VwZGF0ZSh0aGlzLmNvbnRlbnQsIHRoaXMudXNlckVucm9sbG1lbnRMaXN0KVxuICAgICAgICAvLyBDcmVhdGUgaGFzaG1hcCBhbmQgY29tcHV0ZSBtaWxlc3RvbmUgbG9ja2luZyBhZnRlciBwcm9ncmVzcyBpcyB1cGRhdGVkXG4gICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICAgIC8vIENvbXB1dGUgbWlsZXN0b25lIGxvY2tpbmcgc3RhdHVzIHdpdGggdXBkYXRlZCBwcm9ncmVzcyBkYXRhXG4gICAgICAgIHRoaXMudG9jU3ZjLmNvbXB1dGVNaWxlc3RvbmVMb2NraW5nU3RhdHVzKClcbiAgICAgICAgLy8gU3luYyBjb250ZW50IHRyZWUncyBpc0xvY2tlZCB3aXRoIGNvbXB1dGVkIHZhbHVlc1xuICAgICAgICB0aGlzLnN5bmNNaWxlc3RvbmVMb2NrU3RhdHVzKClcbiAgICAgICAgdGhpcy5nZXRPcmdJZEZvclNoYXJlKClcbiAgICAgICAgdGhpcy5nZXRUb2NTdHJ1Y3R1cmUoKVxuICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSBmZXRjaEhpZXJhcmNoeUNvbnRlbnQgcmV0dXJucyBhbiBPYnNlcnZhYmxlXG4gICAgICAgIGNvbnN0IG9ic2VydmFibGUgPSB0aGlzLmNvbnRlbnRTdmMuZmV0Y2hIaWVyYXJjaHlDb250ZW50KGlkZW50aWZpZXIsICdkZXRhaWwnKVxuXG4gICAgICAgIGlmICghb2JzZXJ2YWJsZSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdmZXRjaEhpZXJhcmNoeUNvbnRlbnQgZGlkIG5vdCByZXR1cm4gYW4gT2JzZXJ2YWJsZScpXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG9ic2VydmFibGUuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5yZXN1bHQ/LmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gcmVzcG9uc2UucmVzdWx0LmNvbnRlbnRcbiAgICAgICAgICAgICAgdGhpcy5nZXRPcmdJZEZvclNoYXJlKClcbiAgICAgICAgICAgICAgdGhpcy5nZXRUb2NTdHJ1Y3R1cmUoKVxuICAgICAgICAgICAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlclJhdGluZyA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VXNlclJhdGluZyhmYWxzZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBoaWVyYXJjaHkgY29udGVudCcsIGVycm9yKVxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldFRvY1N0cnVjdHVyZSgpIHtcbiAgICB0aGlzLmluaXRpYWxpemVUb2NTdHJ1Y3R1cmUoKVxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy50b2NTdHJ1Y3R1cmUpIHtcbiAgICAgIHRoaXMuaGFzVG9jU3RydWN0dXJlID0gZmFsc2VcbiAgICAgIHRoaXMudG9jU3RydWN0dXJlLmxlYXJuaW5nTW9kdWxlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFID8gLTEgOiAwXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZS5jb3Vyc2UgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DT1VSU0UgPyAtMSA6IDBcbiAgICAgIHRoaXMudG9jU3RydWN0dXJlID0gdGhpcy50b2NTdmMuZ2V0VG9jU3RydWN0dXJlKHRoaXMuY29udGVudCwgdGhpcy50b2NTdHJ1Y3R1cmUpXG4gICAgICBmb3IgKGNvbnN0IHByb2dUeXBlIGluIHRoaXMudG9jU3RydWN0dXJlKSB7XG4gICAgICAgIGlmICh0aGlzLnRvY1N0cnVjdHVyZVtwcm9nVHlwZV0gPiAwKSB7XG4gICAgICAgICAgdGhpcy5oYXNUb2NTdHJ1Y3R1cmUgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmcm9tIG5nT25DaGFuZ2VzXG4gICAgICB0aGlzLmZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKClcbiAgICAgIHRoaXMubW9kaWZ5U2Vuc2libGVDb250ZW50UmF0aW5nKClcbiAgICAgIHRoaXMuYXNzaWduUGF0aEFuZFVwZGF0ZUJhbm5lcih0aGlzLnJvdXRlci51cmwpXG4gICAgICB0aGlzLmdldExlYXJuaW5nVXJscygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmMgbWlsZXN0b25lIGlzTG9ja2VkIHByb3BlcnR5IHdpdGggY29tcHV0ZWQgbG9ja2luZyBzdGF0dXMgZnJvbSBoYXNobWFwXG4gICAqIFRoaXMgZW5zdXJlcyB0aGUgY29udGVudCB0cmVlIHJlZmxlY3RzIHRoZSBhY3R1YWwgbG9jayBzdGF0dXNcbiAgICovXG4gIHN5bmNNaWxlc3RvbmVMb2NrU3RhdHVzKCkge1xuICAgIGlmICghdGhpcy5jb250ZW50IHx8ICF0aGlzLmNvbnRlbnQuY2hpbGRyZW4pIHJldHVyblxuXG4gICAgdGhpcy5jb250ZW50LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdNaWxlc3RvbmUnICYmIGNoaWxkLmlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgaGFzaERhdGEgPSB0aGlzLnRvY1N2Yy5oYXNobWFwW2NoaWxkLmlkZW50aWZpZXJdXG4gICAgICAgIGlmIChoYXNoRGF0YSAmJiBoYXNoRGF0YS5jb21wdXRlZElzTG9ja2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjaGlsZC5pc0xvY2tlZCA9IGhhc2hEYXRhLmNvbXB1dGVkSXNMb2NrZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBvbkxhbmd1YWdlU2VsZWN0KGxhbmc6IGFueSkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSBpcyBhbHJlYWR5IHNldFxuICAgIGlmICh0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgJiYgdGhpcy5zZWxlY3RlZExhbmd1YWdlLmlkZW50aWZpZXIgPT09IGxhbmcuaWRlbnRpZmllcikge1xuICAgICAgcmV0dXJuIC8vIEV4aXQgdGhlIGZ1bmN0aW9uIGlmIHRoZSBsYW5ndWFnZSBpcyB0aGUgc2FtZVxuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJiB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGgpIHtcbiAgICAgIGxldCBkYXRhID0ge31cbiAgICAgIC8vIFRPRE86IFJlbW92ZSBoYXJkY29kZSBzdHJpbmdzXG4gICAgICBjb25zdCBlbnJvbGxlZENvdXJzZSA9IHRoaXMudG9jU3ZjLmZpbmRFbnJvbG1lbnRCeUNvbGxlY3Rpb25JZCh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCwgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJykpXG4gICAgICBpZiAoZW5yb2xsZWRDb3Vyc2UgJiYgZW5yb2xsZWRDb3Vyc2Uuc3RhdHVzID09PSAyKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xhbmd1YWdlU2VsZWN0aW9uKGxhbmcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBwcm9ncmVzcyBpbiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UsXG4gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3MgJiYgdGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzW2xhbmcubGFuZ0lkXSA+IDApIHtcbiAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgZnJvbTogJ2xhbmd1YWdlU3dpdGNoJyxcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYW5zbGF0ZScsXG4gICAgICAgICAgICAgIGhlYWRlcjogYENvbnRpbnVlIHdoZXJlIHlvdSBsZWZ0IG9mZiBpbiAke2xhbmcubmFtZX0/YCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFlvdSd2ZSBhbHJlYWR5IG1hZGUgc29tZSBwcm9ncmVzcyBpbiB0aGlzIGxhbmd1YWdlLlxcbiBJZiB5b3UgY29udGludWUgaXQgd2lsbCByZXN1bWUgZnJvbSB3aGVyZSB5b3UgbGVmdCBvZmYuYCxcbiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uOiAnQmFjaycsXG4gICAgICAgICAgICAgIGFjY2VwdEJ1dHRvbjogJ1Jlc3VtZScsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHByb2dyZXNzIGluIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSwgb3IgZmlyc3QgdGltZSBzZWxlY3Rpb25cbiAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgZnJvbTogJ2xhbmd1YWdlU3dpdGNoJyxcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYW5zbGF0ZScsXG4gICAgICAgICAgICAgIGhlYWRlcjogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIGxhbmd1YWdlPycsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdTd2l0Y2hpbmcgdGhlIGxhbmd1YWdlIHdpbGwgcmVzZXQgeW91ciBwcm9ncmVzcy4gXFxuIFRoZSBjb3Vyc2Ugd2lsbCByZXN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyBpbiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UuJyxcbiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uOiAnQmFjaycsXG4gICAgICAgICAgICAgIGFjY2VwdEJ1dHRvbjogJ0NoYW5nZSBsYW5ndWFnZScsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd0xhbmdTd2l0Y2hQb3B1cChsYW5nLCBkYXRhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2Nlc3NMYW5ndWFnZVNlbGVjdGlvbihsYW5nKVxuICAgIH1cbiAgfVxuXG4gIHNob3dMYW5nU3dpdGNoUG9wdXAobGFuZzogYW55LCBkYXRhPzogYW55KSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihUT0NNdWx0aUxpbmd1YWxEaWFsb2dDb21wb25lbnQsIGRhdGEpXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChjb25maXJtZWQpID0+IHtcbiAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGFuZ3VhZ2VTZWxlY3Rpb24obGFuZylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc2hvd09uZVN0ZXBSZXN1bWVDb25maXJtKHVybERhdGE6IGFueSkge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgZGF0YToge1xuICAgICAgICBmcm9tOiAnbGFuZ3VhZ2VTd2l0Y2gnLFxuICAgICAgICBpY29uOiAndHJhbnNsYXRlJyxcbiAgICAgICAgaGVhZGVyOiBgWW91J3ZlIGFscmVhZHkgc3RhcnRlZCB0aGlzIGNvdXJzZWAsXG4gICAgICAgIG1lc3NhZ2U6IGBZb3XigJl2ZSBtYWRlIHNvbWUgPGI+cHJvZ3Jlc3M8L2I+IGluIGFub3RoZXIgbGFuZ3VhZ2Ugb2YgdGhpcyBjb3Vyc2UuIFxcbldvdWxkIHlvdSBsaWtlIHRvIDxiPnJlc3VtZSB3aGVyZSB5b3UgbGVmdCBvZmY8L2I+LCBvciBjb250aW51ZSB3aXRoIHRoaXMgdmVyc2lvbiBpbnN0ZWFkP2AsXG4gICAgICAgIGNhbmNlbEJ1dHRvbjogJ0NvbnRpbnVlIEhlcmUnLFxuICAgICAgICBhY2NlcHRCdXR0b246ICdSZXN1bWUnLFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFRPQ011bHRpTGluZ3VhbERpYWxvZ0NvbXBvbmVudCwgZGF0YSlcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKGNvbmZpcm1lZCkgPT4ge1xuICAgICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICBbdXJsRGF0YS51cmxdLFxuICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHVybERhdGEucXVlcnlQYXJhbXMgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldFJlcXVpcmVkTGFuZ3VhZ2VEZXRhaWxzKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSwgdGhpcy5xdWVyeVBhcmFtc0RhdGFbJ01MJ10pXG4gICAgICAgIHRoaXMucHJvY2Vzc0xhbmd1YWdlU2VsZWN0aW9uKGxhbmcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByb2Nlc3NMYW5ndWFnZVNlbGVjdGlvbihsYW5nOiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgPSBsYW5nXG5cbiAgICAvLyBTZXQgc2tlbGV0b24gbG9hZGVyIHRvIHNob3cgbG9hZGluZyBzdGF0ZVxuICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSB0cnVlXG4gICAgLy8gQ2hlY2sgaWYgbGFuZ3VhZ2Ugb2JqZWN0IGhhcyByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gICAgaWYgKGxhbmcgJiYgbGFuZy5pZGVudGlmaWVyKSB7XG4gICAgICAvLyBDcmVhdGUgYSBwcm9taXNlIGNoYWluIHRvIGZldGNoIGNvbnRlbnQgZGF0YSBhbmQgaGllcmFyY2h5IHNlcXVlbnRpYWxseVxuICAgICAgdGhpcy5mZXRjaENvbnRlbnRSZWFkKGxhbmcuaWRlbnRpZmllcilcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIEFmdGVyIGNvbnRlbnQgcmVhZCBpcyBzdWNjZXNzZnVsLCBmZXRjaCB0aGUgaGllcmFyY2h5XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hDb250ZW50SGllcmFyY2h5KGxhbmcuaWRlbnRpZmllcilcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIEJvdGggb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWxcbiAgICAgICAgICAvLyBVcGRhdGUgVUkgYXMgbmVlZGVkIHdpdGggbmV3IGNvbnRlbnRcbiAgICAgICAgICB0aGlzLnJvdXRlckNoYW5nZUhhbmRsZXIodHJ1ZSlcbiAgICAgICAgICBpZiAodGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmdldExlYXJuaW5nVXJscygpXG4gICAgICAgICAgICAvLyBSZXNldCB1c2VyIHByb2dyZXNzIGFuZCBmZXRjaCBlbnJvbGxtZW50IGRhdGEgaWYgbm90IGluIHByZXZpZXcgbW9kZVxuICAgICAgICAgICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVXBkYXRlIHN1YmplY3QgdG8gbm90aWZ5IHJhdGluZyBzdW1tcnkgY29tcG9uZW50IGFuZCBsb2FkIHRoZSBzdW1hbXJ5IG9mIHNlbGVjdGVkIGxhbmd1YWdlXG4gICAgICAgICAgdGhpcy5yZXNldFJhdGluZ3NTZXJ2aWNlLnNldFJhdGluZ1NlcnZpY2VVcGRhdGUodHJ1ZSlcbiAgICAgICAgICAvLyBGaW5hbGx5IHNldCBsb2FkaW5nIHN0YXRlIHRvIGZhbHNlXG4gICAgICAgICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAvLyBIYW5kbGUgYW55IGVycm9ycyBpbiB0aGUgcHJvbWlzZSBjaGFpblxuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdFcnJvciBkdXJpbmcgbGFuZ3VhZ2UgY2hhbmdlOicsIGVycm9yKVxuICAgICAgICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignRmFpbGVkIHRvIGxvYWQgY29udGVudCBpbiBzZWxlY3RlZCBsYW5ndWFnZScsICdYJywge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0ludmFsaWQgbGFuZ3VhZ2Ugc2VsZWN0aW9uJywgbGFuZylcbiAgICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdJbnZhbGlkIGxhbmd1YWdlIHNlbGVjdGlvbicsICdYJywge1xuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY29udGVudCBkYXRhIGZvciBhIGdpdmVuIGlkZW50aWZpZXIgYW5kIHVwZGF0ZXMgdGhlIGNvbnRlbnRSZWFkRGF0YSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgY29udGVudCBpZGVudGlmaWVyIHRvIGZldGNoXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIGNvbnRlbnQgd2FzIGZldGNoZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDb250ZW50UmVhZChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdDYW5ub3QgZmV0Y2ggY29udGVudDogaWRlbnRpZmllciBpcyBtaXNzaW5nJylcbiAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9ic2VydmFibGUgPSB0aGlzLmNvbnRlbnRTdmMuZmV0Y2hDb250ZW50RGF0YShpZGVudGlmaWVyKVxuXG4gICAgICBpZiAoIW9ic2VydmFibGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ2ZldGNoQ29udGVudERhdGEgZGlkIG5vdCByZXR1cm4gYW4gT2JzZXJ2YWJsZScpXG4gICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBvYnNlcnZhYmxlLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlPy5yZXN1bHQ/LmNvbnRlbnQpIHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBjb250ZW50UmVhZERhdGEgd2l0aCB0aGUgZmV0Y2hlZCBjb250ZW50XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YSA9IHJlc3BvbnNlLnJlc3VsdC5jb250ZW50XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBsYW5ndWFnZSBsaXN0IGFmdGVyIGNvbnRlbnQgaXMgZmV0Y2hlZFxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhKSB7XG4gICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VMaXN0ID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRBbGxDb250ZW50TGFuZ3VhZ2VzKHRoaXMuY29udGVudFJlYWREYXRhKVxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldFNlbGVjdGVkTGFuZ3VhZ2UodGhpcy5jb250ZW50UmVhZERhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXJTdmMud2FybignQ29udGVudCBkYXRhIG5vdCBmb3VuZCBpbiByZXNwb25zZScsIHJlc3BvbnNlKVxuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBjb250ZW50IGRhdGEnLCBlcnJvcilcbiAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcm91dGVyQ2hhbmdlSGFuZGxlcihhcHBlbmRCYXRjaElkOiBib29sZWFuKSB7XG4gICAgY29uc3QgcXVlcnlQYXJhbXM6IGFueSA9IHt9XG5cbiAgICAvLyBBZGQgYmF0Y2ggSUQgaWYgbmVlZGVkXG4gICAgaWYgKGFwcGVuZEJhdGNoSWQgJiYgdGhpcy5nZXRCYXRjaElkKCkpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zLmJhdGNoSWQgPSB0aGlzLmdldEJhdGNoSWQoKVxuICAgIH1cblxuICAgIC8vIEFkZCBtdWx0aWxpbmd1YWwgSUQgYW5kIGxhbmd1YWdlIHRvIHF1ZXJ5IHBhcmFtcyBpZiBhdmFpbGFibGVcbiAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb250ZW50UmVhZERhdGEuaWRlbnRpZmllcikge1xuICAgICAgbGV0IGxhbmd1YWdlID0gJydcblxuICAgICAgLy8gSGFuZGxlIGJvdGggc3RyaW5nIGFuZCBhcnJheSBsYW5ndWFnZSBmb3JtYXRzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmNvbnRlbnRSZWFkRGF0YS5sYW5ndWFnZSkpIHtcbiAgICAgICAgbGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YS5sYW5ndWFnZVswXS50b0xvd2VyQ2FzZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudFJlYWREYXRhLmxhbmd1YWdlKSB7XG4gICAgICAgIGxhbmd1YWdlID0gdGhpcy5jb250ZW50UmVhZERhdGEubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKVxuICAgICAgfVxuICAgICAgaWYgKCEodGhpcy5zZWxlY3RlZExhbmd1YWdlICYmIE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSkubGVuZ3RoKSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgPSB7XG4gICAgICAgICAgbGFuZ0lkOiBsYW5ndWFnZSxcbiAgICAgICAgICBuYW1lOiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5sYW5ndWFnZVswXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IGFkZCBwYXJhbWV0ZXJzIGlmIHdlIGhhdmUgdmFsaWQgZGF0YVxuICAgICAgaWYgKGxhbmd1YWdlKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zLk1MID0gbGFuZ3VhZ2VcbiAgICAgIH1cblxuICAgICAgcXVlcnlQYXJhbXMuTUxJZCA9IHRoaXMuY29udGVudFJlYWREYXRhLmlkZW50aWZpZXJcbiAgICB9XG5cbiAgICAvLyBPbmx5IG5hdmlnYXRlIGlmIHdlIGhhdmUgYmF0Y2ggSUQgb3Igb3RoZXIgcGFyYW1ldGVyc1xuICAgIGlmIChPYmplY3Qua2V5cyhxdWVyeVBhcmFtcykubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgIFtdLFxuICAgICAgICB7XG4gICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICBxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMsXG4gICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udGludWVMZWFybmluZ0RhdGEoY29udGVudElkOiBzdHJpbmcsIGJhdGNoSWQ/OiBzdHJpbmcsIGxhbmc/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICB0aGlzLnJlc3VtZURhdGEgPSBudWxsXG4gICAgbGV0IHVzZXJJZFxuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSkge1xuICAgICAgdXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkIHx8ICcnXG4gICAgfVxuXG4gICAgY29uc3QgcmVxOiBOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhUmVxID0ge1xuICAgICAgcmVxdWVzdDoge1xuICAgICAgICBiYXRjaElkLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgIGNvdXJzZUlkOiBjb250ZW50SWQgfHwgJycsXG4gICAgICAgIGNvbnRlbnRJZHM6IFtdLFxuICAgICAgICBmaWVsZHM6IFsncHJvZ3Jlc3NkZXRhaWxzJ10sXG4gICAgICAgIC4uLihsYW5nID8geyBsYW5ndWFnZTogbGFuZyB9IDogbnVsbCksXG4gICAgICB9LFxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmMuZmV0Y2hDb250ZW50SGlzdG9yeVYyKHJlcSkuc3Vic2NyaWJlKFxuICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc3VsdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBSZXN1bWVEYXRhID0gXy5nZXQoZGF0YSwgJ3Jlc3VsdC5jb250ZW50TGlzdCcpXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3MgPSBfLmdldChkYXRhLCAncmVzdWx0Lmxhbmd1YWdlUHJvZ3Jlc3MnKSB8fCB7fVxuICAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhID0gXy5tYXAodGVtcFJlc3VtZURhdGEsIHJyID0+IHtcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gXy5maWx0ZXIoZmxhdHRlbkl0ZW1zKF8uZ2V0KHRoaXMuY29udGVudCwgJ2NoaWxkcmVuJykgfHwgW10sICdjaGlsZHJlbicpLCB7ICdpZGVudGlmaWVyJzogcnIuY29udGVudElkLCBwcmltYXJ5Q2F0ZWdvcnk6ICdMZWFybmluZyBSZXNvdXJjZScgfSlcbiAgICAgICAgICAgICAgXy5zZXQocnIsICdwcm9ncmVzc2RldGFpbHMubWltZVR5cGUnLCBfLmdldChfLmZpcnN0KGl0ZW1zKSwgJ21pbWVUeXBlJykpXG4gICAgICAgICAgICAgIGlmICghXy5nZXQocnIsICdjb21wbGV0aW9uUGVyY2VudGFnZScpKSB7XG4gICAgICAgICAgICAgICAgaWYgKF8uZ2V0KHJyLCAnc3RhdHVzJykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgIF8uc2V0KHJyLCAnY29tcGxldGlvblBlcmNlbnRhZ2UnLCAxMDApXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIF8uc2V0KHJyLCAnY29tcGxldGlvblBlcmNlbnRhZ2UnLCAwKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcnJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IF8ubWFwKHRoaXMucmVzdW1lRGF0YSwgJ2NvbXBsZXRpb25QZXJjZW50YWdlJylcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBfLnRvSW50ZWdlcihfLmdldCh0aGlzLmNvbnRlbnQsICdsZWFmTm9kZXNDb3VudCcpKSB8fCAxXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3MubGVuZ3RoIDwgdG90YWxDb3VudCkge1xuICAgICAgICAgICAgICBjb25zdCBkaWZmID0gdG90YWxDb3VudCAtIHByb2dyZXNzLmxlbmd0aFxuICAgICAgICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgIF8uZWFjaChuZXcgQXJyYXkoZGlmZiksICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHByb2dyZXNzLnB1c2goMClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAgICAgICAgICAgdGhpcy50b2NTdmMudXBkYXRlUmVzdW1hRGF0YSh0aGlzLnJlc3VtZURhdGEpXG4gICAgICAgICAgICAvLyB0aGlzLnRvY1N2Yy5tYXBNb2R1bGVEdXJhdGlvbkFuZFByb2dyZXNzKHRoaXMuY29udGVudCwgdGhpcy5jb250ZW50KVxuICAgICAgICAgICAgdGhpcy5nZXRMYXN0UGxheWVkUmVzb3VyY2UoKVxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgIT09IDEwMCkge1xuICAgICAgICAgICAgICB0aGlzLnRvY1N2Yy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZSh0aGlzLmNvbnRlbnQsIHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IG51bGxcbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb250ZW50U3ZjLnNldFByb2dyYW1DaGlsZFJlc3VtZURhdGEodGhpcy5yZXN1bWVEYXRhLCBjb250ZW50SWQpXG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgIT09IDEwMCkge1xuICAgICAgICAgICAgdGhpcy5iaW5kQ29tcGxldGlvblBlcmNlbnRhZ2UoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignQ09OVEVOVCBISVNUT1JZIEZFVENIIEVSUk9SID4nLCBlcnJvcilcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KCkge1xuICAgIGlmICh0aGlzLnJlc3VtZURhdGEgJiYgdGhpcy5jb250ZW50KSB7XG4gICAgICBsZXQgcmVzdW1lRGF0YVYyOiBhbnlcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgnc3RhcnQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoKVxuICAgICAgfVxuICAgICAgaWYgKCFyZXN1bWVEYXRhVjIubWltZVR5cGUpIHtcbiAgICAgICAgcmVzdW1lRGF0YVYyLm1pbWVUeXBlID0gdGhpcy50b2NTdmMuZ2V0TWltZVR5cGUodGhpcy5jb250ZW50LCByZXN1bWVEYXRhVjIuaWRlbnRpZmllcilcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzdW1lRGF0YUxpbmsgPSB0aGlzLmdldFJlc3VtZVVybChyZXN1bWVEYXRhVjIpXG4gICAgICB0aGlzLmFjdGlvblNWQy5zZXRVcGRhdGVDb21wR3JvdXBPID0gdGhpcy5yZXN1bWVEYXRhTGlua1xuICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgfVxuICB9XG4gIGlzU2VsZWN0ZWRJbk1vcmVEcm9wZG93bigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRMYW5ndWFnZT8uaWRlbnRpZmllciB8fCAhdGhpcy5sYW5ndWFnZUxpc3QpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sYW5ndWFnZUxpc3Quc2xpY2UoNSkuc29tZSgobGFuZzogYW55KSA9PlxuICAgICAgbGFuZz8uaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZExhbmd1YWdlPy5pZGVudGlmaWVyXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgZ2V0UXVlcnlQYXJhbXMoKSB7XG4gICAgY29uc3QgdGVtcFF1ZXJ5UGFyYW1zRGF0YTogYW55ID0ge31cbiAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtTWFwLnN1YnNjcmliZShhc3luYyBxUGFyYW1zTWFwID0+IHtcblxuICAgICAgLy8gRXh0cmFjdCBhbGwgcGFyYW1ldGVycyBmcm9tIHRoZSBQYXJhbU1hcFxuICAgICAgcVBhcmFtc01hcC5rZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgdGVtcFF1ZXJ5UGFyYW1zRGF0YVtrZXldID0gcVBhcmFtc01hcC5nZXQoa2V5KSA/PyAnJ1xuICAgICAgfSlcbiAgICAgIHRlbXBRdWVyeVBhcmFtc0RhdGFcblxuICAgICAgLy8gUHJvY2VzcyBzcGVjaWZpYyBwYXJhbWV0ZXJzXG4gICAgICBjb25zdCBjb250ZXh0SWQgPSB0ZW1wUXVlcnlQYXJhbXNEYXRhWydjb250ZXh0SWQnXVxuICAgICAgY29uc3QgY29udGV4dFBhdGggPSB0ZW1wUXVlcnlQYXJhbXNEYXRhWydjb250ZXh0UGF0aCddXG4gICAgICBjb25zdCByZWNvbW1lbmRlZENvdXJzZXNJZCA9IHRlbXBRdWVyeVBhcmFtc0RhdGFbJ3JlY29tbWVuZGF0aW9uSWQnXVxuXG4gICAgICBpZiAoY29udGV4dElkICYmIGNvbnRleHRQYXRoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dElkID0gY29udGV4dElkXG4gICAgICAgIHRoaXMuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aFxuICAgICAgfVxuXG4gICAgICBpZiAocmVjb21tZW5kZWRDb3Vyc2VzSWQpIHtcbiAgICAgICAgdGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCA9IHJlY29tbWVuZGVkQ291cnNlc0lkXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlTGliLmdldFJlY29tbWVuZGVkQ291cnNlc1Nha3NoYW1BSShyZWNvbW1lbmRlZENvdXJzZXNJZCkudG9Qcm9taXNlKClcbiAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZmVlZGJhY2tzICYmIHJlc3BvbnNlLmZlZWRiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZmVlZGJhY2tHaXZlbiA9IHJlc3BvbnNlLmZlZWRiYWNrcy5maW5kKChmZWVkYmFjazogYW55KSA9PiBmZWVkYmFjaz8uY291cnNlX2lkID09PSB0aGlzLmNvdXJzZUlEKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgZmV0Y2hpbmcgcmVjb21tZW5kZWQgY291cnNlczonLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRlbXBRdWVyeVBhcmFtc0RhdGFcbiAgfVxuXG4gIGdldE9yZ0lkRm9yU2hhcmUoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiAhW1xuICAgICAgTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfQ09VUlNFLFxuICAgICAgTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfQVNTRVNTRU1FTlQsXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNLFxuICAgICAgTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5JTlZJVEVfT05MWV9QUk9HUkFNLFxuICAgIF0uaW5jbHVkZXModGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5KSkge1xuICAgICAgdGhpcy5jYW5TaGFyZSA9IHRydWVcbiAgICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSkge1xuICAgICAgICB0aGlzLnJvb3RPcmdJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnJvb3RPcmdJZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGFuZCBwcm9jZXNzZXMgY29udGVudCBjcmVhdG9yIGRhdGEgZnJvbSB0aGUgY3VycmVudCBjb250ZW50XG4gICAqIC0gU2V0cyBjb250ZW50Q3JlYXRvckRhdGEgZnJvbSBwYXJzZWQgY3JlYXRvciBjb250YWN0c1xuICAgKiAtIERldGVybWluZXMgaWYgXCJzaG93IGJ1dHRvblwiIGZsYWcgc2hvdWxkIGJlIGVuYWJsZWQgYmFzZWQgb24gY29udGVudCBuYW1lXG4gICAqIC0gSW5jbHVkZXMgcHJvcGVyIGVycm9yIGhhbmRsaW5nIGZvciBudWxsIHZhbHVlcyBhbmQgcGFyc2luZ1xuICAgKi9cbiAgZ2V0Q29udGVudENyZWF0b3JEYXRhKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBPbmx5IHByb2NlZWQgaWYgd2UgaGF2ZSB2YWxpZCBjb250ZW50IGRhdGFcbiAgICAgIGlmICghdGhpcy5jb250ZW50UmVhZERhdGEpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMud2FybignQ2Fubm90IGdldCBjcmVhdG9yIGRhdGE6IGNvbnRlbnRSZWFkRGF0YSBpcyBub3QgYXZhaWxhYmxlJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgY29udGVudCBuYW1lIGZvciBjb21wYXJpc29uIChzYWZlbHkgaGFuZGxlIG51bGwvdW5kZWZpbmVkKVxuICAgICAgY29uc3QgY29udGVudE5hbWUgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YS5uYW1lPy50cmltKCkgfHwgJydcblxuICAgICAgLy8gUGFyc2UgYW5kIHNldCBjcmVhdG9yIGNvbnRhY3RzIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhLmNyZWF0b3JDb250YWN0cykge1xuICAgICAgICAvLyBVc2UgdGhlIGV4aXN0aW5nIHBhcnNpbmcgbWV0aG9kIHRvIGhhbmRsZSBjcmVhdG9yIGNvbnRhY3RzXG4gICAgICAgIHRoaXMuY29udGVudENyZWF0b3JEYXRhID0gdGhpcy5oYW5kbGVQYXJzZUpzb25EYXRhKHRoaXMuY29udGVudFJlYWREYXRhLmNyZWF0b3JDb250YWN0cylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlc2V0IHRvIGVtcHR5IGFycmF5IGlmIG5vIGNyZWF0b3IgY29udGFjdHNcbiAgICAgICAgdGhpcy5jb250ZW50Q3JlYXRvckRhdGEgPSBbXVxuICAgICAgfVxuXG4gICAgICAvLyBTZXQgc2hvd0J0biBmbGFnIGJhc2VkIG9uIGRha3NodGEgbmFtZSBjb21wYXJpc29uIChjYXNlIGluc2Vuc2l0aXZlKVxuICAgICAgLy8gVGhpcyBkZXRlcm1pbmVzIGlmIHRoZSBzcGVjaWFsIGJ1dHRvbiBmb3IgZGFrc2h0YSBjb250ZW50IGlzIHNob3duXG4gICAgICB0aGlzLnNob3dCdG4gPSBjb250ZW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSB0aGlzLmRha3NodGFOYW1lLnRvTG93ZXJDYXNlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIGFueSB1bmV4cGVjdGVkIGVycm9yc1xuICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgY29udGVudCBjcmVhdG9yIGRhdGE6JywgZXJyb3IpXG4gICAgICB0aGlzLmNvbnRlbnRDcmVhdG9yRGF0YSA9IFtdXG4gICAgICB0aGlzLnNob3dCdG4gPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGdldEkxOE5UcmFuc2xhdGlvbnMoKSB7XG4gICAgLy8gU3Vic2NyaWJlIHRvIGxhbmd1YWdlIHRyYW5zbGF0aW9uIGZsYWcgY2hhbmdlc1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5jb25maWdTdmMubGFuZ3VhZ2VUcmFuc2xhdGlvbkZsYWdcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpIC8vIEVuc3VyZSBzdWJzY3JpcHRpb24gaXMgY2xlYW5lZCB1cCBvbiBjb21wb25lbnQgZGVzdHJveVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBPbmx5IHByb2NlZWQgaWYgd2UgaGF2ZSB2YWxpZCBkYXRhXG4gICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlYnNpdGUgbGFuZ3VhZ2UgaXMgc2V0IGluIGxvY2FsU3RvcmFnZVxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkTGFuZ3VhZ2UgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJylcbiAgICAgICAgICAgIGlmIChzdG9yZWRMYW5ndWFnZSkge1xuICAgICAgICAgICAgICAvLyBTZXQgZGVmYXVsdCBsYW5ndWFnZSBhcyBmYWxsYmFja1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZygnZW4nKVxuXG4gICAgICAgICAgICAgIC8vIFVzZSB0aGUgc3RvcmVkIGxhbmd1YWdlIHByZWZlcmVuY2VcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKHN0b3JlZExhbmd1YWdlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgIC8vIExvZyBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgZHVyaW5nIHN1YnNjcmlwdGlvblxuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdFcnJvciBpbiBsYW5ndWFnZSB0cmFuc2xhdGlvbiBzdWJzY3JpcHRpb246JywgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAvLyBTdG9yZSBzdWJzY3JpcHRpb24gZm9yIGNsZWFudXAgKG9wdGlvbmFsIGFsdGVybmF0aXZlIHRvIHRha2VVbnRpbClcbiAgICB0aGlzLnRyYW5zbGF0aW9uU3Vic2NyaXB0aW9uID0gdHJhbnNsYXRpb25TdWJzY3JpcHRpb25cbiAgfVxuXG4gIGdldFNlcnZlckRhdGVUaW1lKCkge1xuICAgIC8vIEZldGNoIHRoZSBzZXJ2ZXIgZGF0ZSB0aW1lIGFuZCBwcm9jZXNzIHRoZSByZXNwb25zZVxuICAgIHRoaXMudG9jU3ZjLmdldFNlcnZlckRhdGUoKS5zdWJzY3JpYmUoXG4gICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiByZXNwb25zZSBjb250YWlucyB2YWxpZCBzeXN0ZW0gZGF0ZVxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3lzdGVtRGF0ZSkge1xuICAgICAgICAgIC8vIFVwZGF0ZSBzZXJ2aWNlIHdpdGggc2VydmVyIGRhdGUgKHJlbW92ZWQgZHVwbGljYXRlIGNhbGwpXG4gICAgICAgICAgdGhpcy50b2NTdmMuY2hhbmdlU2VydmVyRGF0ZShyZXNwb25zZS5zeXN0ZW1EYXRlKVxuICAgICAgICAgIHRoaXMuc2VydmVyRGF0ZSA9IHJlc3BvbnNlLnN5c3RlbURhdGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjbGllbnQncyB0aW1lIGlmIHNlcnZlciB0aW1lIGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBjbGllbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5jaGFuZ2VTZXJ2ZXJEYXRlKGNsaWVudFRpbWUpXG4gICAgICAgICAgdGhpcy5zZXJ2ZXJEYXRlID0gY2xpZW50VGltZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBkZXBlbmRlbnQgZnVuY3Rpb25zIHRoYXQgbmVlZCBzZXJ2ZXIgZGF0ZVxuICAgICAgICB0aGlzLmZpbmRBQ1BCKClcbiAgICAgICAgdGhpcy5nZXRLYXJtYXBvaW50c0xpbWl0KClcbiAgICAgIH0sXG4gICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgc2VydmVyIGRhdGU6JywgZXJyb3IpXG5cbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gY2xpZW50J3MgdGltZSBvbiBlcnJvclxuICAgICAgICBjb25zdCBjbGllbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgICAgdGhpcy50b2NTdmMuY2hhbmdlU2VydmVyRGF0ZShjbGllbnRUaW1lKVxuICAgICAgICB0aGlzLnNlcnZlckRhdGUgPSBjbGllbnRUaW1lXG4gICAgICB9XG4gICAgKVxuXG4gICAgLy8gU3Vic2NyaWJlIHRvIHNlcnZlciBkYXRlIGNoYW5nZXMgZnJvbSBzZXJ2aWNlXG4gICAgdGhpcy5zZXJ2ZXJEYXRlU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuc2VydmVyRGF0ZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSkgLy8gRW5zdXJlIHN1YnNjcmlwdGlvbiBpcyBjbGVhbmVkIHVwXG4gICAgICAuc3Vic2NyaWJlKHNlcnZlckRhdGUgPT4ge1xuICAgICAgICB0aGlzLnNlcnZlckRhdGUgPSBzZXJ2ZXJEYXRlXG4gICAgICB9KVxuICB9XG5cbiAgZ2V0IGdldEJhc2VDb250ZW50SWRlbnRpZmllcigpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8IHRoaXMuY29udGVudD8uaWRlbnRpZmllciB8fCAnJ1xuICB9XG5cbiAgZ2V0IGlzTXVsdGlsaW5ndWFsKCkge1xuICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmxhbmd1YWdlTWFwVjEpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlTGlzdC5sZW5ndGggPiAxXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaGFuZGxlRW5yb2xsbWVudChldmVudDogYW55KSB7XG5cbiAgICBpZiAodGhpcy5pc011bHRpbGluZ3VhbCkge1xuICAgICAgdGhpcy5vcGVuTGFuZ0RpYWxvZyhldmVudClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVBdXRvQmF0Y2hBc3NpZ24oKVxuICAgIH1cbiAgfVxuXG4gIG9wZW5MYW5nRGlhbG9nKF9ldmVudDogYW55KSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihFbnJvbGxMYW5ndWFnZURpYWxvZ3VlQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgIHJlc3RvcmVGb2N1czogZmFsc2UsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHByZVNlbGVjdDogdGhpcy5zZWxlY3RlZExhbmd1YWdlLFxuICAgICAgICBsYW5ndWFnZUxpc3Q6IHRoaXMubGFuZ3VhZ2VMaXN0LFxuICAgICAgfVxuICAgIH0pXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChzZWxlY3RlZExhbmcpID0+IHtcbiAgICAgIGlmIChzZWxlY3RlZExhbmcpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZExhbmd1YWdlID0gc2VsZWN0ZWRMYW5nXG4gICAgICAgIHRoaXMuaGFuZGxlQXV0b0JhdGNoQXNzaWduKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0UmVzdW1lVXJsKHJlc291cmNlRGF0YTogYW55LCBiYXRjaElkPzogYW55LCBwcmltYXJ5Q2F0ZWdvcnk/OiBhbnkpIHtcbiAgICBsZXQgTUxJZCA9IHRoaXMuc2VsZWN0ZWRMYW5ndWFnZT8uaWRlbnRpZmllciB8fCAnJ1xuICAgIGxldCBNTCA9IHRoaXMuc2VsZWN0ZWRMYW5ndWFnZT8ubGFuZ0lkIHx8ICcnXG4gICAgbGV0IHJlc3VtZURhdGFVcmwgPSB2aWV3ZXJSb3V0ZUdlbmVyYXRvcihcbiAgICAgIHJlc291cmNlRGF0YS5pZGVudGlmaWVyLFxuICAgICAgcmVzb3VyY2VEYXRhLm1pbWVUeXBlLFxuICAgICAgdGhpcy5pc1Jlc291cmNlID8gdW5kZWZpbmVkIDogdGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJyxcbiAgICAgIHRoaXMuaXNSZXNvdXJjZSA/IHVuZGVmaW5lZCA6IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmNvbnRlbnRUeXBlIHx8ICcnLFxuICAgICAgdGhpcy5mb3JQcmV2aWV3LFxuICAgICAgcHJpbWFyeUNhdGVnb3J5IHx8ICdMZWFybmluZyBSZXNvdXJjZScsXG4gICAgICBiYXRjaElkIHx8IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8ubmFtZSB8fCAnJyxcbiAgICAgIE1MLFxuICAgICAgTUxJZCxcbiAgICApXG4gICAgcmV0dXJuIHJlc3VtZURhdGFVcmxcbiAgfVxuXG4gIGdldCBjb250ZW50Q29tcGxldGlvblBlcmNlbnQoKSB7XG4gICAgaWYgKHRoaXMuYmF0Y2hEYXRhPy5lbnJvbGxlZCkge1xuICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZScgJiYgdGhpcy5pc011bHRpbGluZ3VhbCkge1xuICAgICAgICBpZiAodGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzICYmIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZT8ubGFuZ0lkICYmIHRoaXMubGFuZ3VhZ2VNYXBQcm9ncmVzc1t0aGlzLnNlbGVjdGVkTGFuZ3VhZ2U/LmxhbmdJZF0pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzW3RoaXMuc2VsZWN0ZWRMYW5ndWFnZT8ubGFuZ0lkXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IDBcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGVja0ZvckNvbXBsZXRpb25TdXJ2ZXlUcmlnZ2VyKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50UmVhZERhdGEpIHtcbiAgICAgIC8vIGNoZWNrIGlmIGNvbXBsZXRpb24gc3VydmV5IGlzIGVuYWJsZWQgYW5kIHVzZXIgaGFzIGNvbXBsZXRlZCB0aGUgY291cnNlIGJlZm9yZSAyM3JkIERFQyAyMDIzIChyZWxlYXNlIGRhdGUgb2YgY29tcGxldGlvbiBzdXJ2ZXkpXG4gICAgICBpZiAodGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWcgJiYgdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWcuY29tcGxldGlvblN1cnZleSAmJiB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZy5jb21wbGV0aW9uU3VydmV5LmVuYWJsZWQgJiZcbiAgICAgICAgdGhpcy5lbnJvbGxlZENvdXJzZURhdGEgJiYgdGhpcy5lbnJvbGxlZENvdXJzZURhdGEgJiYgdGhpcy5lbnJvbGxlZENvdXJzZURhdGEuY29tcGxldGVkT24gPj0gdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWcuY29tcGxldGlvblN1cnZleS5zdGFydERhdGUpIHtcbiAgICAgICAgaWYgKCh0aGlzLmNvbnRlbnQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCB0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkgJiYgdGhpcy5jb250ZW50UmVhZERhdGEuY29tcGxldGlvblN1cnZleUxpbmspIHtcbiAgICAgICAgICBjb25zdCBzSUQgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YS5jb21wbGV0aW9uU3VydmV5TGluay5zcGxpdCgnc3VydmV5cy8nKVxuICAgICAgICAgIGNvbnN0IHN1cnZleUlkID0gc0lEWzFdXG4gICAgICAgICAgY29uc3QgY291cnNlSWQgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyXG4gICAgICAgICAgLy8gQ2FsbCBBUEkgdG8gc2VlIGlmIHN1cnZleSBpcyBzdWJtaXR0ZWQgb3Igbm90XG4gICAgICAgICAgdGhpcy50b2NTdmMuZ2V0QXBsbGljYXRpb25zQnlJZChzdXJ2ZXlJZCwgY291cnNlSWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzLnJlc3VsdC5yZXNwb25zZSAmJiBPYmplY3Qua2V5cyhyZXMucmVzdWx0LnJlc3BvbnNlKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9ja0NlcnRpZmljYXRlID0gZmFsc2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMubG9ja0NlcnRpZmljYXRlID0gdHJ1ZVxuICAgICAgICAgICAgICB0aGlzLm9wZW5Db21wbGV0aW9uU3VydmV5Rm9ybVBvcHVwKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2xlYXIgZXhpc3Rpbmcgc3VydmV5IGRhdGEgZnJvbSBsb2NhbCBzdG9yYWdlIGJlZm9yZSBvcGVuaW5nIHBvcHVwXG4gIGNsZWFyRXhpc3RpbmdQdWJsaWNTdXJ2ZXlEYXRhKHN1cnZleUlkOiBzdHJpbmcsIGNvdXJzZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzdG9yYWdlS2V5ID0gYHN1cnZleV8ke3N1cnZleUlkfV8ke2NvdXJzZUlkfWBcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmFnZUtleSkpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JhZ2VLZXkpXG4gICAgfVxuICB9XG5cbiAgb3BlblB1YmxpY1N1cnZleVBvcHVwKG5hdmlnYXRpb25Vcmw/OiBzdHJpbmcsIHF1ZXJ5UGFyYW1zPzogYW55KSB7XG4gICAgLy8gR2V0IHN1cnZleSBJRCBhbmQgY291cnNlIElEIGZyb20gZW52aXJvbm1lbnQgYW5kIGNvbnRlbnQgZGF0YVxuICAgIGNvbnN0IHN1cnZleUlkID0gdGhpcy5lbnZpcm9ubWVudC5wdWJsaWNDb250ZW50U3VydmV5SWQgfHwgJydcbiAgICBjb25zdCBjb3Vyc2VJZCA9IHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnXG4gICAgY29uc3QgY291cnNlTmFtZSA9IHRoaXMuY29udGVudFJlYWREYXRhPy5uYW1lIHx8ICcnXG4gICAgY29uc3QgY29udGV4dE9yZ0lkID0gdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3IgJiYgdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3IubGVuZ3RoID4gMCA/XG4gICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uY3JlYXRlZEZvclswXSA6ICcnXG5cbiAgICB0aGlzLmNsZWFyRXhpc3RpbmdQdWJsaWNTdXJ2ZXlEYXRhKHN1cnZleUlkLCBjb3Vyc2VJZClcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBzdXJ2ZXlJZDogc3VydmV5SWQsXG4gICAgICBjb3Vyc2VJZDogY291cnNlSWQsXG4gICAgICBjb3Vyc2VOYW1lOiBjb3Vyc2VOYW1lLFxuICAgICAgY29udGV4dE9yZ0lkOiBjb250ZXh0T3JnSWRcbiAgICB9XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihQdWJsaWNTdXJ2ZXlGb3JtQ29tcG9uZW50LCB7XG4gICAgICAvLyBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICB3aWR0aDogJzc1MHB4JyxcbiAgICAgIG1heFdpZHRoOiAnOTB2dycsXG4gICAgICBoZWlnaHQ6ICc4MHZoJyxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgIH0pXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgLy8gTmF2aWdhdGUgdG8gdGhlIGludGVuZGVkIFVSTCBvbmx5IHdoZW4gc3VydmV5IGlzIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgaWYgKG5hdmlnYXRpb25VcmwpIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbbmF2aWdhdGlvblVybF0sIHsgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmVzdW1lQ29udGVudERhdGEoKSB7XG4gICAgY29uc3QgbmF2aWdhdGlvblVybCA9ICh0aGlzLnJlc3VtZURhdGEgJiYgIXRoaXMuY2VydERhdGEpID8gdGhpcy5yZXN1bWVEYXRhTGluaz8udXJsIDogdGhpcy5maXJzdFJlc291cmNlTGluaz8udXJsXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSAodGhpcy5yZXN1bWVEYXRhICYmICF0aGlzLmNlcnREYXRhKSA/IHRoaXMuZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiB0aGlzLmdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbbmF2aWdhdGlvblVybF0sIHsgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdXNlciBjYW4gZW5yb2xsIGluIHRoZSBjb3Vyc2VcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gZW5yb2xsbWVudCBpcyBhbGxvd2VkXG4gICAqL1xuICBjYW5FbnJvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmRpc2FibGVFbnJvbGxCdG5cbiAgfVxuXG4gIGdvQmFjaygpIHtcbiAgICB0aGlzLmxvY2F0aW9uLmJhY2soKVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiY291cnNlSUQgZWxzZSBub0RhdGFGb3VuZFwiPlxuICA8bmctdGVtcGxhdGUgI2Vucm9sbEZ1bmN0aW9uYWxpdHk+XG4gICAgPGRpdiBbaGlkZGVuXT1cImlzUmVzb3VyY2UgJiYgIWNvbnRlbnQ/LmFydGlmYWN0VXJsPy5sZW5ndGhcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgdGV4dC1jZW50ZXJcIj5cbiAgICAgIDwhLS0gQ291cnNlIGJsb2NrIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTVxuICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTVxuICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJlxuICAgICAgICAgICAgICAgICAgICBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGFjdGlvbkJ0blN0YXR1cyA9PT0gJ2dyYW50JyAmJiAhKGlzTW9iaWxlICYmIGNvbnRlbnQ/LmlzSW5JbnRyYW5ldCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmIGNvbnRlbnQ/LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICFjb250ZW50Py5hcnRpZmFjdFVybD8ubGVuZ3RoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFICYmICFjb250ZW50Py5hcnRpZmFjdFVybCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZClcIj5cbiAgICAgICAgICA8YSAqbmdJZj1cInNob3dTdGFydC5zaG93ICYmICFpc1Bvc3RBc3Nlc3NtZW50ICYmICFmb3JQcmV2aWV3XCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKClcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IHJlc3VtZURhdGFMaW5rPy51cmwgOiBmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+XG4gICAgICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCB8fCBjZXJ0RGF0YVwiPlxuICAgICAgICAgICAgICB7eyBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDAgPyB0cmFuc2xhdGVMYWJlbHMoJ1N0YXJ0IGFnYWluJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9hPlxuXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzUG9zdEFzc2Vzc21lbnQgJiYgc2hvd1Rha2VBc3Nlc3NtZW50Py5wb3N0X2Fzc2Vzc21lbnRcIiAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCIgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+e3sgJ2FwcHRvY2hvbWUudGFrZUFzc2Vzc21lbnQnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzUG9zdEFzc2Vzc21lbnQgJiYgKCFjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBY2JwQ2xhaW1cIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInQUNCUCdcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBY2JwQ2xhaW0gJiYgIW1vbnRobHlDYXBFeGNlZWRcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInUmVzdW1lJ1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cIiFpc1Bvc3RBc3Nlc3NtZW50ICYmIChjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwIHx8IGNlcnREYXRhKVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQWNicENvdXJzZSAmJiBpc0FjYnBDbGFpbSAmJiAhaXNDbGFpbWVkXCI+XG4gICAgICAgICAgICAgIDx3cy1hcHAta2FybWFwb2ludHMtcGFuZWwgW2J0bnR5cGVdPVwiJ0FDQlAgQ0xBSU0nXCIgW2RhdGFdPVwia3BhcnJheVwiIFtidG5DYXRlZ29yeV09XCInY2xhaW0nXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tDbGFpbUthcm1hUG9pbnRzKT1cIm9uQ2xpY2tPZkNsYWltKCRldmVudClcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0FjYnBDb3Vyc2UgJiYgIW1vbnRobHlDYXBFeGNlZWRcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInU3RhcnQgYWdhaW4nXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQWNicENvdXJzZSAmJiBtb250aGx5Q2FwRXhjZWVkICYmICFpc0NvbXBsZXRlZFRoaXNNb250aFwiPlxuICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidTdGFydCBhZ2FpbidcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJpc1Bvc3RBc3Nlc3NtZW50ICYmIHNob3dUYWtlQXNzZXNzbWVudD8ucG9zdF9hc3Nlc3NtZW50XCI+XG4gICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidUYWtlIEFzc2Vzc21lbnQnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiAoYWN0aW9uQnRuU3RhdHVzID09PSAnZ3JhbnQnICYmICEoaXNNb2JpbGUgJiYgY29udGVudD8uaXNJbkludHJhbmV0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoIGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmIGNvbnRlbnQ/LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhY29udGVudD8uYXJ0aWZhY3RVcmw/Lmxlbmd0aCApICYmXG4gICAgICAgICAgICAgICAgICAgICAgISggY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCApICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFICYmICFjb250ZW50Py5hcnRpZmFjdFVybCkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTClcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSAgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVFbnJvbGxtZW50KClcIiBbbmdDbGFzc109XCJ7J2Rpc2FibGUtc3RhcnQtYnRuJzogIWNhbkVucm9sbCgpfVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0FjYnBDb3Vyc2VcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInQUNCUCdcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBY2JwQ291cnNlICYmICFtb250aGx5Q2FwRXhjZWVkICYmIHVzZXJFbnJvbGxtZW50TGlzdCAmJiAhdXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidFbnJvbGwnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgIDwhLS0gUFJvZ3JhbSAmIG1hbmRhdG9yeSBjb3Vyc2UgYmxvY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZTsgZWxzZSBhdXRoVmlld0J0blwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gfHwgY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5NQU5EQVRPUllfQ09VUlNFX0dPQUxcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdJZj1cIihjb3Vyc2VDYXRlZ29yeT8uTU9ERVJBVEVEX1BST0dSQU0gPT09IGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkpICYmIChjb250ZW50UmVhZERhdGE/LmJhdGNoZXMgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiKChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFKSAgJiYgIWVucm9sbEJ0bkxvYWRpbmcpICYmICFjb250ZW50UmVhZERhdGE/LmJhdGNoZXNbMF0uZW5kRGF0ZVwiPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiAoY2xpY2spPVwiaGFuZGxlRW5yb2xsbWVudCgpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIj5cbiAgICAgICAgICAgICAgICAgIHt7J2FwcHRvY2hvbWUuZW5yb2xsJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBY2JwQ291cnNlXCI+XG4gICAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInQUNCUCdcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQWNicENvdXJzZSAmJiAhbW9udGhseUNhcEV4Y2VlZCAmJiB1c2VyRW5yb2xsbWVudExpc3QgJiYgIXVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidFbnJvbGwnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIigoY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSkgICYmICFlbnJvbGxCdG5Mb2FkaW5nKSAmJiBjb250ZW50UmVhZERhdGE/LmJhdGNoZXNbMF0uZW5kRGF0ZVwiPlxuICAgICAgICAgICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICAgIFt1c2VyRW5yb2xsbWVudExpc3RdPVwidXNlckVucm9sbG1lbnRMaXN0XCIgW2FuYWx5dGljc109XCJhbmFseXRpY3NcIlxuICAgICAgICAgICAgICAgICAgKHByb2dyYW1FbnJvbGxDYWxsKT1cInByb2dyYW1FbnJvbGxDYWxsKCRldmVudClcIiBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIlxuICAgICAgICAgICAgICAgICAgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIj5cbiAgICAgICAgICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiKGNvdXJzZUNhdGVnb3J5Py5NT0RFUkFURURfUFJPR1JBTSA9PT0gY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSkgJiYgIWNvbnRlbnRSZWFkRGF0YT8uYmF0Y2hlcyAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICAgICAgTm8gQmF0Y2hlc1xuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiY291cnNlQ2F0ZWdvcnk/Lk1PREVSQVRFRF9QUk9HUkFNICE9PSBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICYmICFlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiYgY3VycmVudENvdXJzZUJhdGNoSWQpICYmIGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUueW91QXJlTm90SW52aXRlZCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmICEhY3VycmVudENvdXJzZUJhdGNoSWQgJiYgZ2V0U3RhcnREYXRlID09PSAnTkEnXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUubm9BY3RpdmVCYXRjaGVzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQSdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgc2hhZG93LWxnIHRleHQtaW5mby1kaXZcIj57eyAnYXBwdG9jaG9tZS5iYXRjaFdpbGxTdGFydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICB7e2dldFN0YXJ0RGF0ZX19ITwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmIGNvdXJzZUNhdGVnb3J5Py5NT0RFUkFURURfUFJPR1JBTSA9PT0gY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQSdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgc2hhZG93LWxnIHRleHQtaW5mby1kaXZcIj57eyAnYXBwdG9jaG9tZS5iYXRjaFdpbGxTdGFydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICB7e2dldFN0YXJ0RGF0ZX19ITwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0JhdGNoSW5Qcm9ncmVzcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCBhY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIShpc01vYmlsZSAmJiBjb250ZW50Py5pc0luSW50cmFuZXQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiYgY3VycmVudENvdXJzZUJhdGNoSWQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcIj5cbiAgICAgICAgICAgIDxhICpuZ0lmPVwic2hvd1N0YXJ0LnNob3cgJiYgIWlzUG9zdEFzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJyZXN1bWVEYXRhID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwicmVzdW1lRGF0YSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgJiYgKGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwICYmIGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlPiAwKSA/XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygnc3RhcnQnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFwiPlxuICAgICAgICAgICAgICAgIHt7IChyZXN1bWVEYXRhKSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwID8gXCJTdGFydCBhZ2FpblwiIDogXCJTdGFydFwiIH19XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPGEgKm5nSWY9XCJpc1Bvc3RBc3Nlc3NtZW50ICYmIHNob3dUYWtlQXNzZXNzbWVudD8ucG9zdF9hc3Nlc3NtZW50XCIgW3JvdXRlckxpbmtdPVwiZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiPnt7ICdhcHB0b2Nob21lLnRha2VBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCIhaXNQb3N0QXNzZXNzbWVudCAmJiAoIWNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwKVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBY2JwQ2xhaW1cIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidBQ0JQJ1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBY2JwQ2xhaW0gJiYgIW1vbnRobHlDYXBFeGNlZWRcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidSZXN1bWUnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cIiFpc1Bvc3RBc3Nlc3NtZW50ICYmIChjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKVwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNBY2JwQ291cnNlICYmIGlzQWNicENsYWltICYmICFpc0NsYWltZWRcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidBQ0JQIENMQUlNJ1wiIFtjb25kaXRpb25dPVwie2lzUG9zdEFzc2Vzc21lbnQ6IGlzUG9zdEFzc2Vzc21lbnQsIGNvbnRlbnQ6IGNvbnRlbnQsIGlzQWNicENvdXJzZTogaXNBY2JwQ291cnNlLCBpc0NsYWltZWQ6IGlzQ2xhaW1lZCwgbW9udGhseUNhcEV4Y2VlZDogbW9udGhseUNhcEV4Y2VlZCwgaXNDb21wbGV0ZWRUaGlzTW9udGg6IGlzQ29tcGxldGVkVGhpc01vbnRoLCBzaG93VGFrZUFzc2Vzc21lbnQ6IHNob3dUYWtlQXNzZXNzbWVudCwgdXNlckVucm9sbG1lbnRMaXN0OiB1c2VyRW5yb2xsbWVudExpc3QsIGlzQ29tcGxldGVkVGhpc01vbnRoOiBpc0NvbXBsZXRlZFRoaXNNb250aCwgcmVzdW1lRGF0YTogcmVzdW1lRGF0YSwgdXNlclJhdGluZzogdXNlclJhdGluZ31cIiBbZGF0YV09XCJrcGFycmF5XCIgW2J0bkNhdGVnb3J5XT1cIidjbGFpbSdcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrQ2xhaW1LYXJtYVBvaW50cyk9XCJvbkNsaWNrT2ZDbGFpbSgkZXZlbnQpXCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQWNicENvdXJzZSAmJiAhbW9udGhseUNhcEV4Y2VlZFwiPlxuICAgICAgICAgICAgICAgIDx3cy1hcHAta2FybWFwb2ludHMtcGFuZWwgW2J0bnR5cGVdPVwiJ1N0YXJ0IGFnYWluJ1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNBY2JwQ291cnNlICYmIG1vbnRobHlDYXBFeGNlZWQgJiYgIWlzQ29tcGxldGVkVGhpc01vbnRoXCI+XG4gICAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInU3RhcnQgYWdhaW4nXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzUG9zdEFzc2Vzc21lbnQgJiYgc2hvd1Rha2VBc3Nlc3NtZW50Py5wb3N0X2Fzc2Vzc21lbnRcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInVGFrZSBBc3Nlc3NtZW50J1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImlzQmF0Y2hJblByb2dyZXNzICYmIChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSAmJiBiYXRjaERhdGE/LmVucm9sbGVkKSAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICA8YSAqbmdJZj1cInNob3dTdGFydC5zaG93ICYmICFpc1Bvc3RBc3Nlc3NtZW50XCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKClcIlxuICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cInJlc3VtZURhdGEgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cInJlc3VtZURhdGEgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+XG4gICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgJiYgKGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwICYmIGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlPiAwKSA/XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIDpcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXCI+XG4gICAgICAgICAgICB7eyByZXN1bWVEYXRhIHx8IGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyB0cmFuc2xhdGVMYWJlbHMoJ1N0YXJ0IGFnYWluJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIiczNnB4J1wiXG4gICAgICAgICAgW2JpbmRpbmdDbGFzc109XCInZmxleCByb3VuZGVkIGgtOCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBDdXJhdGVkIHByb2dyYW0gYmxvY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0gJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRW5yb2xsbWVudCgpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIFNUQU5EQUxPTkVfQVNTRVNTTUVOVCBibGFjayAtLT5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZyAmJiBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICE9PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgKGNsaWNrKT1cImhhbmRsZUVucm9sbG1lbnQoKVwiXG4gICAgICAgICAgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIElOVklURSBPTkxZIFNUQU5EQUxPTkUgQVNTRVNTTUVOVCBibG9jay0tPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmICFiYXRjaERhdGE/LmVucm9sbGVkICYmICFlbnJvbGxCdG5Mb2FkaW5nICYmIGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3Rm9ySW52aXRlT25seUFzc2Vzc21lbnRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiPnt7ICdhcHB0b2Nob21lLnlvdUFyZU5vdEludml0ZWRGb3JBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJiBiYXRjaERhdGE/LmVucm9sbGVkICYmIGlzQmF0Y2hJblByb2dyZXNzICYmICFlbnJvbGxCdG5Mb2FkaW5nICYmIGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3RBZ2FpbicgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3QnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCIhaXNCYXRjaEluUHJvZ3Jlc3MgJiYgISFjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgPT09ICdOQScgJiYgY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUubm9BY3RpdmVCYXRjaGVzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQScgJiYgY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUuYmF0Y2hXaWxsU3RhcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAge3tnZXRTdGFydERhdGV9fSE8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTVEFOREFMT05FX0FTU0VTU01FTlQgZW5yb2xsZWQgYmxhY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZyAmJiBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICE9PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgW3JvdXRlckxpbmtdPVwiZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFwiPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0QWdhaW4nIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMFwiPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0JyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIEJMRU5ERURfUFJPR1JBTSBibG9jayAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJiYXRjaERhdGE/LndvcmtGbG93Py53ZkluaXRpYXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLkFQUFJPVkVEIHx8XG4gICAgICAgICAgICAgICAgICAgICAgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFSkVDVEVEIHx8XG4gICAgICAgICAgICAgICAgICAgICAgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXTiB8fFxuICAgICAgICAgICAgICAgICAgICAgIGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSXRlbT8uY3VycmVudFN0YXR1cyA9PT0gV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRU1PVkVEKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtYWNjZW50LXRleHQgd3MtbWF0LWFjY2VudC1saWdodC1iZyBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzdGF0dXNNc2dcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9udC1ib2xkXCI+XG4gICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLnJlcXVlc3RVbmRlclJldmlldycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgPGEgKm5nSWY9XCJzaG93U3RhcnQuc2hvdyAmJiBiYXRjaERhdGE/LndvcmtGbG93Py53ZkluaXRpYXRlZCAmJiBiYXRjaERhdGE/LndvcmtGbG93Py53Zkl0ZW0/LmN1cnJlbnRTdGF0dXMgPT09IFdGQmxlbmRlZFByb2dyYW1TdGF0dXMuQVBQUk9WRURcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiaXNCYXRjaEluUHJvZ3Jlc3M/IChyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybCA6ICcnIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiXG4gICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiaXNCYXRjaEluUHJvZ3Jlc3MgPyAocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpIDogJycgXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZS1zdGFydC1idG4nOiAhaXNCYXRjaEluUHJvZ3Jlc3N9XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+XG4gICAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSAmJiAoY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDAgJiYgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2U+IDApID9cbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3N0YXJ0JywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgfHwgY2VydERhdGFcIj5cbiAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwID8gdHJhbnNsYXRlTGFiZWxzKCdTdGFydCBhZ2FpbicsICdhcHB0b2Nob21lJykgOlxuICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3N0YXJ0JywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQnRuU3RhdHVzID09ICdyZWplY3QnICYmIGNvbnRlbnQ/LnJlZ2lzdHJhdGlvblVybFwiPlxuICAgICAgICA8YSBbaHJlZl09XCJjb250ZW50Py5yZWdpc3RyYXRpb25VcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlclwiPnt7XG4gICAgICAgICAgJ2FwcHRvY2hvbWUucmVnaXN0ZXInIHwgdHJhbnNsYXRlIH19PC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgI3Byb2dyZXNzRnVuY3Rpb25hbGl0eT5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00IHRleHQtc21cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgdGV4dC14c1wiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLm92ZXJhbGxQcm9ncmVzcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzXCIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDBcIj4ge3sgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgfX0gJTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDx3cy13aWRnZXQtY29udGVudC1wcm9ncmVzcyAqbmdJZj1cImNvbnRlbnQ/LmlkZW50aWZpZXJcIiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCJcbiAgICAgICAgICAgIFtjb250ZW50SWRdPVwiY29udGVudD8uaWRlbnRpZmllclwiIFtwcm9ncmVzc109XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZVwiIFtwcm9ncmVzc1R5cGVdPVwiJ3BlcmNlbnRhZ2UnXCJcbiAgICAgICAgICAgIFtjdXN0b21DbGFzc05hbWVdPVwiJ2NvbnRlbnQtcHJvZ3Jlc3MnXCI+XG4gICAgICAgICAgPC93cy13aWRnZXQtY29udGVudC1wcm9ncmVzcz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRDb21wbGV0aW9uUGVyY2VudCA+PSA1MFwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cImFjY2VudFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJhdGUtYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkZlZWRiYWNrRGlhbG9nKGNvbnRlbnQpXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+c3Rhcl9wdXJwbGU1MDA8L21hdC1pY29uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdXNlclJhdGluZ1wiPlxuICAgICAgICAgICAgPGRpdj57eyAnYXBwdG9jc2luZ2xlcGFnZS5yYXRlTm93JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VyUmF0aW5nXCI+XG4gICAgICAgICAgICA8ZGl2Pnt7ICdhcHB0b2NzaW5nbGVwYWdlLmVkaXRSYXRpbmcnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPGRpdiBjbGFzcz1cInRvYy1iYW5uZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNiBmaXhlZC13aWR0aFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImJhbm5lci1kZXRhaWxzIHRvYy1jb250ZW50XCIgI2Jhbm5lckRldGFpbHM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1iYWNrLWJ0blwiIChjbGljayk9XCJnb0JhY2soKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidGV4dC13aGl0ZVwiPmFycm93X2JhY2s8L21hdC1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEzMnB4J1wiIFtoZWlnaHRdPVwiJzMycHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzE0MHB4J1wiIFtoZWlnaHRdPVwiJzI0cHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyB0YWctZGl2IHJvdW5kZWQtMnhsIGdhcC0xIGl0ZW1zLWNlbnRlciBwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndzLW1hdC1vcmFuZ2UtdGV4dCBub2R0cmFuc2xhdGVcIj52aWRlb19saWJyYXJ5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctMyBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnksICdzZWFyY2hmaWx0ZXJzJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctMyBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5LCAnc2VhcmNoZmlsdGVycycpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyB0YWctZGl2IHJvdW5kZWQtMnhsIGdhcC0xIGl0ZW1zLWNlbnRlciBwLTJcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmFkZGl0aW9uYWxUYWdzPy5pbmNsdWRlcygnaUdPVCBTcGVjaWFsaXphdGlvbicpXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXBwcm92ZWQtaWNvblwiIHNyYz1cIi4vYXNzZXRzL2ljb25zL2FwcHJvdmVkLnN2Z1wiIGFsdD1cImFwcHJvdmVkXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWJvbGQgdGV4dC13aGl0ZSBsZWFkaW5nLTMgbm9kdHJhbnNsYXRlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ2NhcmRjb250ZW50djIuaUdPVFNwZWNpYWxpemF0aW9uUHJvZ3JhbScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIEtub3dsZWRnZSBsZXZlbCBibG9jayBmb3Igc2VhcmNoIGJveCAtLT5cbiAgICAgICAgICAgICAgICA8IS0tIHt7Y29udGVudD8uZGlmZmljdWx0eUxldmVsfX0gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uZGlmZmljdWx0eUxldmVsXCIgY2xhc3M9XCJrbm93bGVkZ2UtbGV2ZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uZGlmZmljdWx0eUxldmVsPy50b0xvd2VyQ2FzZSgpID09PSAnYmVnaW5uZXInXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsZXZlbC1iYWRnZSBiZWdpbm5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwiZmFsc2VcIiBjbGFzcz1cImxldmVsLWJhZGdlIGJlZ2lubmVyXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCIjREJGNERDXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjQyMjY3IDVDNy42NzkyNyA0LjU1NTU1IDguMzIwNzcgNC41NTU1NiA4LjU3NzM3IDVMMTIuMDQxNSAxMUMxMi4yOTgxIDExLjQ0NDQgMTEuOTc3MyAxMiAxMS40NjQxIDEySDQuNTM1OTJDNC4wMjI3MiAxMiAzLjcwMTk3IDExLjQ0NDQgMy45NTg1NyAxMUw3LjQyMjY3IDVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDlDOTUxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIHt7Y29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWx9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmRpZmZpY3VsdHlMZXZlbD8udG9Mb3dlckNhc2UoKSA9PT0gJ2ludGVybWVkaWF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxldmVsLWJhZGdlIGludGVybWVkaWF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwidHJ1ZVwiIGNsYXNzPVwibGV2ZWwtYmFkZ2UgaW50ZXJtZWRpYXRlXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCIjRDFEQkVDXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjQyMjY3IDIuNjY2NjZDNy42NzkyNyAyLjIyMjIxIDguMzIwNzcgMi4yMjIyMSA4LjU3NzM3IDIuNjY2NjZMMTIuMDQxNSA4LjY2NjY2QzEyLjI5ODEgOS4xMTExIDExLjk3NzMgOS42NjY2NiAxMS40NjQxIDkuNjY2NjZINC41MzU5MkM0LjAyMjcyIDkuNjY2NjYgMy43MDE5NyA5LjExMTEgMy45NTg1NyA4LjY2NjY2TDcuNDIyNjcgMi42NjY2NlpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxQjRDQTFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjcgNS42NjY2NkM3LjY3OTI3IDUuMjIyMjEgOC4zMjA3NyA1LjIyMjIxIDguNTc3MzcgNS42NjY2NkwxMi4wNDE1IDExLjY2NjdDMTIuMjk4MSAxMi4xMTExIDExLjk3NzMgMTIuNjY2NyAxMS40NjQxIDEyLjY2NjdINC41MzU5MkM0LjAyMjcyIDEyLjY2NjcgMy43MDE5NyAxMi4xMTExIDMuOTU4NTcgMTEuNjY2N0w3LjQyMjY3IDUuNjY2NjZaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMUI0Q0ExXCIgc3Ryb2tlPVwiI0QxREJFQ1wiIHN0cm9rZS13aWR0aD1cIjAuNVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICB7e2NvbnRlbnRSZWFkRGF0YT8uZGlmZmljdWx0eUxldmVsfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWw/LnRvTG93ZXJDYXNlKCkgPT09ICdhZHZhbmNlZCdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxldmVsLWJhZGdlIGFkdmFuY2VkXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCJmYWxzZVwiIGNsYXNzPVwibGV2ZWwtYmFkZ2UgYWR2YW5jZWRcIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCIjRkZFNkUxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy40MjI2NCAyLjMzMzM0QzcuNjc5MjQgMS44ODg5IDguMzIwNzQgMS44ODg5IDguNTc3MzQgMi4zMzMzNEwxMi4wNDE0IDguMzMzMzRDMTIuMjk4IDguNzc3NzkgMTEuOTc3MyA5LjMzMzM0IDExLjQ2NDEgOS4zMzMzNEg0LjUzNTg5QzQuMDIyNjkgOS4zMzMzNCAzLjcwMTk0IDguNzc3NzkgMy45NTg1NCA4LjMzMzM0TDcuNDIyNjQgMi4zMzMzNFpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0ZGODI2OFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjQgNUM3LjY3OTI0IDQuNTU1NTUgOC4zMjA3NCA0LjU1NTU2IDguNTc3MzQgNUwxMi4wNDE0IDExQzEyLjI5OCAxMS40NDQ0IDExLjk3NzMgMTIgMTEuNDY0MSAxMkg0LjUzNTg5QzQuMDIyNjkgMTIgMy43MDE5NCAxMS40NDQ0IDMuOTU4NTQgMTFMNy40MjI2NCA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkY4MjY4XCIgc3Ryb2tlPVwiI0ZGRTZFMVwiIHN0cm9rZS13aWR0aD1cIjAuNVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjQgNy42NjY2OUM3LjY3OTI0IDcuMjIyMjQgOC4zMjA3NCA3LjIyMjI0IDguNTc3MzQgNy42NjY2OUwxMi4wNDE0IDEzLjY2NjdDMTIuMjk4IDE0LjExMTEgMTEuOTc3MyAxNC42NjY3IDExLjQ2NDEgMTQuNjY2N0g0LjUzNTg5QzQuMDIyNjkgMTQuNjY2NyAzLjcwMTk0IDE0LjExMTEgMy45NTg1NCAxMy42NjY3TDcuNDIyNjQgNy42NjY2OVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0ZGODI2OFwiIHN0cm9rZT1cIiNGRkU2RTFcIiBzdHJva2Utd2lkdGg9XCIwLjVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIHt7Y29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWx9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjYlBsYW5FbmREYXRlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZHVlLXRhZyB0ZXh0LXhzIGxlYWRpbmctM1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZHVlLXdhcm5pbmcnOiBjYlBsYW5EdXJhdGlvbiA9PT0gbnNDYXJkQ29udGVudERhdGEuVVBDT01JTkcsICdkdWUtb3ZlcmR1ZSc6IGNiUGxhbkR1cmF0aW9uID09PSBuc0NhcmRDb250ZW50RGF0YS5PVkVSRFVFLCAnZHVlLXN1Y2Nlc3MnOiBjYlBsYW5EdXJhdGlvbiA9PT0gbnNDYXJkQ29udGVudERhdGEuU1VDQ0VTU31cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2NvbW1vbi5kdWVCeScgfCB0cmFuc2xhdGUgfX0gLSAmbmJzcDs8c3BhbiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IGNiUGxhbkVuZERhdGUgfCBkYXRlOiAnZFxuICAgICAgICAgICAgICAgICAgICAgIE1NTSx5J319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmIGNvbnRlbnRSZWFkRGF0YT8uY29udGVudFZlcnNpb25JbmZvPy5pZGVudGlmaWVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZXctdmVyc2lvbi1jaGlwIHJvdW5kZWQtMnhsXCIgKGNsaWNrKT1cIm5hdmlnYXRlVG9OZXdWZXJzaW9uKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm5hdmlnYXRlVG9OZXdWZXJzaW9uKClcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5ldy12ZXJzaW9uLXRleHQgbm9kdHJhbnNsYXRlXCI+e3sgJ2FwcHRvYy5uZXdWZXJzaW9uJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXdoaXRlIG1vYi1zaGFyZVwiICpuZ0lmPVwiY2FuU2hhcmVcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCIgKGNsaWNrKT1cIm9uQ2xpY2tPZlNoYXJlKClcIj5zaGFyZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTAlJ1wiIFtoZWlnaHRdPVwiJzMycHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzcwJSdcIiBbaGVpZ2h0XT1cIiczMnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFubmVyLXRleHQgdGV4dC1iYXNlIHNtOnRleHQtNHhsIGxlYWRpbmctNiBzbTpsZWFkaW5nLTEwIGZvbnQtYm9sZCBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgIGhhbmRsZUNhcGl0YWxpemUoY29udGVudFJlYWREYXRhPy5uYW1lKSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBzbTp0ZXh0LWJhc2Ugc291cmNlLXRleHQgZm9udC1zZW1pYm9sZCBicmVhay13b3JkcyBub2R0cmFuc2xhdGVcIiAjY29udGVudFNvdXJjZVxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc291cmNlRWxsaXBzaXMnOiBzb3VyY2VFbGxpcHNpc31cIiB0aXRsZT1cInt7Y29udGVudFJlYWREYXRhPy5zb3VyY2V9fVwiPnt7ICdjYXJkY29udGVudHYyLmJ5J1xuICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlIH19IHt7IGNvbnRlbnRSZWFkRGF0YT8uc291cmNlIH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMjBweCdcIiBbaGVpZ2h0XT1cIic0MHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzg4cHgnXCIgW2hlaWdodF09XCInMjRweCdcIlxuICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyByYXRpbmctY2hpcCBweS0yIGl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZU5hdmlnYXRlVG9SZXZpZXdzKClcIiAqbmdJZj1cImNvbnRlbnQ/LmF2ZXJhZ2VSYXRpbmdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBtYXJnaW4tbGVmdC1zIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+Z3JhZGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd2hpdGUgdGV4dC1zbSBsZWFkaW5nLTRcIj57eyBjb250ZW50Py5hdmVyYWdlUmF0aW5nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcGFyYXRvclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXdoaXRlIHRleHQtc20gbGVhZGluZy00IG1hcmdpbi1yaWdodC1tXCI+e3sgY29udGVudD8udG90YWxSYXRpbmcgfCBwaXBlQ291bnRUcmFuc2Zvcm0gfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiICpuZ0lmPVwiY29udGVudD8uYWRkaXRpb25hbFRhZ3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb3N0LWVucm9sbGVkLWNoaXAgdGV4dC14cyBsZWFkaW5nLTNcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29udGVudD8uYWRkaXRpb25hbFRhZ3M/LmluY2x1ZGVzKCdtb3N0VHJlbmRpbmcnKVwiPnt7ICdjYXJkY29udGVudHYyLm1vc3RUcmVuZGluZycgfFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbnRlbnQ/LmFkZGl0aW9uYWxUYWdzPy5pbmNsdWRlcygnbW9zdEVucm9sbGVkJylcIj57eyAnY2FyZGNvbnRlbnR2Mi5tb3N0RW5yb2xsZWQnIHxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnJldGlyZW1lbnREYXRlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5ldy12ZXJzaW9uLXBpbGwgdGV4dC14cyBsZWFkaW5nLTNcIiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uc3RhdHVzICE9PSAnUmV0aXJlZCdcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdhcHB0b2MucGVuZGluZ1JldGlyZW1lbnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZXctdmVyc2lvbi1yZXRpcmUtcGlsbCB0ZXh0LXhzIGxlYWRpbmctM1wiICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5zdGF0dXMgPT09ICdSZXRpcmVkJ1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgJ2FwcHRvYy5yZXRpcmVkJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTgwcHgnXCIgW2hlaWdodF09XCInMjBweCdcIlxuICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgY29udGVudFJlYWREYXRhPy5zWVNfSU5URVJOQUxfTEFTVF9VUERBVEVEX09OXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBsZWFkaW5nLTQgc291cmNlLXRleHQgbm9kdHJhbnNsYXRlXCI+KHt7ICdhcHB0b2MubGFzdFVwZGF0ZWRPbicgfCB0cmFuc2xhdGUgfX0ge3tcbiAgICAgICAgICAgICAgY29udGVudFJlYWREYXRhPy5zWVNfSU5URVJOQUxfTEFTVF9VUERBVEVEX09OIHwgZGF0ZTogJ01NTSBkLCB5JyB9fSk8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTJcIiAqbmdJZj1cImxhbmd1YWdlTGlzdD8ubGVuZ3RoID4gMVwiPlxuICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCBjbGFzcz1cImxhbmctY2hpcHNcIj5cbiAgICAgICAgICAgICAgICA8IS0tIFNob3cgdXAgdG8gNiBjaGlwcyAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsYW5nIG9mIGxhbmd1YWdlTGlzdCB8IHNsaWNlOjA6NTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwibWF0Y2hpcC1jdXN0b21cIiBzZWxlY3RhYmxlPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJsYW5nPy5pZGVudGlmaWVyID09PSBzZWxlY3RlZExhbmd1YWdlPy5pZGVudGlmaWVyXCIgKGNsaWNrKT1cIm9uTGFuZ3VhZ2VTZWxlY3QobGFuZylcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbGFuZy5uYW1lIHx8IGxhbmcudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFwiTW9yZVwiIGNoaXAgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiA2IGxhbmd1YWdlcyAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGFuZ3VhZ2VMaXN0Lmxlbmd0aCA+IDVcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCBbbWF0TWVudVRyaWdnZXJGb3JdPVwibW9yZUxhbmd1YWdlc01lbnVcIiBzZWxlY3RhYmxlPVwiZmFsc2VcIiBjbGFzcz1cIm1vcmUtY2hpcCBtYXRjaGlwLWN1c3RvbVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpc1NlbGVjdGVkSW5Nb3JlRHJvcGRvd24oKVwiPlxuICAgICAgICAgICAgICAgICAgICBNb3JlIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uXCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1jaGlwPlxuICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNtb3JlTGFuZ3VhZ2VzTWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBjbGFzcz1cIm1hdC1yYWRpby1ncm91cCBmbGV4IGZsZXgtY29sIGdhcC0yIHAtM1wiIFt2YWx1ZV09XCJzZWxlY3RlZExhbmd1YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gKm5nRm9yPVwibGV0IGxhbmcgb2YgbGFuZ3VhZ2VMaXN0IHwgc2xpY2U6NVwiIFt2YWx1ZV09XCJsYW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImxhbmc/LmlkZW50aWZpZXIgPT09IHNlbGVjdGVkTGFuZ3VhZ2U/LmlkZW50aWZpZXJcIiAoY2hhbmdlKT1cIm9uTGFuZ3VhZ2VTZWxlY3QobGFuZylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbmcuZGlzcGxheU5hbWUgfHwgbGFuZy5uYW1lIHx8IGxhbmcgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9tYXQtY2hpcC1saXN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC02IGZpeGVkLXdpZHRoXCI+XG4gICAgPGRpdiBjbGFzcz1cInRvYy1jb250ZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiZcbiAgICAgICAgc2VsZWN0ZWRCYXRjaERhdGE/LmNvbnRlbnRbMF0/LmJhdGNoQXR0cmlidXRlcz8uYmF0Y2hMb2NhdGlvbkRldGFpbHMgJiZcbiAgICAgICAgc2VsZWN0ZWRCYXRjaERhdGE/LmNvbnRlbnRbMF0/LmVucm9sbG1lbnRFbmREYXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1kZXRhaWxzIG10LTZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQgcGItM1wiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibG9jYXRpb24taWNvbiBub2R0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgbG9jYXRpb25fb25cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jLWRlc2NcIj5cbiAgICAgICAgICAgICAge3tzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hBdHRyaWJ1dGVzPy5iYXRjaExvY2F0aW9uRGV0YWlsc319XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImV2ZW50LWljb24gbm9kdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgIGV2ZW50PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2MtZGVzY1wiPlxuICAgICAgICAgICAgICBMYXN0IGRhdGUgb2YgZW5yb2xsbWVudCAtIHt7c2VsZWN0ZWRCYXRjaERhdGE/LmNvbnRlbnRbMF0/LmVucm9sbG1lbnRFbmREYXRlIHwgZGF0ZTogJ2RkL01NL3l5eXknfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY29tbWVuZGVkQ291cnNlc0lkICYmICFmZWVkYmFja0dpdmVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJweC00IHB5LTMgbXQtNiByZWxldmVudC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgaXRlbXMtY2VudGVyIGZsZXgtd3JhcCBmbGV4IGp1c3RpZnktY2VudGVyIG1kOmp1c3RpZnktc3RhcnRcIj5cbiAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pbWFnZXMvc2Frc2hhbUFJL2xhZHktZ3JlZXQuc3ZnXCIgYWx0PVwiZ3JlZXRcIiB3aWR0aD1cIjU2Ljg5XCIgaGVpZ2h0PVwiNjRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmVudC1pbmZvXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkZXIgdGV4dC1zbSByZWxldmVudC1oZWFkaW5nIGJsb2NrIG1iLTFcIj57eyAnaG9tZS50b2NSZWxldmVudEhlYWRpbmcnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVsZXZlbnQtc3ViaW5mbyBmb250LW5vcm1hbCB0ZXh0LXNtIGJsb2NrXCI+e3sgJ2hvbWUudG9jUmVsZXZlbnRTdWJIZWFkaW5nJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LW1pZGRsZSByZWxldmFudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1taWRkbGUgcmVsZXZlbnQtbm9ybWFsIHJlbGV2ZW50LWJ0biBweS0yIHB4LTQgcmVsZXZhbnQtYm94XCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJpc1JlbGV2ZW50QnRuSG92ZXJlZCA9IHRydWVcIiAobW91c2VsZWF2ZSk9XCJpc1JlbGV2ZW50QnRuSG92ZXJlZCA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQWNjZXB0UmVsZXZlbnQoKVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpc1JlbGV2ZW50QnRuSG92ZXJlZCAmJiAhaXNSZWxldmVudCA/IFNBS1NIQU1BSV9JQ09OX0xPQURFUiA6IFNBS1NIQU1BSV9JQ09OX05PUk1BTFwiXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJsb2FkZXJcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBjbGFzcz1cIm1yLTJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtcmVsZXZlbnQgZmYtbGF0byB0ZXh0LXNtIGZvbnQtYm9sZFwiPnt7ICdob21lLnJlbGV2ZW50JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1taWRkbGUgbm8tYnV0dG9uIG1sLThcIiAoY2xpY2spPVwiaGFuZGxlRGVjbGluZVJlbGV2ZW50KClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbiB0ZXh0LW5vIG1yLTEgbm9kdHJhbnNsYXRlXCI+dGh1bWJfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW5vIGZmLWxhdG8gdGV4dC1zbSBmb250LWJvbGRcIj57eyAnaG9tZS5ubycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGItNCBsZzpweS00XCJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgJiYgY29udGVudD8uaWRlbnRpZmllciAmJiBiYXNlQ29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyXCI+XG4gICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLXByb2dyZXNzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwcm9ncmVzc0Z1bmN0aW9uYWxpdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICA8d3Mtd2lkZ2V0LWNvbnRlbnQtdG9jIFtjb250ZW50XT1cImNvbnRlbnRcIiBbY29tcG9uZW50TmFtZV09XCIndG9jJ1wiIFtwYXRoU2V0XT1cInBhdGhTZXRcIlxuICAgICAgICAgIFt0b2NTdHJ1Y3R1cmVdPVwidG9jU3RydWN0dXJlXCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtpc0Vucm9sbGVkXT1cImJhdGNoRGF0YT8uZW5yb2xsZWRcIlxuICAgICAgICAgIFtyZXN1bWVEYXRhXT1cInJlc3VtZURhdGFcIiBbYmF0Y2hEYXRhXT1cInNlbGVjdGVkQmF0Y2hEYXRhXCIgW3NrZWxldG9uTG9hZGVyXT1cInNrZWxldG9uTG9hZGVyXCJcbiAgICAgICAgICBbY2hhbmdlVGFiXT1cImNoYW5nZVRhYlwiIFtoaWVyYXJjaHlNYXBEYXRhXT1cInRvY1N2Yz8uaGFzaG1hcFwiIFtzZWxlY3RlZEJhdGNoRGF0YV09XCJzZWxlY3RlZEJhdGNoRGF0YVwiXG4gICAgICAgICAgW2NvbmRpdGlvbl09XCJ7aXNQb3N0QXNzZXNzbWVudDogaXNQb3N0QXNzZXNzbWVudCwgY29udGVudDogY29udGVudCwgaXNBY2JwQ291cnNlOiBpc0FjYnBDb3Vyc2UsIGlzQ2xhaW1lZDogaXNDbGFpbWVkLCBtb250aGx5Q2FwRXhjZWVkOiBtb250aGx5Q2FwRXhjZWVkLCBpc0NvbXBsZXRlZFRoaXNNb250aDogaXNDb21wbGV0ZWRUaGlzTW9udGgsIHNob3dUYWtlQXNzZXNzbWVudDogc2hvd1Rha2VBc3Nlc3NtZW50LCB1c2VyRW5yb2xsbWVudExpc3Q6IHVzZXJFbnJvbGxtZW50TGlzdCwgcmVzdW1lRGF0YTogcmVzdW1lRGF0YSwgdXNlclJhdGluZzogdXNlclJhdGluZywgZW5yb2xsQnRuTG9hZGluZzogZW5yb2xsQnRuTG9hZGluZywgcHJpbWFyeUNhdGVnb3J5OiBwcmltYXJ5Q2F0ZWdvcnksIGN1cnJlbnRDb3Vyc2VCYXRjaElkOiBjdXJyZW50Q291cnNlQmF0Y2hJZCwgaXNBY2JwQ2xhaW06IGlzQWNicENsYWltfVwiXG4gICAgICAgICAgW2twYXJyYXldPVwia3BhcnJheVwiIChwbGF5UmVzdW1lRm9yQUkpPVwicGxheVJlc3VtZUZvckFJKClcIiAoZW5yb2xsVXNlclRvQUkpPVwiZW5yb2xsVXNlclRvQUkoKVwiXG4gICAgICAgICAgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIiBbYmFzZUNvbnRlbnRSZWFkRGF0YV09XCJiYXNlQ29udGVudFJlYWREYXRhXCIgW2xhbmd1YWdlTGlzdF09XCJsYW5ndWFnZUxpc3RcIlxuICAgICAgICAgIFtsb2NrQ2VydGlmaWNhdGVdPVwibG9ja0NlcnRpZmljYXRlXCIgKHRyaWdlckNvbXBsZXRpb25TdXJ2ZXlGb3JtKT1cIm9wZW5TdXJ2ZXlGb3JtUG9wdXAoJGV2ZW50KVwiXG4gICAgICAgICAgKHJlc3VtZUNvbnRlbnQpPVwicmVzdW1lQ29udGVudERhdGEoKVwiPjwvd3Mtd2lkZ2V0LWNvbnRlbnQtdG9jPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iLXRpcC1mb3ItbGVhcm5lclwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJsZWFybkFkdmlzb3J5RGF0YSAmJiBsZWFybkFkdmlzb3J5RGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXRpcHMtZm9yLWxlYXJuZXItY2FyZCBbbGVhcm5BZHZpc29yeURhdGFdPVwibGVhcm5BZHZpc29yeURhdGFcIj48L3dzLXdpZGdldC10aXBzLWZvci1sZWFybmVyLWNhcmQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cblxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250YWluZXJcIj5cblxuICAgICAgPCEtLSBpZiBuZWVkZWQgc3RpY2t5IG9mIHJpZ2h0IGNvbnRhaW5lciBhZGQgdGhpcyB0byBiZWxvdyBkaXYgPT4gI3JpZ2h0Q29udGFpbmVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRlbnQtaW5uZXJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMzg0cHgnXCIgW2hlaWdodF09XCInMjI0cHgnXCJcbiAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaW1hZ2UtZGl2XCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoJyArIGNvbnRlbnRSZWFkRGF0YT8ucG9zdGVySW1hZ2UgKyAnKScsICdiYWNrZ3JvdW5kLXJlcGVhdCc6ICduby1yZXBlYXQnLCAnYmFja2dyb3VuZC1zaXplJzogJ2NvdmVyJ31cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ltYWdlLWJhY2tkcm9wJzogc2Nyb2xsZWR9XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiB0ZXh0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNCBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydqdXN0aWZ5LWJldHdlZW4nOiBzY3JvbGxlZCwgJ2p1c3RpZnktZW5kJzogIXNjcm9sbGVkfVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgdGFnLWRpdiByb3VuZGVkLTJ4bCBnYXAtMSBpdGVtcy1jZW50ZXIgcC0yXCIgKm5nSWY9XCJzY3JvbGxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ3cy1tYXQtb3JhbmdlLXRleHQgbm9kdHJhbnNsYXRlXCI+dmlkZW9fbGlicmFyeTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1ib2xkIHRleHQtd2hpdGUgbGVhZGluZy0zXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnksICdzZWFyY2hmaWx0ZXJzJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctM1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25DbGlja09mU2hhcmUoKVwiIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgZ2FwLTIgc2hhcmUtdGFnXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYW5TaGFyZSAmJiAhZm9yUHJldmlld1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5zaGFyZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uuc2hhcmUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMVwiICpuZ0lmPVwic2Nyb2xsZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhsIGxlYWRpbmctNiB0ZXh0LXdoaXRlIGZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY29udGVudFJlYWREYXRhPy5uYW1lKSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBzb3VyY2UtdGV4dCBmb250LXNlbWlib2xkIGJyZWFrLXdvcmRzXCIgI2NvbnRlbnRTb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzb3VyY2VFbGxpcHNpcyc6IHNvdXJjZUVsbGlwc2lzfVwiIHRpdGxlPVwie3tjb250ZW50UmVhZERhdGE/LnNvdXJjZX19XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ2NhcmRjb250ZW50djIuYnknIHwgdHJhbnNsYXRlIH19IHt7IGNvbnRlbnRSZWFkRGF0YT8uc291cmNlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IHAtNSBib3JkZXItYm90dG9tXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSAgY3Vyc29yLXBvaW50ZXIgc3dpdGNoLXZlcnNpb25cIlxuICAgICAgICAgICAgICAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiBjb250ZW50UmVhZERhdGE/LmNvbnRlbnRWZXJzaW9uSW5mbz8uaWRlbnRpZmllclwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVRvTmV3VmVyc2lvbigpXCIgKGtleWRvd24pPVwibmF2aWdhdGVUb05ld1ZlcnNpb24oKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1zd2l0Y2hcIj57eyAnYXBwdG9jLnN3aXRjaFRvTmV3VmVyc2lvbicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YSAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMyBqdXN0aWZ5LWFyb3VuZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5iYXRjaEF0dHJpYnV0ZXM/LmN1cnJlbnRCYXRjaFNpemVcbiAgICAgICAgICAgICAgICAgICAgfHwgJzAnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLmJhdGNoU2l6ZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8udXNlckNvdW50Py50b3RhbEFwcGxpZWQgfHwgJzAnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLnRvdGFsQXBwbGllZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8udXNlckNvdW50Py5lbnJvbGxlZCB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1sYWJlbFwiPnt7ICdhcHB0b2MudG90YWxFbnJvbGxlZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmICFwcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1c1wiPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGVucm9sbC1idG4ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/Lmxlbmd0aFwiIChjbGljayk9XCJyb3V0ZVRvUHJlQXNzZXNzZW50KClcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLnByZUVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmIHByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmbGV4IHByZWVucm9sbGRvbmUtYnRuIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUucHJlRW5yb2xsRG9uZScgfCB0cmFuc2xhdGUgfX08aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvQWNjZXB0X2ljb24ucG5nXCIgYWx0PVwidGlja1wiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWljb25cIj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInRpbWVyICYmIHRpbWVyLmRheXMgPj0gMCAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC02IGJhdGNoLXRpbWVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdW5kZXJsaW5lXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmJhdGNoU3RhcnRzSW4nIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdW5kZXJsaW5lXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIuZGF5cyB8fCAwIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItbGFiZWxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5kYXlzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IHRpbWVyLmhvdXJzICsgMSA6IHRpbWVyLmhvdXJzIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItbGFiZWxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5ob3VycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb3VudGVyLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTEgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtNHhsIGxlYWRpbmctMTAgY291bnRlclwiPnt7IHRpbWVyLm1pbiA9PT0gNjAgPyAwMCA6IHRpbWVyLm1pbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UubWludXRlcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3QnRuXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2JpbGUxMjAwICYmIChcbiAgICAgICAgICFjb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8ubGVuZ3RoIHx8XG4gICAgICAgICAoY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/Lmxlbmd0aCAmJiAocHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMgfHwgICFwcmVBc3Nlc3NtZW50UmVxdWlyZWRGbGFnKSlcbiAgICAgICApXCI+XG5cbiAgICAgICAgICAgICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgW3VzZXJFbnJvbGxtZW50TGlzdF09XCJ1c2VyRW5yb2xsbWVudExpc3RcIiAod2l0aGRyYXdPckVucm9sbCk9XCJ3aXRoZHJhd09yRW5yb2xsKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbYW5hbHl0aWNzXT1cImFuYWx5dGljc1wiIFtyZXN1bWVEYXRhXT1cInJlc3VtZURhdGFcIiBbYmF0Y2hEYXRhXT1cImJhdGNoRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb250ZW50UmVhZERhdGFdPVwiY29udGVudFJlYWREYXRhXCI+XG4gICAgICAgICAgICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzMzNnB4J1wiIFtoZWlnaHRdPVwiJzQwcHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczMzZweCdcIiBbaGVpZ2h0XT1cIic2OHB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMiBpbmZvLWRpdlwiICpuZ0lmPVwiY29udGVudD8uaXNJbkludHJhbmV0ICYmIHNob3dJbnRyYW5ldE1zZ1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLnZpZXdlZEluSW50cmFuZXQnIHwgdHJhbnNsYXRlIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0yIGluZm8tZGl2XCIgKm5nSWY9XCJzaG93SW5zdHJ1Y3RvckxlZE1zZ1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+aW5mbzwvbWF0LWljb24+Jm5ic3A7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLm5vdEF2YWlsYWJsZU9ubGluZScgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZ2FwLTIgaW5mby1kaXZcIiAqbmdJZj1cInNob3dTdGFydC5tc2cgPT09ICd5b3V0dWJlRm9yYmlkZGVuJ1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+aW5mbzwvbWF0LWljb24+Jm5ic3A7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLnlvdXR1YmVDb250ZW50QmxvY2tlZCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0J0blwiPlxuICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7IGNzY21zVXJsIH19XCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUuYXBwbHlGb3JQaHlzaWNhbFRyYWluaW5nJyB8IHRyYW5zbGF0ZSB9fTwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uU3RhdHVzIDw9IDIgJiYgaXNCYXRjaEluUHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicHJvZ3Jlc3NGdW5jdGlvbmFsaXR5XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPCEtLSBPdmVyYWxsIHByb2dyZXNzIGZ1bmN0aW9uYWxpdHkgLS0+XG5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJyZXN1bWVEYXRhICYmICF1c2VyUmF0aW5nXCI+IC0tPlxuICAgICAgICAgICAgICAgIDwhLS0gPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInUmF0ZSB0aGlzIGNvdXJzZSdcIiBbZGF0YV09XCJrcGFycmF5XCJcbiAgICAgICAgICAgICAgICAgIFtwQ2F0ZWdvcnldPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD4gLS0+XG4gICAgICAgICAgICAgICAgPCEtLSA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJyZXN1bWVEYXRhICYmIHVzZXJSYXRpbmdcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidFZGl0IHJhdGluZydcIiBbZGF0YV09XCJrcGFycmF5XCJcbiAgICAgICAgICAgICAgICAgIFtwQ2F0ZWdvcnldPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhY3Rpb25CdG5TdGF0dXMgIT09ICd3YWl0JyAmJiBjb250ZW50UmVhZERhdGE/LnN0YXR1cyAhPT0gJ0RlbGV0ZWQnICYmIGNvbnRlbnRSZWFkRGF0YT8uc3RhdHVzICE9PSAnRXhwaXJlZCdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZW5yb2xsRnVuY3Rpb25hbGl0eVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2FybWEtcG9pbnRzLWRpdlwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQta2FybWEtcG9pbnRzIFtkYXRhXT1cImtwYXJyYXlcIiAoY2xpY2tDbGFpbUthcm1hUG9pbnRzKT1cIm9uQ2xpY2tPZkNsYWltKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgW2NvbnRlbnRdPVwiY29udGVudFwiXG4gICAgICAgICAgICAgICAgICBbY29uZGl0aW9uXT1cIntpc1Bvc3RBc3Nlc3NtZW50OiBpc1Bvc3RBc3Nlc3NtZW50LCBjb250ZW50OiBjb250ZW50LCBpc0FjYnBDb3Vyc2U6IGlzQWNicENvdXJzZSwgaXNDbGFpbWVkOiBpc0NsYWltZWQsIG1vbnRobHlDYXBFeGNlZWQ6IG1vbnRobHlDYXBFeGNlZWQsIGlzQ29tcGxldGVkVGhpc01vbnRoOiBpc0NvbXBsZXRlZFRoaXNNb250aCwgc2hvd1Rha2VBc3Nlc3NtZW50OiBzaG93VGFrZUFzc2Vzc21lbnQsIHVzZXJFbnJvbGxtZW50TGlzdDogdXNlckVucm9sbG1lbnRMaXN0LCBpc0NvbXBsZXRlZFRoaXNNb250aDogaXNDb21wbGV0ZWRUaGlzTW9udGgsIHJlc3VtZURhdGE6IHJlc3VtZURhdGEsIHVzZXJSYXRpbmc6IHVzZXJSYXRpbmcsIGVucm9sbEJ0bkxvYWRpbmc6IGVucm9sbEJ0bkxvYWRpbmcsIHByaW1hcnlDYXRlZ29yeTogcHJpbWFyeUNhdGVnb3J5LCBjdXJyZW50Q291cnNlQmF0Y2hJZDogY3VycmVudENvdXJzZUJhdGNoSWQsIGlzQWNicENsYWltOiBpc0FjYnBDbGFpbX1cIj48L3dzLXdpZGdldC1rYXJtYS1wb2ludHM+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0MHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNDhweCdcIiBbaGVpZ2h0XT1cIic4cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgPHdzLXdpZGdldC10b2Mta3BpLXZhbHVlcyBbY29udGVudF09XCJjb250ZW50XCIgW3RvY1N0cnVjdHVyZV09XCJ0b2NTdHJ1Y3R1cmVcIlxuICAgICAgICAgICAgICAgIFtzaG93SW5zdHJ1Y3RvckxlZE1zZ109XCJzaG93SW5zdHJ1Y3RvckxlZE1zZ1wiIFtjb250ZW50UmVhZERhdGFdPVwiY29udGVudFJlYWREYXRhXCJcbiAgICAgICAgICAgICAgICBbbGFuZ3VhZ2VMaXN0XT1cImxhbmd1YWdlTGlzdFwiPjwvd3Mtd2lkZ2V0LXRvYy1rcGktdmFsdWVzPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtOCBwLTVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiICpuZ0Zvcj1cImxldCBpIG9mIFsxLCAyXVwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNzJweCdcIiBbaGVpZ2h0XT1cIicyMHB4J1wiXG4gICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczNnB4J1wiIFtoZWlnaHRdPVwiJzM2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZC1mdWxsJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTI0cHgnXCIgW2hlaWdodF09XCInMjBweCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzEycHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCIgKm5nSWY9XCJoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckRldGFpbHMpPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtYm9sZFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmF1dGhvcnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhdXRob3Igb2YgaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JEZXRhaWxzKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXZhdGFyLXBob3RvIFtyYW5kb21Db2xvcl09XCJ0cnVlXCIgW2RhdGFsZW5dPVwiMVwiIFtzaXplXT1cIidyb3VuZC1tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3Bob3RvVXJsXT1cImF1dGhvcj8ucGhvdG8gfHwgJydcIiBbbmFtZV09XCJhdXRob3I/Lm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShhdXRob3I/Lm5hbWUsICduYW1lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy0zXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYXV0aG9yJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiICpuZ0lmPVwiaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JDb250YWN0cyk/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3JlYXRvcnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjcmVlYXRvciBvZiBoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckNvbnRhY3RzKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXZhdGFyLXBob3RvIFtyYW5kb21Db2xvcl09XCJ0cnVlXCIgW2RhdGFsZW5dPVwiMVwiIFtzaXplXT1cIidyb3VuZC1tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3Bob3RvVXJsXT1cImNyZWVhdG9yPy5waG90byB8fCAnJ1wiIFtuYW1lXT1cImNyZWVhdG9yPy5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTEganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY3JlZWF0b3I/Lm5hbWUsICduYW1lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy0zXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3JlYXRvcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5zb3VyY2UgICYmIChjb250ZW50Q3JlYXRvckRhdGEgJiYgY29udGVudENyZWF0b3JEYXRhPy5sZW5ndGgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYmFzZSBmb250LWJvbGRcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBpdGVtcy1jZW50ZXJcIiAqbmdGb3I9XCJsZXQgY3JlYXRvciBvZiBjb250ZW50Q3JlYXRvckRhdGFcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHByb3ZpZGVyLWxvZ28tZGl2XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmNyZWF0b3JMb2dvXCIgW3NyY109XCJjb250ZW50UmVhZERhdGE/LmNyZWF0b3JMb2dvXCJcbiAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX1cIiAvPlxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiIWNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckxvZ29cIiBjbGFzcz1cIm1hdC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIvYXNzZXRzL2luc3RhbmNlcy9lYWdsZS9hcHBfbG9nb3MvS2FybWF5b2dpQmhhcmF0X0xvZ28uc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX1cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSB3b3JkLWJyZWFrIGN1cnNvci1wb2ludGVyXCIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3I/Lmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyYWlzZVRlbGVtZXRlcnlGb3JQcm92aWRlcihjb250ZW50UmVhZERhdGE/LnNvdXJjZSwgY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yWzBdKVwiXG4gICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL2FwcC9sZWFybi9icm93c2UtYnkvcHJvdmlkZXInLCBjb250ZW50UmVhZERhdGE/LnNvdXJjZSwgY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yWzBdLCAnbWljcm8tc2l0ZXMnXVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnRSZWFkRGF0YT8uc291cmNlLCAnc291cmNlJykgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gd29yZC1icmVha1wiICpuZ0lmPVwiIWNvbnRlbnRSZWFkRGF0YT8uY3JlYXRlZEZvcj8ubGVuZ3RoXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50UmVhZERhdGE/LnNvdXJjZSwgJ3NvdXJjZScpIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImxlYXJuQWR2aXNvcnlEYXRhICYmIGxlYXJuQWR2aXNvcnlEYXRhPy5sZW5ndGhcIj5cbiAgICAgICAgICA8d3Mtd2lkZ2V0LXRpcHMtZm9yLWxlYXJuZXItY2FyZCBbbGVhcm5BZHZpc29yeURhdGFdPVwibGVhcm5BZHZpc29yeURhdGFcIj48L3dzLXdpZGdldC10aXBzLWZvci1sZWFybmVyLWNhcmQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cblxuXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9iaWxlLWVucm9sbC1kaXZcIlxuICAgIFtuZ0NsYXNzXT1cInsnYmctd2hpdGUnOiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSB9XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQgJiYgY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwibW9iaWxlMTIwMCAmJiAhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3QnRuXCI+XG4gICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICBbdXNlckVucm9sbG1lbnRMaXN0XT1cInVzZXJFbnJvbGxtZW50TGlzdFwiICh3aXRoZHJhd09yRW5yb2xsKT1cIndpdGhkcmF3T3JFbnJvbGwoJGV2ZW50KVwiXG4gICAgICAgICAgW2FuYWx5dGljc109XCJhbmFseXRpY3NcIiBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiPlxuICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJlbnJvbGxGdW5jdGlvbmFsaXR5XCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDx3cy1hcHAtc2hhcmUtdG9jICpuZ0lmPVwiZW5hYmxlU2hhcmVcIiBbcm9vdE9yZ0lkXT1cInJvb3RPcmdJZFwiIFtjb250ZW50XT1cImNvbnRlbnRcIlxuICAgIChyZXNldEVuYWJsZVNoYXJlKT1cInJlc2V0RW5hYmxlU2hhcmUoJGV2ZW50KVwiIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIj48L3dzLWFwcC1zaGFyZS10b2M+XG48L25nLWNvbnRhaW5lcj5cbjxuZy10ZW1wbGF0ZSAjbm9EYXRhRm91bmQ+XG4gIDxkaXZcbiAgICBjbGFzcz1cImVycm9yLW5vdC1mb3VuZCBmbGV4IGZsZXgtd3JhcHBlZCBtYXJnaW4tbGVmdC1tIG1hcmdpbi10b3AteGwgbWFyZ2luLXJpZ2h0LW0gZmxleC1jb2wganVzdGlmeS1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHRleHQtY2VudGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImVycm9yLWxvZ29cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJlcnJvci1tZXNzYWdlIHdzLW1hdC1wcmltYXJ5LXRleHQgZm9udC13ZWlnaHQtYm9sZFwiPlxuICAgICAgICBUaGUgcGFnZSB5b3UgcmVxdWVzdGVkIGNhbm5vdCBiZSBmb3VuZFxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSA8ZGl2IGNsYXNzPVwiZXJyb3Itc3VwcG9ydFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN1cHBvcnQtbWVzc2FnZVwiID5XZSBoYXZlIHVwZGF0ZWQgb3VyIHdlYiBzaXRlIGFuZCBtYW55IFVSTHMgaGF2ZSBjaGFuZ2VkLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInN1cHBvcnQtbWVzc2FnZVwiID5Zb3UgbWlnaHQgd2FudCB0bzo8L2Rpdj5cbiAgICA8L2Rpdj4gLS0+XG4gIDwvZGl2PlxuXG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2F1dGhWaWV3Pnt7J2FwcHRvY2hvbWUudmlldycgfCB0cmFuc2xhdGV9fTwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYXV0aFZpZXdCdG4gaTE4bj5cbiAgPGEgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKCRldmVudClcIlxuICAgIFtyb3V0ZXJMaW5rXT1cInNob3VsZFNob3dTdXJ2ZXlQb3B1cCgpID8gbnVsbCA6ICgocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmwpXCJcbiAgICBbcXVlcnlQYXJhbXNdPVwic2hvdWxkU2hvd1N1cnZleVBvcHVwKCkgPyBudWxsIDogKChyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJykpXCJcbiAgICBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlclwiPlxuICAgIHt7J2FwcHRvY2hvbWUudmlldycgfCB0cmFuc2xhdGV9fVxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNhdXRoVmlld0Zvckludml0ZU9ubHlBc3Nlc3NtZW50PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9yUHJldmlldyAmJiBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ID09PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgIFtxdWVyeVBhcmFtc109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCI+XG4gICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0JyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgIDwvYT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPiJdfQ==
2852
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1ob21lLXYyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9jb21wb25lbnRzL2FwcC10b2MtaG9tZS12Mi9hcHAtdG9jLWhvbWUtdjIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1ob21lLXYyL2FwcC10b2MtaG9tZS12Mi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFBYyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUM3RCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUE7QUFHdEIsT0FBTyxFQUF1QyxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHL0QsT0FBTyxFQUE0QixPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDeEUsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLDJCQUEyQjtBQUMzQixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sY0FBYyxNQUFNLDZCQUE2QixDQUFBO0FBRXhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUVoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUV4RSxPQUFPLEVBSWdDLFFBQVEs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RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUztRQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUE7SUFDL0IsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3RCLENBQUM7K0dBMWdHVSxxQkFBcUIsOC9CQTROdEIsYUFBYTttR0E1TloscUJBQXFCLHdtQkNqRmxDLDBtK0RBNCtCYzs7NEZEMzVCRCxxQkFBcUI7a0JBUGpDLFNBQVM7K0JBQ0Usd0JBQXdCLGlCQUluQixpQkFBaUIsQ0FBQyxJQUFJOzswQkE4TmxDLE1BQU07MkJBQUMsYUFBYTs0Q0FwTWQsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQXlDcUMsV0FBVztzQkFBckQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQXVEWixTQUFTO3NCQUFyQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDbUIsVUFBVTtzQkFBdkQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNoQixhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBb0MxQixZQUFZO3NCQURYLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uLCBJbnB1dCxcbiAgSW5qZWN0LCBPcHRpb25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuaW1wb3J0IHsgU2FmZUh0bWwsIERvbVNhbml0aXplciwgU2FmZVN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlcidcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBFdmVudCwgRGF0YSwgUm91dGVyLCBOYXZpZ2F0aW9uRW5kIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG4vLyBpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUsIFN1YmplY3QsIG9mLCBmcm9tIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHNoYXJlLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5kYXlqcy5leHRlbmQoaXNTYW1lT3JCZWZvcmUpXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCBpc1NhbWVPckJlZm9yZSBmcm9tICdkYXlqcy9wbHVnaW4vaXNTYW1lT3JCZWZvcmUnXG5cbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5tb2RlbCdcbmltcG9ydCB7IFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50LnNlcnZpY2UnXG5pbXBvcnQgeyB2aWV3ZXJSb3V0ZUdlbmVyYXRvciB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy92aWV3ZXItcm91dGUtdXRpbCdcbmltcG9ydCB7IE5zV2lkZ2V0UmVzb2x2ZXIgfSBmcm9tICdAc3VuYmlyZC1jYi9yZXNvbHZlci12MidcbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25zU2VydmljZSwgRGF0YVRyYW5zZmVyU2VydmljZSwgRXZlbnRTZXJ2aWNlLFxuICBMb2dnZXJTZXJ2aWNlLCBNdWx0aWxpbmd1YWxUcmFuc2xhdGlvbnNTZXJ2aWNlLFxuICBOc1BhZ2UsIFRGZXRjaFN0YXR1cywgVGVsZW1ldHJ5U2VydmljZSxcbiAgVXRpbGl0eVNlcnZpY2UsIFdpZGdldEVucm9sbFNlcnZpY2UsIFdzRXZlbnRzLFxufSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12MidcblxuaW1wb3J0IHsgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlLCBUT0NNdWx0aUxpbmd1YWxEaWFsb2dDb21wb25lbnQsIFdpZGdldENvbnRlbnRMaWJTZXJ2aWNlLCBXaWRnZXRVc2VyU2VydmljZUxpYiB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xuaW1wb3J0IHsgTnNBcHBUb2MgfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwLXRvYy5tb2RlbCdcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHAtdG9jLnNlcnZpY2UnXG5pbXBvcnQgeyBNb2JpbGVBcHBzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vYmlsZS1hcHBzLnNlcnZpY2UnXG5pbXBvcnQgeyBIYW5kbGVDbGFpbVNlcnZpY2UgfSBmcm9tICcuLi8uLi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtdG9jL2NvbnRlbnQtc2VydmljZXMvaGFuZGxlLWNsYWltLnNlcnZpY2UnXG5pbXBvcnQgeyBBY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWN0aW9uLnNlcnZpY2UnXG5pbXBvcnQgeyBSYXRpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3JhdGluZy5zZXJ2aWNlJ1xuaW1wb3J0IHsgVmlld2VyVXRpbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92aWV3ZXItdXRpbC5zZXJ2aWNlJ1xuaW1wb3J0IHsgTG9hZENoZWNrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xvYWQtY2hlY2suc2VydmljZSdcbmltcG9ydCB7IFJlc2V0UmF0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXNldC1yYXRpbmdzLnNlcnZpY2UnXG5cbmltcG9ydCB7IEFwcFRvY0RpYWxvZ0ludHJvVmlkZW9Db21wb25lbnQgfSBmcm9tICcuLi9hcHAtdG9jLWRpYWxvZy1pbnRyby12aWRlby9hcHAtdG9jLWRpYWxvZy1pbnRyby12aWRlby5jb21wb25lbnQnXG5pbXBvcnQgeyBDb250ZW50UmF0aW5nVjJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtcmF0aW5nLXYyLWRpYWxvZy9jb250ZW50LXJhdGluZy12Mi1kaWFsb2cuY29tcG9uZW50J1xuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGltZXIuc2VydmljZSdcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJ1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgYXMgTWF0U25hY2tiYXJOZXcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInXG5pbXBvcnQgeyBOZXRDb3JlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ldGNvcmUuc2VydmljZSdcbmltcG9ydCB7IEVucm9sbExhbmd1YWdlRGlhbG9ndWVDb21wb25lbnQgfSBmcm9tICcuLi9lbnJvbGwtbGFuZ3VhZ2UtZGlhbG9ndWUvZW5yb2xsLWxhbmd1YWdlLWRpYWxvZ3VlLmNvbXBvbmVudCdcbmltcG9ydCB7IENvbXBsZXRpb25TdXJ2ZXlGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcGxldGlvbi1zdXJ2ZXktZm9ybS9jb21wbGV0aW9uLXN1cnZleS1mb3JtLmNvbXBvbmVudCdcbmltcG9ydCB7IFB1YmxpY1N1cnZleUZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9wdWJsaWMtc3VydmV5LWZvcm0vcHVibGljLXN1cnZleS1mb3JtLmNvbXBvbmVudCdcbmltcG9ydCB7IE5zQ2FyZENvbnRlbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FyZC1jb250ZW50Lm1vZGVsJ1xuaW1wb3J0IHsgTm9uUmVsZXZlbnRGZWVkYmFja0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL25vbi1yZWxldmVudC1mZWVkYmFjay1kaWFsb2cvbm9uLXJlbGV2ZW50LWZlZWRiYWNrLWRpYWxvZy5jb21wb25lbnQnXG5pbXBvcnQgeyBBcHBUb2NWMlNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHAtdG9jLXYyLnNlcnZpY2UnXG5cbmV4cG9ydCBlbnVtIEVycm9yVHlwZSB7XG4gIGludGVybmFsU2VydmVyID0gJ2ludGVybmFsU2VydmVyJyxcbiAgc2VydmljZVVuYXZhaWxhYmxlID0gJ3NlcnZpY2VVbmF2YWlsYWJsZScsXG4gIHNvbWV0aGluZ1dyb25nID0gJ3NvbWV0aGluZ1dyb25nJyxcbn1cblxuY29uc3QgZmxhdHRlbkl0ZW1zID0gKGl0ZW1zOiBhbnlbXSwga2V5OiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoZmxhdHRlbmVkSXRlbXMsIGl0ZW0pID0+IHtcbiAgICBmbGF0dGVuZWRJdGVtcy5wdXNoKGl0ZW0pXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbVtrZXldKSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICBmbGF0dGVuZWRJdGVtcyA9IGZsYXR0ZW5lZEl0ZW1zLmNvbmNhdChmbGF0dGVuSXRlbXMoaXRlbVtrZXldLCBrZXkpKVxuICAgIH1cbiAgICByZXR1cm4gZmxhdHRlbmVkSXRlbXNcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgfSwgW10pXG59XG5jb25zdCBTTkFDS0JBUl9EVVJBVElPTiA9IDMwMDBcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzLWFwcC1hcHAtdG9jLWhvbWUtdjInLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1ob21lLXYyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXBwLXRvYy1ob21lLXYyLmNvbXBvbmVudC5zY3NzJ10sXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdXNlLWNvbXBvbmVudC12aWV3LWVuY2Fwc3VsYXRpb25cbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwVG9jSG9tZVYyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQge1xuICBxdWVyeVBhcmFtc0RhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTsgLy8gSW5pdGlhbGl6ZSBxdWVyeVBhcmFtc0RhdGFcbiAgc2hvdyA9IGZhbHNlXG4gIGNoYW5nZVRhYiA9IGZhbHNlXG4gIHNrZWxldG9uTG9hZGVyID0gdHJ1ZVxuICBiYW5uZXJzOiBOc0FwcFRvYy5JVG9jQmFubmVyIHwgbnVsbCA9IG51bGxcbiAgc2hvd01vcmVHbGFuY2UgPSBmYWxzZVxuICBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICBjb250ZW50UmVhZERhdGE6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIGJhc2VDb250ZW50UmVhZERhdGE6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIGVycm9yQ29kZTogTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlIHwgbnVsbCA9IG51bGxcbiAgcmVzdW1lRGF0YTogYW55ID0gbnVsbFxuICBuc0NhcmRDb250ZW50RGF0YTogYW55ID0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3RcbiAgYmF0Y2hEYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlIHwgbnVsbCA9IG51bGxcbiAgY3VycmVudENvdXJzZUJhdGNoSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIHVzZXJFbnJvbGxtZW50TGlzdCE6IE5zQ29udGVudC5JQ291cnNlW11cbiAgcm91dGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHBhZ2VOYXZiYXI6IFBhcnRpYWw8TnNQYWdlLklOYXZCYWNrZ3JvdW5kPiA9IHRoaXMuY29uZmlnU3ZjLnBhZ2VOYXZCYXJcbiAgaXNDb2hvcnRzUmVzdHJpY3RlZCA9IGZhbHNlXG4gIHN0aWNreSA9IGZhbHNlXG4gIGlzSW5JZnJhbWUgPSBmYWxzZVxuICBjYlBsYW5FbmREYXRlOiBhbnlcbiAgY2JQbGFuRHVyYXRpb246IGFueVxuICBlbnJvbGxlZENvdXJzZURhdGE6IGFueVxuICBASW5wdXQoKSBmb3JQcmV2aWV3OiBhbnkgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL2F1dGhvci8nKVxuICBASW5wdXQoKSBpbnB1dENvbnRlbnQ6IGFueVxuICAvLyBmb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9hdXRob3IvJylcbiAgYW5hbHl0aWNzID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhPy5wYWdlRGF0YT8uZGF0YT8uYW5hbHl0aWNzXG4gIGVycm9yV2lkZ2V0RGF0YTogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aFR5cGVkRGF0YTxhbnk+ID0ge1xuICAgIHdpZGdldFR5cGU6ICdlcnJvclJlc29sdmVyJyxcbiAgICB3aWRnZXRTdWJUeXBlOiAnZXJyb3JSZXNvbHZlcicsXG4gICAgd2lkZ2V0RGF0YToge1xuICAgICAgZXJyb3JUeXBlOiAnaW50ZXJuYWxTZXJ2ZXInLFxuICAgIH0sXG4gIH1cbiAgaXNBdXRob3IgPSBmYWxzZVxuICBhdXRob3JCdG5XaWRnZXQ6IE5zUGFnZS5JTmF2TGluayA9IHtcbiAgICBhY3Rpb25CdG5JZDogJ2ZlYXR1cmVfYXV0aG9yaW5nJyxcbiAgICBjb25maWc6IHtcbiAgICAgIHR5cGU6ICdtYXQtYnV0dG9uJyxcbiAgICB9LFxuICB9XG4gIHRvY0NvbmZpZzogYW55ID0gbnVsbFxuICBwcmltYXJ5Q2F0ZWdvcnkgPSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeVxuICBjb3Vyc2VDYXRlZ29yeSA9IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnlcbiAgV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cyA9IE5zQ29udGVudC5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzXG4gIGFza0F1dGhvckVuYWJsZWQgPSB0cnVlXG4gIHRyYWluaW5nTEh1YkVuYWJsZWQgPSBmYWxzZVxuICB0cmFpbmluZ0xIdWJDb3VudCQ/OiBPYnNlcnZhYmxlPG51bWJlcj5cbiAgYm9keTogU2FmZUh0bWwgfCBudWxsID0gbnVsbFxuICB2aWV3TW9yZVJlbGF0ZWRUb3BpY3MgPSBmYWxzZVxuICBoYXNUb2NTdHJ1Y3R1cmUgPSBmYWxzZVxuICB0b2NTdHJ1Y3R1cmU6IE5zQXBwVG9jLklUb2NTdHJ1Y3R1cmUgfCBudWxsID0gbnVsbFxuICBjb250ZW50UGFyZW50czogeyBba2V5OiBzdHJpbmddOiBOc0FwcFRvYy5JQ29udGVudFBhcmVudFJlc3BvbnNlW10gfSA9IHt9XG4gIG9iaktleXMgPSBPYmplY3Qua2V5c1xuICBmcmFnbWVudCE6IHN0cmluZ1xuICBhY3RpdmVGcmFnbWVudCA9IHRoaXMucm91dGUuZnJhZ21lbnQucGlwZShzaGFyZSgpKVxuICBjdXJyZW50RnJhZ21lbnQgPSAnb3ZlcnZpZXcnXG4gIHNob3dTY3JvbGwhOiBib29sZWFuXG4gIHNob3dTY3JvbGxIZWlnaHQgPSAzMDBcbiAgaGlkZVNjcm9sbEhlaWdodCA9IDEwXG4gIGVsZW1lbnRQb3NpdGlvbjogYW55XG4gIGJhdGNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBiYXRjaERhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHJlc3VtZURhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHRyYW5zbGF0aW9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBAVmlld0NoaWxkKCdzdGlja3lNZW51JywgeyBzdGF0aWM6IHRydWUgfSkgbWVudUVsZW1lbnQhOiBFbGVtZW50UmVmXG4gIGJhdGNoQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gIGNvbnRlbnRQcm9ncmVzcyA9IDBcbiAgYmFubmVyVXJsOiBTYWZlU3R5bGUgfCBudWxsID0gbnVsbFxuICByb3V0ZVBhdGggPSAnb3ZlcnZpZXcnXG4gIHZhbGlkUGF0aHMgPSBuZXcgU2V0KFsnb3ZlcnZpZXcnLCAnY29udGVudHMnLCAnYW5hbHl0aWNzJ10pXG4gIHJvdXRlclBhcmFtU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBpbml0aWFscm91dGVEYXRhOiBhbnlcbiAgYWN0aW9uQnRuU3RhdHVzID0gJ3dhaXQnXG4gIGlzUmVnaXN0cmF0aW9uU3VwcG9ydGVkID0gZmFsc2VcbiAgc2hvd0ludHJhbmV0TWVzc2FnZSA9IGZhbHNlXG4gIGZpcnN0UmVzb3VyY2VMaW5rOiB7IHVybDogc3RyaW5nOyBxdWVyeVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB9IHwgbnVsbCA9IG51bGxcbiAgcmVzdW1lRGF0YUxpbms6IHsgdXJsOiBzdHJpbmc7IHF1ZXJ5UGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH0gfCBudWxsID0gbnVsbFxuICBjZXJ0RGF0YTogYW55ID0gbnVsbFxuICBzaG93VGFrZUFzc2Vzc21lbnQ6IE5zQXBwVG9jLklQb3N0QXNzZXNzbWVudCB8IG51bGwgPSBudWxsXG4gIGNoZWNrUmVnaXN0cmF0aW9uU291cmNlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAnU2tpbGxTb2Z0IERpZ2l0YWxpemF0aW9uJyxcbiAgICAnU2tpbGxTb2Z0IExlYWRlcnNoaXAnLFxuICAgICdQbHVyYWxzaWdodCcsXG4gIF0pXG4gIGV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzOiBURmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgcmVnaXN0ZXJGb3JFeHRlcm5hbCA9IGZhbHNlXG4gIGlzR29hbHNFbmFibGVkID0gZmFsc2VcbiAgY29udGV4dElkPzogc3RyaW5nXG4gIGNvbnRleHRQYXRoPzogc3RyaW5nXG4gIGRlZmF1bHRTTG9nbyA9ICcnXG4gIGRpc2FibGVFbnJvbGxCdG4gPSBmYWxzZVxuICBpc0Fzc2Vzc1Zpc2libGUgPSBmYWxzZVxuICBpc1ByYWN0aWNlVmlzaWJsZSA9IGZhbHNlXG4gIGNlcnRpZmljYXRlT3BlbiA9IGZhbHNlXG4gIGJyZWFkY3J1bWJzOiBhbnlcbiAgaGlzdG9yeURhdGE6IGFueVxuICBjb3Vyc2VDb21wbGV0ZVN0YXRlID0gMlxuICB1c2VySWQ6IGFueVxuICB1c2VyUmF0aW5nOiBhbnlcbiAgZGFrc2h0YU5hbWUgPSB0aGlzLmVudmlyb25tZW50LmRha3NodGFOYW1lXG4gIGNzY21zVXJsID0gdGhpcy5lbnZpcm9ubWVudC5jc2Ntc1VybFxuICBzaG93QnRuID0gZmFsc2VcbiAgY2hhbm5lbElkOiBhbnlcbiAgc2VsZWN0ZWRCYXRjaERhdGE6IGFueVxuICBzZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uOiBhbnlcbiAgc2VydmVyRGF0ZVN1YnNjcmlwdGlvbjogYW55XG4gIHNlcnZlckRhdGU6IGFueVxuICBrcGFycmF5OiBhbnkgPSBbXVxuICBlbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgaXNBY2JwQ291cnNlID0gZmFsc2VcbiAgaXNBY2JwQ2xhaW0gPSBmYWxzZVxuICBjb3Vyc2VJRDogYW55XG4gIGlzQ2xhaW1lZCA9IGZhbHNlXG4gIG1vbnRobHlDYXBFeGNlZWQgPSBmYWxzZVxuICBpc0NvbXBsZXRlZFRoaXNNb250aCA9IGZhbHNlXG4gIHN0YXJ0RGF0ZTogYW55XG4gIGVuZERhdGU6IGFueVxuICBzdGFydERhdGVEaWZmZXJlbmNlOiBhbnlcbiAgZW5kRGF0ZURpZmZlcmVuY2U6IGFueVxuICBAVmlld0NoaWxkKCdyaWdodENvbnRhaW5lcicpIHJjRWxlbWVudCE6IEVsZW1lbnRSZWZcbiAgQFZpZXdDaGlsZCgnYmFubmVyRGV0YWlscycsIHsgc3RhdGljOiB0cnVlIH0pIGJhbm5lckVsZW0hOiBFbGVtZW50UmVmXG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnRTb3VyY2UnKSBjb250ZW50U291cmNlITogRWxlbWVudFJlZlxuICBzb3VyY2VFbGxpcHNpcyA9IGZhbHNlXG4gIHNjcm9sbExpbWl0ID0gMFxuICByY0VsZW0gPSB7XG4gICAgb2ZmU2V0VG9wOiAwLFxuICAgIEJvdHRvbVBvczogMCxcbiAgfVxuICBzY3JvbGxlZCA9IGZhbHNlXG4gIHBhdGhTZXQgPSBuZXcgU2V0KClcbiAgY2FuU2hhcmUgPSBmYWxzZVxuICBlbmFibGVTaGFyZSA9IGZhbHNlXG4gIHJvb3RPcmdJZDogYW55XG4gIGNlcnRJZDogYW55XG4gIG1vYmlsZTEyMDA6IGFueVxuICBhc3Nlc3NtZW50U3RyaXA6IGFueVxuICBsZWFybkFkdmlzb3J5RGF0YTogYW55XG4gIGNvbnRlbnRDcmVhdG9yRGF0YTogYW55ID0gW11cbiAgLy8gcmFuZG9tbGVhcm5BZHZpc29yeU9iajogYW55XG4gIC8vIGxlYXJuQWR2aXNvcnlEYXRhTGVuZ3RoOiBhbnlcblxuICBwcml2YXRlIGRlc3Ryb3lTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PGFueT4oKVxuICB0aW1lclVuc3Vic2NyaWJlOiBhbnlcbiAgdGltZXI6IGFueVxuICBpc1JlbGV2ZW50QnRuSG92ZXJlZCA9IGZhbHNlXG4gIFNBS1NIQU1BSV9JQ09OX05PUk1BTCA9ICcvYXNzZXRzL2ltYWdlcy9zYWtzaGFtQUkvYWktaWNvbi5zdmcnXG4gIFNBS1NIQU1BSV9JQ09OX0xPQURFUiA9ICcvYXNzZXRzL2ltYWdlcy9zYWtzaGFtQUkvc2Frc2hhbV9haV9sb2FkZXIuZ2lmJ1xuICByZWNvbW1lbmRlZENvdXJzZXNJZCA9ICcnXG4gIGZlZWRiYWNrR2l2ZW46IGFueVxuICBwcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IGZhbHNlXG4gIGZyb21BSVR1dG9yID0gZmFsc2VcbiAgbGFuZ3VhZ2VMaXN0OiBhbnkgPSBbXVxuICBzZWxlY3RlZExhbmd1YWdlOiBhbnlcbiAgbGFuZ3VhZ2VNYXBQcm9ncmVzczogYW55XG4gIHByZUFzc2Vzc21lbnRSZXF1aXJlZEZsYWc6IGFueSA9IGZhbHNlXG4gIGxvY2tDZXJ0aWZpY2F0ZSA9IGZhbHNlXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnLCBbJyRldmVudCddKVxuICBoYW5kbGVTY3JvbGwoKSB7XG4gICAgY29uc3Qgd2luZG93U2Nyb2xsID0gd2luZG93LnBhZ2VZT2Zmc2V0XG4gICAgaWYgKHdpbmRvd1Njcm9sbCA+PSB0aGlzLmVsZW1lbnRQb3NpdGlvbiAtIDEwMCkge1xuICAgICAgdGhpcy5zdGlja3kgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RpY2t5ID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY3JvbGxMaW1pdCkge1xuICAgICAgaWYgKCh3aW5kb3cuc2Nyb2xsWSArIHRoaXMucmNFbGVtLkJvdHRvbVBvcykgPj0gdGhpcy5zY3JvbGxMaW1pdCkge1xuICAgICAgICB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3N0aWNreSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJjRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnXG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIzNi4uLiAoT2Zmc2V0VG9wIG9mIHJpZ2h0IGNvbnRhaW5lciArIDEwNClcbiAgICBpZiAod2luZG93LnNjcm9sbFkgPiAodGhpcy5yY0VsZW0ub2ZmU2V0VG9wICsgMTA0KSkge1xuICAgICAgdGhpcy5zY3JvbGxlZCA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxlZCA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGNvbnRlbnRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXJTdmM6IExvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBtb2JpbGVBcHBzU3ZjOiBNb2JpbGVBcHBzU2VydmljZSxcbiAgICBwcml2YXRlIHV0aWxpdHlTdmM6IFV0aWxpdHlTZXJ2aWNlLFxuICAgIC8vIHByaXZhdGUgcHJvZ3Jlc3NTdmM6IENvbnRlbnRQcm9ncmVzc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZW50TGFuZ1N2YzogQ29udGVudExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGlvblNWQzogQWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHZpZXdlclN2YzogVmlld2VyVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByYXRpbmdTdmM6IFJhdGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0ZWxlbWV0cnlTZXJ2aWNlOiBUZWxlbWV0cnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3RyYW5zbGF0aW9uczogTXVsdGlsaW5ndWFsVHJhbnNsYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50czogRXZlbnRTZXJ2aWNlLFxuICAgIC8vIHByaXZhdGUgbWF0U25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgbG9hZENoZWNrU2VydmljZTogTG9hZENoZWNrU2VydmljZSxcbiAgICBwcml2YXRlIGhhbmRsZUNsYWltU2VydmljZTogSGFuZGxlQ2xhaW1TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVzZXRSYXRpbmdzU2VydmljZTogUmVzZXRSYXRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIHRpbWVyU2VydmljZTogVGltZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyBlbnJvbGxTdmM6IFdpZGdldEVucm9sbFNlcnZpY2UsXG4gICAgcHVibGljIGNvbnRlbnRMaWJTdmM6IFdpZGdldENvbnRlbnRMaWJTZXJ2aWNlLFxuICAgIHB1YmxpYyBkYXRhVHJhbnNmZXJTdmM6IERhdGFUcmFuc2ZlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYXRTbmFja2Jhck5ldzogTWF0U25hY2tiYXJOZXcsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZUxpYjogV2lkZ2V0VXNlclNlcnZpY2VMaWIsXG4gICAgcHVibGljIG5ldENvcmVTZXJ2aWNlOiBOZXRDb3JlU2VydmljZSxcbiAgICBwdWJsaWMgYXBwVG9jVjJTdmM6IEFwcFRvY1YyU2VydmljZSxcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIHB1YmxpYyBlbnZpcm9ubWVudDogYW55XG4gICkge1xuICAgIHRoaXMuaGlzdG9yeURhdGEgPSBoaXN0b3J5LnN0YXRlXG4gICAgdGhpcy5oYW5kbGVCcmVhZGNydW1icygpXG4gICAgdGhpcy5tb2JpbGVBcHBzU3ZjLm1vYmlsZVRvcEhlYWRlclZpc2liaWxpdHlTdGF0dXMubmV4dCh0cnVlKVxuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykpIHtcbiAgICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKCdlbicpXG4gICAgICBjb25zdCBsYW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpIVxuICAgICAgdGhpcy50cmFuc2xhdGUudXNlKGxhbmcpXG4gICAgfVxuXG4gICAgdGhpcy5sb2FkQ2hlY2tTZXJ2aWNlLmNoaWxkQ29tcG9uZW50TG9hZGVkJC5zdWJzY3JpYmUoX2lzTG9hZGVkID0+IHtcbiAgICAgIC8vIFByZXNlbnQgaW4gYXBwLXRvYy1hYm91dC5jb21wb25lbnRcbiAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmF0aW5nc0RpdicpKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhdGluZ3NEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmF0aW5nc0RpdicpIGFzIGFueVxuICAgICAgICAgIGlmIChyYXRpbmdzRGl2KSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbExpbWl0ID0gcmF0aW5nc0Rpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gYXMgYW55XG4gICAgICAgICAgfVxuICAgICAgICB9LCA1MDApXG4gICAgICB9XG5cbiAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudENvbnRhaW5lcicpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudENvbnRhaW5lcicpIGFzIGFueVxuICAgICAgICBpZiAoY29udGVudERpdikge1xuICAgICAgICAgIHRoaXMuc2Nyb2xsTGltaXQgPSBjb250ZW50RGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLmhhbmRsZUNsYWltU2VydmljZS5nZXRDbGFpbURhdGEoKS5zdWJzY3JpYmUoKF9ldmVudERhdGE6IGFueSkgPT4ge1xuICAgICAgdGhpcy5vbkNsaWNrT2ZDbGFpbShfZXZlbnREYXRhKVxuICAgIH0pXG4gIH1cblxuICBnZXRLYXJtYXBvaW50c0xpbWl0KCkge1xuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmMudXNlckthcm1hUG9pbnRzKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzICYmIHJlcy5rcExpc3QpIHtcbiAgICAgICAgICBjb25zdCBpbmZvID0gcmVzLmtwTGlzdC5hZGRpbmZvXG4gICAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgIHRoaXMubW9udGhseUNhcEV4Y2VlZCA9IEpTT04ucGFyc2UoaW5mbykuY2xhaW1lZE5vbkFDQlBDb3Vyc2VLYXJtYVF1b3RhID49IDRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaXNDb3Vyc2VDb21wbGV0ZWRPblRoaXNNb250aCgpIHtcbiAgICBjb25zdCBub3cgPSBtb21lbnQodGhpcy5zZXJ2ZXJEYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGNvdXJzZURhdGEgPSB0aGlzLmVucm9sbGVkQ291cnNlRGF0YVxuICAgICAgaWYgKGNvdXJzZURhdGEgJiYgY291cnNlRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwICYmIGNvdXJzZURhdGEuY29tcGxldGVkT24pIHtcbiAgICAgICAgY29uc3QgY29tcGxldGVkT24gPSBtb21lbnQoY291cnNlRGF0YS5jb21wbGV0ZWRPbikuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgY29uc3QgY29tcGxldGVkTW9udGggPSBtb21lbnQoY29tcGxldGVkT24sICdZWVlZLU1NLUREJykubW9udGgoKVxuICAgICAgICBjb25zdCBjdXJyZW50TW9udGggPSBtb21lbnQobm93LCAnWVlZWS1NTS1ERCcpLm1vbnRoKClcbiAgICAgICAgdGhpcy5pc0NvbXBsZXRlZFRoaXNNb250aCA9IGNvbXBsZXRlZE1vbnRoID09PSBjdXJyZW50TW9udGhcbiAgICAgICAgdGhpcy5jb250ZW50Wyd2aWV3TW9yZSddID0gZmFsc2VcbiAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0ZWRPbiddID0gY291cnNlRGF0YS5jb21wbGV0ZWRPblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZpbHRlcmVkQWNicExpc3QocmVzOiBhbnkpIHtcbiAgICByZXR1cm4gcmVzLmZpbHRlcigodjogYW55KSA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuY291cnNlSUQpXG4gIH1cblxuICBmaW5kQUNQQigpIHtcbiAgICBjb25zdCBsb2NhbENicCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYnBEYXRhJylcbiAgICBpZiAobG9jYWxDYnApIHtcbiAgICAgIGNvbnN0IHN0b3JlYWdlQ2JwID0gSlNPTi5wYXJzZShsb2NhbENicClcbiAgICAgIGNvbnN0IGNicCA9IHRoaXMuZmlsdGVyZWRBY2JwTGlzdChzdG9yZWFnZUNicClcbiAgICAgIGlmIChjYnAubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGFjYnAgPSAnY2JQbGFuJ1xuICAgICAgICB0aGlzLmNiUGxhbkVuZERhdGUgPSBjYnBbMF0uZW5kRGF0ZVxuICAgICAgICBjb25zdCBzRGF0ZSA9IGRheWpzKHRoaXMuc2VydmVyRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgY29uc3QgZGF5c0NvdW50ID0gZGF5anModGhpcy5jYlBsYW5FbmREYXRlKS5kaWZmKHRoaXMuc2VydmVyRGF0ZSwgJ2RheScpXG4gICAgICAgIHRoaXMuY2JQbGFuRHVyYXRpb24gPSBkYXlzQ291bnQgPCAwID8gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSA6IGRheXNDb3VudCA+IDI5XG4gICAgICAgICAgPyBOc0NhcmRDb250ZW50LkFDQlBDb25zdC5TVUNDRVNTIDogTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuVVBDT01JTkdcbiAgICAgICAgaWYgKGFjYnAgJiYgdGhpcy5jYlBsYW5FbmREYXRlICYmIGFjYnAgPT09ICdjYlBsYW4nKSB7XG4gICAgICAgICAgdGhpcy5pc0FjYnBDb3Vyc2UgPSB0cnVlXG4gICAgICAgICAgY29uc3QgZURhdGUgPSBkYXlqcyh0aGlzLmNiUGxhbkVuZERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICAgICAgaWYgKGRheWpzKHNEYXRlKS5pc1NhbWVPckJlZm9yZShlRGF0ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RPYmogPSB7XG4gICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0VHlwZTogJ0NvdXJzZScsXG4gICAgICAgICAgICAgICAgICBjb250ZXh0SWQ6IHRoaXMuY291cnNlSUQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGVudFN2Yy5nZXRDb3Vyc2VLYXJtYVBvaW50cyhyZXF1ZXN0T2JqKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmtwTGlzdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHJlcy5rcExpc3RcbiAgICAgICAgICAgICAgICBpZiAocm93LmFkZGluZm8pIHtcbiAgICAgICAgICAgICAgICAgIGlmIChKU09OLnBhcnNlKHJvdy5hZGRpbmZvKS5BQ0JQKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2xhaW1lZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSB0cnVlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmFpc2VUZWxlbWV0ZXJ5Rm9yUHJvdmlkZXIocHJvdmlkZXJOYW1lOiBzdHJpbmcsIHByaXZpZGVySWQ6IHN0cmluZykge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIGlkOiAnYnRuLXByb3ZpZGVyJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBwcm92aWRlck5hbWUsXG4gICAgICAgIHR5cGU6IHByaXZpZGVySWQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWRFeHQ6ICdidG4tcHJvdmlkZXInLFxuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkNPTlRFTlQsXG4gICAgICB9KVxuXG4gIH1cblxuICByYWlzZVRlbGVtZXRyeSgpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBzdWJUeXBlOiAna2FybWFwb2ludHMtY2xhaW0nLFxuICAgICAgICBpZDogdGhpcy5jb3Vyc2VJRCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNvdXJzZUlELFxuICAgICAgICB0eXBlOiAnY291cnNlJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZEV4dDogJ2J0bi1hY2JwLWNsYWltJyxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5LQVJNQVBPSU5UUyxcbiAgICAgIH0pXG4gIH1cblxuICBvbkNsaWNrT2ZDbGFpbShldmVudDogYW55KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHVzZXJJZDogdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIsXG4gICAgICBjb3Vyc2VJZDogdGhpcy5jb3Vyc2VJRCxcbiAgICB9XG4gICAgdGhpcy5yYWlzZVRlbGVtZXRyeSgpXG4gICAgdGhpcy5jb250ZW50U3ZjLmNsYWltS2FybWFwb2ludHMocmVxdWVzdCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5pc0NsYWltZWQgPSB0cnVlXG4gICAgICB0aGlzLm9wZW5TbmFja2JhcignS2FybWEgcG9pbnRzIGFyZSBzdWNjZXNzZnVsbHkgY2xhaW1lZC4nKVxuICAgICAgLy8gdGhpcy5nZXRVc2VyRW5yb2xsbWVudExpc3QoKVxuICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ3NvbWV0aGluZyB3ZW50IHdyb25nLicpXG4gICAgfSlcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5yY0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucmNFbGVtLkJvdHRvbVBvcyA9IHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wICsgdGhpcy5yY0VsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcbiAgICAgIHRoaXMucmNFbGVtLm9mZlNldFRvcCA9IHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wXG4gICAgfVxuICAgIC8vIEdldCBUaW1lIGZvciB0aGUgYmF0Y2hcbiAgICB0aGlzLnRpbWVyVW5zdWJzY3JpYmUgPSB0aGlzLnRpbWVyU2VydmljZS5nZXRUaW1lckRhdGEoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSlcbiAgICAgIC5zdWJzY3JpYmUoKF90aW1lcjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGltZXIgPSBfdGltZXJcbiAgICAgIH0pXG4gIH1cblxuICBoYW5kbGVCcmVhZGNydW1icygpIHtcbiAgICBpZiAodGhpcy5oaXN0b3J5RGF0YSkge1xuICAgICAgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ1NlYXJjaCcpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNodXJsID0gYC9hcHAvZ2xvYmFsc2VhcmNoYFxuICAgICAgICBjb25zdCBxUGFyYW0gPSB7XG4gICAgICAgICAgcTogdGhpcy5oaXN0b3J5RGF0YS5wYXJhbSxcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnU2VhcmNoJywgdXJsOiBzZWFyY2h1cmwsIHF1ZXJ5UGFyYW1zOiBxUGFyYW0gfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ2NvbXBldGVuY3ktZGV0YWlscycpIHtcbiAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgL2FwcC9sZWFybi9icm93c2UtYnkvY29tcGV0ZW5jeS8ke3RoaXMuaGlzdG9yeURhdGEucGFyYW19YFxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLmJyZWFkY3J1bWJzID0geyB1cmw6ICdob21lJywgdGl0bGVzOiBbeyB0aXRsZTogdGhpcy5oaXN0b3J5RGF0YS5wYXJhbSwgdXJsOiBmaW5hbFVybCB9LCB7IHRpdGxlOiAnRGV0YWlscycsIHVybDogJ25vbmUnIH1dIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5oaXN0b3J5RGF0YS5wYXRoID09PSAnYWxsLUNCUCcpIHtcbiAgICAgICAgY29uc3QgZmluYWxVUkwgPSBgL2FwcC9sZWFybi9icm93c2UtYnkvcHJvdmlkZXIvJHt0aGlzLmhpc3RvcnlEYXRhLnBhcmFtfWBcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6IGBhbGwgQ0JQJ3NgLCB1cmw6IGZpbmFsVVJMIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdhbGwtY29tcGV0ZW5jaWVzJykge1xuICAgICAgICBjb25zdCBmaW5hbFVybCA9IGAvYXBwL2xlYXJuL2Jyb3dzZS1ieS9jb21wZXRlbmN5L2FsbC1jb21wZXRlbmNpZXNgXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnYWxsIGNvbXBldGVuY2llcycsIHVybDogZmluYWxVcmwgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ2N1cmF0ZWRDb2xsZWN0aW9ucycpIHtcbiAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgL2FwcC9jdXJhdGVkQ29sbGVjdGlvbnMvaG9tZWBcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6ICdjdXJhdGVkIGNvbGxlY3Rpb25zJywgdXJsOiBmaW5hbFVybCB9LCB7IHRpdGxlOiAnRGV0YWlscycsIHVybDogJ25vbmUnIH1dIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6ICdMZWFybicsIHVybDogJy9wYWdlL2xlYXJuJywgaWNvbjogJ3NjaG9vbCcgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5mcmFnbWVudCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBkb2N1bWVudCEucXVlcnlTZWxlY3RvcihgIyR7dGhpcy5mcmFnbWVudH1gKSEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogODAsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgfVxuICB9XG5cbiAgZ2V0IGVuYWJsZUFuYWx5dGljcygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XG4gICAgICByZXR1cm4gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ3RvY0FuYWx5dGljcycpXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IGlzUmVzb3VyY2UoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgY29uc3QgaXNSZXNvdXJjZSA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LktOT1dMRURHRV9BUlRJRkFDVCB8fFxuICAgICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRVxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRVxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICAgIHx8IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVFxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT05cbiAgICAgICAgfHwgISh0aGlzLmNvbnRlbnQuY2hpbGRyZW4gJiYgdGhpcy5jb250ZW50LmNoaWxkcmVuLmxlbmd0aClcbiAgICAgIGlmIChpc1Jlc291cmNlKSB7XG4gICAgICAgIHRoaXMubW9iaWxlQXBwc1N2Yy5zZW5kVmlld2VyRGF0YSh0aGlzLmNvbnRlbnQpXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNSZXNvdXJjZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBnZXRTdGFydERhdGUoKSB7XG4gICAgaWYgKHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhKSB7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgLy8gY29uc3QgYmF0Y2ggPSBfLmZpcnN0KF8uZmlsdGVyKHRoaXMuY29udGVudFsnYmF0Y2hlcyddLCB7IGJhdGNoSWQ6IHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgfSkgfHwgW10pXG4gICAgICBjb25zdCBiYXRjaCA9IHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhLmJhdGNoXG4gICAgICB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkID0gYmF0Y2guYmF0Y2hJZFxuICAgICAgaWYgKGJhdGNoICYmIHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQpIHtcbiAgICAgICAgdGhpcy5zdGFydERhdGUgPSAoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSlcbiAgICAgICAgLy8gY29uc3QgcGFyc2VkRGF0ZSA9IG1vbWVudCh0aGlzLnN0YXJ0RGF0ZSk7XG4gICAgICAgIC8vIGNvbnN0IGRhdGVPbmx5ID0gcGFyc2VkRGF0ZS5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICBjb25zdCBzdGFydERhdGVUaW1lID0gdGhpcy5zdGFydERhdGUgJiYgbmV3IERhdGUodGhpcy5zdGFydERhdGUpLmdldFRpbWUoKVxuICAgICAgICB0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgPSBzdGFydERhdGVUaW1lIC0gbm93XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgJiYgdGhpcy5zdGFydERhdGVEaWZmZXJlbmNlID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSlcbiAgICAgICAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoKHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSAlICgxMDAwICogNjAgKiA2MCAqIDI0KSkgLyAoMTAwMCAqIDYwICogNjApKVxuICAgICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKCh0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgJSAoMTAwMCAqIDYwICogNjApKSAvICgxMDAwICogNjApKVxuICAgICAgICAgIHJldHVybiAoYCR7ZGF5c30gRGF5cyA6ICR7aG91cnN9IEhvdXJzIDogJHttaW51dGVzfSBNaW51dGVzYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ05BJ1xuICAgICAgfVxuICAgICAgcmV0dXJuICdOQSdcbiAgICAgIC8vIGlmIChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpICYmIG1vbWVudChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpKS5pc0FmdGVyKCkpIHtcbiAgICAgIC8vICAgcmV0dXJuIG1vbWVudChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpKS5mcm9tKG5vdylcbiAgICAgIC8vIH1cbiAgICAgIC8vIGlmIChfLmdldChiYXRjaCwgJ2VuZERhdGUnKSAmJiBtb21lbnQoXy5nZXQoYmF0Y2gsICdlbmREYXRlJykpLmlzQmVmb3JlKCkpIHtcbiAgICAgIC8vICAgcmV0dXJuICdOQSdcbiAgICAgIC8vIH1cbiAgICAgIC8vIGlmIChzdGFydERhdGVUaW1lICYmIG1vbWVudChzdGFydERhdGVUaW1lKS5pc0FmdGVyKCkpICB7XG4gICAgICAvLyAgIHJldHVybiBtb21lbnQoc3RhcnREYXRlVGltZSkuZnJvbShub3cpXG4gICAgICAvLyB9XG4gICAgICAvLyBpZiAoZW5kRGF0ZVRpbWUgJiYgbW9tZW50KGVuZERhdGVUaW1lKS5pc0JlZm9yZSgpKSB7XG4gICAgICAvLyAgICAgcmV0dXJuICdOQSdcbiAgICAgIC8vICAgfVxuICAgICAgLy8gcmV0dXJuICdOQSdcbiAgICB9IHJldHVybiAnTkEnXG4gIH1cblxuICBnZXQgaXNCYXRjaEluUHJvZ3Jlc3MoKSB7XG4gICAgLy8gaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnRbJ2JhdGNoZXMnXSkge1xuICAgIC8vIGNvbnN0IGJhdGNoZXMgPSB0aGlzLmNvbnRlbnRbJ2JhdGNoZXMnXSBhcyBOc0NvbnRlbnQuSUJhdGNoXG4gICAgLy8gaWYgKHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQpIHtcbiAgICAvLyAgIC8vIGNvbnN0IG5vdyA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpXG4gICAgLy8gICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgIC8vICAgaWYgKHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQpIHtcbiAgICAvLyAgICAgY29uc3QgYmF0Y2ggPSBfLmZpcnN0KF8uZmlsdGVyKHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQsIHsgYmF0Y2hJZDogdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCB9KSB8fCBbXSlcbiAgICAvLyAgICAgaWYgKGJhdGNoKSB7XG4gICAgLy8gICAgICAgLy8gY29uc3Qgc3RhcnREYXRlID0gbW9tZW50KGJhdGNoLnN0YXJ0RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJylcbiAgICAvLyAgICAgICAvLyBjb25zdCBlbmREYXRlID0gYmF0Y2guZW5kRGF0ZSA/IG1vbWVudChiYXRjaC5lbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKSA6IG5vd1xuICAgIC8vICAgICAgIC8vIHJldHVybiAoXG4gICAgLy8gICAgICAgLy8gICAvLyBiYXRjaC5zdGF0dXMgJiZcbiAgICAvLyAgICAgICAvLyAgIG1vbWVudChzdGFydERhdGUpLmlzU2FtZU9yQmVmb3JlKG5vdylcbiAgICAvLyAgICAgICAvLyAgICYmIG1vbWVudChlbmREYXRlKS5pc1NhbWVPckFmdGVyKG5vdylcbiAgICAvLyAgICAgICAvLyApXG4gICAgLy8gICAgICAgdGhpcy5zdGFydERhdGUgPSBiYXRjaCAmJiAoXy5nZXQoYmF0Y2gsICdzdGFydFRpbWUnKSlcbiAgICAvLyAgICAgICB0aGlzLmVuZERhdGUgPSBiYXRjaCAmJiAoXy5nZXQoYmF0Y2gsICdlbmRUaW1lJykpXG4gICAgLy8gICAgICAgY29uc3QgZW5kRGF0ZVRpbWUgPSBuZXcgRGF0ZSh0aGlzLmVuZERhdGUpLmdldFRpbWUoKVxuICAgIC8vICAgICAgIHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPSBlbmREYXRlVGltZSAtIG5vd1xuICAgIC8vICAgICAgIGlmKHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPiAwKSB7XG4gICAgLy8gICAgICAgcmV0dXJuICBiYXRjaC5zdGF0dXNcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gZmFsc2VcbiAgICAvLyB9IHJldHVybiBmYWxzZVxuXG4gICAgaWYgKHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhKSB7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmVucm9sbGVkQ291cnNlRGF0YS5iYXRjaFxuICAgICAgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCA9IGJhdGNoLmJhdGNoSWRcbiAgICAgIGlmIChiYXRjaCAmJiB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkKSB7XG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gKF8uZ2V0KGJhdGNoLCAnc3RhcnREYXRlJykpXG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IChfLmdldChiYXRjaCwgJ2VuZERhdGUnKSlcbiAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZVRpbWUgPSB0aGlzLnN0YXJ0RGF0ZSAmJiBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgICAgbGV0IGVuZERhdGUgPSB0aGlzLmVuZERhdGUgJiYgbmV3IERhdGUodGhpcy5lbmREYXRlKVxuICAgICAgICAgIGVuZERhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KVxuICAgICAgICAgIGNvbnN0IGVuZERhdGVUaW1lID0gZW5kRGF0ZS5nZXRUaW1lKClcbiAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgPSBub3cgLSBzdGFydERhdGVUaW1lXG4gICAgICAgICAgdGhpcy5lbmREYXRlRGlmZmVyZW5jZSA9IGVuZERhdGVUaW1lIC0gbm93XG4gICAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPiAwICYmIHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSA+IDAgJiYgYmF0Y2guc3RhdHVzICE9PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cblxuXG4gIGdldFVzZXJSYXRpbmcoZmlyZVVwZGF0ZTogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUpIHtcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgfHwgJydcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSkge1xuICAgICAgICB0aGlzLnJhdGluZ1N2Yy5nZXRSYXRpbmcodGhpcy5jb250ZW50LmlkZW50aWZpZXIsIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnksIHRoaXMudXNlcklkKS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlczogYW55KSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LnJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIHRoaXMudXNlclJhdGluZyA9IHJlcy5yZXN1bHQucmVzcG9uc2VcbiAgICAgICAgICAgICAgaWYgKGZpcmVVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvY1N2Yy5jaGFuZ2VVcGRhdGVSZXZpZXdzKHRydWUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGVudFZpZXdFdmVudEZvck5ldENvcmUoJ3ZpZXcnKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignVVNFUiBSQVRJTkcgRkVUQ0ggRVJST1IgPicsIGVycilcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRTb3VyY2UgJiYgdGhpcy5jb250ZW50U291cmNlLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNDQpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VFbGxpcHNpcyA9IHRydWVcbiAgICAgIH1cbiAgICB9LCAyNTApXG4gIH1cblxuXG5cbiAgcHVibGljIGZldGNoVXNlcldGRm9yQmxlbmRlZCgpIHtcbiAgICBjb25zdCBhcHBsaWNhdGlvbklkcyA9ICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQubWFwKGUgPT4gZS5iYXRjaElkKSkgfHwgW11cbiAgICBjb25zdCByZXEgPSB7XG4gICAgICBhcHBsaWNhdGlvbklkcyxcbiAgICAgIHNlcnZpY2VOYW1lOiAnYmxlbmRlZHByb2dyYW0nLFxuICAgICAgbGltaXQ6IDEwMCxcbiAgICAgIG9mZnNldDogMCxcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRlbnRTdmMuZmV0Y2hCbGVuZGVkVXNlcldGKHJlcSkudGhlbihcbiAgICAgIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBsYXRlc3RXRiA9IF8ubWF4QnkoZGF0YS5yZXN1bHQuZGF0YVswXS53ZkluZm8sIChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZWwubGFzdFVwZGF0ZWRPbikuZ2V0VGltZSgpXG4gICAgICAgICAgfSlcbiAgICAgICAgICAvLyBsYXRlc3RXRi5jdXJyZW50U3RhdHVzID0gdGhpcy5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFSkVDVEVEXG4gICAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgdGhpcy5iYXRjaERhdGEhLndvcmtGbG93ID0ge1xuICAgICAgICAgICAgd2ZJbml0aWF0ZWQ6IHRydWUsXG4gICAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgIGJhdGNoOiB0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQuZmluZCgoZTogYW55KSA9PiBlLmJhdGNoSWQgPT09IGxhdGVzdFdGLmFwcGxpY2F0aW9uSWQpLFxuICAgICAgICAgICAgd2ZJdGVtOiBsYXRlc3RXRixcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50b2NTdmMuc2V0V0ZEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuaW5mbygnZmV0Y2hCbGVuZGVkVXNlcldGIGRhdGEgPT0gJywgZGF0YSlcbiAgICAgIH0sXG4gICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignQ09OVEVOVCBISVNUT1JZIEZFVENIIEVSUk9SID4nLCBlcnJvcilcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgcHVibGljIGNoZWNrSWZCYXRjaEV4aXN0cyhsYXRlc3Q6IGFueSkge1xuICAgIGlmICghdGhpcy5iYXRjaERhdGEgfHwgIXRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXRjaERhdGEuY29udGVudC5maW5kKGIgPT4gYi5iYXRjaElkID09PSBsYXRlc3QuYmF0Y2hJZClcbiAgfVxuXG4gIHB1YmxpYyBnZXRCYXRjaElkKCk6IHN0cmluZyB7XG4gICAgbGV0IGJhdGNoSWQgPSAnJ1xuICAgIGlmICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQpIHtcbiAgICAgICAgYmF0Y2hJZCA9IGJhdGNoLmJhdGNoSWRcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhdGNoSWRcbiAgfVxuXG5cbiAgcHVibGljIGhhbmRsZUF1dG9CYXRjaEFzc2lnbigpIHtcbiAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICB0aGlzLm5hdmlnYXRlVG9QbGF5ZXJQYWdlKCcnKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSB0cnVlXG4gICAgICB0aGlzLmNoYW5nZVRhYiA9ICF0aGlzLmNoYW5nZVRhYlxuICAgICAgdGhpcy5yYWlzZUVucm9sbFRlbGVtZXRyeSgpXG4gICAgICBpZiAodGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCkge1xuICAgICAgICB0aGlzLnJhaXNlRW5yb2xsVGVsZW1lbnRyeUZvclNha3NoYW1BSUdlbmVyYXRlZCgpXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCkge1xuICAgICAgICB0aGlzLnJhaXNlRW5yb2xsVGVsZW1lbnRyeUZvclNha3NoYW1BSUdlbmVyYXRlZCgpXG4gICAgICB9XG4gICAgICBjb25zdCBiYXRjaERhdGEgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5iYXRjaGVzICYmIHRoaXMuY29udGVudFJlYWREYXRhLmJhdGNoZXNbMF1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNKSB7XG4gICAgICAgIHRoaXMuYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNLCBiYXRjaERhdGEpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0pIHtcbiAgICAgICAgbGV0IG1vZGVyYXRlZEJhdGNoRGF0YTogYW55XG4gICAgICAgIGlmICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQubGVuZ3RoID4gMSkge1xuICAgICAgICAgIG1vZGVyYXRlZEJhdGNoRGF0YSA9IHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgJiYgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1vZGVyYXRlZEJhdGNoRGF0YSA9IHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudFswXVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0sIG1vZGVyYXRlZEJhdGNoRGF0YSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkxFQVJOSU5HX1BBVEhXQVkpIHtcbiAgICAgICAgdGhpcy5hdXRvRW5yb2xsTGVhcm5pbmdQYXRod2F5KGJhdGNoRGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXV0b0Fzc2lnbkVucm9sbCgpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29udGVudFZpZXdFdmVudEZvck5ldENvcmUoJ2Vucm9sbCcpXG4gIH1cblxuICBwdWJsaWMgYXV0b0Vucm9sbExlYXJuaW5nUGF0aHdheShiYXRjaERhdGE6IGFueSkge1xuICAgIGxldCBiYXRjaElkID0gYmF0Y2hEYXRhPy5iYXRjaElkXG4gICAgaWYgKGJhdGNoSWQpIHtcbiAgICAgIHRoaXMuY29udGVudFN2Yy5hdXRvRW5yb2xsTFAodGhpcy5jb250ZW50Py5pZGVudGlmaWVyKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9QbGF5ZXJQYWdlKGJhdGNoSWQpXG4gICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ1NvbWV0aGluZyB3ZW50IHdyb25nJylcbiAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbignTm8gYmFjdGhlcyBmb3VuZCcpXG4gICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhdXRvRW5yb2xsQ3VyYXRlZFByb2dyYW0ocHJvZ3JhbVR5cGU6IGFueSwgYmF0Y2hEYXRhOiBhbnkpIHtcbiAgICBpZiAoIWJhdGNoRGF0YSkge1xuICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbignTm8gYmFjdGhlcyBmb3VuZCcpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgbGV0IHVzZXJJZCA9ICcnXG4gICAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUgJiYgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkKSB7XG4gICAgICAgIHVzZXJJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZFxuICAgICAgfVxuICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHByb2dyYW1JZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgICAgLy8gYXMgb2Ygbm93IGN1cmF0ZWQgcHJvZ3JhbSBvbmx5IG9uZSBiYXRjaCBpcyBjb21pbmcgbmVlZCB0byBjaGVjayBhbmQgbW9kaWZ5XG4gICAgICAgICAgYmF0Y2hJZDogYmF0Y2hEYXRhPy5iYXRjaElkLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50U3ZjLmF1dG9Bc3NpZ25DdXJhdGVkQmF0Y2hBcGkocmVxLCBwcm9ncmFtVHlwZSkuc3Vic2NyaWJlKFxuICAgICAgICAoZGF0YTogTnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBpZiAocHJvZ3JhbVR5cGUgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0gJiYgYmF0Y2hEYXRhLmVuZERhdGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5iYXRjaERhdGEgPSB7XG4gICAgICAgICAgICAgICAgY29udGVudDogW2JhdGNoRGF0YV0sXG4gICAgICAgICAgICAgICAgZW5yb2xsZWQ6IHRydWUsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJDaGFuZ2VIYW5kbGVyKHRydWUpXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0VXNlckVucm9sbG1lbnRMaXN0KClcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgICAgICAgICB9LCAyMDAwKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUGxheWVyUGFnZShyZXEucmVxdWVzdC5iYXRjaElkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKF9lcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ19lcnJvcicsIF9lcnJvcilcbiAgICAgICAgICAvLyBpZihfZXJyb3IgJiYgX2Vycm9yLmVycm9yICYmIF9lcnJvci5lcnJvci5wYXJhbXMgJiYgX2Vycm9yLmVycm9yLnBhcmFtcy5lcnIgJiYgX2Vycm9yLmVycm9yLnBhcmFtcy5lcnIuZXJybXNnKSB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKF8uZ2V0KF9lcnJvciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKSB8fCAnUGxlYXNlIHRyeSBhZ2FpbiBsYXRlcicpXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXV0b0Fzc2lnbkVucm9sbCgpIHtcbi8qKioqKioqKioqKioqICDinKggV2luZHN1cmYgQ29tbWFuZCDirZAgICoqKioqKioqKioqKiovXG4gIC8qKlxuICAgKiBJZiB0aGUgdXNlciBpcyBub3QgZW5yb2xsZWQgaW4gdGhlIGNvdXJzZSwgYXV0by1hc3NpZ25zIGEgYmF0Y2ggYW5kIG5hdmlnYXRlcyB0byB0aGUgcGxheWVyIHBhZ2UuXG4gICAqIElmIHRoZSB1c2VyIGlzIGFscmVhZHkgZW5yb2xsZWQsIGRvZXMgbm90aGluZy5cbiAgICovXG4vKioqKioqKiAgNmQ5NGM2NDYtMjU0Yy00NGQ2LWE3YzMtOTBiZGI5NTA3MzE4ICAqKioqKioqLyAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmMuYXV0b0Fzc2lnbkJhdGNoQXBpKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyLCB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UpLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGRhdGEuY29udGVudCxcbiAgICAgICAgICAgIGVucm9sbGVkOiB0cnVlLFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYXRjaElkID0gdGhpcy5nZXRCYXRjaElkKClcbiAgICAgICAgICBpZiAoYmF0Y2hJZCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUGxheWVyUGFnZShiYXRjaElkKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICAoX2Vycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXy5nZXQoX2Vycm9yLCAnZXJyb3IucGFyYW1zLmVycm1zZycpIHx8ICdQbGVhc2UgdHJ5IGFnYWluIGxhdGVyJylcbiAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmF2aWdhdGVUb1BsYXllclBhZ2UoYmF0Y2hJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gdHJ1ZVxuICAgICAgbGV0IGZpcnN0UGxheWFibGVDb250ZW50XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UuaWRlbnRpZmllcikge1xuICAgICAgICBmaXJzdFBsYXlhYmxlQ29udGVudCA9IHRoaXMuY29udGVudFN2Yy5nZXRGaXJzdENoaWxkSW5IaWVyYXJjaHkodGhpcy5jb250ZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZmV0Y2ggaGllcmFyY2h5IGZvciB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UgaW4gcG9wdXAgZmlyc3QsIHRoZW4gZ2V0IGZpcnN0IHBsYXlhYmxlIGNvbnRlbnQgYW5kIHJlZGlyZWN0IHRvIGl0XG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGllcmFyY2h5KHRoaXMuc2VsZWN0ZWRMYW5ndWFnZS5pZGVudGlmaWVyKVxuICAgICAgICBmaXJzdFBsYXlhYmxlQ29udGVudCA9IHRoaXMuY29udGVudFN2Yy5nZXRGaXJzdENoaWxkSW5IaWVyYXJjaHkodGhpcy5jb250ZW50KVxuICAgICAgfVxuICAgICAgbGV0IHByaW1hcnlDYXRlZ29yeVxuICAgICAgaWYgKHRoaXMuY29udGVudC5zZWN1cmVTZXR0aW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByaW1hcnlDYXRlZ29yeSA9ICdMZWFybmluZyBSZXNvdXJjZSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByaW1hcnlDYXRlZ29yeSA9IGZpcnN0UGxheWFibGVDb250ZW50LnByaW1hcnlDYXRlZ29yeSB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5XG4gICAgICB9XG4gICAgICB0aGlzLmZpcnN0UmVzb3VyY2VMaW5rID0gdGhpcy5nZXRSZXN1bWVVcmwoZmlyc3RQbGF5YWJsZUNvbnRlbnQsIGJhdGNoSWQsIHByaW1hcnlDYXRlZ29yeSlcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHt0aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnVybH1gXSwgeyBxdWVyeVBhcmFtczogeyAuLi50aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnF1ZXJ5UGFyYW1zLCBmcm9tQUlUdXRvcjogdGhpcy5mcm9tQUlUdXRvciB9IH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZldGNoQmF0Y2hEZXRhaWxzKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgIGNvdXJzZUlkOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcbiAgICAgICAgICAgIHN0YXR1czogWycwJywgJzEnLCAnMiddLFxuICAgICAgICAgICAgLy8gY3JlYXRlZEJ5OiAnZmNhMjkyNWYtMWVlZS00NjU0LTkxNzctZmVjZTNmZDZhZmM5JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvcnRfYnk6IHsgY3JlYXRlZERhdGU6ICdkZXNjJyB9LFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50U3ZjLmZldGNoQ291cnNlQmF0Y2hlcyhyZXEpLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IGRhdGFcbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YS5lbnJvbGxlZCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy50b2NTdmMuc2V0QmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgICAgICAgIHRoaXMucm91dGVyQ2hhbmdlSGFuZGxlcihmYWxzZSlcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignQ09OVEVOVCBISVNUT1JZIEZFVENIIEVSUk9SID4nLCBlcnJvcilcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuXG4gIHNjcm9sbFRvVG9wKCkge1xuICAgIChmdW5jdGlvbiBzbW9vdGhzY3JvbGwoKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2Nyb2xsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcFxuICAgICAgaWYgKGN1cnJlbnRTY3JvbGwgPiAwKSB7XG4gICAgICAgIC8vIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc21vb3Roc2Nyb2xsKVxuICAgICAgICAvLyB3aW5kb3cuc2Nyb2xsVG8oMCwgY3VycmVudFNjcm9sbCAtIChjdXJyZW50U2Nyb2xsIC8gNSkpXG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KSgpXG4gIH1cblxuICBwdWJsaWMgZ2V0Q29tcGV0ZW5jaWVzKGNvbXBldGVuY2llczogYW55KSB7XG4gICAgY29uc3QgY29tcGV0ZW5jaWVzQXJyYXkgPSBKU09OLnBhcnNlKGNvbXBldGVuY2llcylcbiAgICBjb25zdCBjb21wZXRlbmN5U3RyaW5nQXJyYXk6IGFueVtdID0gW11cbiAgICBjb21wZXRlbmNpZXNBcnJheS5tYXAoKGM6IGFueSkgPT4ge1xuICAgICAgY29tcGV0ZW5jeVN0cmluZ0FycmF5LnB1c2goYy5uYW1lKVxuICAgIH0pXG4gICAgcmV0dXJuIGNvbXBldGVuY3lTdHJpbmdBcnJheVxuICB9XG5cbiAgZ2V0IHNob3dJbnRyYW5ldE1zZygpIHtcbiAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hvd0ludHJhbmV0TWVzc2FnZVxuICB9XG5cbiAgZ2V0IHNob3dTdGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy50b2NTdmMuc2hvd1N0YXJ0QnV0dG9uKHRoaXMuY29udGVudClcbiAgfVxuXG4gIGdldCBpc1Bvc3RBc3Nlc3NtZW50KCk6IGJvb2xlYW4ge1xuICAgIGlmICghKHRoaXMudG9jQ29uZmlnICYmIHRoaXMudG9jQ29uZmlnLnBvc3RBc3Nlc3NtZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJlxuICAgICAgICB0aGlzLmNvbnRlbnQubGVhcm5pbmdNb2RlID09PSAnSW5zdHJ1Y3Rvci1MZWQnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IGlzTW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnV0aWxpdHlTdmMuaXNNb2JpbGVcbiAgfVxuXG4gIGdldCBzaG93U3VidGl0bGVPbkJhbm5lcigpIHtcbiAgICByZXR1cm4gdGhpcy50b2NTdmMuc3VidGl0bGVPbkJhbm5lcnNcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVFbnJvbGxtZW50RW5kRGF0ZShiYXRjaDogYW55KSB7XG4gICAgY29uc3QgZW5yb2xsbWVudEVuZERhdGUgPSBkYXlqcyhfLmdldChiYXRjaCwgJ2Vucm9sbG1lbnRFbmREYXRlJykpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgY29uc3Qgc3lzdGVtRGF0ZSA9IGRheWpzKClcbiAgICByZXR1cm4gZW5yb2xsbWVudEVuZERhdGUgPyBkYXlqcyhlbnJvbGxtZW50RW5kRGF0ZSkuaXNCZWZvcmUoc3lzdGVtRGF0ZSkgOiBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuU25hY2tiYXIocHJpbWFyeU1zZzogc3RyaW5nLCBkdXJhdGlvbjogbnVtYmVyID0gNTAwMCkge1xuICAgIHRoaXMuc25hY2tCYXIub3BlbihwcmltYXJ5TXNnLCAnWCcsIHtcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0pXG4gIH1cblxuICBnZXQgc2hvd0luc3RydWN0b3JMZWRNc2coKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc2hvd0FjdGlvbkJ1dHRvbnMgJiZcbiAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgdGhpcy5jb250ZW50LmxlYXJuaW5nTW9kZSA9PT0gJ0luc3RydWN0b3ItTGVkJyAmJlxuICAgICAgIXRoaXMuY29udGVudC5jaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICF0aGlzLmNvbnRlbnQuYXJ0aWZhY3RVcmxcbiAgICApXG4gIH1cblxuICBnZXQgaXNIZWFkZXJIaWRkZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXNvdXJjZSAmJiB0aGlzLmNvbnRlbnQgJiYgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybC5sZW5ndGhcbiAgfVxuXG4gIGdldCBzaG93QWN0aW9uQnV0dG9ucygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgIT09ICd3YWl0JyAmJlxuICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICB0aGlzLmNvbnRlbnQuc3RhdHVzICE9PSAnRGVsZXRlZCcgJiZcbiAgICAgIHRoaXMuY29udGVudC5zdGF0dXMgIT09ICdFeHBpcmVkJ1xuICAgIClcbiAgfVxuXG4gIGdldCBzaG93QnV0dG9uQ29udGFpbmVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9PT0gJ2dyYW50JyAmJlxuICAgICAgISh0aGlzLmlzTW9iaWxlICYmIHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaXNJbkludHJhbmV0KSAmJlxuICAgICAgIShcbiAgICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICAgIHRoaXMuY29udGVudC5jb250ZW50VHlwZSA9PT0gJ0NvdXJzZScgJiZcbiAgICAgICAgdGhpcy5jb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAhdGhpcy5jb250ZW50LmFydGlmYWN0VXJsXG4gICAgICApICYmXG4gICAgICAhKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUgPT09ICdSZXNvdXJjZScgJiYgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybClcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGdldFJlc3VtZURhdGFGcm9tTGlzdCh0eXBlPzogc3RyaW5nKTogYW55IHwgdm9pZCB7XG4gICAgY29uc3QgcmVzdW1lQ29weSA9IFsuLi50aGlzLnJlc3VtZURhdGFdXG4gICAgaWYgKHJlc3VtZUNvcHkgJiYgcmVzdW1lQ29weS5sZW5ndGgpIHtcbiAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG5cbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSByZXN1bWVDb3B5ICYmIHJlc3VtZUNvcHkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gICAgICAgICAgbmV3IERhdGUoYi5sYXN0QWNjZXNzVGltZSkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYS5sYXN0QWNjZXNzVGltZSkuZ2V0VGltZSgpKS5zaGlmdCgpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWRlbnRpZmllcjogbGFzdEl0ZW0uY29udGVudElkLFxuICAgICAgICAgIG1pbWVUeXBlOiBsYXN0SXRlbS5wcm9ncmVzc2RldGFpbHMgJiYgbGFzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBmaXJzdEl0ZW0gPSByZXN1bWVDb3B5ICYmIHJlc3VtZUNvcHkubGVuZ3RoICYmIHJlc3VtZUNvcHlbMF1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkZW50aWZpZXI6IGZpcnN0SXRlbS5jb250ZW50SWQsXG4gICAgICAgIG1pbWVUeXBlOiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzICYmIGZpcnN0SXRlbS5wcm9ncmVzc2RldGFpbHMubWltZVR5cGUsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fVxuICB9XG5cbiAgcHJpdmF0ZSBtb2RpZnlTZW5zaWJsZUNvbnRlbnRSYXRpbmcoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZyAmJlxuICAgICAgdHlwZW9mIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nICE9PSAnbnVtYmVyJ1xuICAgICkge1xuICAgICAgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgPSAodGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgYXMgYW55KVt0aGlzLmNvbmZpZ1N2Yy5yb290T3JnIHx8ICcnXVxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC50b3RhbFJhdGluZyAmJiB0eXBlb2YgdGhpcy5jb250ZW50LnRvdGFsUmF0aW5nICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5jb250ZW50LnRvdGFsUmF0aW5nID0gKHRoaXMuY29udGVudC50b3RhbFJhdGluZyBhcyBhbnkpW3RoaXMuY29uZmlnU3ZjLnJvb3RPcmcgfHwgJyddXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZWFybmluZ1VybHMoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5pc1ByYWN0aWNlVmlzaWJsZSA9IEJvb2xlYW4oXG4gICAgICAgIHRoaXMudG9jU3ZjLmZpbHRlclRvYyh0aGlzLmNvbnRlbnQsIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuUFJBQ1RJQ0UpLFxuICAgICAgKVxuXG4gICAgICB0aGlzLmlzQXNzZXNzVmlzaWJsZSA9IEJvb2xlYW4oXG4gICAgICAgIHRoaXMudG9jU3ZjLmZpbHRlclRvYyh0aGlzLmNvbnRlbnQsIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuQVNTRVNTKSxcbiAgICAgIClcblxuICAgICAgY29uc3QgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgIGxldCBwcmltYXJ5Q2F0ZWdvcnlcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2VjdXJlU2V0dGluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSAnTGVhcm5pbmcgUmVzb3VyY2UnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSBmaXJzdFBsYXlhYmxlQ29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeVxuICAgICAgfVxuICAgICAgdGhpcy5maXJzdFJlc291cmNlTGluayA9IHRoaXMuZ2V0UmVzdW1lVXJsKGZpcnN0UGxheWFibGVDb250ZW50LCBudWxsLCBwcmltYXJ5Q2F0ZWdvcnkpXG5cbiAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgLy8gaWYgKGZpcnN0UGxheWFibGVDb250ZW50Lm9wdGlvbmFsUmVhZGluZyAmJiBmaXJzdFBsYXlhYmxlQ29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdMZWFybmluZyBSZXNvdXJjZScpIHtcbiAgICAgIC8vICAgdGhpcy51cGRhdGVQcm9ncmVzcygyLCBmaXJzdFBsYXlhYmxlQ29udGVudC5pZGVudGlmaWVyKVxuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXNzaWduUGF0aEFuZFVwZGF0ZUJhbm5lcih1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSB1cmwuc3BsaXQoJy8nKS5wb3AoKVxuICAgIGlmIChwYXRoICYmIHRoaXMudmFsaWRQYXRocy5oYXMocGF0aCkpIHtcbiAgICAgIHRoaXMucm91dGVQYXRoID0gcGF0aFxuICAgICAgdGhpcy51cGRhdGVCYW5uZXJVcmwoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQmFubmVyVXJsKCkge1xuICAgIGlmICh0aGlzLmJhbm5lcnMpIHtcbiAgICAgIHRoaXMuYmFubmVyVXJsID0gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFxuICAgICAgICBgdXJsKCR7dGhpcy5iYW5uZXJzW3RoaXMucm91dGVQYXRoXX0pYCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwbGF5SW50cm9WaWRlbygpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmRpYWxvZy5vcGVuKEFwcFRvY0RpYWxvZ0ludHJvVmlkZW9Db21wb25lbnQsIHtcbiAgICAgICAgZGF0YTogdGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvLFxuICAgICAgICBoZWlnaHQ6ICczNTBweCcsXG4gICAgICAgIHdpZHRoOiAnNjIwcHgnLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBnZXQgc2FuaXRpemVkSW50cm9kdWN0b3J5VmlkZW9JY29uKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvSWNvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShgdXJsKCR7dGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvSWNvbn0pYClcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hFeHRlcm5hbENvbnRlbnRBY2Nlc3MoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQucmVnaXN0cmF0aW9uVXJsKSB7XG4gICAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgICB0aGlzLmV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzID0gJ2ZldGNoaW5nJ1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBmYWxzZVxuICAgICAgICB0aGlzLnRvY1N2Yy5mZXRjaEV4dGVybmFsQ29udGVudEFjY2Vzcyh0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikuc3Vic2NyaWJlKFxuICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gZGF0YS5oYXNBY2Nlc3NcbiAgICAgICAgICB9LFxuICAgICAgICAgIF9lcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLmV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBmYWxzZVxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxDb250ZW50RmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFJhdGluZ0ljb24ocmF0aW5nSW5kZXg6IG51bWJlcik6ICdzdGFyJyB8ICdzdGFyX2JvcmRlcicgfCAnc3Rhcl9oYWxmJyB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZykge1xuICAgICAgY29uc3QgYXZnUmF0aW5nID0gdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmdcbiAgICAgIGNvbnN0IHJhdGluZ0Zsb29yID0gTWF0aC5mbG9vcihhdmdSYXRpbmcpXG4gICAgICBpZiAocmF0aW5nSW5kZXggPD0gcmF0aW5nRmxvb3IpIHtcbiAgICAgICAgcmV0dXJuICdzdGFyJ1xuICAgICAgfVxuICAgICAgaWYgKHJhdGluZ0Zsb29yID09PSByYXRpbmdJbmRleCAtIDEgJiYgYXZnUmF0aW5nICUgMSA+IDApIHtcbiAgICAgICAgcmV0dXJuICdzdGFyX2hhbGYnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnc3Rhcl9ib3JkZXInXG4gIH1cblxuICBwcml2YXRlIGNoZWNrUmVnaXN0cmF0aW9uU3RhdHVzKCkge1xuICAgIGNvbnN0IHNvdXJjZSA9ICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnNvdXJjZVNob3J0TmFtZSkgfHwgJydcbiAgICBpZiAoXG4gICAgICAhdGhpcy5mb3JQcmV2aWV3ICYmXG4gICAgICAhdGhpcy5pc1JlZ2lzdHJhdGlvblN1cHBvcnRlZCAmJlxuICAgICAgdGhpcy5jaGVja1JlZ2lzdHJhdGlvblNvdXJjZXMuaGFzKHNvdXJjZSlcbiAgICApIHtcbiAgICAgIHRoaXMuY29udGVudFN2Y1xuICAgICAgICAuZ2V0UmVnaXN0cmF0aW9uU3RhdHVzKHNvdXJjZSlcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICBpZiAocmVzLmhhc0FjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPSAnZ3JhbnQnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzID0gJ3JlamVjdCdcbiAgICAgICAgICAgIGlmIChyZXMucmVnaXN0cmF0aW9uVXJsICYmIHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQucmVnaXN0cmF0aW9uVXJsID0gcmVzLnJlZ2lzdHJhdGlvblVybFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKF9lcnIgPT4geyB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9ICdncmFudCdcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZVF1ZXJ5KHR5cGU6ICdSRVNVTUUnIHwgJ1NUQVJUX09WRVInIHwgJ1NUQVJUJyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGlmICh0aGlzLmZpcnN0UmVzb3VyY2VMaW5rICYmICh0eXBlID09PSAnU1RBUlQnIHx8IHR5cGUgPT09ICdTVEFSVF9PVkVSJykpIHtcbiAgICAgIGxldCBxUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAuLi50aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnF1ZXJ5UGFyYW1zLFxuICAgICAgICB2aWV3TW9kZTogdHlwZSxcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZXh0SWQgJiYgdGhpcy5jb250ZXh0UGF0aCkge1xuICAgICAgICBxUGFyYW1zID0ge1xuICAgICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgICAgY29sbGVjdGlvbklkOiB0aGlzLmNvbnRleHRJZCxcbiAgICAgICAgICBjb2xsZWN0aW9uVHlwZTogdGhpcy5jb250ZXh0UGF0aCxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgICBkZWxldGUgcVBhcmFtcy52aWV3TW9kZVxuICAgICAgfVxuICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLmNoYW5uZWxJZCxcbiAgICAgIH1cbiAgICAgIHJldHVybiBxUGFyYW1zXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YUxpbmsgJiYgdHlwZSA9PT0gJ1JFU1VNRScpIHtcbiAgICAgIGxldCBxUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAuLi50aGlzLnJlc3VtZURhdGFMaW5rLnF1ZXJ5UGFyYW1zLFxuICAgICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgICAgdmlld01vZGU6ICdSRVNVTUUnLFxuICAgICAgICAvLyBjb3Vyc2VOYW1lOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQubmFtZSA6ICcnLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsXG4gICAgICB9XG4gICAgICByZXR1cm4gcVBhcmFtc1xuICAgIH1cbiAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzSW5JRnJhbWUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgb3BlbkZlZWRiYWNrRGlhbG9nKGNvbnRlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29udGVudFJhdGluZ1YyRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzc2OHB4JyxcbiAgICAgIGRhdGE6IHsgY29udGVudCwgdXNlcklkOiB0aGlzLnVzZXJJZCwgdXNlclJhdGluZzogdGhpcy51c2VyUmF0aW5nIH0sXG4gICAgfSlcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5nZXRVc2VyUmF0aW5nKHRydWUpXG4gICAgICAgIC8vIHRoaXMuZ2V0VXNlckVucm9sbG1lbnRMaXN0KClcbiAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgICAgdGhpcy5yZXNldFJhdGluZ3NTZXJ2aWNlLnNldFJhdGluZ1NlcnZpY2VVcGRhdGUodHJ1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlUHJvZ3Jlc3Moc3RhdHVzOiBudW1iZXIsIHJlc291cmNlSWQ6IGFueSkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zLmlkID9cbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zLmlkIDogJydcbiAgICBjb25zdCBiYXRjaElkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5iYXRjaElkID9cbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA6ICcnXG4gICAgY29uc3QgaXNQcmVBc3Nlc3NtZW50ID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5wcmVBc3Nlc3NtZW50XG4gICAgaWYgKGlzUHJlQXNzZXNzbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMudmlld2VyU3ZjXG4gICAgICAgIC5yZWFsVGltZVByb2dyZXNzVXBkYXRlRm9yUHJlQXNzZXNzbWVudFF1aXoocmVzb3VyY2VJZCwgc3RhdHVzKVxuXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZpZXdlclN2Yy5yZWFsVGltZVByb2dyZXNzVXBkYXRlUXVpeihyZXNvdXJjZUlkLCBjb2xsZWN0aW9uSWQsIGJhdGNoSWQsIHN0YXR1cylcbiAgfVxuXG4gIGdldFByb2dyYW1EdXJhdGlvbihiYXRjaERhdGE6IGFueSkge1xuICAgIGlmIChiYXRjaERhdGEpIHtcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGRheWpzKGRheWpzKGJhdGNoRGF0YS5zdGFydERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpKVxuICAgICAgY29uc3QgZW5kRGF0ZSA9IGRheWpzKGRheWpzKGJhdGNoRGF0YS5lbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSlcbiAgICAgIC8vIGFkZGluZyAxIHRvIGluY2x1ZGUgdGhlIHN0YXJ0IGRhdGVcbiAgICAgIHJldHVybiAoZW5kRGF0ZS5kaWZmKHN0YXJ0RGF0ZSwgJ2RheXMnKSArIDEpXG4gICAgfVxuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgd2l0aGRyYXdPckVucm9sbChkYXRhOiBzdHJpbmcpIHtcbiAgICBpZiAoZGF0YSA9PT0gTnNDb250ZW50LldGQmxlbmRlZFByb2dyYW1TdGF0dXMuSU5JVElBVEUpIHtcbiAgICAgIHRoaXMuZmV0Y2hVc2VyV0ZGb3JCbGVuZGVkKClcbiAgICB9XG4gIH1cblxuXG5cbiAgaGFuZGxlQ2FwaXRhbGl6ZShzdHI6IHN0cmluZywgdHlwZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gJydcbiAgICBpZiAoc3RyKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ25hbWUnKSB7XG4gICAgICAgIHJldHVyblZhbHVlID0gc3RyLnNwbGl0KCcgJykubWFwKF9zdHIgPT4ge1xuICAgICAgICAgIHJldHVybiBfc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgX3N0ci5zbGljZSgxKVxuICAgICAgICB9KS5qb2luKCcgJylcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgcmV0dXJuVmFsdWUgPSBzdHIgJiYgKHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVyblZhbHVlXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUGFyc2VKc29uRGF0YShzOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkU3RyaW5nID0gSlNPTi5wYXJzZShzKVxuICAgICAgcmV0dXJuIHBhcnNlZFN0cmluZ1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTmF2aWdhdGVUb1Jldmlld3MoKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudFRvVmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXdDb250YWluZXInKSBhcyBhbnlcblxuICAgIGlmIChlbGVtZW50VG9WaWV3KSB7XG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICB0b3A6IGVsZW1lbnRUb1ZpZXcub2Zmc2V0VG9wLFxuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJhaXNlQ2VydEludHJlYWN0VGVsZW1ldHJ5KCkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFR5cGVzLkNMSUNLLFxuICAgICAgICBpZDogJ3ZpZXctY2VydGlmaWNhdGUnLFxuICAgICAgICBzdWJUeXBlOiBXc0V2ZW50cy5FbnVtSW50ZXJhY3RTdWJUeXBlcy5DRVJUSUZJQ0FURSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNlcnRJZCwgICAvLyBpZCBvZiB0aGUgY2VydGlmaWNhdGVcbiAgICAgICAgdHlwZTogV3NFdmVudHMuRW51bUludGVyYWN0U3ViVHlwZXMuQ0VSVElGSUNBVEUsXG4gICAgICB9KVxuICB9XG5cbiAgdHJhbnNsYXRlTGFiZWxzKGxhYmVsOiBzdHJpbmcsIHR5cGU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmxhbmd0cmFuc2xhdGlvbnMudHJhbnNsYXRlTGFiZWwobGFiZWwsIHR5cGUsICcnKVxuICB9XG5cblxuXG4gIGdldExhc3RQbGF5ZWRSZXNvdXJjZSgpIHtcbiAgICBsZXQgZmlyc3RQbGF5YWJsZUNvbnRlbnRcbiAgICBsZXQgcmVzdW1lRGF0YVYyOiBhbnlcbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhICYmIHRoaXMucmVzdW1lRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuY29udGVudCkge1xuICAgICAgaWYgKHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KCdzdGFydCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgpXG4gICAgICB9XG4gICAgICB0aGlzLmV4cGFuZFRoZVBhdGgocmVzdW1lRGF0YVYyLmlkZW50aWZpZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgICAgdGhpcy5leHBhbmRUaGVQYXRoKGZpcnN0UGxheWFibGVDb250ZW50LmlkZW50aWZpZXIpXG5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBhbmRUaGVQYXRoKHJlc291cmNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgcmVzb3VyY2VJZCkge1xuICAgICAgY29uc3QgcGF0aCA9IHRoaXMudXRpbGl0eVN2Yy5nZXRQYXRoKHRoaXMuY29udGVudCwgcmVzb3VyY2VJZClcbiAgICAgIHRoaXMucGF0aFNldCA9IG5ldyBTZXQocGF0aC5tYXAoKHU6IHsgaWRlbnRpZmllcjogYW55IH0pID0+IHUuaWRlbnRpZmllcikpXG4gICAgfVxuICB9XG5cbiAgcmFpc2VFbnJvbGxUZWxlbWV0cnkoKSB7XG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgc3ViVHlwZTogJ2Vucm9sbCcsXG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICAgIHR5cGU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZEV4dDogYGJ0bi1lbnJvbGxgLFxuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkNPTlRFTlQsXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgcmFpc2VFbnJvbGxUZWxlbWVudHJ5Rm9yU2Frc2hhbUFJR2VuZXJhdGVkKCkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIHN1YlR5cGU6ICdlbnJvbGwnLFxuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgaWQ6IHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQsXG4gICAgICAgICAgdmVyOiBcIjEuMFwiLFxuICAgICAgICAgIHR5cGU6IFwiaWdvdC1haVwiXG4gICAgICAgIH0sXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICAgIHR5cGU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZDogYC9hcHAvdG9jLyR7dGhpcy5jb250ZW50Py5pZGVudGlmaWVyfS9vdmVydmlld19idG4tZW5yb2xsYCxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5DT05URU5ULFxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIG9uQ2xpY2tPZlNoYXJlKCkge1xuICAgIHRoaXMuZW5hYmxlU2hhcmUgPSB0cnVlXG4gICAgdGhpcy5yYWlzZVRlbGVtZXRyeUZvclNoYXJlKCdzaGFyZUNvbnRlbnQnKVxuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUgKi9cbiAgcmFpc2VUZWxlbWV0cnlGb3JTaGFyZShzdWJUeXBlOiBhbnkpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBzdWJUeXBlLFxuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgICB0eXBlOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5IDogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWRFeHQ6IGBidG4tJHtzdWJUeXBlfWAsXG4gICAgICAgIG1vZHVsZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeW1vZHVsZXMuQ09OVEVOVCxcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICByZXNldEVuYWJsZVNoYXJlKCkge1xuICAgIHRoaXMuZW5hYmxlU2hhcmUgPSBmYWxzZVxuICB9XG5cbiAgdHJhbnNsYXRlTGFiZWwobGFiZWw6IHN0cmluZywgdHlwZTogYW55KSB7XG4gICAgaWYgKGxhYmVsICYmIHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd0cmFuc2xhdGlvbnMudHJhbnNsYXRlTGFiZWwobGFiZWwsIHR5cGUsICcnKVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnJvdXRlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMuYmF0Y2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYmF0Y2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5iYXRjaERhdGFTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYmF0Y2hEYXRhU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgdGhpcy50b2NTdmMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnbm9uZSdcbiAgICBpZiAodGhpcy5yb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnRpbWVyVW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMudGltZXJVbnN1YnNjcmliZS51bnN1YnNjcmliZSgpXG4gICAgfVxuICB9XG5cbiAgcHJvZ3JhbUVucm9sbENhbGwoYmF0Y2hEYXRhOiBhbnkpIHtcbiAgICB0aGlzLmF1dG9FbnJvbGxDdXJhdGVkUHJvZ3JhbShOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNLCBiYXRjaERhdGEpXG4gIH1cblxuICByYWlzZVRlbGVtZXRyeUZvclB1YmxpYygkZXZlbnQ6IGFueSkge1xuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBmaXJzdCBwcmV2ZW50IG5hdmlnYXRpb24gdG8gcGxheWVyIHBhZ2VcbiAgICBjb25zdCBzaG91bGRQcmV2ZW50TmF2aWdhdGlvbiA9IHRoaXMuc2hvdWxkU2hvd1N1cnZleVBvcHVwKClcbiAgICBpZiAoc2hvdWxkUHJldmVudE5hdmlnYXRpb24pIHtcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBpZDogXCJ2aWV3LWFzc2Vzc21lbnRcIixcbiAgICAgICAgc3ViVHlwZTogXCJhbm9ueW1vdXMtYXNzZXNzbWVudFwiLFxuICAgICAgfSwge30sXG4gICAgICB7XG4gICAgICAgIG1vZHVsZTogJ0xhbmRpbmcgUGFnZScsXG4gICAgICB9KVxuXG4gICAgaWYgKHNob3VsZFByZXZlbnROYXZpZ2F0aW9uKSB7XG4gICAgICAvLyBQcmVwYXJlIG5hdmlnYXRpb24gZGV0YWlsc1xuICAgICAgY29uc3QgbmF2aWdhdGlvblVybCA9ICh0aGlzLnJlc3VtZURhdGEgJiYgIXRoaXMuY2VydERhdGEpID8gdGhpcy5yZXN1bWVEYXRhTGluaz8udXJsIDogdGhpcy5maXJzdFJlc291cmNlTGluaz8udXJsXG4gICAgICBjb25zdCBxdWVyeVBhcmFtcyA9ICh0aGlzLnJlc3VtZURhdGEgJiYgIXRoaXMuY2VydERhdGEpID8gdGhpcy5nZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IHRoaXMuZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVxuXG4gICAgICAvLyBPcGVuIHN1cnZleSBwb3B1cCBkaXJlY3RseSB3aXRoIG5hdmlnYXRpb24gZGV0YWlsc1xuICAgICAgaWYgKG5hdmlnYXRpb25VcmwpIHtcbiAgICAgICAgdGhpcy5vcGVuUHVibGljU3VydmV5UG9wdXAobmF2aWdhdGlvblVybCwgcXVlcnlQYXJhbXMpXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBzaG91bGRTaG93U3VydmV5UG9wdXAoKTogYm9vbGVhbiB7XG4gICAgLy8gU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3Igc3VydmV5IHBvcHVwIGNvbmRpdGlvblxuICAgIC8vIENoZWNrIGlmIGl0J3MgcHVibGljIHZpZXcgYW5kIGNvbnRlbnQgaXMgYSBjYXNlIHN0dWR5XG4gICAgcmV0dXJuIHRoaXMuZm9yUHJldmlldyAmJiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50UmVhZERhdGFcbiAgICAgICYmIHRoaXMuY29udGVudFJlYWREYXRhLmNvdXJzZUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkNBU0VfU1RVRFlcbiAgfVxuXG5cbiAgYXN5bmMgY2hlY2tJZlVzZXJFbnJvbGxlZCgpIHtcbiAgICB0aGlzLmNvbnRlbnRMaWJTdmMub25lU3RlcFJlc3VtZUVuYWJsZSA9IGZhbHNlXG4gICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gdHJ1ZVxuICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgIC8vIG9ubHkgZm9yICByZXNvdXJjZVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmlkZW50aWZpZXIgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmXG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5QUk9HUkFNICYmXG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5NQU5EQVRPUllfQ09VUlNFX0dPQUwgJiZcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJlxuICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmXG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0pIHtcbiAgICAgIC8vIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHRoaXMuaXNSZXNvdXJjZSA/ICcnIDogdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmlkZW50aWZpZXJcbiAgICAgIHJldHVybiB0aGlzLmdldENvbnRpbnVlTGVhcm5pbmdEYXRhKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyKVxuICAgIH1cblxuICAgIGxldCBlbnJvbGxlZENvdXJzZTogTnNDb250ZW50LklDb3Vyc2UgfCB1bmRlZmluZWRcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllciAmJiAhdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICBpZiAodGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoKSB7XG4gICAgICAgIGVucm9sbGVkQ291cnNlID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QuZmluZCgoY291cnNlOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyIHx8ICcnXG4gICAgICAgICAgaWYgKGNvdXJzZS5jb3Vyc2VJZCAhPT0gaWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY291cnNlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGN1cnJlbnQgY291cnNlIGlzIHByZXNlbnQgaW4gdGhlIGxpc3Qgb2YgdXNlciBlbnJvbGxlZCBjb3Vyc2VcbiAgICAgIGlmIChlbnJvbGxlZENvdXJzZSAmJiBlbnJvbGxlZENvdXJzZS5iYXRjaElkKSB7XG4gICAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLnJlc3VtZURhdGEuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IHJlc1xuICAgICAgICAgICAgdGhpcy5nZXRMYXN0UGxheWVkUmVzb3VyY2UoKVxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMudG9jU3ZjLmNoZWNrTW9kdWxlV2lzZURhdGEodGhpcy5jb250ZW50KVxuICAgICAgICB0aGlzLmVucm9sbGVkQ291cnNlRGF0YSA9IGVucm9sbGVkQ291cnNlXG4gICAgICAgIHRoaXMuaXNDb3Vyc2VDb21wbGV0ZWRPblRoaXNNb250aCgpXG4gICAgICAgIHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgPSBlbnJvbGxlZENvdXJzZS5iYXRjaElkXG4gICAgICAgIC8vIHRoaXMuZG93bmxvYWRDZXJ0KGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcylcbiAgICAgICAgaWYgKGVucm9sbGVkQ291cnNlICYmIGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcyAmJlxuICAgICAgICAgIGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBjZXJ0aWZpY2F0ZTogYW55ID0gZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PlxuICAgICAgICAgICAgbmV3IERhdGUoYi5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkpXG4gICAgICAgICAgY29uc3QgY2VydElkID0gY2VydGlmaWNhdGVbMF0uaWRlbnRpZmllclxuICAgICAgICAgIHRoaXMuY2VydElkID0gY2VydElkXG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50WydjZXJ0aWZpY2F0ZU9iaiddID0ge1xuICAgICAgICAgICAgICBjZXJ0SWQsXG4gICAgICAgICAgICAgIGNlcnREYXRhOiAnJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgZW5yb2xsZWQgY291cnNlIGlzIGNvbXBsZXRlZCB0aGVuIHRvIG1ha2UgYWxsIGxhbmd1YWdlcyBjb3Vyc2VzIGFzIHdlbGwgYXMgYWxsIGNvbnRlbnQgYXMgY29tcGxldGVkXG4gICAgICAgIGlmIChlbnJvbGxlZENvdXJzZS5zdGF0dXMgPT09IDIpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRbJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSAxMDBcbiAgICAgICAgICB0aGlzLmNvbnRlbnRbJ2NvbXBsZXRpb25TdGF0dXMnXSA9IDJcbiAgICAgICAgICBhd2FpdCB0aGlzLnRvY1N2Yy5tYXBDb21wbGV0aW9uQ2hpbGRQZXJjZW50YWdlUHJvZ3JhbSh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgbGV0IGNvbnRlbnRMYWcgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldENvbnRlbnRMYW5ndWFnZSh0aGlzLmNvbnRlbnRSZWFkRGF0YSlcbiAgICAgICAgICB0aGlzLmdldENvbnRpbnVlTGVhcm5pbmdEYXRhKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyLCBlbnJvbGxlZENvdXJzZS5iYXRjaElkLCBjb250ZW50TGFnKVxuICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy50b2NTdmMubWFwTW9kdWxlQ291bnQodGhpcy5jb250ZW50KVxuICAgICAgICAgIHRoaXMuY2hlY2tGb3JDb21wbGV0aW9uU3VydmV5VHJpZ2dlcigpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhLmN1bXVsYXRpdmVUcmFja2luZyAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5jb3Vyc2VDYXRlZ29yeSAhPT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5MRUFSTklOR19QQVRIV0FZKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRvY1N2Yy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZVByb2dyYW0odGhpcy5jb250ZW50LCB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdClcbiAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JDb21wbGV0aW9uU3VydmV5VHJpZ2dlcigpXG4gICAgICAgICAgICB0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5yZXN1bWVEYXRhLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IHJlc1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGFzdFBsYXllZFJlc291cmNlKClcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgLy8gdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29udGVudExhZyA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0Q29udGVudExhbmd1YWdlKHRoaXMuY29udGVudFJlYWREYXRhKVxuICAgICAgICAgICAgdGhpcy5nZXRDb250aW51ZUxlYXJuaW5nRGF0YSh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllciwgZW5yb2xsZWRDb3Vyc2UuYmF0Y2hJZCwgY29udGVudExhZylcbiAgICAgICAgICAgIHRoaXMuY29udGVudFsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IGVucm9sbGVkQ291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy50b2NTdmMubWFwTW9kdWxlQ291bnQodGhpcy5jb250ZW50KVxuICAgICAgICAgICAgLy8gdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IHtcbiAgICAgICAgICBjb250ZW50OiBbZW5yb2xsZWRDb3Vyc2UuYmF0Y2hdLFxuICAgICAgICAgIGVucm9sbGVkOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9jU3ZjLnNldEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgdGhpcy50b2NTdmMuZ2V0U2VsZWN0ZWRCYXRjaERhdGEodGhpcy5iYXRjaERhdGEpXG4gICAgICAgIHRoaXMudG9jU3ZjLm1hcFNlc3Npb25Db21wbGV0aW9uUGVyY2VudGFnZSh0aGlzLmJhdGNoRGF0YSwgdGhpcy5yZXN1bWVEYXRhKVxuICAgICAgICB0aGlzLnJvdXRlckNoYW5nZUhhbmRsZXIodHJ1ZSlcbiAgICAgICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YSh0aGlzLmNvbnRlbnQpXG4gICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KHRoaXMuY29udGVudClcbiAgICAgICAgLy8gSXQncyB1bmRlcnN0b29kIHRoYXQgdXNlciBpcyBub3QgYWxyZWFkeSBlbnJvbGxlZFxuICAgICAgICAvLyBGZXRjaCB0aGUgYXZhaWxhYmxlIGJhdGNoZXMgYW5kIHByZXNlbnQgdG8gdXNlclxuICAgICAgICBpZiAodGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFXG4gICAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSkge1xuICAgICAgICAgIC8vIERpc2FibGluZyBhdXRvIGVucm9sbG1lbnQgdG8gYmF0Y2hcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XG4gICAgICAgICAgICB0aGlzLmZldGNoQmF0Y2hEZXRhaWxzKClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mZXRjaEJhdGNoRGV0YWlscygpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2NTdmMuY2FsbEhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKHRoaXMuY29udGVudClcbiAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgfVxuXG5cbiAgICB9XG5cbiAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2VcbiAgfVxuXG4gIGJpbmRDb21wbGV0aW9uUGVyY2VudGFnZSgpIHtcbiAgICBsZXQgY29tcGxldGlvblBlcmNlbnRhZ2UgPSAwXG4gICAgbGV0IGNvbXBsZXRpb25TdGF0dXMgPSAwXG4gICAgaWYgKHRoaXMubGFuZ3VhZ2VNYXBQcm9ncmVzcyAmJiBPYmplY3Qua2V5cyh0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3MpLmxlbmd0aCkge1xuICAgICAgbGV0IGxhbmdQZXJjZW50YWdlID0gdGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzW3RoaXMuc2VsZWN0ZWRMYW5ndWFnZS5sYW5nSWRdIHx8IDBcbiAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlID0gbGFuZ1BlcmNlbnRhZ2VcbiAgICAgIGNvbXBsZXRpb25TdGF0dXMgPSBsYW5nUGVyY2VudGFnZSA+PSAxMDAgPyAyIDogMFxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZW5yb2xsZWREYXRhID0gdGhpcy50b2NTdmMuZmluZEVucm9sbWVudEJ5Q29sbGVjdGlvbklkKHRoaXMudXNlckVucm9sbG1lbnRMaXN0LCAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnKSlcbiAgICAgIGlmIChlbnJvbGxlZERhdGEgJiYgZW5yb2xsZWREYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlKSB7XG4gICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlID0gZW5yb2xsZWREYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAgIGNvbXBsZXRpb25TdGF0dXMgPSBlbnJvbGxlZERhdGEuc3RhdHVzXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5jb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID0gY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgIHRoaXMuY29udGVudC5jb21wbGV0aW9uU3RhdHVzID0gY29tcGxldGlvblN0YXR1c1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUFjY2VwdFJlbGV2ZW50KCkge1xuICAgIHRoaXMuc2F2ZUZlZWRiYWNrKCcnLCAxKVxuICB9XG5cbiAgaGFuZGxlRGVjbGluZVJlbGV2ZW50KCkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oTm9uUmVsZXZlbnRGZWVkYmFja0RpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgd2lkdGg6ICc1MDJweCcsXG4gICAgICBwYW5lbENsYXNzOiBbJ3JlbGV2ZW50LWZlZWRiYWNrLWRpYWxvZyddLFxuICAgIH0pXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLnNhdmVGZWVkYmFjayhyZXN1bHQsIDApXG4gICAgICAgIGRpYWxvZ1JlZi5jbG9zZSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaWFsb2dSZWYuY2xvc2UoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjb250ZW50Vmlld0V2ZW50Rm9yTmV0Q29yZShldmVudFR5cGU6IGFueSkge1xuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnICYmIHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcubmV0Y29yZVdlYkNvbmZpZyAgLy8gTk9TT05BUlxuICAgICAgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnLmlzQWN0aXZlIC8vIE5PU09OQVJcbiAgICAgICYmIHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcubmV0Y29yZVdlYkNvbmZpZy5ldmVudHMgLy8gTk9TT05BUlxuICAgICAgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnLmV2ZW50cy5jb250ZW50X3ZpZXcgLy8gTk9TT05BUlxuICAgICAgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnLmV2ZW50cy5jb250ZW50X3ZpZXcuaXNBY3RpdmUgLy8gTk9TT05BUlxuICAgICkge1xuICAgICAgbGV0IHBheWxvYWQ6IGFueSA9IHt9XG4gICAgICAvLyBpZiAodGhpcy5jb25maWdTdmMgJiYgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyICYmIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyKSB7IC8vIE5PU09OQVJcbiAgICAgIC8vICAgcGF5bG9hZFsncGtedXNlcmlkJ10gPSB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllci50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgLy8gfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQubmFtZSkge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X25hbWUnXSA9IHRoaXMuY29udGVudC5uYW1lXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSkge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2NhdGVnb3J5J10gPSB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnlcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9pZCddID0gdGhpcy5jb250ZW50LmlkZW50aWZpZXJcbiAgICAgIH1cbiAgICAgIC8vIGlmKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQubmFtZSkge1xuICAgICAgcGF5bG9hZFsnY29udGVudF91cmwnXSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmXG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5hcHBJY29uKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfaW1hZ2UnXSA9IHRoaXMuY29udGVudC5hcHBJY29uXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5kdXJhdGlvbikge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2R1cmF0aW9uJ10gPSB0aGlzLmNvbnRlbnQuZHVyYXRpb24gJiYgTnVtYmVyKHRoaXMuY29udGVudC5kdXJhdGlvbikgPiAwID8gTnVtYmVyKHRoaXMuY29udGVudC5kdXJhdGlvbikgOiAwXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2R1cmF0aW9uJ10gPSAwXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5hdmdSYXRpbmdcbiAgICAgICkge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X3JhdGluZyddID0gdGhpcy5jb250ZW50LmF2Z1JhdGluZ1xuICAgICAgICBwYXlsb2FkWydjb250ZW50IHJhdGluZyddID0gdGhpcy5jb250ZW50LmF2Z1JhdGluZ1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQudG90YWxOb09mUmF0aW5nKSB7XG4gICAgICAgIHBheWxvYWRbJ25vX3VzZXJzX3JhdGVkJ10gPSB0aGlzLmNvbnRlbnQudG90YWxOb09mUmF0aW5nXG4gICAgICB9XG4gICAgICAvLyBpZih0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50Lm5hbWUpIHtcbiAgICAgIHBheWxvYWRbJ2xlYXJuaW5nX3BhdGhfY29udGVudCddID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXG4gICAgICBwYXlsb2FkWydsZWFybmluZyBwYXRoIGNvbnRlbnQnXSA9IHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmIHRoaXMudXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aCA/IHRydWUgOiBmYWxzZVxuICAgICAgLy8gfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuc291cmNlKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfcHJvdmlkZXJfbmFtZSddID0gdGhpcy5jb250ZW50LnNvdXJjZVxuICAgICAgfVxuICAgICAgLy8gY29uc29sZS5sb2coJ3BheWxvYWQnLCBwYXlsb2FkKVxuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gJ3ZpZXcnKSB7XG4gICAgICAgIHRoaXMubmV0Q29yZVNlcnZpY2UudHJhY2tFdmVudEZvckNvbnRlbnRBbmRFdmVudCgnY29udGVudF92aWV3JywgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIudHJpbSgpLnRvTG93ZXJDYXNlKCksIHBheWxvYWQpXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ2Vucm9sbCcpIHtcbiAgICAgICAgdGhpcy5uZXRDb3JlU2VydmljZS50cmFja0V2ZW50Rm9yQ29udGVudEFuZEV2ZW50KCdjb250ZW50X2Vucm9sbWVudCcsIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBwYXlsb2FkKVxuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgICAgdGhpcy5uZXRDb3JlU2VydmljZS50cmFja0V2ZW50Rm9yQ29udGVudEFuZEV2ZW50KCdjb250ZW50X2NvbXBsZXRpb24nLCB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllci50cmltKCkudG9Mb3dlckNhc2UoKSwgcGF5bG9hZClcbiAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIHNlY29uZHNUb1RpbWUoZDogYW55KSB7XG4gICAgZCA9IE51bWJlcihkKVxuICAgIHZhciBoID0gTWF0aC5mbG9vcihkIC8gMzYwMClcbiAgICB2YXIgbSA9IE1hdGguZmxvb3IoZCAlIDM2MDAgLyA2MClcbiAgICB2YXIgcyA9IE1hdGguZmxvb3IoZCAlIDM2MDAgJSA2MClcblxuICAgIHZhciBoRGlzcGxheSA9IGggPiAwID8gaCArIChoID09IDEgPyBcIiBob3VyLCBcIiA6IFwiIGhvdXJzLCBcIikgOiBcIlwiXG4gICAgdmFyIG1EaXNwbGF5ID0gbSA+IDAgPyBtICsgKG0gPT0gMSA/IFwiIG1pbnV0ZSwgXCIgOiBcIiBtaW51dGVzLCBcIikgOiBcIlwiXG4gICAgdmFyIHNEaXNwbGF5ID0gcyA+IDAgPyBzICsgKHMgPT0gMSA/IFwiIHNlY29uZFwiIDogXCIgc2Vjb25kc1wiKSA6IFwiXCJcbiAgICByZXR1cm4gaERpc3BsYXkgKyBtRGlzcGxheSArIHNEaXNwbGF5XG4gIH1cblxuXG4gIGFzeW5jIHNhdmVGZWVkYmFjayhjb21tZW50OiBzdHJpbmcsIHJhdGluZyA9IDApIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgXCJyZWNvbW1lbmRhdGlvbl9pZFwiOiB0aGlzLnJlY29tbWVuZGVkQ291cnNlc0lkLFxuICAgICAgXCJjb3Vyc2VfaWRcIjogdGhpcy5jb3Vyc2VJRCxcbiAgICAgIFwicmF0aW5nXCI6IHJhdGluZyxcbiAgICAgIFwiY29tbWVudHNcIjogY29tbWVudCxcbiAgICAgIFwidXNlcl9pZFwiOiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZT8udXNlcklkIHx8ICcnXG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb250ZW50TGliU3ZjLnNhdmVGZWVkYmFja1Nha3NoYW1BSShwYXlsb2FkKS50b1Byb21pc2UoKS5jYXRjaCgoKSA9PiB7IH0pXG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlPy5tZXNzYWdlKSB7XG4gICAgICB0aGlzLm1hdFNuYWNrYmFyTmV3Lm9wZW4oXG4gICAgICAgICdUaGFuayB5b3UgZm9yIHlvdXIgZmVlZGJhY2suJywgJ1gnLFxuICAgICAgICB7IGR1cmF0aW9uOiBTTkFDS0JBUl9EVVJBVElPTiwgcGFuZWxDbGFzczogWydzdWNjZXNzJ10gfVxuICAgICAgKVxuICAgICAgdGhpcy5mZWVkYmFja0dpdmVuID0geyBjb3Vyc2VfaWQ6IHRoaXMuY291cnNlSUQsIHJhdGluZzogcmF0aW5nLCBjb21tZW50czogY29tbWVudCB9XG5cbiAgICB9IGVsc2UgaWYgKCFyZXNwb25zZSkge1xuICAgICAgdGhpcy5tYXRTbmFja2Jhck5ldy5vcGVuKFxuICAgICAgICAnU29tZXRoaW5nIGlzIHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicsICdYJyxcbiAgICAgICAgeyBkdXJhdGlvbjogU05BQ0tCQVJfRFVSQVRJT04sIHBhbmVsQ2xhc3M6IFsnZXJyb3InXSB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcGxheVJlc3VtZUZvckFJKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGlmICh0aGlzLmZpcnN0UmVzb3VyY2VMaW5rKSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnVybF0sIHsgcXVlcnlQYXJhbXM6IHRoaXMuZmlyc3RSZXNvdXJjZUxpbmsucXVlcnlQYXJhbXMgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIGVucm9sbFVzZXJUb0FJKCkge1xuICAgIHRoaXMuZnJvbUFJVHV0b3IgPSB0cnVlXG4gICAgdGhpcy5oYW5kbGVBdXRvQmF0Y2hBc3NpZ24oKVxuICB9XG5cbiAgb3BlblN1cnZleUZvcm1Qb3B1cChldmVudDogYm9vbGVhbikge1xuICAgIGlmIChldmVudCkge1xuICAgICAgdGhpcy5vcGVuQ29tcGxldGlvblN1cnZleUZvcm1Qb3B1cCgpXG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVQcmVBc3Nlc3NtZW50UXVlcnkodHlwZTogJ1JFU1VNRScgfCAnU1RBUlRfT1ZFUicgfCAnU1RBUlQnKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgaWYgKHRoaXMuZmlyc3RSZXNvdXJjZUxpbmsgJiYgKHR5cGUgPT09ICdTVEFSVCcgfHwgdHlwZSA9PT0gJ1NUQVJUX09WRVInKSkge1xuICAgICAgbGV0IHFQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgIC4uLnRoaXMuZmlyc3RSZXNvdXJjZUxpbmsucXVlcnlQYXJhbXMsXG4gICAgICAgIHZpZXdNb2RlOiB0eXBlLFxuICAgICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHRJZCAmJiB0aGlzLmNvbnRleHRQYXRoKSB7XG4gICAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgICBjb2xsZWN0aW9uSWQ6IHRoaXMuY29udGV4dElkLFxuICAgICAgICAgIGNvbGxlY3Rpb25UeXBlOiB0aGlzLmNvbnRleHRQYXRoLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIGRlbGV0ZSBxUGFyYW1zLnZpZXdNb2RlXG4gICAgICB9XG4gICAgICBxUGFyYW1zID0ge1xuICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbElkLFxuICAgICAgfVxuICAgICAgcmV0dXJuIHFQYXJhbXNcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhTGluayAmJiB0eXBlID09PSAnUkVTVU1FJykge1xuICAgICAgbGV0IHFQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgIC4uLnRoaXMucmVzdW1lRGF0YUxpbmsucXVlcnlQYXJhbXMsXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgICB2aWV3TW9kZTogJ1JFU1VNRScsXG4gICAgICAgIC8vIGNvdXJzZU5hbWU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5uYW1lIDogJycsXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZXh0SWQgJiYgdGhpcy5jb250ZXh0UGF0aCkge1xuICAgICAgICBxUGFyYW1zID0ge1xuICAgICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgICAgY29sbGVjdGlvbklkOiB0aGlzLmNvbnRleHRJZCxcbiAgICAgICAgICBjb2xsZWN0aW9uVHlwZTogdGhpcy5jb250ZXh0UGF0aCxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgICBkZWxldGUgcVBhcmFtcy52aWV3TW9kZVxuICAgICAgfVxuICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLmNoYW5uZWxJZCxcbiAgICAgIH1cbiAgICAgIHJldHVybiBxUGFyYW1zXG4gICAgfVxuICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICB2aWV3TW9kZTogdHlwZSxcbiAgICB9XG4gIH1cblxuICByb3V0ZVRvUHJlQXNzZXNzZW50KCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YSkge1xuICAgICAgLy8gdGhpcy5nZW5lcmF0ZVByZUFzc2Vzc21lbnRRdWVyeSgnU1RBUlQnKVxuICAgICAgbGV0IGZpcnN0UmVzb3VyY2UgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YS5wcmVFbnJvbG1lbnRSZXNvdXJjZXNbMF1cbiAgICAgIGxldCBtaW1lVHlwZSA9IGZpcnN0UmVzb3VyY2U/LmNvdXJzZUNhdGVnb3J5ID09PSAnUHJlIEVucm9sbWVudCBBc3Nlc3NtZW50JyA/ICdhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldCcgOiBmaXJzdFJlc291cmNlLm1pbWVUeXBlXG4gICAgICB0aGlzLmZpcnN0UmVzb3VyY2VMaW5rID0gdmlld2VyUm91dGVHZW5lcmF0b3IoXG4gICAgICAgIGZpcnN0UmVzb3VyY2UuaWRlbnRpZmllcixcbiAgICAgICAgbWltZVR5cGUsXG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyLFxuICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnksXG4gICAgICAgIHRoaXMuZm9yUHJldmlldyxcbiAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb250ZW50UmVhZERhdGEucHJlRW5yb2xtZW50UmVzb3VyY2VzWzBdPy5wcmltYXJ5Q2F0ZWdvcnkgfHwgJycsXG4gICAgICAgICcnLFxuICAgICAgKVxuICAgICAgbGV0IHJvdXRlckxpbmsgPSB0aGlzLmZpcnN0UmVzb3VyY2VMaW5rPy51cmxcbiAgICAgIGxldCBxdWVyeVBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVQcmVBc3Nlc3NtZW50UXVlcnkoJ1NUQVJUJylcbiAgICAgIHF1ZXJ5UGFyYW1zID0geyAuLi5xdWVyeVBhcmFtcywgcHJlQXNzZXNzbWVudDogJ3RydWUnIH1cbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHtyb3V0ZXJMaW5rfWBdLCB7IHF1ZXJ5UGFyYW1zIH0pXG4gICAgfVxuICB9XG5cbiAgZ2V0UHJlQXNzZXNzbWVudFJlcXVpcmVkKCkge1xuICAgIHRoaXMucHJlQXNzZXNzbWVudFJlcXVpcmVkRmxhZyA9IGZhbHNlXG4gICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8uZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0/LmlzTWFuZGF0b3J5KSB7XG4gICAgICAgICAgdGhpcy5wcmVBc3Nlc3NtZW50UmVxdWlyZWRGbGFnID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldFByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzKCkge1xuICAgIHRoaXMucHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMgPSBmYWxzZVxuICAgIGxldCBwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyOiBhbnkgPSBbXVxuICAgIGxldCBwcmVFbnJvbGxtZW50TWFuZGF0b3J5UmVzb3VyY2VzQXJyOiBhbnkgPSBbXVxuICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YT8ucHJlRW5yb2xtZW50UmVzb3VyY2VzPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/LmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyLnB1c2goaXRlbT8uaWRlbnRpZmllcilcbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbT8uaXNNYW5kYXRvcnkpIHtcbiAgICAgICAgICBwcmVFbnJvbGxtZW50TWFuZGF0b3J5UmVzb3VyY2VzQXJyLnB1c2goaXRlbT8uaWRlbnRpZmllcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKHByZUVucm9sbG1lbnRSZXNvdXJjZXNBcnIgJiYgcHJlRW5yb2xsbWVudFJlc291cmNlc0Fyci5sZW5ndGgpIHtcbiAgICAgIGxldCByZXEgPSB7XG4gICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgXCJjb250ZW50SWRzXCI6IHByZUVucm9sbG1lbnRSZXNvdXJjZXNBcnIsXG4gICAgICAgICAgXCJmaWVsZHNcIjogW1xuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy50b2NTdmMucmVhZFByZUVucm9sbG1lbnRSZXNvdXJjZXNTdGF0ZShyZXEpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGxldCBtYW5kYXRvcnlJZHNDb21wbGV0ZWQgPSBbXVxuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc3VsdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQuY29udGVudExpc3RbaV1bJ3N0YXR1cyddID09PSAyICYmIHByZUVucm9sbG1lbnRNYW5kYXRvcnlSZXNvdXJjZXNBcnIuaW5jbHVkZXMoZGF0YS5yZXN1bHQuY29udGVudExpc3RbaV1bJ2NvbnRlbnRJZCddKSkge1xuICAgICAgICAgICAgICBtYW5kYXRvcnlJZHNDb21wbGV0ZWQucHVzaChkYXRhLnJlc3VsdC5jb250ZW50TGlzdFtpXVsnY29udGVudElkJ10pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyPy5sZW5ndGggPT09IGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0Py5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMgPSB0cnVlXG4gICAgICAgICAgfSBlbHNlIGlmIChtYW5kYXRvcnlJZHNDb21wbGV0ZWQubGVuZ3RoID09PSBwcmVFbnJvbGxtZW50TWFuZGF0b3J5UmVzb3VyY2VzQXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IHRydWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyU3ZjLnNldEVucm9sbERhdGEobnVsbClcbiAgICB0aGlzLmdldFNlcnZlckRhdGVUaW1lKClcbiAgICB0aGlzLm1vYmlsZTEyMDAgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDEyMDFcbiAgICB0aGlzLmdldEkxOE5UcmFuc2xhdGlvbnMoKVxuICAgIHRoaXMubG9hZExlYXJuZXJBZHZpc29yeURhdGEoKVxuICAgIHRoaXMuc2V0dXBTZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uKClcbiAgICB0aGlzLnNldENoYW5uZWxJZCgpXG4gICAgdGhpcy5jaGVja0lmcmFtZUNvbnRleHQoKVxuICAgIHRoaXMucXVlcnlQYXJhbXNEYXRhID0gdGhpcy5zZXR1cFJvdXRlU3Vic2NyaXB0aW9ucygpXG4gICAgdGhpcy5zZXR1cEZyYWdtZW50U3Vic2NyaXB0aW9uKClcbiAgICB0aGlzLnNldHVwQmF0Y2hTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmNvbmZpZ3VyZURlZmF1bHRMb2dvKClcbiAgICB0aGlzLmNvbmZpZ3VyZUZlYXR1cmVGbGFncygpXG4gICAgdGhpcy5jaGVja1JlZ2lzdHJhdGlvblN0YXR1cygpXG4gICAgdGhpcy5zZXR1cFJvdXRlckV2ZW50U3Vic2NyaXB0aW9uKClcbiAgICB0aGlzLmdldENvbnRlbnRDcmVhdG9yRGF0YSgpXG4gIH1cblxuICBwcml2YXRlIGluaXREYXRhKGRhdGE6IERhdGEpIHtcbiAgICBjb25zdCBpbml0RGF0YTogYW55ID0gdGhpcy50b2NTdmMuaW5pdERhdGEoZGF0YSwgdHJ1ZSlcbiAgICB0aGlzLnNldEVycm9yQ29kZShpbml0RGF0YS5lcnJvckNvZGUpXG4gICAgdGhpcy5pbml0aWFsaXplVG9jU3RydWN0dXJlKClcbiAgICB0aGlzLnNldHVwQmF0Y2hDb250cm9sU3Vic2NyaXB0aW9uKClcbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gIH1cblxuICBwcml2YXRlIHNldEVycm9yQ29kZShlcnJvckNvZGU6IE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZSkge1xuICAgIHRoaXMuZXJyb3JDb2RlID0gZXJyb3JDb2RlXG4gICAgc3dpdGNoICh0aGlzLmVycm9yQ29kZSkge1xuICAgICAgY2FzZSBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUuQVBJX0ZBSUxVUkU6XG4gICAgICBjYXNlIE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZS5JTlZBTElEX0RBVEE6XG4gICAgICBjYXNlIE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZS5OT19EQVRBOlxuICAgICAgICB0aGlzLmVycm9yV2lkZ2V0RGF0YS53aWRnZXREYXRhLmVycm9yVHlwZSA9IEVycm9yVHlwZS5pbnRlcm5hbFNlcnZlclxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5lcnJvcldpZGdldERhdGEud2lkZ2V0RGF0YS5lcnJvclR5cGUgPSBFcnJvclR5cGUuc29tZXRoaW5nV3JvbmdcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuXG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVG9jU3RydWN0dXJlKCkge1xuICAgIHRoaXMuY29udGVudFBhcmVudHMgPSB7fVxuICAgIHRoaXMudG9jU3RydWN0dXJlID0ge1xuICAgICAgYXNzZXNzbWVudDogMCxcbiAgICAgIGNvdXJzZTogMCxcbiAgICAgIGhhbmRzT246IDAsXG4gICAgICBpbnRlcmFjdGl2ZVZpZGVvOiAwLFxuICAgICAgbGVhcm5pbmdNb2R1bGU6IDAsXG4gICAgICBvdGhlcjogMCxcbiAgICAgIHBkZjogMCxcbiAgICAgIHN1cnZleTogMCxcbiAgICAgIHBvZGNhc3Q6IDAsXG4gICAgICBwcmFjdGljZVRlc3Q6IDAsXG4gICAgICBmaW5hbFRlc3Q6IDAsXG4gICAgICBxdWl6OiAwLFxuICAgICAgdmlkZW86IDAsXG4gICAgICB3ZWJNb2R1bGU6IDAsXG4gICAgICB3ZWJQYWdlOiAwLFxuICAgICAgeW91dHViZTogMCxcbiAgICAgIGludGVyYWN0aXZlY29udGVudDogMCxcbiAgICAgIG9mZmxpbmVTZXNzaW9uOiAwLFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBCYXRjaENvbnRyb2xTdWJzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5iYXRjaENvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoYmF0Y2g6IE5zQ29udGVudC5JQmF0Y2gpID0+IHtcbiAgICAgIGlmIChiYXRjaCkge1xuICAgICAgICB0aGlzLmhhbmRsZUJhdGNoRW5yb2xsbWVudChiYXRjaClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVCYXRjaEVucm9sbG1lbnQoYmF0Y2g6IE5zQ29udGVudC5JQmF0Y2gpIHtcbiAgICB0aGlzLmRpc2FibGVFbnJvbGxCdG4gPSB0cnVlXG4gICAgbGV0IHVzZXJJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlPy51c2VySWQgfHwgJydcblxuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBjb3Vyc2VJZDogYmF0Y2guY291cnNlSWQsXG4gICAgICAgIGJhdGNoSWQ6IGJhdGNoLmJhdGNoSWQsXG4gICAgICB9LFxuICAgIH1cblxuICAgIHRoaXMuY29udGVudFN2Yy5lbnJvbGxVc2VyVG9CYXRjaChyZXEpLnRoZW4oKGRhdGFiOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhYj8ucmVzdWx0Py5yZXNwb25zZSA9PT0gJ1NVQ0NFU1MnKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEVucm9sbG1lbnQoYmF0Y2gpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhhbmRsZUVucm9sbG1lbnRGYWlsdXJlKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTdWNjZXNzZnVsRW5yb2xsbWVudChiYXRjaDogTnNDb250ZW50LklCYXRjaCkge1xuICAgIHRoaXMuYmF0Y2hEYXRhID0ge1xuICAgICAgY29udGVudDogW2JhdGNoXSxcbiAgICAgIGVucm9sbGVkOiB0cnVlLFxuICAgIH1cbiAgICB0aGlzLnRvY1N2Yy5nZXRTZWxlY3RlZEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICB0aGlzLnRvY1N2Yy5tYXBTZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UodGhpcy5iYXRjaERhdGEpXG4gICAgdGhpcy5yb3V0ZXJDaGFuZ2VIYW5kbGVyKHRydWUpXG4gICAgdGhpcy5vcGVuU25hY2tiYXIoJ0Vucm9sbGVkIFN1Y2Nlc3NmdWxseSEnKVxuICAgIHRoaXMuZGlzYWJsZUVucm9sbEJ0biA9IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVucm9sbG1lbnRGYWlsdXJlKCkge1xuICAgIHRoaXMub3BlblNuYWNrYmFyKCdTb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciEnKVxuICAgIHRoaXMuZGlzYWJsZUVucm9sbEJ0biA9IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGxvYWRMZWFybmVyQWR2aXNvcnlEYXRhKCkge1xuICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEgJiYgdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhLmRhdGEpIHtcbiAgICAgIHRoaXMubGVhcm5BZHZpc29yeURhdGEgPSB0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEuZGF0YS5sZWFybmVyQWR2aXNvcnlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwU2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbigpIHtcbiAgICB0aGlzLnNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5nZXRTZWxlY3RlZEJhdGNoLnN1YnNjcmliZShiYXRjaERhdGEgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YSA9IGJhdGNoRGF0YVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHNldENoYW5uZWxJZCgpIHtcbiAgICB0aGlzLmNoYW5uZWxJZCA9IHRoaXMudGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlDb25maWdcbiAgICAgID8gdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeUNvbmZpZy5jaGFubmVsXG4gICAgICA6ICcnXG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZyYW1lQ29udGV4dCgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pc0luSWZyYW1lID0gd2luZG93LnNlbGYgIT09IHdpbmRvdy50b3BcbiAgICB9IGNhdGNoIChfZXgpIHtcbiAgICAgIHRoaXMuaXNJbklmcmFtZSA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFJvdXRlU3Vic2NyaXB0aW9ucygpIHtcbiAgICBsZXQgcXVlcnlQYXJhbXN0ZW1wOiBhbnkgPSB7fVxuICAgIGlmICh0aGlzLnJvdXRlKSB7XG4gICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gdHJ1ZVxuICAgICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGUuZGF0YS5zdWJzY3JpYmUoYXN5bmMgKGRhdGE6IERhdGEpID0+IHtcbiAgICAgICAgaWYgKGRhdGE/LmNvbnRlbnQ/LmRhdGE/LmlkZW50aWZpZXIpIHtcbiAgICAgICAgICBxdWVyeVBhcmFtc3RlbXAgPSBhd2FpdCB0aGlzLnByb2Nlc3NSb3V0ZURhdGEoZGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB0ZW1wRGF0YSA9IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgICAgZGF0YTogdGhpcy5pbnB1dENvbnRlbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcXVlcnlQYXJhbXN0ZW1wID0gYXdhaXQgdGhpcy5wcm9jZXNzUm91dGVEYXRhKHRlbXBEYXRhKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcXVlcnlQYXJhbXN0ZW1wXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NSb3V0ZURhdGEoZGF0YTogRGF0YSkge1xuICAgIHRoaXMuY291cnNlSUQgPSBkYXRhLmNvbnRlbnQuZGF0YS5pZGVudGlmaWVyXG4gICAgY29uc3QgaW5pdERhdGEgPSB0aGlzLnRvY1N2Yy5pbml0RGF0YShkYXRhLCB0cnVlKVxuXG4gICAgLy8gR2V0IHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICBjb25zdCBxdWVyeVBhcmFtc0RhdGFUZW1wID0gYXdhaXQgdGhpcy5nZXRRdWVyeVBhcmFtcygpXG4gICAgLy8gSGFuZGxlIG11bHRpbGluZ3VhbCBjb250ZW50IGlmIG1sSWQgaXMgcHJlc2VudCBpbiBxdWVyeSBwYXJhbWV0ZXJzXG4gICAgaWYgKHF1ZXJ5UGFyYW1zRGF0YVRlbXAuTUxJZCkge1xuICAgICAgLy8gU3RvcmUgdGhlIG9yaWdpbmFsIGNvbnRlbnQgZGF0YSBmb3IgcmVmZXJlbmNlXG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgPSBpbml0RGF0YS5jb250ZW50XG5cbiAgICAgIC8vIEZldGNoIHRoZSBtdWx0aWxpbmd1YWwgY29udGVudFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50UmVhZChxdWVyeVBhcmFtc0RhdGFUZW1wLk1MSWQpXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgIC8vIElmIG11bHRpbGluZ3VhbCBjb250ZW50IGZldGNoIGZhaWxzLCBmYWxsIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvbnRlbnRcbiAgICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YSA9IGluaXREYXRhLmNvbnRlbnRcbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy53YXJuKCdGYWlsZWQgdG8gbG9hZCBtdWx0aWxpbmd1YWwgY29udGVudCwgdXNpbmcgb3JpZ2luYWwgY29udGVudCBpbnN0ZWFkJylcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gT24gZXJyb3IsIHVzZSB0aGUgb3JpZ2luYWwgY29udGVudFxuICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YSA9IGluaXREYXRhLmNvbnRlbnRcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgbXVsdGlsaW5ndWFsIGNvbnRlbnQ6JywgZXJyb3IpXG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignRmFpbGVkIHRvIGxvYWQgY29udGVudCBpbiBzZWxlY3RlZCBsYW5ndWFnZScsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBtdWx0aWxpbmd1YWwgY29udGVudCByZXF1ZXN0ZWQsIHVzZSB0aGUgb3JpZ2luYWwgY29udGVudFxuICAgICAgdGhpcy5jb250ZW50UmVhZERhdGEgPSBpbml0RGF0YS5jb250ZW50XG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgPSBpbml0RGF0YS5jb250ZW50XG4gICAgfVxuICAgIC8vIEFkZGVkIHRvIG1ha2Ugc3VyZSB0aGlzIHJlZmVyZW5jZSB3YXMgaW5jb3JyZWN0LCBhc3NpZ25pbmcgYWdhaW4gdG8gbWFrZSBzdXJlIGdsb2JhbCB2YXJpYWJsZSBpcyBwcm9wZXJseSB1cGRhdGVkXG4gICAgdGhpcy5xdWVyeVBhcmFtc0RhdGEgPSBxdWVyeVBhcmFtc0RhdGFUZW1wXG5cbiAgICAvLyBDb250aW51ZSB3aXRoIHRoZSByZXN0IG9mIHRoZSBwcm9jZXNzaW5nXG4gICAgdGhpcy5sb2FkTGFuZ3VhZ2VEYXRhKClcbiAgICB0aGlzLmdldFByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzKClcbiAgICB0aGlzLmdldFByZUFzc2Vzc21lbnRSZXF1aXJlZCgpXG5cbiAgICBhd2FpdCB0aGlzLmhhbmRsZUNvbnRlbnRQcmV2aWV3T3JFbnJvbGxtZW50KClcblxuICAgIHRoaXMuaW5pdGlhbHJvdXRlRGF0YSA9IGRhdGFcbiAgICB0aGlzLmxvYWRCYW5uZXJBbmRUb2NDb25maWcoZGF0YSlcbiAgICB0aGlzLmZldGNoUG9zdEFzc2Vzc21lbnRTdGF0dXNJZk5lZWRlZCgpXG4gICAgdGhpcy5pbml0RGF0YShkYXRhKVxuXG4gICAgLy8gdG8gY2xlYXIgcHVibGljIHN1cnZleSBkYXRhIGlmIGFueSBvbiBsb2FkLFxuICAgIC8vIGlmIG5vdCBjbGVhcmVkIHRoZW4gaXQgd2lsbCBiZSBjbGVhcmVkIG9uIHBvcHVwIGNsb3NlLFxuICAgIC8vICBidXQgdGhlIHRlYWNoZXJzIG5vdGVzIHdpbGwgYmUgdmlzaWJsZSBvbiBjaW1pbmcgYmFjayBmcm9tIHBsYXllciBwYWdlXG4gICAgY29uc3Qgc3VydmV5SWQgPSB0aGlzLmVudmlyb25tZW50LnB1YmxpY0NvbnRlbnRTdXJ2ZXlJZCB8fCAnJ1xuICAgIGNvbnN0IGNvdXJzZUlkID0gdGhpcy5jb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgJydcbiAgICB0aGlzLmNsZWFyRXhpc3RpbmdQdWJsaWNTdXJ2ZXlEYXRhKHN1cnZleUlkLCBjb3Vyc2VJZClcblxuICAgIHJldHVybiBxdWVyeVBhcmFtc0RhdGFUZW1wXG4gIH1cblxuICBvcGVuQ29tcGxldGlvblN1cnZleUZvcm1Qb3B1cCgpIHtcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIF8uZ2V0KHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSwgJ2NvbXBsZXRpb25TdXJ2ZXlMaW5rJykpIHtcbiAgICAgIGNvbnN0IHNJRCA9IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5jb21wbGV0aW9uU3VydmV5TGluay5zcGxpdCgnc3VydmV5cy8nKVxuICAgICAgY29uc3Qgc3VydmV5SWQgPSBzSURbMV1cbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIHN1cnZleUlkLFxuICAgICAgICBjb3Vyc2VOYW1lOiB0aGlzLmNvbnRlbnRSZWFkRGF0YT8ubmFtZSB8fCAnJyxcbiAgICAgICAgY291cnNlSUQ6IHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnLFxuICAgICAgICBjb250ZXh0T3JnSWQ6IHRoaXMuY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yICYmIHRoaXMuY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yLmxlbmd0aCA+IDAgP1xuICAgICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yWzBdIDogJydcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29tcGxldGlvblN1cnZleUZvcm1Db21wb25lbnQsIHtcbiAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgICB3aWR0aDogJzc1MHB4JyxcbiAgICAgICAgbWF4V2lkdGg6ICc5MHZ3JyxcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgdGhpcy5vcGVuQ29uZmlybWF0aW9uRGlhbG9nKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvY2tDZXJ0aWZpY2F0ZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBvcGVuQ29uZmlybWF0aW9uRGlhbG9nKCkge1xuICAgIGNvbnN0IGRpYWxvZ0RhdGEgPSB7XG4gICAgICBtZXNzYWdlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnYXBwdG9jLnN1cnZleVN1Ym1pdHRlZCcpLFxuICAgICAgICAgIGNsYXNzZXM6ICdkaWFsb2ctdGl0bGUnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhcHB0b2Muc3VydmV5Q29tcGxldGVkQ2VydGlmaWNhdGVHZW5lcmF0aW5nJyksXG4gICAgICAgICAgY2xhc3NlczogJ2RpYWxvZy1kZXNjcmlwdGlvbiBtYi0yJ1xuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgaWNvbk5hbWU6ICdjaGVja19jaXJjbGUnLFxuICAgICAgdHlwZTogJ3ByaW1hcnknLFxuICAgICAgYnV0dG9uc1Bvc2l0aW9uQ2xhc3M6ICdqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXInLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NlczogJ3N1Y2Nlcy1idXR0b24gd2lkdGgtZnVsbCcsXG4gICAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnYXBwdG9jLnJldHVyblRvUHJvZ3JhbVBhZ2UnKSxcbiAgICAgICAgICByZXNwb25zZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICBtYXhXaWR0aDogJzkwdncnXG4gICAgfSlcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmxvY2tDZXJ0aWZpY2F0ZSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgbG9hZExhbmd1YWdlRGF0YSgpIHtcbiAgICB0aGlzLmxhbmd1YWdlTGlzdCA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0QWxsQ29udGVudExhbmd1YWdlcyh0aGlzLmNvbnRlbnRSZWFkRGF0YSlcbiAgICB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldFNlbGVjdGVkTGFuZ3VhZ2UodGhpcy5jb250ZW50UmVhZERhdGEpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUNvbnRlbnRQcmV2aWV3T3JFbnJvbGxtZW50KCkge1xuICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZENvbnRlbnRGb3JQcmV2aWV3KClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gLy8gSWYgd2UncmUgd29ya2luZyB3aXRoIG11bHRpbGluZ3VhbCBjb250ZW50LCBtYWtlIHN1cmUgdG8gZmV0Y2ggaXRzIGhpZXJhcmNoeVxuICAgICAgLy8gaWYgKHRoaXMucXVlcnlQYXJhbXNEYXRhLm1sSWQgJiYgdGhpcy5jb250ZW50UmVhZERhdGEgJiZcbiAgICAgIC8vICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyID09PSB0aGlzLnF1ZXJ5UGFyYW1zRGF0YS5tbElkKSB7XG4gICAgICAvLyAgIC8vIEZldGNoIGNvbnRlbnQgaGllcmFyY2h5IGZvciB0aGUgbXVsdGlsaW5ndWFsIGNvbnRlbnRcbiAgICAgIC8vICAgdHJ5IHtcbiAgICAgIC8vICAgICBhd2FpdCB0aGlzLmZldGNoQ29udGVudEhpZXJhcmNoeSh0aGlzLmNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyKTtcbiAgICAgIC8vICAgICAvLyBBZnRlciBmZXRjaGluZyBoaWVyYXJjaHksIHVwZGF0ZSBVSSBjb21wb25lbnRzXG4gICAgICAvLyAgICAgdGhpcy5nZXRMZWFybmluZ1VybHMoKTtcbiAgICAgIC8vICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgZmV0Y2hpbmcgaGllcmFyY2h5IGZvciBtdWx0aWxpbmd1YWwgY29udGVudDonLCBlcnJvcik7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH1cblxuICAgICAgLy8gQ29udGludWUgd2l0aCByZWd1bGFyIGVucm9sbG1lbnQgZmxvd1xuICAgICAgdGhpcy5mZXRjaFVzZXJFbnJvbGxtZW50RGF0YVYyKClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRDb250ZW50Rm9yUHJldmlldygpIHtcbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICBhd2FpdCB0aGlzLmZldGNoQ29udGVudEhpZXJhcmNoeSh0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJylcbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YSh0aGlzLmNvbnRlbnQpXG4gICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGxvYWRCYW5uZXJBbmRUb2NDb25maWcoZGF0YTogRGF0YSkge1xuICAgIHRoaXMuYmFubmVycyA9IGRhdGE/LnBhZ2VEYXRhPy5kYXRhPy5iYW5uZXJzIHx8IFtdXG4gICAgdGhpcy50b2NTdmMuc3VidGl0bGVPbkJhbm5lcnMgPSBkYXRhPy5wYWdlRGF0YT8uZGF0YT8uc3VidGl0bGVPbkJhbm5lcnMgfHwgZmFsc2VcbiAgICB0aGlzLnRvY1N2Yy5zaG93RGVzY3JpcHRpb24gPSBkYXRhPy5wYWdlRGF0YT8uZGF0YT8uc2hvd0Rlc2NyaXB0aW9uIHx8IGZhbHNlXG4gICAgdGhpcy50b2NDb25maWcgPSBkYXRhPy5wYWdlRGF0YT8uZGF0YSB8fCB7fVxuICAgIHRoaXMua3BhcnJheSA9IHRoaXMudG9jQ29uZmlnLmthcm1hUG9pbnRzXG4gIH1cblxuICBwcml2YXRlIGZldGNoUG9zdEFzc2Vzc21lbnRTdGF0dXNJZk5lZWRlZCgpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuaXNQb3N0QXNzZXNzbWVudCkge1xuICAgICAgdGhpcy50b2NTdmMuZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1cyh0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIGNvbnN0IGFzc2Vzc21lbnREYXRhID0gcmVzLnJlc3VsdFxuICAgICAgICBmb3IgKGNvbnN0IG8gb2YgYXNzZXNzbWVudERhdGEpIHtcbiAgICAgICAgICBpZiAoby5jb250ZW50SWQgPT09ICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dUYWtlQXNzZXNzbWVudCA9IG9cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBGcmFnbWVudFN1YnNjcmlwdGlvbigpIHtcbiAgICB0aGlzLmN1cnJlbnRGcmFnbWVudCA9ICdvdmVydmlldydcbiAgICB0aGlzLnJvdXRlLmZyYWdtZW50LnN1YnNjcmliZSgoZnJhZ21lbnQ6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50RnJhZ21lbnQgPSBmcmFnbWVudCB8fCAnb3ZlcnZpZXcnXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBCYXRjaFN1YnNjcmlwdGlvbnMoKSB7XG4gICAgdGhpcy5iYXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLmJhdGNoUmVwbGF5U3ViamVjdC5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB0aGlzLmhhbmRsZUJhdGNoVXBkYXRlKCksXG4gICAgICAoKSA9PiB0aGlzLmxvZ2dlclN2Yy5lcnJvcignZXJyb3Igb24gYmF0Y2hTdWJzY3JpcHRpb24nKVxuICAgIClcblxuICAgIHRoaXMuYmF0Y2hEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuc2V0QmF0Y2hEYXRhU3ViamVjdC5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB0aGlzLmhhbmRsZUJsZW5kZWRQcm9ncmFtVXBkYXRlKCksXG4gICAgICAoKSA9PiB0aGlzLmxvZ2dlclN2Yy5lcnJvcignZXJyb3Igb24gYmF0Y2hEYXRhU3Vic2NyaXB0aW9uJylcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUJhdGNoVXBkYXRlKCkge1xuICAgIHRoaXMuZmV0Y2hCYXRjaERldGFpbHMoKVxuICAgIGlmICh0aGlzLmNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XG4gICAgICB0aGlzLmZldGNoVXNlcldGRm9yQmxlbmRlZCgpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVCbGVuZGVkUHJvZ3JhbVVwZGF0ZSgpIHtcbiAgICBpZiAodGhpcy5jb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkge1xuICAgICAgdGhpcy5mZXRjaFVzZXJXRkZvckJsZW5kZWQoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlRGVmYXVsdExvZ28oKSB7XG4gICAgY29uc3QgaW5zdGFuY2VDb25maWcgPSB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZ1xuICAgIGlmIChpbnN0YW5jZUNvbmZpZz8ubG9nb3M/LmRlZmF1bHRTb3VyY2VMb2dvKSB7XG4gICAgICB0aGlzLmRlZmF1bHRTTG9nbyA9IGluc3RhbmNlQ29uZmlnLmxvZ29zLmRlZmF1bHRTb3VyY2VMb2dvXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25maWd1cmVGZWF0dXJlRmxhZ3MoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcykge1xuICAgICAgdGhpcy5pc0dvYWxzRW5hYmxlZCA9ICF0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKCdnb2FscycpXG4gICAgICB0aGlzLmlzUmVnaXN0cmF0aW9uU3VwcG9ydGVkID0gdGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzLmhhcygncmVnaXN0cmF0aW9uRXh0ZXJuYWwnKVxuICAgICAgdGhpcy5zaG93SW50cmFuZXRNZXNzYWdlID0gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ3Nob3dJbnRyYW5ldE1lc3NhZ2VEZXNrdG9wJylcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwUm91dGVyRXZlbnRTdWJzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5yb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKHJvdXRlckV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgaWYgKHJvdXRlckV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICB0aGlzLmFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIocm91dGVyRXZlbnQudXJsKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG5cbiAgZmV0Y2hVc2VyRW5yb2xsbWVudERhdGFWMigpIHtcblxuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgJydcbiAgICBpZiAoIWlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdDYW5ub3QgZmV0Y2ggZW5yb2xsbWVudCBkYXRhOiBjb250ZW50IGlkZW50aWZpZXIgaXMgbWlzc2luZycpXG4gICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCA9IFtdXG4gICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgcmV0aXJlZENvdXJzZXNFbmFibGVkOiB0cnVlLFxuICAgICAgICBjb3Vyc2VJZDogW2lkZW50aWZpZXJdXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbnJvbGxTdmMuZmV0Y2hFbnJvbGxDb250ZW50RGF0YShyZXF1ZXN0KS5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSxcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcz8ucmVzdWx0Py5jb3Vyc2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCA9IHJlcy5yZXN1bHQuY291cnNlc1xuICAgICAgICAgIC8vIENoZWNrIGZvciBjb21wbGV0ZWQgY29udGVudFxuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvbnRlbnREYXRhID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QuZmluZChcbiAgICAgICAgICAgIChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciAmJlxuICAgICAgICAgICAgICBlbC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXG4gICAgICAgICAgKVxuICAgICAgICAgIGlmIChjb21wbGV0ZWRDb250ZW50RGF0YSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50Vmlld0V2ZW50Rm9yTmV0Q29yZSgnY29tcGxldGUnKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRhdGFUcmFuc2ZlclN2Yy5zZXRFbnJvbGxEYXRhKHRoaXMudXNlckVucm9sbG1lbnRMaXN0KVxuICAgICAgICAgIC8vIGluIGNhc2Ugb2YgYmFjayBmcm9tIHBsYXllciB3ZSBuZWVkIHRvIGNoZWNrIHJlY2VudCBsYW5ndWFnZSBhbmQgbG9hZFxuICAgICAgICAgIGlmICghdGhpcy5jb250ZW50TGliU3ZjPy5vbmVTdGVwUmVzdW1lRW5hYmxlICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciA9PT0gdGhpcy5jb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIGxldCBsYW5nID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5sYW5ndWFnZS5sZW5ndGggPyB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/Lmxhbmd1YWdlWzBdIDogJydcbiAgICAgICAgICAgIGxldCBiYXNlQ29udGVudEZyb21FbnJvbGxEYXRhID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT4gZWwuY29sbGVjdGlvbklkID09PSB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIpXG4gICAgICAgICAgICBpZiAobGFuZyAmJiBiYXNlQ29udGVudEZyb21FbnJvbGxEYXRhICYmIGJhc2VDb250ZW50RnJvbUVucm9sbERhdGE/LnJlY2VudF9sYW5ndWFnZT8udG9Mb3dlckNhc2UoKSAhPT0gbGFuZykge1xuICAgICAgICAgICAgICBsZXQgbG9jYWxMYW5nID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRSZXF1aXJlZExhbmd1YWdlRGV0YWlscyh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEsIGJhc2VDb250ZW50RnJvbUVucm9sbERhdGE/LnJlY2VudF9sYW5ndWFnZSlcbiAgICAgICAgICAgICAgaWYgKGxvY2FsTGFuZyAmJiBPYmplY3Qua2V5cyhsb2NhbExhbmcpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xhbmd1YWdlU2VsZWN0aW9uKHRoaXMuY29udGVudExhbmdTdmMuZ2V0UmVxdWlyZWRMYW5ndWFnZURldGFpbHModGhpcy5iYXNlQ29udGVudFJlYWREYXRhLCBiYXNlQ29udGVudEZyb21FbnJvbGxEYXRhPy5yZWNlbnRfbGFuZ3VhZ2UpKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xhbmd1YWdlU2VsZWN0aW9uKHRoaXMuY29udGVudExhbmdTdmMuZ2V0U2VsZWN0ZWRMYW5ndWFnZSh0aGlzLmNvbnRlbnRSZWFkRGF0YSkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWx3YXlzIGNhbGwgZmV0Y2hDb250ZW50SGllcmFyY2h5IGZpcnN0XG4gICAgICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoQ29udGVudEhpZXJhcmNoeSh0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJykpXG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51c2VyRW5yb2xsbWVudExpc3QgPSBbXVxuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgY29udGVudCBJRCBmcm9tIGVpdGhlciBjb250ZW50IG9yIGNvbnRlbnRSZWFkRGF0YVxuICAgICAgICAgIGNvbnN0IGNvbnRlbnRJZCA9IHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJ1xuICAgICAgICAgIGlmICghY29udGVudElkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignQ2Fubm90IGZldGNoIGhpZXJhcmNoeTogY29udGVudCBpZGVudGlmaWVyIGlzIG1pc3NpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGZXRjaCBoaWVyYXJjaHkgY29udGVudCBmb3IgYWRkaXRpb25hbCBkYXRhXG4gICAgICAgICAgcmV0dXJuIGZyb20odGhpcy5mZXRjaENvbnRlbnRIaWVyYXJjaHkoY29udGVudElkKSlcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAvLyBBZGQgY2F0Y2hFcnJvciBoZXJlIHRvIGhhbmRsZSBlcnJvcnMgZnJvbSBmZXRjaENvbnRlbnRIaWVyYXJjaHlcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgaW4gZW5yb2xsbWVudCBkYXRhIHByb2Nlc3NpbmcnLCBlcnJvcilcbiAgICAgICAgcmV0dXJuIG9mKGZhbHNlKVxuICAgICAgfSlcbiAgICApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdD8ubGVuZ3RoICYmIHRoaXMuY29udGVudExpYlN2Yz8ub25lU3RlcFJlc3VtZUVuYWJsZSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlT25lU3RlcFJlc3VtZSgpXG4gICAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRmFpbGVkIHRvIGZldGNoIHVzZXIgZW5yb2xsbWVudCBkYXRhJywgZXJyb3IpXG4gICAgICAgIHRoaXMudXNlckVucm9sbG1lbnRMaXN0ID0gW11cbiAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgIH0sXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAvLyBPcHRpb25hbCBjb21wbGV0aW9uIGhhbmRsZXIgaWYgbmVlZGVkXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlT25lU3RlcFJlc3VtZSgpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NvbnRlbnQgbm90IGF2YWlsYWJsZSBmb3Igb25lLXN0ZXAgcmVzdW1lJylcblxuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3VuZENvbnRlbnQgPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5maW5kKFxuICAgICAgICAoZWw6IGFueSkgPT4gZWwuY29sbGVjdGlvbklkID09PSB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXJcbiAgICAgIClcblxuICAgICAgaWYgKCFmb3VuZENvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMud2FybignTm8gbWF0Y2hpbmcgZW5yb2xsZWQgY29udGVudCBmb3VuZCBmb3Igb25lLXN0ZXAgcmVzdW1lJylcblxuICAgICAgfVxuXG4gICAgICBjb25zdCB1cmxEYXRhID0gYXdhaXQgdGhpcy5jb250ZW50TGliU3ZjLmdldFJlc291cnNlTGluayhcbiAgICAgICAgdGhpcy5jb250ZW50LFxuICAgICAgICBbZm91bmRDb250ZW50XSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLFxuICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJyxcbiAgICAgIClcblxuICAgICAgaWYgKCF1cmxEYXRhKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLndhcm4oJ05vIFVSTCBkYXRhIHJldHVybmVkIGZvciBvbmUtc3RlcCByZXN1bWUnKVxuXG4gICAgICB9XG5cbiAgICAgIGlmICh1cmxEYXRhPy51cmwpIHtcbiAgICAgICAgaWYgKHVybERhdGEudXJsLmluY2x1ZGVzKCdhcHAvdG9jJykpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRMaWJTdmMub25lU3RlcFJlc3VtZUVuYWJsZSA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb250ZW50TGliU3ZjLm9uZVN0ZXBSZXN1bWVFbmFibGUgPSBmYWxzZVxuICAgICAgICAgIC8vIFdoZW4gY29taW5nIGZyb20gc2VhcmNoIHBhZ2UgZm9yIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgY29udGVudCwgY29uZmlybSBmaXJzdCB0byBvbmUgc3RlcCByZXN1bWUgb3IgbG9hZCB0aGUgc2VhcmNoZWQgbGFuZ3VhZ2VcbiAgICAgICAgICBpZiAodXJsRGF0YT8ucXVlcnlQYXJhbXM/Lk1MICYmICh1cmxEYXRhPy5xdWVyeVBhcmFtcz8uTUwgIT09IHRoaXMucXVlcnlQYXJhbXNEYXRhWydNTCddKSkge1xuICAgICAgICAgICAgdGhpcy5zaG93T25lU3RlcFJlc3VtZUNvbmZpcm0odXJsRGF0YSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgICAgIFt1cmxEYXRhLnVybF0sXG4gICAgICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHVybERhdGEucXVlcnlQYXJhbXMgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgaW4gaGFuZGxlT25lU3RlcFJlc3VtZScsIGVycm9yKVxuICAgICAgdGhpcy5jb250ZW50TGliU3ZjLm9uZVN0ZXBSZXN1bWVFbmFibGUgPSBmYWxzZVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGZldGNoQ29udGVudEhpZXJhcmNoeShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0xlYXJuaW5nIFBhdGh3YXknKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmFwcFRvY1YyU3ZjLmNvbnN0cnVjdEhlaXJhcmNoeURhdGEoY29udGVudClcbiAgICAgICAgdGhpcy5hcHBUb2NWMlN2Yy5tYXBDb250ZW50SGllcmFyY2h5UHJvZ3Jlc3NVcGRhdGUodGhpcy5jb250ZW50LCB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdClcbiAgICAgICAgLy8gQ3JlYXRlIGhhc2htYXAgYW5kIGNvbXB1dGUgbWlsZXN0b25lIGxvY2tpbmcgYWZ0ZXIgcHJvZ3Jlc3MgaXMgdXBkYXRlZFxuICAgICAgICB0aGlzLnRvY1N2Yy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAodGhpcy5jb250ZW50KVxuICAgICAgICBjb25zb2xlLmxvZygnaGFzaG1hcCcsIHRoaXMudG9jU3ZjLmhhc2htYXApXG4gICAgICAgIC8vIENvbXB1dGUgbWlsZXN0b25lIGxvY2tpbmcgc3RhdHVzIHdpdGggdXBkYXRlZCBwcm9ncmVzcyBkYXRhXG4gICAgICAgIHRoaXMudG9jU3ZjLmNvbXB1dGVNaWxlc3RvbmVMb2NraW5nU3RhdHVzKClcbiAgICAgICAgLy8gU3luYyBjb250ZW50IHRyZWUncyBpc0xvY2tlZCB3aXRoIGNvbXB1dGVkIHZhbHVlc1xuICAgICAgICB0aGlzLnN5bmNNaWxlc3RvbmVMb2NrU3RhdHVzKClcbiAgICAgICAgdGhpcy5nZXRPcmdJZEZvclNoYXJlKClcbiAgICAgICAgdGhpcy5nZXRUb2NTdHJ1Y3R1cmUoKVxuICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSBmZXRjaEhpZXJhcmNoeUNvbnRlbnQgcmV0dXJucyBhbiBPYnNlcnZhYmxlXG4gICAgICAgIGNvbnN0IG9ic2VydmFibGUgPSB0aGlzLmNvbnRlbnRTdmMuZmV0Y2hIaWVyYXJjaHlDb250ZW50KGlkZW50aWZpZXIsICdkZXRhaWwnKVxuXG4gICAgICAgIGlmICghb2JzZXJ2YWJsZSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdmZXRjaEhpZXJhcmNoeUNvbnRlbnQgZGlkIG5vdCByZXR1cm4gYW4gT2JzZXJ2YWJsZScpXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG9ic2VydmFibGUuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5yZXN1bHQ/LmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gcmVzcG9uc2UucmVzdWx0LmNvbnRlbnRcbiAgICAgICAgICAgICAgdGhpcy5nZXRPcmdJZEZvclNoYXJlKClcbiAgICAgICAgICAgICAgdGhpcy5nZXRUb2NTdHJ1Y3R1cmUoKVxuICAgICAgICAgICAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlclJhdGluZyA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VXNlclJhdGluZyhmYWxzZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBoaWVyYXJjaHkgY29udGVudCcsIGVycm9yKVxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldFRvY1N0cnVjdHVyZSgpIHtcbiAgICB0aGlzLmluaXRpYWxpemVUb2NTdHJ1Y3R1cmUoKVxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy50b2NTdHJ1Y3R1cmUpIHtcbiAgICAgIHRoaXMuaGFzVG9jU3RydWN0dXJlID0gZmFsc2VcbiAgICAgIHRoaXMudG9jU3RydWN0dXJlLmxlYXJuaW5nTW9kdWxlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFID8gLTEgOiAwXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZS5jb3Vyc2UgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DT1VSU0UgPyAtMSA6IDBcbiAgICAgIHRoaXMudG9jU3RydWN0dXJlID0gdGhpcy50b2NTdmMuZ2V0VG9jU3RydWN0dXJlKHRoaXMuY29udGVudCwgdGhpcy50b2NTdHJ1Y3R1cmUpXG4gICAgICBmb3IgKGNvbnN0IHByb2dUeXBlIGluIHRoaXMudG9jU3RydWN0dXJlKSB7XG4gICAgICAgIGlmICh0aGlzLnRvY1N0cnVjdHVyZVtwcm9nVHlwZV0gPiAwKSB7XG4gICAgICAgICAgdGhpcy5oYXNUb2NTdHJ1Y3R1cmUgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmcm9tIG5nT25DaGFuZ2VzXG4gICAgICB0aGlzLmZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKClcbiAgICAgIHRoaXMubW9kaWZ5U2Vuc2libGVDb250ZW50UmF0aW5nKClcbiAgICAgIHRoaXMuYXNzaWduUGF0aEFuZFVwZGF0ZUJhbm5lcih0aGlzLnJvdXRlci51cmwpXG4gICAgICB0aGlzLmdldExlYXJuaW5nVXJscygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmMgbWlsZXN0b25lIGlzTG9ja2VkIHByb3BlcnR5IHdpdGggY29tcHV0ZWQgbG9ja2luZyBzdGF0dXMgZnJvbSBoYXNobWFwXG4gICAqIFRoaXMgZW5zdXJlcyB0aGUgY29udGVudCB0cmVlIHJlZmxlY3RzIHRoZSBhY3R1YWwgbG9jayBzdGF0dXNcbiAgICovXG4gIHN5bmNNaWxlc3RvbmVMb2NrU3RhdHVzKCkge1xuICAgIGlmICghdGhpcy5jb250ZW50IHx8ICF0aGlzLmNvbnRlbnQuY2hpbGRyZW4pIHJldHVyblxuXG4gICAgdGhpcy5jb250ZW50LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdNaWxlc3RvbmUnICYmIGNoaWxkLmlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgaGFzaERhdGEgPSB0aGlzLnRvY1N2Yy5oYXNobWFwW2NoaWxkLmlkZW50aWZpZXJdXG4gICAgICAgIGlmIChoYXNoRGF0YSAmJiBoYXNoRGF0YS5jb21wdXRlZElzTG9ja2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjaGlsZC5pc0xvY2tlZCA9IGhhc2hEYXRhLmNvbXB1dGVkSXNMb2NrZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBvbkxhbmd1YWdlU2VsZWN0KGxhbmc6IGFueSkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSBpcyBhbHJlYWR5IHNldFxuICAgIGlmICh0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgJiYgdGhpcy5zZWxlY3RlZExhbmd1YWdlLmlkZW50aWZpZXIgPT09IGxhbmcuaWRlbnRpZmllcikge1xuICAgICAgcmV0dXJuIC8vIEV4aXQgdGhlIGZ1bmN0aW9uIGlmIHRoZSBsYW5ndWFnZSBpcyB0aGUgc2FtZVxuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJiB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGgpIHtcbiAgICAgIGxldCBkYXRhID0ge31cbiAgICAgIC8vIFRPRE86IFJlbW92ZSBoYXJkY29kZSBzdHJpbmdzXG4gICAgICBjb25zdCBlbnJvbGxlZENvdXJzZSA9IHRoaXMudG9jU3ZjLmZpbmRFbnJvbG1lbnRCeUNvbGxlY3Rpb25JZCh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCwgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJykpXG4gICAgICBpZiAoZW5yb2xsZWRDb3Vyc2UgJiYgZW5yb2xsZWRDb3Vyc2Uuc3RhdHVzID09PSAyKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xhbmd1YWdlU2VsZWN0aW9uKGxhbmcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBwcm9ncmVzcyBpbiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UsXG4gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3MgJiYgdGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzW2xhbmcubGFuZ0lkXSA+IDApIHtcbiAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgZnJvbTogJ2xhbmd1YWdlU3dpdGNoJyxcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYW5zbGF0ZScsXG4gICAgICAgICAgICAgIGhlYWRlcjogYENvbnRpbnVlIHdoZXJlIHlvdSBsZWZ0IG9mZiBpbiAke2xhbmcubmFtZX0/YCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFlvdSd2ZSBhbHJlYWR5IG1hZGUgc29tZSBwcm9ncmVzcyBpbiB0aGlzIGxhbmd1YWdlLlxcbiBJZiB5b3UgY29udGludWUgaXQgd2lsbCByZXN1bWUgZnJvbSB3aGVyZSB5b3UgbGVmdCBvZmYuYCxcbiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uOiAnQmFjaycsXG4gICAgICAgICAgICAgIGFjY2VwdEJ1dHRvbjogJ1Jlc3VtZScsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHByb2dyZXNzIGluIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSwgb3IgZmlyc3QgdGltZSBzZWxlY3Rpb25cbiAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgZnJvbTogJ2xhbmd1YWdlU3dpdGNoJyxcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYW5zbGF0ZScsXG4gICAgICAgICAgICAgIGhlYWRlcjogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIGxhbmd1YWdlPycsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdTd2l0Y2hpbmcgdGhlIGxhbmd1YWdlIHdpbGwgcmVzZXQgeW91ciBwcm9ncmVzcy4gXFxuIFRoZSBjb3Vyc2Ugd2lsbCByZXN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyBpbiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UuJyxcbiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uOiAnQmFjaycsXG4gICAgICAgICAgICAgIGFjY2VwdEJ1dHRvbjogJ0NoYW5nZSBsYW5ndWFnZScsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd0xhbmdTd2l0Y2hQb3B1cChsYW5nLCBkYXRhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2Nlc3NMYW5ndWFnZVNlbGVjdGlvbihsYW5nKVxuICAgIH1cbiAgfVxuXG4gIHNob3dMYW5nU3dpdGNoUG9wdXAobGFuZzogYW55LCBkYXRhPzogYW55KSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihUT0NNdWx0aUxpbmd1YWxEaWFsb2dDb21wb25lbnQsIGRhdGEpXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChjb25maXJtZWQpID0+IHtcbiAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGFuZ3VhZ2VTZWxlY3Rpb24obGFuZylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc2hvd09uZVN0ZXBSZXN1bWVDb25maXJtKHVybERhdGE6IGFueSkge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgZGF0YToge1xuICAgICAgICBmcm9tOiAnbGFuZ3VhZ2VTd2l0Y2gnLFxuICAgICAgICBpY29uOiAndHJhbnNsYXRlJyxcbiAgICAgICAgaGVhZGVyOiBgWW91J3ZlIGFscmVhZHkgc3RhcnRlZCB0aGlzIGNvdXJzZWAsXG4gICAgICAgIG1lc3NhZ2U6IGBZb3XigJl2ZSBtYWRlIHNvbWUgPGI+cHJvZ3Jlc3M8L2I+IGluIGFub3RoZXIgbGFuZ3VhZ2Ugb2YgdGhpcyBjb3Vyc2UuIFxcbldvdWxkIHlvdSBsaWtlIHRvIDxiPnJlc3VtZSB3aGVyZSB5b3UgbGVmdCBvZmY8L2I+LCBvciBjb250aW51ZSB3aXRoIHRoaXMgdmVyc2lvbiBpbnN0ZWFkP2AsXG4gICAgICAgIGNhbmNlbEJ1dHRvbjogJ0NvbnRpbnVlIEhlcmUnLFxuICAgICAgICBhY2NlcHRCdXR0b246ICdSZXN1bWUnLFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFRPQ011bHRpTGluZ3VhbERpYWxvZ0NvbXBvbmVudCwgZGF0YSlcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKGNvbmZpcm1lZCkgPT4ge1xuICAgICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICBbdXJsRGF0YS51cmxdLFxuICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHVybERhdGEucXVlcnlQYXJhbXMgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldFJlcXVpcmVkTGFuZ3VhZ2VEZXRhaWxzKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSwgdGhpcy5xdWVyeVBhcmFtc0RhdGFbJ01MJ10pXG4gICAgICAgIHRoaXMucHJvY2Vzc0xhbmd1YWdlU2VsZWN0aW9uKGxhbmcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByb2Nlc3NMYW5ndWFnZVNlbGVjdGlvbihsYW5nOiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgPSBsYW5nXG5cbiAgICAvLyBTZXQgc2tlbGV0b24gbG9hZGVyIHRvIHNob3cgbG9hZGluZyBzdGF0ZVxuICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSB0cnVlXG4gICAgLy8gQ2hlY2sgaWYgbGFuZ3VhZ2Ugb2JqZWN0IGhhcyByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gICAgaWYgKGxhbmcgJiYgbGFuZy5pZGVudGlmaWVyKSB7XG4gICAgICAvLyBDcmVhdGUgYSBwcm9taXNlIGNoYWluIHRvIGZldGNoIGNvbnRlbnQgZGF0YSBhbmQgaGllcmFyY2h5IHNlcXVlbnRpYWxseVxuICAgICAgdGhpcy5mZXRjaENvbnRlbnRSZWFkKGxhbmcuaWRlbnRpZmllcilcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIEFmdGVyIGNvbnRlbnQgcmVhZCBpcyBzdWNjZXNzZnVsLCBmZXRjaCB0aGUgaGllcmFyY2h5XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hDb250ZW50SGllcmFyY2h5KGxhbmcuaWRlbnRpZmllcilcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIEJvdGggb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWxcbiAgICAgICAgICAvLyBVcGRhdGUgVUkgYXMgbmVlZGVkIHdpdGggbmV3IGNvbnRlbnRcbiAgICAgICAgICB0aGlzLnJvdXRlckNoYW5nZUhhbmRsZXIodHJ1ZSlcbiAgICAgICAgICBpZiAodGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmdldExlYXJuaW5nVXJscygpXG4gICAgICAgICAgICAvLyBSZXNldCB1c2VyIHByb2dyZXNzIGFuZCBmZXRjaCBlbnJvbGxtZW50IGRhdGEgaWYgbm90IGluIHByZXZpZXcgbW9kZVxuICAgICAgICAgICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVXBkYXRlIHN1YmplY3QgdG8gbm90aWZ5IHJhdGluZyBzdW1tcnkgY29tcG9uZW50IGFuZCBsb2FkIHRoZSBzdW1hbXJ5IG9mIHNlbGVjdGVkIGxhbmd1YWdlXG4gICAgICAgICAgdGhpcy5yZXNldFJhdGluZ3NTZXJ2aWNlLnNldFJhdGluZ1NlcnZpY2VVcGRhdGUodHJ1ZSlcbiAgICAgICAgICAvLyBGaW5hbGx5IHNldCBsb2FkaW5nIHN0YXRlIHRvIGZhbHNlXG4gICAgICAgICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAvLyBIYW5kbGUgYW55IGVycm9ycyBpbiB0aGUgcHJvbWlzZSBjaGFpblxuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdFcnJvciBkdXJpbmcgbGFuZ3VhZ2UgY2hhbmdlOicsIGVycm9yKVxuICAgICAgICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignRmFpbGVkIHRvIGxvYWQgY29udGVudCBpbiBzZWxlY3RlZCBsYW5ndWFnZScsICdYJywge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0ludmFsaWQgbGFuZ3VhZ2Ugc2VsZWN0aW9uJywgbGFuZylcbiAgICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdJbnZhbGlkIGxhbmd1YWdlIHNlbGVjdGlvbicsICdYJywge1xuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY29udGVudCBkYXRhIGZvciBhIGdpdmVuIGlkZW50aWZpZXIgYW5kIHVwZGF0ZXMgdGhlIGNvbnRlbnRSZWFkRGF0YSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgY29udGVudCBpZGVudGlmaWVyIHRvIGZldGNoXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIGNvbnRlbnQgd2FzIGZldGNoZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDb250ZW50UmVhZChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdDYW5ub3QgZmV0Y2ggY29udGVudDogaWRlbnRpZmllciBpcyBtaXNzaW5nJylcbiAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9ic2VydmFibGUgPSB0aGlzLmNvbnRlbnRTdmMuZmV0Y2hDb250ZW50RGF0YShpZGVudGlmaWVyKVxuXG4gICAgICBpZiAoIW9ic2VydmFibGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ2ZldGNoQ29udGVudERhdGEgZGlkIG5vdCByZXR1cm4gYW4gT2JzZXJ2YWJsZScpXG4gICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBvYnNlcnZhYmxlLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlPy5yZXN1bHQ/LmNvbnRlbnQpIHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBjb250ZW50UmVhZERhdGEgd2l0aCB0aGUgZmV0Y2hlZCBjb250ZW50XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YSA9IHJlc3BvbnNlLnJlc3VsdC5jb250ZW50XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBsYW5ndWFnZSBsaXN0IGFmdGVyIGNvbnRlbnQgaXMgZmV0Y2hlZFxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhKSB7XG4gICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VMaXN0ID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRBbGxDb250ZW50TGFuZ3VhZ2VzKHRoaXMuY29udGVudFJlYWREYXRhKVxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldFNlbGVjdGVkTGFuZ3VhZ2UodGhpcy5jb250ZW50UmVhZERhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXJTdmMud2FybignQ29udGVudCBkYXRhIG5vdCBmb3VuZCBpbiByZXNwb25zZScsIHJlc3BvbnNlKVxuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBjb250ZW50IGRhdGEnLCBlcnJvcilcbiAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcm91dGVyQ2hhbmdlSGFuZGxlcihhcHBlbmRCYXRjaElkOiBib29sZWFuKSB7XG4gICAgY29uc3QgcXVlcnlQYXJhbXM6IGFueSA9IHt9XG5cbiAgICAvLyBBZGQgYmF0Y2ggSUQgaWYgbmVlZGVkXG4gICAgaWYgKGFwcGVuZEJhdGNoSWQgJiYgdGhpcy5nZXRCYXRjaElkKCkpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zLmJhdGNoSWQgPSB0aGlzLmdldEJhdGNoSWQoKVxuICAgIH1cblxuICAgIC8vIEFkZCBtdWx0aWxpbmd1YWwgSUQgYW5kIGxhbmd1YWdlIHRvIHF1ZXJ5IHBhcmFtcyBpZiBhdmFpbGFibGVcbiAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb250ZW50UmVhZERhdGEuaWRlbnRpZmllcikge1xuICAgICAgbGV0IGxhbmd1YWdlID0gJydcblxuICAgICAgLy8gSGFuZGxlIGJvdGggc3RyaW5nIGFuZCBhcnJheSBsYW5ndWFnZSBmb3JtYXRzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmNvbnRlbnRSZWFkRGF0YS5sYW5ndWFnZSkpIHtcbiAgICAgICAgbGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YS5sYW5ndWFnZVswXS50b0xvd2VyQ2FzZSgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudFJlYWREYXRhLmxhbmd1YWdlKSB7XG4gICAgICAgIGxhbmd1YWdlID0gdGhpcy5jb250ZW50UmVhZERhdGEubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKVxuICAgICAgfVxuICAgICAgaWYgKCEodGhpcy5zZWxlY3RlZExhbmd1YWdlICYmIE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSkubGVuZ3RoKSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgPSB7XG4gICAgICAgICAgbGFuZ0lkOiBsYW5ndWFnZSxcbiAgICAgICAgICBuYW1lOiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5sYW5ndWFnZVswXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IGFkZCBwYXJhbWV0ZXJzIGlmIHdlIGhhdmUgdmFsaWQgZGF0YVxuICAgICAgaWYgKGxhbmd1YWdlKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zLk1MID0gbGFuZ3VhZ2VcbiAgICAgIH1cblxuICAgICAgcXVlcnlQYXJhbXMuTUxJZCA9IHRoaXMuY29udGVudFJlYWREYXRhLmlkZW50aWZpZXJcbiAgICB9XG5cbiAgICAvLyBPbmx5IG5hdmlnYXRlIGlmIHdlIGhhdmUgYmF0Y2ggSUQgb3Igb3RoZXIgcGFyYW1ldGVyc1xuICAgIGlmIChPYmplY3Qua2V5cyhxdWVyeVBhcmFtcykubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgIFtdLFxuICAgICAgICB7XG4gICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICBxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMsXG4gICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udGludWVMZWFybmluZ0RhdGEoY29udGVudElkOiBzdHJpbmcsIGJhdGNoSWQ/OiBzdHJpbmcsIGxhbmc/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICB0aGlzLnJlc3VtZURhdGEgPSBudWxsXG4gICAgbGV0IHVzZXJJZFxuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSkge1xuICAgICAgdXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkIHx8ICcnXG4gICAgfVxuXG4gICAgY29uc3QgcmVxOiBOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhUmVxID0ge1xuICAgICAgcmVxdWVzdDoge1xuICAgICAgICBiYXRjaElkLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgIGNvdXJzZUlkOiBjb250ZW50SWQgfHwgJycsXG4gICAgICAgIGNvbnRlbnRJZHM6IFtdLFxuICAgICAgICBmaWVsZHM6IFsncHJvZ3Jlc3NkZXRhaWxzJ10sXG4gICAgICAgIC4uLihsYW5nID8geyBsYW5ndWFnZTogbGFuZyB9IDogbnVsbCksXG4gICAgICB9LFxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmMuZmV0Y2hDb250ZW50SGlzdG9yeVYyKHJlcSkuc3Vic2NyaWJlKFxuICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc3VsdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBSZXN1bWVEYXRhID0gXy5nZXQoZGF0YSwgJ3Jlc3VsdC5jb250ZW50TGlzdCcpXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3MgPSBfLmdldChkYXRhLCAncmVzdWx0Lmxhbmd1YWdlUHJvZ3Jlc3MnKSB8fCB7fVxuICAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhID0gXy5tYXAodGVtcFJlc3VtZURhdGEsIHJyID0+IHtcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gXy5maWx0ZXIoZmxhdHRlbkl0ZW1zKF8uZ2V0KHRoaXMuY29udGVudCwgJ2NoaWxkcmVuJykgfHwgW10sICdjaGlsZHJlbicpLCB7ICdpZGVudGlmaWVyJzogcnIuY29udGVudElkLCBwcmltYXJ5Q2F0ZWdvcnk6ICdMZWFybmluZyBSZXNvdXJjZScgfSlcbiAgICAgICAgICAgICAgXy5zZXQocnIsICdwcm9ncmVzc2RldGFpbHMubWltZVR5cGUnLCBfLmdldChfLmZpcnN0KGl0ZW1zKSwgJ21pbWVUeXBlJykpXG4gICAgICAgICAgICAgIGlmICghXy5nZXQocnIsICdjb21wbGV0aW9uUGVyY2VudGFnZScpKSB7XG4gICAgICAgICAgICAgICAgaWYgKF8uZ2V0KHJyLCAnc3RhdHVzJykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgIF8uc2V0KHJyLCAnY29tcGxldGlvblBlcmNlbnRhZ2UnLCAxMDApXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIF8uc2V0KHJyLCAnY29tcGxldGlvblBlcmNlbnRhZ2UnLCAwKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcnJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IF8ubWFwKHRoaXMucmVzdW1lRGF0YSwgJ2NvbXBsZXRpb25QZXJjZW50YWdlJylcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBfLnRvSW50ZWdlcihfLmdldCh0aGlzLmNvbnRlbnQsICdsZWFmTm9kZXNDb3VudCcpKSB8fCAxXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3MubGVuZ3RoIDwgdG90YWxDb3VudCkge1xuICAgICAgICAgICAgICBjb25zdCBkaWZmID0gdG90YWxDb3VudCAtIHByb2dyZXNzLmxlbmd0aFxuICAgICAgICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgIF8uZWFjaChuZXcgQXJyYXkoZGlmZiksICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHByb2dyZXNzLnB1c2goMClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAgICAgICAgICAgdGhpcy50b2NTdmMudXBkYXRlUmVzdW1hRGF0YSh0aGlzLnJlc3VtZURhdGEpXG4gICAgICAgICAgICAvLyB0aGlzLnRvY1N2Yy5tYXBNb2R1bGVEdXJhdGlvbkFuZFByb2dyZXNzKHRoaXMuY29udGVudCwgdGhpcy5jb250ZW50KVxuICAgICAgICAgICAgdGhpcy5nZXRMYXN0UGxheWVkUmVzb3VyY2UoKVxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgIT09IDEwMCkge1xuICAgICAgICAgICAgICB0aGlzLnRvY1N2Yy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZSh0aGlzLmNvbnRlbnQsIHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IG51bGxcbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb250ZW50U3ZjLnNldFByb2dyYW1DaGlsZFJlc3VtZURhdGEodGhpcy5yZXN1bWVEYXRhLCBjb250ZW50SWQpXG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgIT09IDEwMCkge1xuICAgICAgICAgICAgdGhpcy5iaW5kQ29tcGxldGlvblBlcmNlbnRhZ2UoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignQ09OVEVOVCBISVNUT1JZIEZFVENIIEVSUk9SID4nLCBlcnJvcilcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KCkge1xuICAgIGlmICh0aGlzLnJlc3VtZURhdGEgJiYgdGhpcy5jb250ZW50KSB7XG4gICAgICBsZXQgcmVzdW1lRGF0YVYyOiBhbnlcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgnc3RhcnQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoKVxuICAgICAgfVxuICAgICAgaWYgKCFyZXN1bWVEYXRhVjIubWltZVR5cGUpIHtcbiAgICAgICAgcmVzdW1lRGF0YVYyLm1pbWVUeXBlID0gdGhpcy50b2NTdmMuZ2V0TWltZVR5cGUodGhpcy5jb250ZW50LCByZXN1bWVEYXRhVjIuaWRlbnRpZmllcilcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzdW1lRGF0YUxpbmsgPSB0aGlzLmdldFJlc3VtZVVybChyZXN1bWVEYXRhVjIpXG4gICAgICB0aGlzLmFjdGlvblNWQy5zZXRVcGRhdGVDb21wR3JvdXBPID0gdGhpcy5yZXN1bWVEYXRhTGlua1xuICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgfVxuICB9XG4gIGlzU2VsZWN0ZWRJbk1vcmVEcm9wZG93bigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRMYW5ndWFnZT8uaWRlbnRpZmllciB8fCAhdGhpcy5sYW5ndWFnZUxpc3QpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sYW5ndWFnZUxpc3Quc2xpY2UoNSkuc29tZSgobGFuZzogYW55KSA9PlxuICAgICAgbGFuZz8uaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZExhbmd1YWdlPy5pZGVudGlmaWVyXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgZ2V0UXVlcnlQYXJhbXMoKSB7XG4gICAgY29uc3QgdGVtcFF1ZXJ5UGFyYW1zRGF0YTogYW55ID0ge31cbiAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtTWFwLnN1YnNjcmliZShhc3luYyBxUGFyYW1zTWFwID0+IHtcblxuICAgICAgLy8gRXh0cmFjdCBhbGwgcGFyYW1ldGVycyBmcm9tIHRoZSBQYXJhbU1hcFxuICAgICAgcVBhcmFtc01hcC5rZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgdGVtcFF1ZXJ5UGFyYW1zRGF0YVtrZXldID0gcVBhcmFtc01hcC5nZXQoa2V5KSA/PyAnJ1xuICAgICAgfSlcbiAgICAgIHRlbXBRdWVyeVBhcmFtc0RhdGFcblxuICAgICAgLy8gUHJvY2VzcyBzcGVjaWZpYyBwYXJhbWV0ZXJzXG4gICAgICBjb25zdCBjb250ZXh0SWQgPSB0ZW1wUXVlcnlQYXJhbXNEYXRhWydjb250ZXh0SWQnXVxuICAgICAgY29uc3QgY29udGV4dFBhdGggPSB0ZW1wUXVlcnlQYXJhbXNEYXRhWydjb250ZXh0UGF0aCddXG4gICAgICBjb25zdCByZWNvbW1lbmRlZENvdXJzZXNJZCA9IHRlbXBRdWVyeVBhcmFtc0RhdGFbJ3JlY29tbWVuZGF0aW9uSWQnXVxuXG4gICAgICBpZiAoY29udGV4dElkICYmIGNvbnRleHRQYXRoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dElkID0gY29udGV4dElkXG4gICAgICAgIHRoaXMuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aFxuICAgICAgfVxuXG4gICAgICBpZiAocmVjb21tZW5kZWRDb3Vyc2VzSWQpIHtcbiAgICAgICAgdGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCA9IHJlY29tbWVuZGVkQ291cnNlc0lkXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlTGliLmdldFJlY29tbWVuZGVkQ291cnNlc1Nha3NoYW1BSShyZWNvbW1lbmRlZENvdXJzZXNJZCkudG9Qcm9taXNlKClcbiAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZmVlZGJhY2tzICYmIHJlc3BvbnNlLmZlZWRiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZmVlZGJhY2tHaXZlbiA9IHJlc3BvbnNlLmZlZWRiYWNrcy5maW5kKChmZWVkYmFjazogYW55KSA9PiBmZWVkYmFjaz8uY291cnNlX2lkID09PSB0aGlzLmNvdXJzZUlEKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgZmV0Y2hpbmcgcmVjb21tZW5kZWQgY291cnNlczonLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRlbXBRdWVyeVBhcmFtc0RhdGFcbiAgfVxuXG4gIGdldE9yZ0lkRm9yU2hhcmUoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiAhW1xuICAgICAgTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfQ09VUlNFLFxuICAgICAgTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfQVNTRVNTRU1FTlQsXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNLFxuICAgICAgTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5JTlZJVEVfT05MWV9QUk9HUkFNLFxuICAgIF0uaW5jbHVkZXModGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5KSkge1xuICAgICAgdGhpcy5jYW5TaGFyZSA9IHRydWVcbiAgICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSkge1xuICAgICAgICB0aGlzLnJvb3RPcmdJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnJvb3RPcmdJZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGFuZCBwcm9jZXNzZXMgY29udGVudCBjcmVhdG9yIGRhdGEgZnJvbSB0aGUgY3VycmVudCBjb250ZW50XG4gICAqIC0gU2V0cyBjb250ZW50Q3JlYXRvckRhdGEgZnJvbSBwYXJzZWQgY3JlYXRvciBjb250YWN0c1xuICAgKiAtIERldGVybWluZXMgaWYgXCJzaG93IGJ1dHRvblwiIGZsYWcgc2hvdWxkIGJlIGVuYWJsZWQgYmFzZWQgb24gY29udGVudCBuYW1lXG4gICAqIC0gSW5jbHVkZXMgcHJvcGVyIGVycm9yIGhhbmRsaW5nIGZvciBudWxsIHZhbHVlcyBhbmQgcGFyc2luZ1xuICAgKi9cbiAgZ2V0Q29udGVudENyZWF0b3JEYXRhKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBPbmx5IHByb2NlZWQgaWYgd2UgaGF2ZSB2YWxpZCBjb250ZW50IGRhdGFcbiAgICAgIGlmICghdGhpcy5jb250ZW50UmVhZERhdGEpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMud2FybignQ2Fubm90IGdldCBjcmVhdG9yIGRhdGE6IGNvbnRlbnRSZWFkRGF0YSBpcyBub3QgYXZhaWxhYmxlJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgY29udGVudCBuYW1lIGZvciBjb21wYXJpc29uIChzYWZlbHkgaGFuZGxlIG51bGwvdW5kZWZpbmVkKVxuICAgICAgY29uc3QgY29udGVudE5hbWUgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YS5uYW1lPy50cmltKCkgfHwgJydcblxuICAgICAgLy8gUGFyc2UgYW5kIHNldCBjcmVhdG9yIGNvbnRhY3RzIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhLmNyZWF0b3JDb250YWN0cykge1xuICAgICAgICAvLyBVc2UgdGhlIGV4aXN0aW5nIHBhcnNpbmcgbWV0aG9kIHRvIGhhbmRsZSBjcmVhdG9yIGNvbnRhY3RzXG4gICAgICAgIHRoaXMuY29udGVudENyZWF0b3JEYXRhID0gdGhpcy5oYW5kbGVQYXJzZUpzb25EYXRhKHRoaXMuY29udGVudFJlYWREYXRhLmNyZWF0b3JDb250YWN0cylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlc2V0IHRvIGVtcHR5IGFycmF5IGlmIG5vIGNyZWF0b3IgY29udGFjdHNcbiAgICAgICAgdGhpcy5jb250ZW50Q3JlYXRvckRhdGEgPSBbXVxuICAgICAgfVxuXG4gICAgICAvLyBTZXQgc2hvd0J0biBmbGFnIGJhc2VkIG9uIGRha3NodGEgbmFtZSBjb21wYXJpc29uIChjYXNlIGluc2Vuc2l0aXZlKVxuICAgICAgLy8gVGhpcyBkZXRlcm1pbmVzIGlmIHRoZSBzcGVjaWFsIGJ1dHRvbiBmb3IgZGFrc2h0YSBjb250ZW50IGlzIHNob3duXG4gICAgICB0aGlzLnNob3dCdG4gPSBjb250ZW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSB0aGlzLmRha3NodGFOYW1lLnRvTG93ZXJDYXNlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIGFueSB1bmV4cGVjdGVkIGVycm9yc1xuICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgY29udGVudCBjcmVhdG9yIGRhdGE6JywgZXJyb3IpXG4gICAgICB0aGlzLmNvbnRlbnRDcmVhdG9yRGF0YSA9IFtdXG4gICAgICB0aGlzLnNob3dCdG4gPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGdldEkxOE5UcmFuc2xhdGlvbnMoKSB7XG4gICAgLy8gU3Vic2NyaWJlIHRvIGxhbmd1YWdlIHRyYW5zbGF0aW9uIGZsYWcgY2hhbmdlc1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5jb25maWdTdmMubGFuZ3VhZ2VUcmFuc2xhdGlvbkZsYWdcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpIC8vIEVuc3VyZSBzdWJzY3JpcHRpb24gaXMgY2xlYW5lZCB1cCBvbiBjb21wb25lbnQgZGVzdHJveVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBPbmx5IHByb2NlZWQgaWYgd2UgaGF2ZSB2YWxpZCBkYXRhXG4gICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlYnNpdGUgbGFuZ3VhZ2UgaXMgc2V0IGluIGxvY2FsU3RvcmFnZVxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkTGFuZ3VhZ2UgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJylcbiAgICAgICAgICAgIGlmIChzdG9yZWRMYW5ndWFnZSkge1xuICAgICAgICAgICAgICAvLyBTZXQgZGVmYXVsdCBsYW5ndWFnZSBhcyBmYWxsYmFja1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZygnZW4nKVxuXG4gICAgICAgICAgICAgIC8vIFVzZSB0aGUgc3RvcmVkIGxhbmd1YWdlIHByZWZlcmVuY2VcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKHN0b3JlZExhbmd1YWdlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgIC8vIExvZyBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgZHVyaW5nIHN1YnNjcmlwdGlvblxuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdFcnJvciBpbiBsYW5ndWFnZSB0cmFuc2xhdGlvbiBzdWJzY3JpcHRpb246JywgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAvLyBTdG9yZSBzdWJzY3JpcHRpb24gZm9yIGNsZWFudXAgKG9wdGlvbmFsIGFsdGVybmF0aXZlIHRvIHRha2VVbnRpbClcbiAgICB0aGlzLnRyYW5zbGF0aW9uU3Vic2NyaXB0aW9uID0gdHJhbnNsYXRpb25TdWJzY3JpcHRpb25cbiAgfVxuXG4gIGdldFNlcnZlckRhdGVUaW1lKCkge1xuICAgIC8vIEZldGNoIHRoZSBzZXJ2ZXIgZGF0ZSB0aW1lIGFuZCBwcm9jZXNzIHRoZSByZXNwb25zZVxuICAgIHRoaXMudG9jU3ZjLmdldFNlcnZlckRhdGUoKS5zdWJzY3JpYmUoXG4gICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiByZXNwb25zZSBjb250YWlucyB2YWxpZCBzeXN0ZW0gZGF0ZVxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3lzdGVtRGF0ZSkge1xuICAgICAgICAgIC8vIFVwZGF0ZSBzZXJ2aWNlIHdpdGggc2VydmVyIGRhdGUgKHJlbW92ZWQgZHVwbGljYXRlIGNhbGwpXG4gICAgICAgICAgdGhpcy50b2NTdmMuY2hhbmdlU2VydmVyRGF0ZShyZXNwb25zZS5zeXN0ZW1EYXRlKVxuICAgICAgICAgIHRoaXMuc2VydmVyRGF0ZSA9IHJlc3BvbnNlLnN5c3RlbURhdGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjbGllbnQncyB0aW1lIGlmIHNlcnZlciB0aW1lIGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBjbGllbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5jaGFuZ2VTZXJ2ZXJEYXRlKGNsaWVudFRpbWUpXG4gICAgICAgICAgdGhpcy5zZXJ2ZXJEYXRlID0gY2xpZW50VGltZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBkZXBlbmRlbnQgZnVuY3Rpb25zIHRoYXQgbmVlZCBzZXJ2ZXIgZGF0ZVxuICAgICAgICB0aGlzLmZpbmRBQ1BCKClcbiAgICAgICAgdGhpcy5nZXRLYXJtYXBvaW50c0xpbWl0KClcbiAgICAgIH0sXG4gICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgc2VydmVyIGRhdGU6JywgZXJyb3IpXG5cbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gY2xpZW50J3MgdGltZSBvbiBlcnJvclxuICAgICAgICBjb25zdCBjbGllbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgICAgdGhpcy50b2NTdmMuY2hhbmdlU2VydmVyRGF0ZShjbGllbnRUaW1lKVxuICAgICAgICB0aGlzLnNlcnZlckRhdGUgPSBjbGllbnRUaW1lXG4gICAgICB9XG4gICAgKVxuXG4gICAgLy8gU3Vic2NyaWJlIHRvIHNlcnZlciBkYXRlIGNoYW5nZXMgZnJvbSBzZXJ2aWNlXG4gICAgdGhpcy5zZXJ2ZXJEYXRlU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuc2VydmVyRGF0ZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSkgLy8gRW5zdXJlIHN1YnNjcmlwdGlvbiBpcyBjbGVhbmVkIHVwXG4gICAgICAuc3Vic2NyaWJlKHNlcnZlckRhdGUgPT4ge1xuICAgICAgICB0aGlzLnNlcnZlckRhdGUgPSBzZXJ2ZXJEYXRlXG4gICAgICB9KVxuICB9XG5cbiAgZ2V0IGdldEJhc2VDb250ZW50SWRlbnRpZmllcigpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8IHRoaXMuY29udGVudD8uaWRlbnRpZmllciB8fCAnJ1xuICB9XG5cbiAgZ2V0IGlzTXVsdGlsaW5ndWFsKCkge1xuICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmxhbmd1YWdlTWFwVjEpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlTGlzdC5sZW5ndGggPiAxXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaGFuZGxlRW5yb2xsbWVudChldmVudDogYW55KSB7XG5cbiAgICBpZiAodGhpcy5pc011bHRpbGluZ3VhbCkge1xuICAgICAgdGhpcy5vcGVuTGFuZ0RpYWxvZyhldmVudClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVBdXRvQmF0Y2hBc3NpZ24oKVxuICAgIH1cbiAgfVxuXG4gIG9wZW5MYW5nRGlhbG9nKF9ldmVudDogYW55KSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihFbnJvbGxMYW5ndWFnZURpYWxvZ3VlQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgIHJlc3RvcmVGb2N1czogZmFsc2UsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHByZVNlbGVjdDogdGhpcy5zZWxlY3RlZExhbmd1YWdlLFxuICAgICAgICBsYW5ndWFnZUxpc3Q6IHRoaXMubGFuZ3VhZ2VMaXN0LFxuICAgICAgfVxuICAgIH0pXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChzZWxlY3RlZExhbmcpID0+IHtcbiAgICAgIGlmIChzZWxlY3RlZExhbmcpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZExhbmd1YWdlID0gc2VsZWN0ZWRMYW5nXG4gICAgICAgIHRoaXMuaGFuZGxlQXV0b0JhdGNoQXNzaWduKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0UmVzdW1lVXJsKHJlc291cmNlRGF0YTogYW55LCBiYXRjaElkPzogYW55LCBwcmltYXJ5Q2F0ZWdvcnk/OiBhbnkpIHtcbiAgICBsZXQgTUxJZCA9IHRoaXMuc2VsZWN0ZWRMYW5ndWFnZT8uaWRlbnRpZmllciB8fCAnJ1xuICAgIGxldCBNTCA9IHRoaXMuc2VsZWN0ZWRMYW5ndWFnZT8ubGFuZ0lkIHx8ICcnXG4gICAgbGV0IHJlc3VtZURhdGFVcmwgPSB2aWV3ZXJSb3V0ZUdlbmVyYXRvcihcbiAgICAgIHJlc291cmNlRGF0YS5pZGVudGlmaWVyLFxuICAgICAgcmVzb3VyY2VEYXRhLm1pbWVUeXBlLFxuICAgICAgdGhpcy5pc1Jlc291cmNlID8gdW5kZWZpbmVkIDogdGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJyxcbiAgICAgIHRoaXMuaXNSZXNvdXJjZSA/IHVuZGVmaW5lZCA6IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmNvbnRlbnRUeXBlIHx8ICcnLFxuICAgICAgdGhpcy5mb3JQcmV2aWV3LFxuICAgICAgcHJpbWFyeUNhdGVnb3J5IHx8ICdMZWFybmluZyBSZXNvdXJjZScsXG4gICAgICBiYXRjaElkIHx8IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8ubmFtZSB8fCAnJyxcbiAgICAgIE1MLFxuICAgICAgTUxJZCxcbiAgICApXG4gICAgcmV0dXJuIHJlc3VtZURhdGFVcmxcbiAgfVxuXG4gIGdldCBjb250ZW50Q29tcGxldGlvblBlcmNlbnQoKSB7XG4gICAgaWYgKHRoaXMuYmF0Y2hEYXRhPy5lbnJvbGxlZCkge1xuICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZScgJiYgdGhpcy5pc011bHRpbGluZ3VhbCkge1xuICAgICAgICBpZiAodGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzICYmIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZT8ubGFuZ0lkICYmIHRoaXMubGFuZ3VhZ2VNYXBQcm9ncmVzc1t0aGlzLnNlbGVjdGVkTGFuZ3VhZ2U/LmxhbmdJZF0pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzW3RoaXMuc2VsZWN0ZWRMYW5ndWFnZT8ubGFuZ0lkXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IDBcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGVja0ZvckNvbXBsZXRpb25TdXJ2ZXlUcmlnZ2VyKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50UmVhZERhdGEpIHtcbiAgICAgIC8vIGNoZWNrIGlmIGNvbXBsZXRpb24gc3VydmV5IGlzIGVuYWJsZWQgYW5kIHVzZXIgaGFzIGNvbXBsZXRlZCB0aGUgY291cnNlIGJlZm9yZSAyM3JkIERFQyAyMDIzIChyZWxlYXNlIGRhdGUgb2YgY29tcGxldGlvbiBzdXJ2ZXkpXG4gICAgICBpZiAodGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWcgJiYgdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWcuY29tcGxldGlvblN1cnZleSAmJiB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZy5jb21wbGV0aW9uU3VydmV5LmVuYWJsZWQgJiZcbiAgICAgICAgdGhpcy5lbnJvbGxlZENvdXJzZURhdGEgJiYgdGhpcy5lbnJvbGxlZENvdXJzZURhdGEgJiYgdGhpcy5lbnJvbGxlZENvdXJzZURhdGEuY29tcGxldGVkT24gPj0gdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWcuY29tcGxldGlvblN1cnZleS5zdGFydERhdGUpIHtcbiAgICAgICAgaWYgKCh0aGlzLmNvbnRlbnQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCB0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkgJiYgdGhpcy5jb250ZW50UmVhZERhdGEuY29tcGxldGlvblN1cnZleUxpbmspIHtcbiAgICAgICAgICBjb25zdCBzSUQgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YS5jb21wbGV0aW9uU3VydmV5TGluay5zcGxpdCgnc3VydmV5cy8nKVxuICAgICAgICAgIGNvbnN0IHN1cnZleUlkID0gc0lEWzFdXG4gICAgICAgICAgY29uc3QgY291cnNlSWQgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyXG4gICAgICAgICAgLy8gQ2FsbCBBUEkgdG8gc2VlIGlmIHN1cnZleSBpcyBzdWJtaXR0ZWQgb3Igbm90XG4gICAgICAgICAgdGhpcy50b2NTdmMuZ2V0QXBsbGljYXRpb25zQnlJZChzdXJ2ZXlJZCwgY291cnNlSWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzLnJlc3VsdC5yZXNwb25zZSAmJiBPYmplY3Qua2V5cyhyZXMucmVzdWx0LnJlc3BvbnNlKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9ja0NlcnRpZmljYXRlID0gZmFsc2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMubG9ja0NlcnRpZmljYXRlID0gdHJ1ZVxuICAgICAgICAgICAgICB0aGlzLm9wZW5Db21wbGV0aW9uU3VydmV5Rm9ybVBvcHVwKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2xlYXIgZXhpc3Rpbmcgc3VydmV5IGRhdGEgZnJvbSBsb2NhbCBzdG9yYWdlIGJlZm9yZSBvcGVuaW5nIHBvcHVwXG4gIGNsZWFyRXhpc3RpbmdQdWJsaWNTdXJ2ZXlEYXRhKHN1cnZleUlkOiBzdHJpbmcsIGNvdXJzZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzdG9yYWdlS2V5ID0gYHN1cnZleV8ke3N1cnZleUlkfV8ke2NvdXJzZUlkfWBcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmFnZUtleSkpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JhZ2VLZXkpXG4gICAgfVxuICB9XG5cbiAgb3BlblB1YmxpY1N1cnZleVBvcHVwKG5hdmlnYXRpb25Vcmw/OiBzdHJpbmcsIHF1ZXJ5UGFyYW1zPzogYW55KSB7XG4gICAgLy8gR2V0IHN1cnZleSBJRCBhbmQgY291cnNlIElEIGZyb20gZW52aXJvbm1lbnQgYW5kIGNvbnRlbnQgZGF0YVxuICAgIGNvbnN0IHN1cnZleUlkID0gdGhpcy5lbnZpcm9ubWVudC5wdWJsaWNDb250ZW50U3VydmV5SWQgfHwgJydcbiAgICBjb25zdCBjb3Vyc2VJZCA9IHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnXG4gICAgY29uc3QgY291cnNlTmFtZSA9IHRoaXMuY29udGVudFJlYWREYXRhPy5uYW1lIHx8ICcnXG4gICAgY29uc3QgY29udGV4dE9yZ0lkID0gdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3IgJiYgdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3IubGVuZ3RoID4gMCA/XG4gICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uY3JlYXRlZEZvclswXSA6ICcnXG5cbiAgICB0aGlzLmNsZWFyRXhpc3RpbmdQdWJsaWNTdXJ2ZXlEYXRhKHN1cnZleUlkLCBjb3Vyc2VJZClcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBzdXJ2ZXlJZDogc3VydmV5SWQsXG4gICAgICBjb3Vyc2VJZDogY291cnNlSWQsXG4gICAgICBjb3Vyc2VOYW1lOiBjb3Vyc2VOYW1lLFxuICAgICAgY29udGV4dE9yZ0lkOiBjb250ZXh0T3JnSWRcbiAgICB9XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihQdWJsaWNTdXJ2ZXlGb3JtQ29tcG9uZW50LCB7XG4gICAgICAvLyBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICB3aWR0aDogJzc1MHB4JyxcbiAgICAgIG1heFdpZHRoOiAnOTB2dycsXG4gICAgICBoZWlnaHQ6ICc4MHZoJyxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgIH0pXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgLy8gTmF2aWdhdGUgdG8gdGhlIGludGVuZGVkIFVSTCBvbmx5IHdoZW4gc3VydmV5IGlzIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgaWYgKG5hdmlnYXRpb25VcmwpIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbbmF2aWdhdGlvblVybF0sIHsgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmVzdW1lQ29udGVudERhdGEoKSB7XG4gICAgY29uc3QgbmF2aWdhdGlvblVybCA9ICh0aGlzLnJlc3VtZURhdGEgJiYgIXRoaXMuY2VydERhdGEpID8gdGhpcy5yZXN1bWVEYXRhTGluaz8udXJsIDogdGhpcy5maXJzdFJlc291cmNlTGluaz8udXJsXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSAodGhpcy5yZXN1bWVEYXRhICYmICF0aGlzLmNlcnREYXRhKSA/IHRoaXMuZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiB0aGlzLmdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbbmF2aWdhdGlvblVybF0sIHsgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdXNlciBjYW4gZW5yb2xsIGluIHRoZSBjb3Vyc2VcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gZW5yb2xsbWVudCBpcyBhbGxvd2VkXG4gICAqL1xuICBjYW5FbnJvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmRpc2FibGVFbnJvbGxCdG5cbiAgfVxuXG4gIGdvQmFjaygpIHtcbiAgICB0aGlzLmxvY2F0aW9uLmJhY2soKVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiY291cnNlSUQgZWxzZSBub0RhdGFGb3VuZFwiPlxuICA8bmctdGVtcGxhdGUgI2Vucm9sbEZ1bmN0aW9uYWxpdHk+XG4gICAgPGRpdiBbaGlkZGVuXT1cImlzUmVzb3VyY2UgJiYgIWNvbnRlbnQ/LmFydGlmYWN0VXJsPy5sZW5ndGhcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgdGV4dC1jZW50ZXJcIj5cbiAgICAgIDwhLS0gQ291cnNlIGJsb2NrIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTVxuICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTVxuICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJlxuICAgICAgICAgICAgICAgICAgICBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGFjdGlvbkJ0blN0YXR1cyA9PT0gJ2dyYW50JyAmJiAhKGlzTW9iaWxlICYmIGNvbnRlbnQ/LmlzSW5JbnRyYW5ldCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmIGNvbnRlbnQ/LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICFjb250ZW50Py5hcnRpZmFjdFVybD8ubGVuZ3RoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFICYmICFjb250ZW50Py5hcnRpZmFjdFVybCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZClcIj5cbiAgICAgICAgICA8YSAqbmdJZj1cInNob3dTdGFydC5zaG93ICYmICFpc1Bvc3RBc3Nlc3NtZW50ICYmICFmb3JQcmV2aWV3XCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKClcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IHJlc3VtZURhdGFMaW5rPy51cmwgOiBmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+XG4gICAgICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCB8fCBjZXJ0RGF0YVwiPlxuICAgICAgICAgICAgICB7eyBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDAgPyB0cmFuc2xhdGVMYWJlbHMoJ1N0YXJ0IGFnYWluJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9hPlxuXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzUG9zdEFzc2Vzc21lbnQgJiYgc2hvd1Rha2VBc3Nlc3NtZW50Py5wb3N0X2Fzc2Vzc21lbnRcIiAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCIgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+e3sgJ2FwcHRvY2hvbWUudGFrZUFzc2Vzc21lbnQnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzUG9zdEFzc2Vzc21lbnQgJiYgKCFjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBY2JwQ2xhaW1cIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInQUNCUCdcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBY2JwQ2xhaW0gJiYgIW1vbnRobHlDYXBFeGNlZWRcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInUmVzdW1lJ1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cIiFpc1Bvc3RBc3Nlc3NtZW50ICYmIChjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwIHx8IGNlcnREYXRhKVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQWNicENvdXJzZSAmJiBpc0FjYnBDbGFpbSAmJiAhaXNDbGFpbWVkXCI+XG4gICAgICAgICAgICAgIDx3cy1hcHAta2FybWFwb2ludHMtcGFuZWwgW2J0bnR5cGVdPVwiJ0FDQlAgQ0xBSU0nXCIgW2RhdGFdPVwia3BhcnJheVwiIFtidG5DYXRlZ29yeV09XCInY2xhaW0nXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tDbGFpbUthcm1hUG9pbnRzKT1cIm9uQ2xpY2tPZkNsYWltKCRldmVudClcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0FjYnBDb3Vyc2UgJiYgIW1vbnRobHlDYXBFeGNlZWRcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInU3RhcnQgYWdhaW4nXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQWNicENvdXJzZSAmJiBtb250aGx5Q2FwRXhjZWVkICYmICFpc0NvbXBsZXRlZFRoaXNNb250aFwiPlxuICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidTdGFydCBhZ2FpbidcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJpc1Bvc3RBc3Nlc3NtZW50ICYmIHNob3dUYWtlQXNzZXNzbWVudD8ucG9zdF9hc3Nlc3NtZW50XCI+XG4gICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidUYWtlIEFzc2Vzc21lbnQnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiAoYWN0aW9uQnRuU3RhdHVzID09PSAnZ3JhbnQnICYmICEoaXNNb2JpbGUgJiYgY29udGVudD8uaXNJbkludHJhbmV0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoIGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmIGNvbnRlbnQ/LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhY29udGVudD8uYXJ0aWZhY3RVcmw/Lmxlbmd0aCApICYmXG4gICAgICAgICAgICAgICAgICAgICAgISggY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCApICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFICYmICFjb250ZW50Py5hcnRpZmFjdFVybCkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTClcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSAgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVFbnJvbGxtZW50KClcIiBbbmdDbGFzc109XCJ7J2Rpc2FibGUtc3RhcnQtYnRuJzogIWNhbkVucm9sbCgpfVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0FjYnBDb3Vyc2VcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInQUNCUCdcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBY2JwQ291cnNlICYmICFtb250aGx5Q2FwRXhjZWVkICYmIHVzZXJFbnJvbGxtZW50TGlzdCAmJiAhdXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidFbnJvbGwnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgIDwhLS0gUFJvZ3JhbSAmIG1hbmRhdG9yeSBjb3Vyc2UgYmxvY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZTsgZWxzZSBhdXRoVmlld0J0blwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gfHwgY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5NQU5EQVRPUllfQ09VUlNFX0dPQUxcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdJZj1cIihjb3Vyc2VDYXRlZ29yeT8uTU9ERVJBVEVEX1BST0dSQU0gPT09IGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkpICYmIChjb250ZW50UmVhZERhdGE/LmJhdGNoZXMgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiKChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFKSAgJiYgIWVucm9sbEJ0bkxvYWRpbmcpICYmICFjb250ZW50UmVhZERhdGE/LmJhdGNoZXNbMF0uZW5kRGF0ZVwiPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiAoY2xpY2spPVwiaGFuZGxlRW5yb2xsbWVudCgpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIj5cbiAgICAgICAgICAgICAgICAgIHt7J2FwcHRvY2hvbWUuZW5yb2xsJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBY2JwQ291cnNlXCI+XG4gICAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInQUNCUCdcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQWNicENvdXJzZSAmJiAhbW9udGhseUNhcEV4Y2VlZCAmJiB1c2VyRW5yb2xsbWVudExpc3QgJiYgIXVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidFbnJvbGwnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIigoY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSkgICYmICFlbnJvbGxCdG5Mb2FkaW5nKSAmJiBjb250ZW50UmVhZERhdGE/LmJhdGNoZXNbMF0uZW5kRGF0ZVwiPlxuICAgICAgICAgICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICAgIFt1c2VyRW5yb2xsbWVudExpc3RdPVwidXNlckVucm9sbG1lbnRMaXN0XCIgW2FuYWx5dGljc109XCJhbmFseXRpY3NcIlxuICAgICAgICAgICAgICAgICAgKHByb2dyYW1FbnJvbGxDYWxsKT1cInByb2dyYW1FbnJvbGxDYWxsKCRldmVudClcIiBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIlxuICAgICAgICAgICAgICAgICAgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIj5cbiAgICAgICAgICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiKGNvdXJzZUNhdGVnb3J5Py5NT0RFUkFURURfUFJPR1JBTSA9PT0gY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSkgJiYgIWNvbnRlbnRSZWFkRGF0YT8uYmF0Y2hlcyAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICAgICAgTm8gQmF0Y2hlc1xuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiY291cnNlQ2F0ZWdvcnk/Lk1PREVSQVRFRF9QUk9HUkFNICE9PSBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICYmICFlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiYgY3VycmVudENvdXJzZUJhdGNoSWQpICYmIGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUueW91QXJlTm90SW52aXRlZCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmICEhY3VycmVudENvdXJzZUJhdGNoSWQgJiYgZ2V0U3RhcnREYXRlID09PSAnTkEnXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUubm9BY3RpdmVCYXRjaGVzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQSdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgc2hhZG93LWxnIHRleHQtaW5mby1kaXZcIj57eyAnYXBwdG9jaG9tZS5iYXRjaFdpbGxTdGFydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICB7e2dldFN0YXJ0RGF0ZX19ITwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmIGNvdXJzZUNhdGVnb3J5Py5NT0RFUkFURURfUFJPR1JBTSA9PT0gY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQSdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgc2hhZG93LWxnIHRleHQtaW5mby1kaXZcIj57eyAnYXBwdG9jaG9tZS5iYXRjaFdpbGxTdGFydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICB7e2dldFN0YXJ0RGF0ZX19ITwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0JhdGNoSW5Qcm9ncmVzcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCBhY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIShpc01vYmlsZSAmJiBjb250ZW50Py5pc0luSW50cmFuZXQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiYgY3VycmVudENvdXJzZUJhdGNoSWQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcIj5cbiAgICAgICAgICAgIDxhICpuZ0lmPVwic2hvd1N0YXJ0LnNob3cgJiYgIWlzUG9zdEFzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJyZXN1bWVEYXRhID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwicmVzdW1lRGF0YSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgJiYgKGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwICYmIGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlPiAwKSA/XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygnc3RhcnQnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFwiPlxuICAgICAgICAgICAgICAgIHt7IChyZXN1bWVEYXRhKSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwID8gXCJTdGFydCBhZ2FpblwiIDogXCJTdGFydFwiIH19XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPGEgKm5nSWY9XCJpc1Bvc3RBc3Nlc3NtZW50ICYmIHNob3dUYWtlQXNzZXNzbWVudD8ucG9zdF9hc3Nlc3NtZW50XCIgW3JvdXRlckxpbmtdPVwiZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiPnt7ICdhcHB0b2Nob21lLnRha2VBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCIhaXNQb3N0QXNzZXNzbWVudCAmJiAoIWNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwKVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBY2JwQ2xhaW1cIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidBQ0JQJ1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBY2JwQ2xhaW0gJiYgIW1vbnRobHlDYXBFeGNlZWRcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidSZXN1bWUnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cIiFpc1Bvc3RBc3Nlc3NtZW50ICYmIChjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKVwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNBY2JwQ291cnNlICYmIGlzQWNicENsYWltICYmICFpc0NsYWltZWRcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidBQ0JQIENMQUlNJ1wiIFtjb25kaXRpb25dPVwie2lzUG9zdEFzc2Vzc21lbnQ6IGlzUG9zdEFzc2Vzc21lbnQsIGNvbnRlbnQ6IGNvbnRlbnQsIGlzQWNicENvdXJzZTogaXNBY2JwQ291cnNlLCBpc0NsYWltZWQ6IGlzQ2xhaW1lZCwgbW9udGhseUNhcEV4Y2VlZDogbW9udGhseUNhcEV4Y2VlZCwgaXNDb21wbGV0ZWRUaGlzTW9udGg6IGlzQ29tcGxldGVkVGhpc01vbnRoLCBzaG93VGFrZUFzc2Vzc21lbnQ6IHNob3dUYWtlQXNzZXNzbWVudCwgdXNlckVucm9sbG1lbnRMaXN0OiB1c2VyRW5yb2xsbWVudExpc3QsIGlzQ29tcGxldGVkVGhpc01vbnRoOiBpc0NvbXBsZXRlZFRoaXNNb250aCwgcmVzdW1lRGF0YTogcmVzdW1lRGF0YSwgdXNlclJhdGluZzogdXNlclJhdGluZ31cIiBbZGF0YV09XCJrcGFycmF5XCIgW2J0bkNhdGVnb3J5XT1cIidjbGFpbSdcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrQ2xhaW1LYXJtYVBvaW50cyk9XCJvbkNsaWNrT2ZDbGFpbSgkZXZlbnQpXCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQWNicENvdXJzZSAmJiAhbW9udGhseUNhcEV4Y2VlZFwiPlxuICAgICAgICAgICAgICAgIDx3cy1hcHAta2FybWFwb2ludHMtcGFuZWwgW2J0bnR5cGVdPVwiJ1N0YXJ0IGFnYWluJ1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNBY2JwQ291cnNlICYmIG1vbnRobHlDYXBFeGNlZWQgJiYgIWlzQ29tcGxldGVkVGhpc01vbnRoXCI+XG4gICAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInU3RhcnQgYWdhaW4nXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzUG9zdEFzc2Vzc21lbnQgJiYgc2hvd1Rha2VBc3Nlc3NtZW50Py5wb3N0X2Fzc2Vzc21lbnRcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInVGFrZSBBc3Nlc3NtZW50J1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImlzQmF0Y2hJblByb2dyZXNzICYmIChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSAmJiBiYXRjaERhdGE/LmVucm9sbGVkKSAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICA8YSAqbmdJZj1cInNob3dTdGFydC5zaG93ICYmICFpc1Bvc3RBc3Nlc3NtZW50XCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKClcIlxuICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cInJlc3VtZURhdGEgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cInJlc3VtZURhdGEgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+XG4gICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgJiYgKGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwICYmIGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlPiAwKSA/XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIDpcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXCI+XG4gICAgICAgICAgICB7eyByZXN1bWVEYXRhIHx8IGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyB0cmFuc2xhdGVMYWJlbHMoJ1N0YXJ0IGFnYWluJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIiczNnB4J1wiXG4gICAgICAgICAgW2JpbmRpbmdDbGFzc109XCInZmxleCByb3VuZGVkIGgtOCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBDdXJhdGVkIHByb2dyYW0gYmxvY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0gJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRW5yb2xsbWVudCgpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIFNUQU5EQUxPTkVfQVNTRVNTTUVOVCBibGFjayAtLT5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZyAmJiBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICE9PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgKGNsaWNrKT1cImhhbmRsZUVucm9sbG1lbnQoKVwiXG4gICAgICAgICAgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIElOVklURSBPTkxZIFNUQU5EQUxPTkUgQVNTRVNTTUVOVCBibG9jay0tPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmICFiYXRjaERhdGE/LmVucm9sbGVkICYmICFlbnJvbGxCdG5Mb2FkaW5nICYmIGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3Rm9ySW52aXRlT25seUFzc2Vzc21lbnRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiPnt7ICdhcHB0b2Nob21lLnlvdUFyZU5vdEludml0ZWRGb3JBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJiBiYXRjaERhdGE/LmVucm9sbGVkICYmIGlzQmF0Y2hJblByb2dyZXNzICYmICFlbnJvbGxCdG5Mb2FkaW5nICYmIGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3RBZ2FpbicgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3QnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCIhaXNCYXRjaEluUHJvZ3Jlc3MgJiYgISFjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgPT09ICdOQScgJiYgY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUubm9BY3RpdmVCYXRjaGVzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQScgJiYgY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUuYmF0Y2hXaWxsU3RhcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAge3tnZXRTdGFydERhdGV9fSE8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTVEFOREFMT05FX0FTU0VTU01FTlQgZW5yb2xsZWQgYmxhY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZyAmJiBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICE9PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgW3JvdXRlckxpbmtdPVwiZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFwiPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0QWdhaW4nIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMFwiPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0JyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIEJMRU5ERURfUFJPR1JBTSBibG9jayAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJiYXRjaERhdGE/LndvcmtGbG93Py53ZkluaXRpYXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLkFQUFJPVkVEIHx8XG4gICAgICAgICAgICAgICAgICAgICAgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFSkVDVEVEIHx8XG4gICAgICAgICAgICAgICAgICAgICAgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXTiB8fFxuICAgICAgICAgICAgICAgICAgICAgIGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSXRlbT8uY3VycmVudFN0YXR1cyA9PT0gV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRU1PVkVEKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtYWNjZW50LXRleHQgd3MtbWF0LWFjY2VudC1saWdodC1iZyBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzdGF0dXNNc2dcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9udC1ib2xkXCI+XG4gICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLnJlcXVlc3RVbmRlclJldmlldycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgPGEgKm5nSWY9XCJzaG93U3RhcnQuc2hvdyAmJiBiYXRjaERhdGE/LndvcmtGbG93Py53ZkluaXRpYXRlZCAmJiBiYXRjaERhdGE/LndvcmtGbG93Py53Zkl0ZW0/LmN1cnJlbnRTdGF0dXMgPT09IFdGQmxlbmRlZFByb2dyYW1TdGF0dXMuQVBQUk9WRURcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiaXNCYXRjaEluUHJvZ3Jlc3M/IChyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybCA6ICcnIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiXG4gICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiaXNCYXRjaEluUHJvZ3Jlc3MgPyAocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpIDogJycgXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZS1zdGFydC1idG4nOiAhaXNCYXRjaEluUHJvZ3Jlc3N9XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+XG4gICAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSAmJiAoY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDAgJiYgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2U+IDApID9cbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3N0YXJ0JywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgfHwgY2VydERhdGFcIj5cbiAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwID8gdHJhbnNsYXRlTGFiZWxzKCdTdGFydCBhZ2FpbicsICdhcHB0b2Nob21lJykgOlxuICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3N0YXJ0JywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQnRuU3RhdHVzID09ICdyZWplY3QnICYmIGNvbnRlbnQ/LnJlZ2lzdHJhdGlvblVybFwiPlxuICAgICAgICA8YSBbaHJlZl09XCJjb250ZW50Py5yZWdpc3RyYXRpb25VcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlclwiPnt7XG4gICAgICAgICAgJ2FwcHRvY2hvbWUucmVnaXN0ZXInIHwgdHJhbnNsYXRlIH19PC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgI3Byb2dyZXNzRnVuY3Rpb25hbGl0eT5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00IHRleHQtc21cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgdGV4dC14c1wiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLm92ZXJhbGxQcm9ncmVzcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzXCIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDBcIj4ge3sgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgfX0gJTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDx3cy13aWRnZXQtY29udGVudC1wcm9ncmVzcyAqbmdJZj1cImNvbnRlbnQ/LmlkZW50aWZpZXJcIiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCJcbiAgICAgICAgICAgIFtjb250ZW50SWRdPVwiY29udGVudD8uaWRlbnRpZmllclwiIFtwcm9ncmVzc109XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZVwiIFtwcm9ncmVzc1R5cGVdPVwiJ3BlcmNlbnRhZ2UnXCJcbiAgICAgICAgICAgIFtjdXN0b21DbGFzc05hbWVdPVwiJ2NvbnRlbnQtcHJvZ3Jlc3MnXCI+XG4gICAgICAgICAgPC93cy13aWRnZXQtY29udGVudC1wcm9ncmVzcz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRDb21wbGV0aW9uUGVyY2VudCA+PSA1MFwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cImFjY2VudFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJhdGUtYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkZlZWRiYWNrRGlhbG9nKGNvbnRlbnQpXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+c3Rhcl9wdXJwbGU1MDA8L21hdC1pY29uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdXNlclJhdGluZ1wiPlxuICAgICAgICAgICAgPGRpdj57eyAnYXBwdG9jc2luZ2xlcGFnZS5yYXRlTm93JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VyUmF0aW5nXCI+XG4gICAgICAgICAgICA8ZGl2Pnt7ICdhcHB0b2NzaW5nbGVwYWdlLmVkaXRSYXRpbmcnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPGRpdiBjbGFzcz1cInRvYy1iYW5uZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNiBmaXhlZC13aWR0aFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImJhbm5lci1kZXRhaWxzIHRvYy1jb250ZW50XCIgI2Jhbm5lckRldGFpbHM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1iYWNrLWJ0blwiIChjbGljayk9XCJnb0JhY2soKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidGV4dC13aGl0ZVwiPmFycm93X2JhY2s8L21hdC1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEzMnB4J1wiIFtoZWlnaHRdPVwiJzMycHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzE0MHB4J1wiIFtoZWlnaHRdPVwiJzI0cHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyB0YWctZGl2IHJvdW5kZWQtMnhsIGdhcC0xIGl0ZW1zLWNlbnRlciBwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndzLW1hdC1vcmFuZ2UtdGV4dCBub2R0cmFuc2xhdGVcIj52aWRlb19saWJyYXJ5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctMyBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnksICdzZWFyY2hmaWx0ZXJzJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctMyBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5LCAnc2VhcmNoZmlsdGVycycpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyB0YWctZGl2IHJvdW5kZWQtMnhsIGdhcC0xIGl0ZW1zLWNlbnRlciBwLTJcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmFkZGl0aW9uYWxUYWdzPy5pbmNsdWRlcygnaUdPVCBTcGVjaWFsaXphdGlvbicpXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXBwcm92ZWQtaWNvblwiIHNyYz1cIi4vYXNzZXRzL2ljb25zL2FwcHJvdmVkLnN2Z1wiIGFsdD1cImFwcHJvdmVkXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWJvbGQgdGV4dC13aGl0ZSBsZWFkaW5nLTMgbm9kdHJhbnNsYXRlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ2NhcmRjb250ZW50djIuaUdPVFNwZWNpYWxpemF0aW9uUHJvZ3JhbScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIEtub3dsZWRnZSBsZXZlbCBibG9jayBmb3Igc2VhcmNoIGJveCAtLT5cbiAgICAgICAgICAgICAgICA8IS0tIHt7Y29udGVudD8uZGlmZmljdWx0eUxldmVsfX0gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uZGlmZmljdWx0eUxldmVsXCIgY2xhc3M9XCJrbm93bGVkZ2UtbGV2ZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uZGlmZmljdWx0eUxldmVsPy50b0xvd2VyQ2FzZSgpID09PSAnYmVnaW5uZXInXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsZXZlbC1iYWRnZSBiZWdpbm5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwiZmFsc2VcIiBjbGFzcz1cImxldmVsLWJhZGdlIGJlZ2lubmVyXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCIjREJGNERDXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjQyMjY3IDVDNy42NzkyNyA0LjU1NTU1IDguMzIwNzcgNC41NTU1NiA4LjU3NzM3IDVMMTIuMDQxNSAxMUMxMi4yOTgxIDExLjQ0NDQgMTEuOTc3MyAxMiAxMS40NjQxIDEySDQuNTM1OTJDNC4wMjI3MiAxMiAzLjcwMTk3IDExLjQ0NDQgMy45NTg1NyAxMUw3LjQyMjY3IDVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDlDOTUxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIHt7Y29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWx9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmRpZmZpY3VsdHlMZXZlbD8udG9Mb3dlckNhc2UoKSA9PT0gJ2ludGVybWVkaWF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxldmVsLWJhZGdlIGludGVybWVkaWF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwidHJ1ZVwiIGNsYXNzPVwibGV2ZWwtYmFkZ2UgaW50ZXJtZWRpYXRlXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCIjRDFEQkVDXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjQyMjY3IDIuNjY2NjZDNy42NzkyNyAyLjIyMjIxIDguMzIwNzcgMi4yMjIyMSA4LjU3NzM3IDIuNjY2NjZMMTIuMDQxNSA4LjY2NjY2QzEyLjI5ODEgOS4xMTExIDExLjk3NzMgOS42NjY2NiAxMS40NjQxIDkuNjY2NjZINC41MzU5MkM0LjAyMjcyIDkuNjY2NjYgMy43MDE5NyA5LjExMTEgMy45NTg1NyA4LjY2NjY2TDcuNDIyNjcgMi42NjY2NlpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxQjRDQTFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjcgNS42NjY2NkM3LjY3OTI3IDUuMjIyMjEgOC4zMjA3NyA1LjIyMjIxIDguNTc3MzcgNS42NjY2NkwxMi4wNDE1IDExLjY2NjdDMTIuMjk4MSAxMi4xMTExIDExLjk3NzMgMTIuNjY2NyAxMS40NjQxIDEyLjY2NjdINC41MzU5MkM0LjAyMjcyIDEyLjY2NjcgMy43MDE5NyAxMi4xMTExIDMuOTU4NTcgMTEuNjY2N0w3LjQyMjY3IDUuNjY2NjZaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMUI0Q0ExXCIgc3Ryb2tlPVwiI0QxREJFQ1wiIHN0cm9rZS13aWR0aD1cIjAuNVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICB7e2NvbnRlbnRSZWFkRGF0YT8uZGlmZmljdWx0eUxldmVsfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWw/LnRvTG93ZXJDYXNlKCkgPT09ICdhZHZhbmNlZCdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxldmVsLWJhZGdlIGFkdmFuY2VkXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCJmYWxzZVwiIGNsYXNzPVwibGV2ZWwtYmFkZ2UgYWR2YW5jZWRcIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCIjRkZFNkUxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy40MjI2NCAyLjMzMzM0QzcuNjc5MjQgMS44ODg5IDguMzIwNzQgMS44ODg5IDguNTc3MzQgMi4zMzMzNEwxMi4wNDE0IDguMzMzMzRDMTIuMjk4IDguNzc3NzkgMTEuOTc3MyA5LjMzMzM0IDExLjQ2NDEgOS4zMzMzNEg0LjUzNTg5QzQuMDIyNjkgOS4zMzMzNCAzLjcwMTk0IDguNzc3NzkgMy45NTg1NCA4LjMzMzM0TDcuNDIyNjQgMi4zMzMzNFpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0ZGODI2OFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjQgNUM3LjY3OTI0IDQuNTU1NTUgOC4zMjA3NCA0LjU1NTU2IDguNTc3MzQgNUwxMi4wNDE0IDExQzEyLjI5OCAxMS40NDQ0IDExLjk3NzMgMTIgMTEuNDY0MSAxMkg0LjUzNTg5QzQuMDIyNjkgMTIgMy43MDE5NCAxMS40NDQ0IDMuOTU4NTQgMTFMNy40MjI2NCA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkY4MjY4XCIgc3Ryb2tlPVwiI0ZGRTZFMVwiIHN0cm9rZS13aWR0aD1cIjAuNVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjQgNy42NjY2OUM3LjY3OTI0IDcuMjIyMjQgOC4zMjA3NCA3LjIyMjI0IDguNTc3MzQgNy42NjY2OUwxMi4wNDE0IDEzLjY2NjdDMTIuMjk4IDE0LjExMTEgMTEuOTc3MyAxNC42NjY3IDExLjQ2NDEgMTQuNjY2N0g0LjUzNTg5QzQuMDIyNjkgMTQuNjY2NyAzLjcwMTk0IDE0LjExMTEgMy45NTg1NCAxMy42NjY3TDcuNDIyNjQgNy42NjY2OVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0ZGODI2OFwiIHN0cm9rZT1cIiNGRkU2RTFcIiBzdHJva2Utd2lkdGg9XCIwLjVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIHt7Y29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWx9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjYlBsYW5FbmREYXRlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZHVlLXRhZyB0ZXh0LXhzIGxlYWRpbmctM1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZHVlLXdhcm5pbmcnOiBjYlBsYW5EdXJhdGlvbiA9PT0gbnNDYXJkQ29udGVudERhdGEuVVBDT01JTkcsICdkdWUtb3ZlcmR1ZSc6IGNiUGxhbkR1cmF0aW9uID09PSBuc0NhcmRDb250ZW50RGF0YS5PVkVSRFVFLCAnZHVlLXN1Y2Nlc3MnOiBjYlBsYW5EdXJhdGlvbiA9PT0gbnNDYXJkQ29udGVudERhdGEuU1VDQ0VTU31cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2NvbW1vbi5kdWVCeScgfCB0cmFuc2xhdGUgfX0gLSAmbmJzcDs8c3BhbiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IGNiUGxhbkVuZERhdGUgfCBkYXRlOiAnZFxuICAgICAgICAgICAgICAgICAgICAgIE1NTSx5J319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmIGNvbnRlbnRSZWFkRGF0YT8uY29udGVudFZlcnNpb25JbmZvPy5pZGVudGlmaWVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZXctdmVyc2lvbi1jaGlwIHJvdW5kZWQtMnhsXCIgKGNsaWNrKT1cIm5hdmlnYXRlVG9OZXdWZXJzaW9uKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm5hdmlnYXRlVG9OZXdWZXJzaW9uKClcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5ldy12ZXJzaW9uLXRleHQgbm9kdHJhbnNsYXRlXCI+e3sgJ2FwcHRvYy5uZXdWZXJzaW9uJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXdoaXRlIG1vYi1zaGFyZVwiICpuZ0lmPVwiY2FuU2hhcmVcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCIgKGNsaWNrKT1cIm9uQ2xpY2tPZlNoYXJlKClcIj5zaGFyZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTAlJ1wiIFtoZWlnaHRdPVwiJzMycHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzcwJSdcIiBbaGVpZ2h0XT1cIiczMnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFubmVyLXRleHQgdGV4dC1iYXNlIHNtOnRleHQtNHhsIGxlYWRpbmctNiBzbTpsZWFkaW5nLTEwIGZvbnQtYm9sZCBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgIGhhbmRsZUNhcGl0YWxpemUoY29udGVudFJlYWREYXRhPy5uYW1lKSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBzbTp0ZXh0LWJhc2Ugc291cmNlLXRleHQgZm9udC1zZW1pYm9sZCBicmVhay13b3JkcyBub2R0cmFuc2xhdGVcIiAjY29udGVudFNvdXJjZVxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc291cmNlRWxsaXBzaXMnOiBzb3VyY2VFbGxpcHNpc31cIiB0aXRsZT1cInt7Y29udGVudFJlYWREYXRhPy5zb3VyY2V9fVwiPnt7ICdjYXJkY29udGVudHYyLmJ5J1xuICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlIH19IHt7IGNvbnRlbnRSZWFkRGF0YT8uc291cmNlIH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMjBweCdcIiBbaGVpZ2h0XT1cIic0MHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzg4cHgnXCIgW2hlaWdodF09XCInMjRweCdcIlxuICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyByYXRpbmctY2hpcCBweS0yIGl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZU5hdmlnYXRlVG9SZXZpZXdzKClcIiAqbmdJZj1cImNvbnRlbnQ/LmF2ZXJhZ2VSYXRpbmdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBtYXJnaW4tbGVmdC1zIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+Z3JhZGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd2hpdGUgdGV4dC1zbSBsZWFkaW5nLTRcIj57eyBjb250ZW50Py5hdmVyYWdlUmF0aW5nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcGFyYXRvclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXdoaXRlIHRleHQtc20gbGVhZGluZy00IG1hcmdpbi1yaWdodC1tXCI+e3sgY29udGVudD8udG90YWxSYXRpbmcgfCBwaXBlQ291bnRUcmFuc2Zvcm0gfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiICpuZ0lmPVwiY29udGVudD8uYWRkaXRpb25hbFRhZ3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb3N0LWVucm9sbGVkLWNoaXAgdGV4dC14cyBsZWFkaW5nLTNcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29udGVudD8uYWRkaXRpb25hbFRhZ3M/LmluY2x1ZGVzKCdtb3N0VHJlbmRpbmcnKVwiPnt7ICdjYXJkY29udGVudHYyLm1vc3RUcmVuZGluZycgfFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbnRlbnQ/LmFkZGl0aW9uYWxUYWdzPy5pbmNsdWRlcygnbW9zdEVucm9sbGVkJylcIj57eyAnY2FyZGNvbnRlbnR2Mi5tb3N0RW5yb2xsZWQnIHxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnJldGlyZW1lbnREYXRlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5ldy12ZXJzaW9uLXBpbGwgdGV4dC14cyBsZWFkaW5nLTNcIiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uc3RhdHVzICE9PSAnUmV0aXJlZCdcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdhcHB0b2MucGVuZGluZ1JldGlyZW1lbnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZXctdmVyc2lvbi1yZXRpcmUtcGlsbCB0ZXh0LXhzIGxlYWRpbmctM1wiICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5zdGF0dXMgPT09ICdSZXRpcmVkJ1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgJ2FwcHRvYy5yZXRpcmVkJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTgwcHgnXCIgW2hlaWdodF09XCInMjBweCdcIlxuICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgY29udGVudFJlYWREYXRhPy5zWVNfSU5URVJOQUxfTEFTVF9VUERBVEVEX09OXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBsZWFkaW5nLTQgc291cmNlLXRleHQgbm9kdHJhbnNsYXRlXCI+KHt7ICdhcHB0b2MubGFzdFVwZGF0ZWRPbicgfCB0cmFuc2xhdGUgfX0ge3tcbiAgICAgICAgICAgICAgY29udGVudFJlYWREYXRhPy5zWVNfSU5URVJOQUxfTEFTVF9VUERBVEVEX09OIHwgZGF0ZTogJ01NTSBkLCB5JyB9fSk8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTJcIiAqbmdJZj1cImxhbmd1YWdlTGlzdD8ubGVuZ3RoID4gMVwiPlxuICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCBjbGFzcz1cImxhbmctY2hpcHNcIj5cbiAgICAgICAgICAgICAgICA8IS0tIFNob3cgdXAgdG8gNiBjaGlwcyAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsYW5nIG9mIGxhbmd1YWdlTGlzdCB8IHNsaWNlOjA6NTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwibWF0Y2hpcC1jdXN0b21cIiBzZWxlY3RhYmxlPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJsYW5nPy5pZGVudGlmaWVyID09PSBzZWxlY3RlZExhbmd1YWdlPy5pZGVudGlmaWVyXCIgKGNsaWNrKT1cIm9uTGFuZ3VhZ2VTZWxlY3QobGFuZylcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbGFuZy5uYW1lIHx8IGxhbmcudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFwiTW9yZVwiIGNoaXAgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiA2IGxhbmd1YWdlcyAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGFuZ3VhZ2VMaXN0Lmxlbmd0aCA+IDVcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCBbbWF0TWVudVRyaWdnZXJGb3JdPVwibW9yZUxhbmd1YWdlc01lbnVcIiBzZWxlY3RhYmxlPVwiZmFsc2VcIiBjbGFzcz1cIm1vcmUtY2hpcCBtYXRjaGlwLWN1c3RvbVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpc1NlbGVjdGVkSW5Nb3JlRHJvcGRvd24oKVwiPlxuICAgICAgICAgICAgICAgICAgICBNb3JlIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uXCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1jaGlwPlxuICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNtb3JlTGFuZ3VhZ2VzTWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBjbGFzcz1cIm1hdC1yYWRpby1ncm91cCBmbGV4IGZsZXgtY29sIGdhcC0yIHAtM1wiIFt2YWx1ZV09XCJzZWxlY3RlZExhbmd1YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gKm5nRm9yPVwibGV0IGxhbmcgb2YgbGFuZ3VhZ2VMaXN0IHwgc2xpY2U6NVwiIFt2YWx1ZV09XCJsYW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImxhbmc/LmlkZW50aWZpZXIgPT09IHNlbGVjdGVkTGFuZ3VhZ2U/LmlkZW50aWZpZXJcIiAoY2hhbmdlKT1cIm9uTGFuZ3VhZ2VTZWxlY3QobGFuZylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbmcuZGlzcGxheU5hbWUgfHwgbGFuZy5uYW1lIHx8IGxhbmcgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9tYXQtY2hpcC1saXN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC02IGZpeGVkLXdpZHRoXCI+XG4gICAgPGRpdiBjbGFzcz1cInRvYy1jb250ZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiZcbiAgICAgICAgc2VsZWN0ZWRCYXRjaERhdGE/LmNvbnRlbnRbMF0/LmJhdGNoQXR0cmlidXRlcz8uYmF0Y2hMb2NhdGlvbkRldGFpbHMgJiZcbiAgICAgICAgc2VsZWN0ZWRCYXRjaERhdGE/LmNvbnRlbnRbMF0/LmVucm9sbG1lbnRFbmREYXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1kZXRhaWxzIG10LTZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQgcGItM1wiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibG9jYXRpb24taWNvbiBub2R0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgbG9jYXRpb25fb25cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jLWRlc2NcIj5cbiAgICAgICAgICAgICAge3tzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hBdHRyaWJ1dGVzPy5iYXRjaExvY2F0aW9uRGV0YWlsc319XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImV2ZW50LWljb24gbm9kdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgIGV2ZW50PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2MtZGVzY1wiPlxuICAgICAgICAgICAgICBMYXN0IGRhdGUgb2YgZW5yb2xsbWVudCAtIHt7c2VsZWN0ZWRCYXRjaERhdGE/LmNvbnRlbnRbMF0/LmVucm9sbG1lbnRFbmREYXRlIHwgZGF0ZTogJ2RkL01NL3l5eXknfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY29tbWVuZGVkQ291cnNlc0lkICYmICFmZWVkYmFja0dpdmVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJweC00IHB5LTMgbXQtNiByZWxldmVudC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgaXRlbXMtY2VudGVyIGZsZXgtd3JhcCBmbGV4IGp1c3RpZnktY2VudGVyIG1kOmp1c3RpZnktc3RhcnRcIj5cbiAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pbWFnZXMvc2Frc2hhbUFJL2xhZHktZ3JlZXQuc3ZnXCIgYWx0PVwiZ3JlZXRcIiB3aWR0aD1cIjU2Ljg5XCIgaGVpZ2h0PVwiNjRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmVudC1pbmZvXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkZXIgdGV4dC1zbSByZWxldmVudC1oZWFkaW5nIGJsb2NrIG1iLTFcIj57eyAnaG9tZS50b2NSZWxldmVudEhlYWRpbmcnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVsZXZlbnQtc3ViaW5mbyBmb250LW5vcm1hbCB0ZXh0LXNtIGJsb2NrXCI+e3sgJ2hvbWUudG9jUmVsZXZlbnRTdWJIZWFkaW5nJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LW1pZGRsZSByZWxldmFudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1taWRkbGUgcmVsZXZlbnQtbm9ybWFsIHJlbGV2ZW50LWJ0biBweS0yIHB4LTQgcmVsZXZhbnQtYm94XCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJpc1JlbGV2ZW50QnRuSG92ZXJlZCA9IHRydWVcIiAobW91c2VsZWF2ZSk9XCJpc1JlbGV2ZW50QnRuSG92ZXJlZCA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQWNjZXB0UmVsZXZlbnQoKVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpc1JlbGV2ZW50QnRuSG92ZXJlZCAmJiAhaXNSZWxldmVudCA/IFNBS1NIQU1BSV9JQ09OX0xPQURFUiA6IFNBS1NIQU1BSV9JQ09OX05PUk1BTFwiXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJsb2FkZXJcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBjbGFzcz1cIm1yLTJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtcmVsZXZlbnQgZmYtbGF0byB0ZXh0LXNtIGZvbnQtYm9sZFwiPnt7ICdob21lLnJlbGV2ZW50JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1taWRkbGUgbm8tYnV0dG9uIG1sLThcIiAoY2xpY2spPVwiaGFuZGxlRGVjbGluZVJlbGV2ZW50KClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbiB0ZXh0LW5vIG1yLTEgbm9kdHJhbnNsYXRlXCI+dGh1bWJfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW5vIGZmLWxhdG8gdGV4dC1zbSBmb250LWJvbGRcIj57eyAnaG9tZS5ubycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGItNCBsZzpweS00XCJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgJiYgY29udGVudD8uaWRlbnRpZmllciAmJiBiYXNlQ29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyXCI+XG4gICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLXByb2dyZXNzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwcm9ncmVzc0Z1bmN0aW9uYWxpdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICA8d3Mtd2lkZ2V0LWNvbnRlbnQtdG9jIFtjb250ZW50XT1cImNvbnRlbnRcIiBbY29tcG9uZW50TmFtZV09XCIndG9jJ1wiIFtwYXRoU2V0XT1cInBhdGhTZXRcIlxuICAgICAgICAgIFt0b2NTdHJ1Y3R1cmVdPVwidG9jU3RydWN0dXJlXCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtpc0Vucm9sbGVkXT1cImJhdGNoRGF0YT8uZW5yb2xsZWRcIlxuICAgICAgICAgIFtyZXN1bWVEYXRhXT1cInJlc3VtZURhdGFcIiBbYmF0Y2hEYXRhXT1cInNlbGVjdGVkQmF0Y2hEYXRhXCIgW3NrZWxldG9uTG9hZGVyXT1cInNrZWxldG9uTG9hZGVyXCJcbiAgICAgICAgICBbY2hhbmdlVGFiXT1cImNoYW5nZVRhYlwiIFtoaWVyYXJjaHlNYXBEYXRhXT1cInRvY1N2Yz8uaGFzaG1hcFwiIFtzZWxlY3RlZEJhdGNoRGF0YV09XCJzZWxlY3RlZEJhdGNoRGF0YVwiXG4gICAgICAgICAgW2NvbmRpdGlvbl09XCJ7aXNQb3N0QXNzZXNzbWVudDogaXNQb3N0QXNzZXNzbWVudCwgY29udGVudDogY29udGVudCwgaXNBY2JwQ291cnNlOiBpc0FjYnBDb3Vyc2UsIGlzQ2xhaW1lZDogaXNDbGFpbWVkLCBtb250aGx5Q2FwRXhjZWVkOiBtb250aGx5Q2FwRXhjZWVkLCBpc0NvbXBsZXRlZFRoaXNNb250aDogaXNDb21wbGV0ZWRUaGlzTW9udGgsIHNob3dUYWtlQXNzZXNzbWVudDogc2hvd1Rha2VBc3Nlc3NtZW50LCB1c2VyRW5yb2xsbWVudExpc3Q6IHVzZXJFbnJvbGxtZW50TGlzdCwgcmVzdW1lRGF0YTogcmVzdW1lRGF0YSwgdXNlclJhdGluZzogdXNlclJhdGluZywgZW5yb2xsQnRuTG9hZGluZzogZW5yb2xsQnRuTG9hZGluZywgcHJpbWFyeUNhdGVnb3J5OiBwcmltYXJ5Q2F0ZWdvcnksIGN1cnJlbnRDb3Vyc2VCYXRjaElkOiBjdXJyZW50Q291cnNlQmF0Y2hJZCwgaXNBY2JwQ2xhaW06IGlzQWNicENsYWltfVwiXG4gICAgICAgICAgW2twYXJyYXldPVwia3BhcnJheVwiIChwbGF5UmVzdW1lRm9yQUkpPVwicGxheVJlc3VtZUZvckFJKClcIiAoZW5yb2xsVXNlclRvQUkpPVwiZW5yb2xsVXNlclRvQUkoKVwiXG4gICAgICAgICAgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIiBbYmFzZUNvbnRlbnRSZWFkRGF0YV09XCJiYXNlQ29udGVudFJlYWREYXRhXCIgW2xhbmd1YWdlTGlzdF09XCJsYW5ndWFnZUxpc3RcIlxuICAgICAgICAgIFtsb2NrQ2VydGlmaWNhdGVdPVwibG9ja0NlcnRpZmljYXRlXCIgKHRyaWdlckNvbXBsZXRpb25TdXJ2ZXlGb3JtKT1cIm9wZW5TdXJ2ZXlGb3JtUG9wdXAoJGV2ZW50KVwiXG4gICAgICAgICAgKHJlc3VtZUNvbnRlbnQpPVwicmVzdW1lQ29udGVudERhdGEoKVwiPjwvd3Mtd2lkZ2V0LWNvbnRlbnQtdG9jPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iLXRpcC1mb3ItbGVhcm5lclwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJsZWFybkFkdmlzb3J5RGF0YSAmJiBsZWFybkFkdmlzb3J5RGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXRpcHMtZm9yLWxlYXJuZXItY2FyZCBbbGVhcm5BZHZpc29yeURhdGFdPVwibGVhcm5BZHZpc29yeURhdGFcIj48L3dzLXdpZGdldC10aXBzLWZvci1sZWFybmVyLWNhcmQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cblxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250YWluZXJcIj5cblxuICAgICAgPCEtLSBpZiBuZWVkZWQgc3RpY2t5IG9mIHJpZ2h0IGNvbnRhaW5lciBhZGQgdGhpcyB0byBiZWxvdyBkaXYgPT4gI3JpZ2h0Q29udGFpbmVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRlbnQtaW5uZXJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMzg0cHgnXCIgW2hlaWdodF09XCInMjI0cHgnXCJcbiAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaW1hZ2UtZGl2XCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoJyArIGNvbnRlbnRSZWFkRGF0YT8ucG9zdGVySW1hZ2UgKyAnKScsICdiYWNrZ3JvdW5kLXJlcGVhdCc6ICduby1yZXBlYXQnLCAnYmFja2dyb3VuZC1zaXplJzogJ2NvdmVyJ31cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ltYWdlLWJhY2tkcm9wJzogc2Nyb2xsZWR9XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiB0ZXh0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNCBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydqdXN0aWZ5LWJldHdlZW4nOiBzY3JvbGxlZCwgJ2p1c3RpZnktZW5kJzogIXNjcm9sbGVkfVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgdGFnLWRpdiByb3VuZGVkLTJ4bCBnYXAtMSBpdGVtcy1jZW50ZXIgcC0yXCIgKm5nSWY9XCJzY3JvbGxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ3cy1tYXQtb3JhbmdlLXRleHQgbm9kdHJhbnNsYXRlXCI+dmlkZW9fbGlicmFyeTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1ib2xkIHRleHQtd2hpdGUgbGVhZGluZy0zXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnksICdzZWFyY2hmaWx0ZXJzJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctM1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25DbGlja09mU2hhcmUoKVwiIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgZ2FwLTIgc2hhcmUtdGFnXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYW5TaGFyZSAmJiAhZm9yUHJldmlld1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5zaGFyZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uuc2hhcmUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMVwiICpuZ0lmPVwic2Nyb2xsZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhsIGxlYWRpbmctNiB0ZXh0LXdoaXRlIGZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY29udGVudFJlYWREYXRhPy5uYW1lKSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBzb3VyY2UtdGV4dCBmb250LXNlbWlib2xkIGJyZWFrLXdvcmRzXCIgI2NvbnRlbnRTb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzb3VyY2VFbGxpcHNpcyc6IHNvdXJjZUVsbGlwc2lzfVwiIHRpdGxlPVwie3tjb250ZW50UmVhZERhdGE/LnNvdXJjZX19XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ2NhcmRjb250ZW50djIuYnknIHwgdHJhbnNsYXRlIH19IHt7IGNvbnRlbnRSZWFkRGF0YT8uc291cmNlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IHAtNSBib3JkZXItYm90dG9tXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSAgY3Vyc29yLXBvaW50ZXIgc3dpdGNoLXZlcnNpb25cIlxuICAgICAgICAgICAgICAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiBjb250ZW50UmVhZERhdGE/LmNvbnRlbnRWZXJzaW9uSW5mbz8uaWRlbnRpZmllclwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVRvTmV3VmVyc2lvbigpXCIgKGtleWRvd24pPVwibmF2aWdhdGVUb05ld1ZlcnNpb24oKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1zd2l0Y2hcIj57eyAnYXBwdG9jLnN3aXRjaFRvTmV3VmVyc2lvbicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YSAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMyBqdXN0aWZ5LWFyb3VuZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5iYXRjaEF0dHJpYnV0ZXM/LmN1cnJlbnRCYXRjaFNpemVcbiAgICAgICAgICAgICAgICAgICAgfHwgJzAnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLmJhdGNoU2l6ZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8udXNlckNvdW50Py50b3RhbEFwcGxpZWQgfHwgJzAnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLnRvdGFsQXBwbGllZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8udXNlckNvdW50Py5lbnJvbGxlZCB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1sYWJlbFwiPnt7ICdhcHB0b2MudG90YWxFbnJvbGxlZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmICFwcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1c1wiPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGVucm9sbC1idG4ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/Lmxlbmd0aFwiIChjbGljayk9XCJyb3V0ZVRvUHJlQXNzZXNzZW50KClcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLnByZUVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmIHByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmbGV4IHByZWVucm9sbGRvbmUtYnRuIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUucHJlRW5yb2xsRG9uZScgfCB0cmFuc2xhdGUgfX08aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvQWNjZXB0X2ljb24ucG5nXCIgYWx0PVwidGlja1wiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWljb25cIj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInRpbWVyICYmIHRpbWVyLmRheXMgPj0gMCAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC02IGJhdGNoLXRpbWVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdW5kZXJsaW5lXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmJhdGNoU3RhcnRzSW4nIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdW5kZXJsaW5lXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIuZGF5cyB8fCAwIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItbGFiZWxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5kYXlzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IHRpbWVyLmhvdXJzICsgMSA6IHRpbWVyLmhvdXJzIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItbGFiZWxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5ob3VycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb3VudGVyLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTEgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtNHhsIGxlYWRpbmctMTAgY291bnRlclwiPnt7IHRpbWVyLm1pbiA9PT0gNjAgPyAwMCA6IHRpbWVyLm1pbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UubWludXRlcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3QnRuXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2JpbGUxMjAwICYmIChcbiAgICAgICAgICFjb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8ubGVuZ3RoIHx8XG4gICAgICAgICAoY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/Lmxlbmd0aCAmJiAocHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMgfHwgICFwcmVBc3Nlc3NtZW50UmVxdWlyZWRGbGFnKSlcbiAgICAgICApXCI+XG5cbiAgICAgICAgICAgICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgW3VzZXJFbnJvbGxtZW50TGlzdF09XCJ1c2VyRW5yb2xsbWVudExpc3RcIiAod2l0aGRyYXdPckVucm9sbCk9XCJ3aXRoZHJhd09yRW5yb2xsKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbYW5hbHl0aWNzXT1cImFuYWx5dGljc1wiIFtyZXN1bWVEYXRhXT1cInJlc3VtZURhdGFcIiBbYmF0Y2hEYXRhXT1cImJhdGNoRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb250ZW50UmVhZERhdGFdPVwiY29udGVudFJlYWREYXRhXCI+XG4gICAgICAgICAgICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzMzNnB4J1wiIFtoZWlnaHRdPVwiJzQwcHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczMzZweCdcIiBbaGVpZ2h0XT1cIic2OHB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMiBpbmZvLWRpdlwiICpuZ0lmPVwiY29udGVudD8uaXNJbkludHJhbmV0ICYmIHNob3dJbnRyYW5ldE1zZ1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLnZpZXdlZEluSW50cmFuZXQnIHwgdHJhbnNsYXRlIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0yIGluZm8tZGl2XCIgKm5nSWY9XCJzaG93SW5zdHJ1Y3RvckxlZE1zZ1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+aW5mbzwvbWF0LWljb24+Jm5ic3A7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLm5vdEF2YWlsYWJsZU9ubGluZScgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZ2FwLTIgaW5mby1kaXZcIiAqbmdJZj1cInNob3dTdGFydC5tc2cgPT09ICd5b3V0dWJlRm9yYmlkZGVuJ1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+aW5mbzwvbWF0LWljb24+Jm5ic3A7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLnlvdXR1YmVDb250ZW50QmxvY2tlZCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0J0blwiPlxuICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7IGNzY21zVXJsIH19XCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUuYXBwbHlGb3JQaHlzaWNhbFRyYWluaW5nJyB8IHRyYW5zbGF0ZSB9fTwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uU3RhdHVzIDw9IDIgJiYgaXNCYXRjaEluUHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicHJvZ3Jlc3NGdW5jdGlvbmFsaXR5XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPCEtLSBPdmVyYWxsIHByb2dyZXNzIGZ1bmN0aW9uYWxpdHkgLS0+XG5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJyZXN1bWVEYXRhICYmICF1c2VyUmF0aW5nXCI+IC0tPlxuICAgICAgICAgICAgICAgIDwhLS0gPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInUmF0ZSB0aGlzIGNvdXJzZSdcIiBbZGF0YV09XCJrcGFycmF5XCJcbiAgICAgICAgICAgICAgICAgIFtwQ2F0ZWdvcnldPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD4gLS0+XG4gICAgICAgICAgICAgICAgPCEtLSA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJyZXN1bWVEYXRhICYmIHVzZXJSYXRpbmdcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidFZGl0IHJhdGluZydcIiBbZGF0YV09XCJrcGFycmF5XCJcbiAgICAgICAgICAgICAgICAgIFtwQ2F0ZWdvcnldPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhY3Rpb25CdG5TdGF0dXMgIT09ICd3YWl0JyAmJiBjb250ZW50UmVhZERhdGE/LnN0YXR1cyAhPT0gJ0RlbGV0ZWQnICYmIGNvbnRlbnRSZWFkRGF0YT8uc3RhdHVzICE9PSAnRXhwaXJlZCdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZW5yb2xsRnVuY3Rpb25hbGl0eVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2FybWEtcG9pbnRzLWRpdlwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQta2FybWEtcG9pbnRzIFtkYXRhXT1cImtwYXJyYXlcIiAoY2xpY2tDbGFpbUthcm1hUG9pbnRzKT1cIm9uQ2xpY2tPZkNsYWltKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgW2NvbnRlbnRdPVwiY29udGVudFwiXG4gICAgICAgICAgICAgICAgICBbY29uZGl0aW9uXT1cIntpc1Bvc3RBc3Nlc3NtZW50OiBpc1Bvc3RBc3Nlc3NtZW50LCBjb250ZW50OiBjb250ZW50LCBpc0FjYnBDb3Vyc2U6IGlzQWNicENvdXJzZSwgaXNDbGFpbWVkOiBpc0NsYWltZWQsIG1vbnRobHlDYXBFeGNlZWQ6IG1vbnRobHlDYXBFeGNlZWQsIGlzQ29tcGxldGVkVGhpc01vbnRoOiBpc0NvbXBsZXRlZFRoaXNNb250aCwgc2hvd1Rha2VBc3Nlc3NtZW50OiBzaG93VGFrZUFzc2Vzc21lbnQsIHVzZXJFbnJvbGxtZW50TGlzdDogdXNlckVucm9sbG1lbnRMaXN0LCBpc0NvbXBsZXRlZFRoaXNNb250aDogaXNDb21wbGV0ZWRUaGlzTW9udGgsIHJlc3VtZURhdGE6IHJlc3VtZURhdGEsIHVzZXJSYXRpbmc6IHVzZXJSYXRpbmcsIGVucm9sbEJ0bkxvYWRpbmc6IGVucm9sbEJ0bkxvYWRpbmcsIHByaW1hcnlDYXRlZ29yeTogcHJpbWFyeUNhdGVnb3J5LCBjdXJyZW50Q291cnNlQmF0Y2hJZDogY3VycmVudENvdXJzZUJhdGNoSWQsIGlzQWNicENsYWltOiBpc0FjYnBDbGFpbX1cIj48L3dzLXdpZGdldC1rYXJtYS1wb2ludHM+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0MHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNDhweCdcIiBbaGVpZ2h0XT1cIic4cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgPHdzLXdpZGdldC10b2Mta3BpLXZhbHVlcyBbY29udGVudF09XCJjb250ZW50XCIgW3RvY1N0cnVjdHVyZV09XCJ0b2NTdHJ1Y3R1cmVcIlxuICAgICAgICAgICAgICAgIFtzaG93SW5zdHJ1Y3RvckxlZE1zZ109XCJzaG93SW5zdHJ1Y3RvckxlZE1zZ1wiIFtjb250ZW50UmVhZERhdGFdPVwiY29udGVudFJlYWREYXRhXCJcbiAgICAgICAgICAgICAgICBbbGFuZ3VhZ2VMaXN0XT1cImxhbmd1YWdlTGlzdFwiPjwvd3Mtd2lkZ2V0LXRvYy1rcGktdmFsdWVzPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtOCBwLTVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiICpuZ0Zvcj1cImxldCBpIG9mIFsxLCAyXVwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNzJweCdcIiBbaGVpZ2h0XT1cIicyMHB4J1wiXG4gICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczNnB4J1wiIFtoZWlnaHRdPVwiJzM2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZC1mdWxsJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTI0cHgnXCIgW2hlaWdodF09XCInMjBweCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzEycHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCIgKm5nSWY9XCJoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckRldGFpbHMpPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtYm9sZFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmF1dGhvcnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhdXRob3Igb2YgaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JEZXRhaWxzKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXZhdGFyLXBob3RvIFtyYW5kb21Db2xvcl09XCJ0cnVlXCIgW2RhdGFsZW5dPVwiMVwiIFtzaXplXT1cIidyb3VuZC1tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3Bob3RvVXJsXT1cImF1dGhvcj8ucGhvdG8gfHwgJydcIiBbbmFtZV09XCJhdXRob3I/Lm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShhdXRob3I/Lm5hbWUsICduYW1lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy0zXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYXV0aG9yJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiICpuZ0lmPVwiaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JDb250YWN0cyk/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3JlYXRvcnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjcmVlYXRvciBvZiBoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckNvbnRhY3RzKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXZhdGFyLXBob3RvIFtyYW5kb21Db2xvcl09XCJ0cnVlXCIgW2RhdGFsZW5dPVwiMVwiIFtzaXplXT1cIidyb3VuZC1tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3Bob3RvVXJsXT1cImNyZWVhdG9yPy5waG90byB8fCAnJ1wiIFtuYW1lXT1cImNyZWVhdG9yPy5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTEganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY3JlZWF0b3I/Lm5hbWUsICduYW1lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy0zXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3JlYXRvcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5zb3VyY2UgICYmIChjb250ZW50Q3JlYXRvckRhdGEgJiYgY29udGVudENyZWF0b3JEYXRhPy5sZW5ndGgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYmFzZSBmb250LWJvbGRcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBpdGVtcy1jZW50ZXJcIiAqbmdGb3I9XCJsZXQgY3JlYXRvciBvZiBjb250ZW50Q3JlYXRvckRhdGFcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHByb3ZpZGVyLWxvZ28tZGl2XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmNyZWF0b3JMb2dvXCIgW3NyY109XCJjb250ZW50UmVhZERhdGE/LmNyZWF0b3JMb2dvXCJcbiAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX1cIiAvPlxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiIWNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckxvZ29cIiBjbGFzcz1cIm1hdC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIvYXNzZXRzL2luc3RhbmNlcy9lYWdsZS9hcHBfbG9nb3MvS2FybWF5b2dpQmhhcmF0X0xvZ28uc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX1cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSB3b3JkLWJyZWFrIGN1cnNvci1wb2ludGVyXCIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3I/Lmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyYWlzZVRlbGVtZXRlcnlGb3JQcm92aWRlcihjb250ZW50UmVhZERhdGE/LnNvdXJjZSwgY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yWzBdKVwiXG4gICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL2FwcC9sZWFybi9icm93c2UtYnkvcHJvdmlkZXInLCBjb250ZW50UmVhZERhdGE/LnNvdXJjZSwgY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yWzBdLCAnbWljcm8tc2l0ZXMnXVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnRSZWFkRGF0YT8uc291cmNlLCAnc291cmNlJykgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gd29yZC1icmVha1wiICpuZ0lmPVwiIWNvbnRlbnRSZWFkRGF0YT8uY3JlYXRlZEZvcj8ubGVuZ3RoXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50UmVhZERhdGE/LnNvdXJjZSwgJ3NvdXJjZScpIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImxlYXJuQWR2aXNvcnlEYXRhICYmIGxlYXJuQWR2aXNvcnlEYXRhPy5sZW5ndGhcIj5cbiAgICAgICAgICA8d3Mtd2lkZ2V0LXRpcHMtZm9yLWxlYXJuZXItY2FyZCBbbGVhcm5BZHZpc29yeURhdGFdPVwibGVhcm5BZHZpc29yeURhdGFcIj48L3dzLXdpZGdldC10aXBzLWZvci1sZWFybmVyLWNhcmQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cblxuXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9iaWxlLWVucm9sbC1kaXZcIlxuICAgIFtuZ0NsYXNzXT1cInsnYmctd2hpdGUnOiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSB9XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQgJiYgY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwibW9iaWxlMTIwMCAmJiAhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3QnRuXCI+XG4gICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICBbdXNlckVucm9sbG1lbnRMaXN0XT1cInVzZXJFbnJvbGxtZW50TGlzdFwiICh3aXRoZHJhd09yRW5yb2xsKT1cIndpdGhkcmF3T3JFbnJvbGwoJGV2ZW50KVwiXG4gICAgICAgICAgW2FuYWx5dGljc109XCJhbmFseXRpY3NcIiBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiPlxuICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJlbnJvbGxGdW5jdGlvbmFsaXR5XCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDx3cy1hcHAtc2hhcmUtdG9jICpuZ0lmPVwiZW5hYmxlU2hhcmVcIiBbcm9vdE9yZ0lkXT1cInJvb3RPcmdJZFwiIFtjb250ZW50XT1cImNvbnRlbnRcIlxuICAgIChyZXNldEVuYWJsZVNoYXJlKT1cInJlc2V0RW5hYmxlU2hhcmUoJGV2ZW50KVwiIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIj48L3dzLWFwcC1zaGFyZS10b2M+XG48L25nLWNvbnRhaW5lcj5cbjxuZy10ZW1wbGF0ZSAjbm9EYXRhRm91bmQ+XG4gIDxkaXZcbiAgICBjbGFzcz1cImVycm9yLW5vdC1mb3VuZCBmbGV4IGZsZXgtd3JhcHBlZCBtYXJnaW4tbGVmdC1tIG1hcmdpbi10b3AteGwgbWFyZ2luLXJpZ2h0LW0gZmxleC1jb2wganVzdGlmeS1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHRleHQtY2VudGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImVycm9yLWxvZ29cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJlcnJvci1tZXNzYWdlIHdzLW1hdC1wcmltYXJ5LXRleHQgZm9udC13ZWlnaHQtYm9sZFwiPlxuICAgICAgICBUaGUgcGFnZSB5b3UgcmVxdWVzdGVkIGNhbm5vdCBiZSBmb3VuZFxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSA8ZGl2IGNsYXNzPVwiZXJyb3Itc3VwcG9ydFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN1cHBvcnQtbWVzc2FnZVwiID5XZSBoYXZlIHVwZGF0ZWQgb3VyIHdlYiBzaXRlIGFuZCBtYW55IFVSTHMgaGF2ZSBjaGFuZ2VkLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInN1cHBvcnQtbWVzc2FnZVwiID5Zb3UgbWlnaHQgd2FudCB0bzo8L2Rpdj5cbiAgICA8L2Rpdj4gLS0+XG4gIDwvZGl2PlxuXG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2F1dGhWaWV3Pnt7J2FwcHRvY2hvbWUudmlldycgfCB0cmFuc2xhdGV9fTwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYXV0aFZpZXdCdG4gaTE4bj5cbiAgPGEgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKCRldmVudClcIlxuICAgIFtyb3V0ZXJMaW5rXT1cInNob3VsZFNob3dTdXJ2ZXlQb3B1cCgpID8gbnVsbCA6ICgocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmwpXCJcbiAgICBbcXVlcnlQYXJhbXNdPVwic2hvdWxkU2hvd1N1cnZleVBvcHVwKCkgPyBudWxsIDogKChyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJykpXCJcbiAgICBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlclwiPlxuICAgIHt7J2FwcHRvY2hvbWUudmlldycgfCB0cmFuc2xhdGV9fVxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNhdXRoVmlld0Zvckludml0ZU9ubHlBc3Nlc3NtZW50PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9yUHJldmlldyAmJiBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ID09PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgIFtxdWVyeVBhcmFtc109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCI+XG4gICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0JyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgIDwvYT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPiJdfQ==