UNPKG

@tekdi/sunbird-quml-player

Version:

The QuML player library components are powered by Angular. This player is primarily designed to be used on Sunbird consumption platforms (mobile app, web portal, offline desktop app) to drive reusability and maintainability, hence reducing the redundant d

188 lines 39.9 kB
import { Component, Output, EventEmitter, Input, HostListener } from '@angular/core'; import { eventName, TelemetryType } from '../telemetry-constants'; import * as i0 from "@angular/core"; import * as i1 from "../services/viewer-service/viewer-service"; import * as i2 from "@angular/common"; import * as i3 from "../icon/ans/ans.component"; import * as i4 from "../icon/durationtimer/durationtimer.component"; import * as i5 from "../progress-indicators/progress-indicators.component"; export class HeaderComponent { constructor(viewerService) { this.viewerService = viewerService; this.showDeviceOrientation = false; this.nextSlideClicked = new EventEmitter(); this.prevSlideClicked = new EventEmitter(); this.durationEnds = new EventEmitter(); this.showSolution = new EventEmitter(); this.toggleScreenRotate = new EventEmitter(); this.showWarning = false; this.isMobilePortrait = false; this.showProgressIndicatorPopUp = false; } ngOnInit() { if (this.duration && this.showTimer) { this.minutes = Math.floor(this.duration / 60); this.seconds = this.duration - this.minutes * 60 < 10 ? `0${this.duration - this.minutes * 60}` : this.duration - this.minutes * 60; } } ngOnChanges() { if (this.duration && this.showTimer && this.initializeTimer && !this.intervalRef) { this.timer(); } else if (this.duration === 0 && this.showTimer && this.initializeTimer && !this.intervalRef) { this.showCountUp(); } if (this.replayed && this.duration && this.showTimer) { this.showWarning = false; clearInterval(this.intervalRef); this.timer(); } else if (this.replayed && this.duration === 0 && this.showTimer) { clearInterval(this.intervalRef); this.showCountUp(); } } ngAfterViewInit() { this.isMobilePortrait = window.matchMedia("(max-width: 480px)").matches; } ngOnDestroy() { if (this.intervalRef) { clearInterval(this.intervalRef); } } nextSlide() { if (!this.disableNext) { this.nextSlideClicked.emit({ type: 'next' }); } } prevSlide() { if (!this.showStartPage && this.currentSlideIndex === 1) { return; } if (!this.disablePreviousNavigation) { this.prevSlideClicked.emit({ event: 'previous clicked' }); } } timer() { /* istanbul ignore else */ if (this.duration > 0) { let durationInSec = this.duration; this.intervalRef = setInterval(() => { let min = ~~(durationInSec / 60); let sec = (durationInSec % 60); if (sec < 10) { this.time = min + ':' + '0' + sec; } else { this.time = min + ':' + sec; } if (durationInSec === 0) { clearInterval(this.intervalRef); this.durationEnds.emit(true); return false; } /* istanbul ignore else */ if (parseInt(durationInSec) <= parseInt(this.warningTime) && this.showWarningTimer) { this.showWarning = true; } durationInSec--; }, 1000); } } showCountUp() { let min = 0; let sec = 0; this.intervalRef = setInterval(() => { if (sec === 59) { sec = 0; min = min + 1; } if (sec < 10) { this.time = min + ':' + '0' + sec++; } else { this.time = min + ':' + sec++; } }, 1000); } onAnswerKeyDown(event) { /* istanbul ignore else */ if (event.key === 'Enter') { event.stopPropagation(); this.showSolution.emit(); } } openProgressIndicatorPopup() { this.showProgressIndicatorPopUp = true; this.viewerService.raiseHeartBeatEvent(eventName.progressIndicatorPopupOpened, TelemetryType.interact, this.currentSlideIndex); } onKeydownHandler(event) { this.onProgressPopupClose(); } onProgressPopupClose() { this.showProgressIndicatorPopUp = false; this.viewerService.raiseHeartBeatEvent(eventName.progressIndicatorPopupClosed, TelemetryType.interact, this.currentSlideIndex); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HeaderComponent, deps: [{ token: i1.ViewerService }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: HeaderComponent, selector: "quml-header", inputs: { questions: "questions", duration: "duration", warningTime: "warningTime", showWarningTimer: "showWarningTimer", disablePreviousNavigation: "disablePreviousNavigation", showTimer: "showTimer", totalNoOfQuestions: "totalNoOfQuestions", currentSlideIndex: "currentSlideIndex", active: "active", initializeTimer: "initializeTimer", endPageReached: "endPageReached", loadScoreBoard: "loadScoreBoard", replayed: "replayed", currentSolutions: "currentSolutions", showFeedBack: "showFeedBack", disableNext: "disableNext", startPageInstruction: "startPageInstruction", showStartPage: "showStartPage", attempts: "attempts", showDeviceOrientation: "showDeviceOrientation", showLegend: "showLegend" }, outputs: { nextSlideClicked: "nextSlideClicked", prevSlideClicked: "prevSlideClicked", durationEnds: "durationEnds", showSolution: "showSolution", toggleScreenRotate: "toggleScreenRotate" }, host: { listeners: { "document:keydown.escape": "onKeydownHandler($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"quml-header__container\">\n <div class=\"quml-header__features pl-64\">\n <div *ngIf=\"attempts?.max && attempts?.current\" class=\"attempts sb-color-primary fnormal font-weight-bold\">\n Attempt no {{attempts.current}}/{{attempts.max}}</div>\n <img src=\"assets/question-mark-round.svg\" *ngIf=\"showLegend\" alt=\"Progress Indicators\" title=\"Progress Indicators\" height=\"20\" width=\"20\" (click)=\"openProgressIndicatorPopup()\">\n </div>\n\n <div class=\"quml-header__metadata\">\n <img src=\"assets/device-rotate.svg\" alt=\"Change Orientation\" title=\"Change Orientation\" height=\"20\" width=\"20\" *ngIf=\"showDeviceOrientation\" (click)=\"toggleScreenRotate.emit()\">\n <ng-container *ngIf=\"duration && showTimer\">\n <div class=\"duration mr-16\" title=\"{{minutes}}:{{seconds}}\" *ngIf=\"!initializeTimer\">\n <quml-durationtimer></quml-durationtimer>\n <span>{{minutes}}:{{seconds}}</span>\n </div>\n <div class=\"duration mr-16\" title=\"{{minutes}}:{{seconds}}\" *ngIf=\"initializeTimer && time\">\n <quml-durationtimer></quml-durationtimer>\n <span [ngClass]=\"{'blink': showWarning}\">{{time}}</span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!duration && showTimer && initializeTimer\">\n <div class=\"duration mr-16\" title=\"{{minutes}}:{{seconds}}\">\n <quml-durationtimer></quml-durationtimer>\n <span>{{time}}</span>\n </div>\n </ng-container>\n\n <div class=\"quml-navigation\" *ngIf=\"!disableNext && !isMobilePortrait\">\n <div class=\"quml-navigation__previous\" (click)=\"prevSlide()\" aria-label=\"preview slide\" title=\"preview slide\"\n role=\"navigation\"\n [ngClass]=\"(startPageInstruction && currentSlideIndex === 0) || (!showStartPage && currentSlideIndex === 1) ? 'navigation-icon-disabled': '' \"\n [attr.tabindex]=\"(startPageInstruction && currentSlideIndex === 0) || (!showStartPage && currentSlideIndex === 1) ? -1 : 0\">\n </div>\n <div class=\"quml-navigation__next ml-8\" (click)=\"nextSlide()\" (keydown.enter)=\"$event.stopPropagation();nextSlide()\"\n aria-label=\"next slide\" title=\"next slide\" *ngIf=\"!active\" role=\"navigation\"\n [ngClass]=\"disableNext ? 'navigation-icon-disabled': '' \" tabindex=\"0\"></div>\n <div class=\"quml-navigation__next quml-navigation__next--active ml-8\" (click)=\"nextSlide()\"\n (keydown.enter)=\"$event.stopPropagation();nextSlide()\" aria-label=\"next slide\" title=\"next slide\" *ngIf=\"active\" role=\"navigation\"\n [ngClass]=\"disableNext ? 'navigation-icon-disabled': '' \" tabindex=\"0\"></div>\n </div>\n\n </div>\n</div>\n\n<div class=\"quml-header__metadata quml-header__metadata--portrait\" *ngIf=\"!loadScoreBoard && !endPageReached\">\n <div class=\"current-slide fnormal\" *ngIf=\"currentSlideIndex\">{{currentSlideIndex}}/{{totalNoOfQuestions}}</div>\n <div class=\"ml-16\" *ngIf=\"currentSolutions && showFeedBack\">\n <quml-ans (click)=\"showSolution.emit()\" (keydown)=\"onAnswerKeyDown($event)\"></quml-ans>\n </div>\n <div class=\"quml-navigation ml-auto\">\n <div class=\"quml-navigation__previous\" tabindex=\"0\" (click)=\"prevSlide()\" (keydown.enter)=\"prevSlide()\"\n aria-label=\"preview slide\"></div>\n <div class=\"quml-navigation__next ml-8\" tabindex=\"0\" (click)=\"nextSlide()\" (keydown.enter)=\"nextSlide()\"\n *ngIf=\"!active\" aria-label=\"next slide\"></div>\n <div class=\"quml-navigation__next quml-navigation__next--active ml-8\" tabindex=\"0\" (click)=\"nextSlide()\"\n (keydown.enter)=\"nextSlide()\" *ngIf=\"active\" aria-label=\"next slide\"></div>\n </div>\n\n</div>\n\n<quml-progress-indicators *ngIf=\"showProgressIndicatorPopUp\" (close)=\"onProgressPopupClose()\"></quml-progress-indicators>", styles: ["::ng-deep :root{--quml-color-primary: #FFD555;--quml-color-primary-contrast:#333;--quml-color-warning: #ff0000;--quml-btn-border: #ccc;--quml-color-gray: #666;--quml-main-bg: #fff;--quml-navigation-btns:#333;--quml-header-metadata: #fff}.quml-header__container,.quml-header__features,.quml-header__metadata{display:flex;align-items:center}.quml-header__container{justify-content:space-between;position:absolute;top:0;background:var(--quml-main-bg);min-height:3.5rem;width:100%;padding:.5rem 1rem .5rem 0;z-index:8}.quml-header__features{justify-content:space-between}.quml-header__features img,.quml-header__metadata img{margin:0 1rem;cursor:pointer}.quml-header__metadata--portrait{display:none}@media only screen and (max-width: 480px){.quml-header__metadata--portrait{display:flex;position:fixed;bottom:0;width:100%;padding:.5rem 1rem;background-color:var(--white);z-index:5;min-height:3rem}.quml-header__metadata--portrait .quml-navigation{display:flex}}.quml-navigation{display:flex;align-items:center}@media only screen and (max-width: 480px){.quml-navigation{display:none}}.quml-navigation__next,.quml-navigation__previous{position:relative;width:3.75rem;height:2.25rem;background:var(--quml-header-metadata);border:.03125rem solid var(--quml-btn-border);border-radius:1rem;box-shadow:inset 0 -.09375rem .0625rem #0003;cursor:pointer}.quml-navigation__next:after,.quml-navigation__previous:after{content:\"\";display:inline-block;padding:.21875rem;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);border:solid var(--quml-navigation-btns);border-width:0 .125rem .125rem 0}.quml-navigation__next:hover,.quml-navigation__next--active,.quml-navigation__next:focus,.quml-navigation__previous:hover,.quml-navigation__previous--active,.quml-navigation__previous:focus{background-color:var(--quml-color-primary)}.quml-navigation__next:after{transform:translate(-50%,-50%) rotate(-45deg);-webkit-transform:translate(-50%,-50%) rotate(-45deg)}.quml-navigation__previous:after{transform:translate(-50%,-50%) rotate(135deg);-webkit-transform:translate(-50%,-50%) rotate(135deg)}.blink{animation:blink 1s steps(1,end) infinite;color:var(--quml-color-warning)}.duration,quml-durationtimer{display:flex;align-items:center}.duration{color:var(--quml-color-primary-contrast);font-weight:700}quml-durationtimer{margin-right:.5rem}.current-slide{color:var(--quml-color-gray);font-weight:700}.navigation-icon-disabled{opacity:.6;cursor:not-allowed}@keyframes blink{0%{opacity:1}50%{opacity:0}to{opacity:1}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.AnsComponent, selector: "quml-ans" }, { kind: "component", type: i4.DurationtimerComponent, selector: "quml-durationtimer" }, { kind: "component", type: i5.ProgressIndicatorsComponent, selector: "quml-progress-indicators", outputs: ["close"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HeaderComponent, decorators: [{ type: Component, args: [{ selector: 'quml-header', template: "<div class=\"quml-header__container\">\n <div class=\"quml-header__features pl-64\">\n <div *ngIf=\"attempts?.max && attempts?.current\" class=\"attempts sb-color-primary fnormal font-weight-bold\">\n Attempt no {{attempts.current}}/{{attempts.max}}</div>\n <img src=\"assets/question-mark-round.svg\" *ngIf=\"showLegend\" alt=\"Progress Indicators\" title=\"Progress Indicators\" height=\"20\" width=\"20\" (click)=\"openProgressIndicatorPopup()\">\n </div>\n\n <div class=\"quml-header__metadata\">\n <img src=\"assets/device-rotate.svg\" alt=\"Change Orientation\" title=\"Change Orientation\" height=\"20\" width=\"20\" *ngIf=\"showDeviceOrientation\" (click)=\"toggleScreenRotate.emit()\">\n <ng-container *ngIf=\"duration && showTimer\">\n <div class=\"duration mr-16\" title=\"{{minutes}}:{{seconds}}\" *ngIf=\"!initializeTimer\">\n <quml-durationtimer></quml-durationtimer>\n <span>{{minutes}}:{{seconds}}</span>\n </div>\n <div class=\"duration mr-16\" title=\"{{minutes}}:{{seconds}}\" *ngIf=\"initializeTimer && time\">\n <quml-durationtimer></quml-durationtimer>\n <span [ngClass]=\"{'blink': showWarning}\">{{time}}</span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!duration && showTimer && initializeTimer\">\n <div class=\"duration mr-16\" title=\"{{minutes}}:{{seconds}}\">\n <quml-durationtimer></quml-durationtimer>\n <span>{{time}}</span>\n </div>\n </ng-container>\n\n <div class=\"quml-navigation\" *ngIf=\"!disableNext && !isMobilePortrait\">\n <div class=\"quml-navigation__previous\" (click)=\"prevSlide()\" aria-label=\"preview slide\" title=\"preview slide\"\n role=\"navigation\"\n [ngClass]=\"(startPageInstruction && currentSlideIndex === 0) || (!showStartPage && currentSlideIndex === 1) ? 'navigation-icon-disabled': '' \"\n [attr.tabindex]=\"(startPageInstruction && currentSlideIndex === 0) || (!showStartPage && currentSlideIndex === 1) ? -1 : 0\">\n </div>\n <div class=\"quml-navigation__next ml-8\" (click)=\"nextSlide()\" (keydown.enter)=\"$event.stopPropagation();nextSlide()\"\n aria-label=\"next slide\" title=\"next slide\" *ngIf=\"!active\" role=\"navigation\"\n [ngClass]=\"disableNext ? 'navigation-icon-disabled': '' \" tabindex=\"0\"></div>\n <div class=\"quml-navigation__next quml-navigation__next--active ml-8\" (click)=\"nextSlide()\"\n (keydown.enter)=\"$event.stopPropagation();nextSlide()\" aria-label=\"next slide\" title=\"next slide\" *ngIf=\"active\" role=\"navigation\"\n [ngClass]=\"disableNext ? 'navigation-icon-disabled': '' \" tabindex=\"0\"></div>\n </div>\n\n </div>\n</div>\n\n<div class=\"quml-header__metadata quml-header__metadata--portrait\" *ngIf=\"!loadScoreBoard && !endPageReached\">\n <div class=\"current-slide fnormal\" *ngIf=\"currentSlideIndex\">{{currentSlideIndex}}/{{totalNoOfQuestions}}</div>\n <div class=\"ml-16\" *ngIf=\"currentSolutions && showFeedBack\">\n <quml-ans (click)=\"showSolution.emit()\" (keydown)=\"onAnswerKeyDown($event)\"></quml-ans>\n </div>\n <div class=\"quml-navigation ml-auto\">\n <div class=\"quml-navigation__previous\" tabindex=\"0\" (click)=\"prevSlide()\" (keydown.enter)=\"prevSlide()\"\n aria-label=\"preview slide\"></div>\n <div class=\"quml-navigation__next ml-8\" tabindex=\"0\" (click)=\"nextSlide()\" (keydown.enter)=\"nextSlide()\"\n *ngIf=\"!active\" aria-label=\"next slide\"></div>\n <div class=\"quml-navigation__next quml-navigation__next--active ml-8\" tabindex=\"0\" (click)=\"nextSlide()\"\n (keydown.enter)=\"nextSlide()\" *ngIf=\"active\" aria-label=\"next slide\"></div>\n </div>\n\n</div>\n\n<quml-progress-indicators *ngIf=\"showProgressIndicatorPopUp\" (close)=\"onProgressPopupClose()\"></quml-progress-indicators>", styles: ["::ng-deep :root{--quml-color-primary: #FFD555;--quml-color-primary-contrast:#333;--quml-color-warning: #ff0000;--quml-btn-border: #ccc;--quml-color-gray: #666;--quml-main-bg: #fff;--quml-navigation-btns:#333;--quml-header-metadata: #fff}.quml-header__container,.quml-header__features,.quml-header__metadata{display:flex;align-items:center}.quml-header__container{justify-content:space-between;position:absolute;top:0;background:var(--quml-main-bg);min-height:3.5rem;width:100%;padding:.5rem 1rem .5rem 0;z-index:8}.quml-header__features{justify-content:space-between}.quml-header__features img,.quml-header__metadata img{margin:0 1rem;cursor:pointer}.quml-header__metadata--portrait{display:none}@media only screen and (max-width: 480px){.quml-header__metadata--portrait{display:flex;position:fixed;bottom:0;width:100%;padding:.5rem 1rem;background-color:var(--white);z-index:5;min-height:3rem}.quml-header__metadata--portrait .quml-navigation{display:flex}}.quml-navigation{display:flex;align-items:center}@media only screen and (max-width: 480px){.quml-navigation{display:none}}.quml-navigation__next,.quml-navigation__previous{position:relative;width:3.75rem;height:2.25rem;background:var(--quml-header-metadata);border:.03125rem solid var(--quml-btn-border);border-radius:1rem;box-shadow:inset 0 -.09375rem .0625rem #0003;cursor:pointer}.quml-navigation__next:after,.quml-navigation__previous:after{content:\"\";display:inline-block;padding:.21875rem;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);border:solid var(--quml-navigation-btns);border-width:0 .125rem .125rem 0}.quml-navigation__next:hover,.quml-navigation__next--active,.quml-navigation__next:focus,.quml-navigation__previous:hover,.quml-navigation__previous--active,.quml-navigation__previous:focus{background-color:var(--quml-color-primary)}.quml-navigation__next:after{transform:translate(-50%,-50%) rotate(-45deg);-webkit-transform:translate(-50%,-50%) rotate(-45deg)}.quml-navigation__previous:after{transform:translate(-50%,-50%) rotate(135deg);-webkit-transform:translate(-50%,-50%) rotate(135deg)}.blink{animation:blink 1s steps(1,end) infinite;color:var(--quml-color-warning)}.duration,quml-durationtimer{display:flex;align-items:center}.duration{color:var(--quml-color-primary-contrast);font-weight:700}quml-durationtimer{margin-right:.5rem}.current-slide{color:var(--quml-color-gray);font-weight:700}.navigation-icon-disabled{opacity:.6;cursor:not-allowed}@keyframes blink{0%{opacity:1}50%{opacity:0}to{opacity:1}}\n"] }] }], ctorParameters: function () { return [{ type: i1.ViewerService }]; }, propDecorators: { questions: [{ type: Input }], duration: [{ type: Input }], warningTime: [{ type: Input }], showWarningTimer: [{ type: Input }], disablePreviousNavigation: [{ type: Input }], showTimer: [{ type: Input }], totalNoOfQuestions: [{ type: Input }], currentSlideIndex: [{ type: Input }], active: [{ type: Input }], initializeTimer: [{ type: Input }], endPageReached: [{ type: Input }], loadScoreBoard: [{ type: Input }], replayed: [{ type: Input }], currentSolutions: [{ type: Input }], showFeedBack: [{ type: Input }], disableNext: [{ type: Input }], startPageInstruction: [{ type: Input }], showStartPage: [{ type: Input }], attempts: [{ type: Input }], showDeviceOrientation: [{ type: Input }], showLegend: [{ type: Input }], nextSlideClicked: [{ type: Output }], prevSlideClicked: [{ type: Output }], durationEnds: [{ type: Output }], showSolution: [{ type: Output }], toggleScreenRotate: [{ type: Output }], onKeydownHandler: [{ type: HostListener, args: ['document:keydown.escape', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3F1bWwtbGlicmFyeS9zcmMvbGliL2hlYWRlci9oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcXVtbC1saWJyYXJ5L3NyYy9saWIvaGVhZGVyL2hlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUF1QyxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEksT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7OztBQVFsRSxNQUFNLE9BQU8sZUFBZTtJQXNDMUIsWUFBb0IsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFqQnZDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUd0QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzNDLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDM0MsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3ZDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN2Qyx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBTXZELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUV6QiwrQkFBMEIsR0FBRyxLQUFLLENBQUM7SUFFbkMsQ0FBQztJQUdELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FB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QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBcUg4QyxnQkFBZ0I7c0JBQXBFLFlBQVk7dUJBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWaWV3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdmlld2VyLXNlcnZpY2Uvdmlld2VyLXNlcnZpY2UnO1xuaW1wb3J0IHsgZXZlbnROYW1lLCBUZWxlbWV0cnlUeXBlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LWNvbnN0YW50cyc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncXVtbC1oZWFkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaGVhZGVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSGVhZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgcXVlc3Rpb25zPzogYW55O1xuICBASW5wdXQoKSBkdXJhdGlvbj86IGFueTtcbiAgQElucHV0KCkgd2FybmluZ1RpbWU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dXYXJuaW5nVGltZXI/OiBib29sZWFuO1xuICBASW5wdXQoKSBkaXNhYmxlUHJldmlvdXNOYXZpZ2F0aW9uOiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93VGltZXI6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHRvdGFsTm9PZlF1ZXN0aW9uczogbnVtYmVyO1xuICBASW5wdXQoKSBjdXJyZW50U2xpZGVJbmRleDogbnVtYmVyO1xuICBASW5wdXQoKSBhY3RpdmU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGluaXRpYWxpemVUaW1lcjogYm9vbGVhbjtcbiAgQElucHV0KCkgZW5kUGFnZVJlYWNoZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGxvYWRTY29yZUJvYXJkOiBib29sZWFuO1xuICBASW5wdXQoKSByZXBsYXllZDogYm9vbGVhbjtcbiAgQElucHV0KCkgY3VycmVudFNvbHV0aW9uczogYW55O1xuICBASW5wdXQoKSBzaG93RmVlZEJhY2s6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRpc2FibGVOZXh0PzogYm9vbGVhbjtcbiAgQElucHV0KCkgc3RhcnRQYWdlSW5zdHJ1Y3Rpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dTdGFydFBhZ2U/OiBib29sZWFuO1xuICBASW5wdXQoKSBhdHRlbXB0cz86IHsgbWF4OiBudW1iZXIsIGN1cnJlbnQ6IG51bWJlciB9O1xuICBASW5wdXQoKSBzaG93RGV2aWNlT3JpZW50YXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0xlZ2VuZDogYm9vbGVhbjtcblxuICBAT3V0cHV0KCkgbmV4dFNsaWRlQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcHJldlNsaWRlQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgZHVyYXRpb25FbmRzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzaG93U29sdXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHRvZ2dsZVNjcmVlblJvdGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG5cbiAgbWludXRlczogbnVtYmVyO1xuICBzZWNvbmRzOiBzdHJpbmcgfCBudW1iZXI7XG4gIHByaXZhdGUgaW50ZXJ2YWxSZWY/O1xuICBzaG93V2FybmluZyA9IGZhbHNlO1xuICBpc01vYmlsZVBvcnRyYWl0ID0gZmFsc2U7XG4gIHRpbWU6IGFueTtcbiAgc2hvd1Byb2dyZXNzSW5kaWNhdG9yUG9wVXAgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2aWV3ZXJTZXJ2aWNlOiBWaWV3ZXJTZXJ2aWNlKSB7XG4gIH1cblxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLmR1cmF0aW9uICYmIHRoaXMuc2hvd1RpbWVyKSB7XG4gICAgICB0aGlzLm1pbnV0ZXMgPSBNYXRoLmZsb29yKHRoaXMuZHVyYXRpb24gLyA2MCk7XG4gICAgICB0aGlzLnNlY29uZHMgPSB0aGlzLmR1cmF0aW9uIC0gdGhpcy5taW51dGVzICogNjAgPCAxMCA/IGAwJHt0aGlzLmR1cmF0aW9uIC0gdGhpcy5taW51dGVzICogNjB9YCA6IHRoaXMuZHVyYXRpb24gLSB0aGlzLm1pbnV0ZXMgKiA2MDtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAodGhpcy5kdXJhdGlvbiAmJiB0aGlzLnNob3dUaW1lciAmJiB0aGlzLmluaXRpYWxpemVUaW1lciAmJiAhdGhpcy5pbnRlcnZhbFJlZikge1xuICAgICAgdGhpcy50aW1lcigpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kdXJhdGlvbiA9PT0gMCAmJiB0aGlzLnNob3dUaW1lciAmJiB0aGlzLmluaXRpYWxpemVUaW1lciAmJiAhdGhpcy5pbnRlcnZhbFJlZikge1xuICAgICAgdGhpcy5zaG93Q291bnRVcCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXBsYXllZCAmJiB0aGlzLmR1cmF0aW9uICYmIHRoaXMuc2hvd1RpbWVyKSB7XG4gICAgICB0aGlzLnNob3dXYXJuaW5nID0gZmFsc2U7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxSZWYpXG4gICAgICB0aGlzLnRpbWVyKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJlcGxheWVkICYmIHRoaXMuZHVyYXRpb24gPT09IDAgJiYgdGhpcy5zaG93VGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbFJlZilcbiAgICAgIHRoaXMuc2hvd0NvdW50VXAoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5pc01vYmlsZVBvcnRyYWl0ID0gd2luZG93Lm1hdGNoTWVkaWEoXCIobWF4LXdpZHRoOiA0ODBweClcIikubWF0Y2hlcztcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmludGVydmFsUmVmKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxSZWYpO1xuICAgIH1cbiAgfVxuXG4gIG5leHRTbGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZU5leHQpIHtcbiAgICAgIHRoaXMubmV4dFNsaWRlQ2xpY2tlZC5lbWl0KHsgdHlwZTogJ25leHQnIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByZXZTbGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuc2hvd1N0YXJ0UGFnZSAmJiB0aGlzLmN1cnJlbnRTbGlkZUluZGV4ID09PSAxKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCF0aGlzLmRpc2FibGVQcmV2aW91c05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMucHJldlNsaWRlQ2xpY2tlZC5lbWl0KHsgZXZlbnQ6ICdwcmV2aW91cyBjbGlja2VkJyB9KTtcbiAgICB9XG4gIH1cblxuICB0aW1lcigpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmR1cmF0aW9uID4gMCkge1xuICAgICAgbGV0IGR1cmF0aW9uSW5TZWMgPSB0aGlzLmR1cmF0aW9uO1xuICAgICAgdGhpcy5pbnRlcnZhbFJlZiA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgbGV0IG1pbiA9IH5+KGR1cmF0aW9uSW5TZWMgLyA2MCk7XG4gICAgICAgIGxldCBzZWMgPSAoZHVyYXRpb25JblNlYyAlIDYwKTtcbiAgICAgICAgaWYgKHNlYyA8IDEwKSB7XG4gICAgICAgICAgdGhpcy50aW1lID0gbWluICsgJzonICsgJzAnICsgc2VjO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudGltZSA9IG1pbiArICc6JyArIHNlYztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHVyYXRpb25JblNlYyA9PT0gMCkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbFJlZik7XG4gICAgICAgICAgdGhpcy5kdXJhdGlvbkVuZHMuZW1pdCh0cnVlKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKHBhcnNlSW50KGR1cmF0aW9uSW5TZWMpIDw9IHBhcnNlSW50KHRoaXMud2FybmluZ1RpbWUpICYmIHRoaXMuc2hvd1dhcm5pbmdUaW1lcikge1xuICAgICAgICAgIHRoaXMuc2hvd1dhcm5pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGR1cmF0aW9uSW5TZWMtLTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH1cbiAgfVxuXG4gIHNob3dDb3VudFVwKCkge1xuICAgIGxldCBtaW4gPSAwO1xuICAgIGxldCBzZWMgPSAwO1xuICAgIHRoaXMuaW50ZXJ2YWxSZWYgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAoc2VjID09PSA1OSkge1xuICAgICAgICBzZWMgPSAwO1xuICAgICAgICBtaW4gPSBtaW4gKyAxO1xuICAgICAgfVxuICAgICAgaWYgKHNlYyA8IDEwKSB7XG4gICAgICAgIHRoaXMudGltZSA9IG1pbiArICc6JyArICcwJyArIHNlYysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50aW1lID0gbWluICsgJzonICsgc2VjKys7XG4gICAgICB9XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBvbkFuc3dlcktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5zaG93U29sdXRpb24uZW1pdCgpXG4gICAgfVxuICB9XG5cbiAgb3BlblByb2dyZXNzSW5kaWNhdG9yUG9wdXAoKSB7XG4gICAgdGhpcy5zaG93UHJvZ3Jlc3NJbmRpY2F0b3JQb3BVcCA9IHRydWU7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZXZlbnROYW1lLnByb2dyZXNzSW5kaWNhdG9yUG9wdXBPcGVuZWQsIFRlbGVtZXRyeVR5cGUuaW50ZXJhY3QsIHRoaXMuY3VycmVudFNsaWRlSW5kZXgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnLCBbJyRldmVudCddKSBvbktleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgdGhpcy5vblByb2dyZXNzUG9wdXBDbG9zZSgpO1xuICB9XG5cbiAgb25Qcm9ncmVzc1BvcHVwQ2xvc2UoKSB7XG4gICAgdGhpcy5zaG93UHJvZ3Jlc3NJbmRpY2F0b3JQb3BVcCA9IGZhbHNlO1xuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50TmFtZS5wcm9ncmVzc0luZGljYXRvclBvcHVwQ2xvc2VkLCBUZWxlbWV0cnlUeXBlLmludGVyYWN0LCB0aGlzLmN1cnJlbnRTbGlkZUluZGV4KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInF1bWwtaGVhZGVyX19jb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cInF1bWwtaGVhZGVyX19mZWF0dXJlcyBwbC02NFwiPlxuICAgIDxkaXYgKm5nSWY9XCJhdHRlbXB0cz8ubWF4ICYmIGF0dGVtcHRzPy5jdXJyZW50XCIgY2xhc3M9XCJhdHRlbXB0cyBzYi1jb2xvci1wcmltYXJ5IGZub3JtYWwgZm9udC13ZWlnaHQtYm9sZFwiPlxuICAgICAgQXR0ZW1wdCBubyB7e2F0dGVtcHRzLmN1cnJlbnR9fS97e2F0dGVtcHRzLm1heH19PC9kaXY+XG4gICAgPGltZyBzcmM9XCJhc3NldHMvcXVlc3Rpb24tbWFyay1yb3VuZC5zdmdcIiAqbmdJZj1cInNob3dMZWdlbmRcIiBhbHQ9XCJQcm9ncmVzcyBJbmRpY2F0b3JzXCIgdGl0bGU9XCJQcm9ncmVzcyBJbmRpY2F0b3JzXCIgaGVpZ2h0PVwiMjBcIiB3aWR0aD1cIjIwXCIgKGNsaWNrKT1cIm9wZW5Qcm9ncmVzc0luZGljYXRvclBvcHVwKClcIj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInF1bWwtaGVhZGVyX19tZXRhZGF0YVwiPlxuICAgIDxpbWcgc3JjPVwiYXNzZXRzL2RldmljZS1yb3RhdGUuc3ZnXCIgYWx0PVwiQ2hhbmdlIE9yaWVudGF0aW9uXCIgdGl0bGU9XCJDaGFuZ2UgT3JpZW50YXRpb25cIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjBcIiAqbmdJZj1cInNob3dEZXZpY2VPcmllbnRhdGlvblwiIChjbGljayk9XCJ0b2dnbGVTY3JlZW5Sb3RhdGUuZW1pdCgpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImR1cmF0aW9uICYmIHNob3dUaW1lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImR1cmF0aW9uIG1yLTE2XCIgdGl0bGU9XCJ7e21pbnV0ZXN9fTp7e3NlY29uZHN9fVwiICpuZ0lmPVwiIWluaXRpYWxpemVUaW1lclwiPlxuICAgICAgICA8cXVtbC1kdXJhdGlvbnRpbWVyPjwvcXVtbC1kdXJhdGlvbnRpbWVyPlxuICAgICAgICA8c3Bhbj57e21pbnV0ZXN9fTp7e3NlY29uZHN9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImR1cmF0aW9uIG1yLTE2XCIgdGl0bGU9XCJ7e21pbnV0ZXN9fTp7e3NlY29uZHN9fVwiICpuZ0lmPVwiaW5pdGlhbGl6ZVRpbWVyICYmIHRpbWVcIj5cbiAgICAgICAgPHF1bWwtZHVyYXRpb250aW1lcj48L3F1bWwtZHVyYXRpb250aW1lcj5cbiAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieydibGluayc6IHNob3dXYXJuaW5nfVwiPnt7dGltZX19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkdXJhdGlvbiAmJiBzaG93VGltZXIgJiYgaW5pdGlhbGl6ZVRpbWVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHVyYXRpb24gbXItMTZcIiB0aXRsZT1cInt7bWludXRlc319Ont7c2Vjb25kc319XCI+XG4gICAgICAgIDxxdW1sLWR1cmF0aW9udGltZXI+PC9xdW1sLWR1cmF0aW9udGltZXI+XG4gICAgICAgIDxzcGFuPnt7dGltZX19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwicXVtbC1uYXZpZ2F0aW9uXCIgKm5nSWY9XCIhZGlzYWJsZU5leHQgJiYgIWlzTW9iaWxlUG9ydHJhaXRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJxdW1sLW5hdmlnYXRpb25fX3ByZXZpb3VzXCIgKGNsaWNrKT1cInByZXZTbGlkZSgpXCIgYXJpYS1sYWJlbD1cInByZXZpZXcgc2xpZGVcIiB0aXRsZT1cInByZXZpZXcgc2xpZGVcIlxuICAgICAgICByb2xlPVwibmF2aWdhdGlvblwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIihzdGFydFBhZ2VJbnN0cnVjdGlvbiAmJiBjdXJyZW50U2xpZGVJbmRleCA9PT0gMCkgfHwgKCFzaG93U3RhcnRQYWdlICYmIGN1cnJlbnRTbGlkZUluZGV4ID09PSAxKSA/ICduYXZpZ2F0aW9uLWljb24tZGlzYWJsZWQnOiAnJyBcIlxuICAgICAgICBbYXR0ci50YWJpbmRleF09XCIoc3RhcnRQYWdlSW5zdHJ1Y3Rpb24gJiYgY3VycmVudFNsaWRlSW5kZXggPT09IDApIHx8ICghc2hvd1N0YXJ0UGFnZSAmJiBjdXJyZW50U2xpZGVJbmRleCA9PT0gMSkgPyAtMSA6IDBcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1bWwtbmF2aWdhdGlvbl9fbmV4dCBtbC04XCIgKGNsaWNrKT1cIm5leHRTbGlkZSgpXCIgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO25leHRTbGlkZSgpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIm5leHQgc2xpZGVcIiB0aXRsZT1cIm5leHQgc2xpZGVcIiAqbmdJZj1cIiFhY3RpdmVcIiByb2xlPVwibmF2aWdhdGlvblwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImRpc2FibGVOZXh0ID8gJ25hdmlnYXRpb24taWNvbi1kaXNhYmxlZCc6ICcnIFwiIHRhYmluZGV4PVwiMFwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1bWwtbmF2aWdhdGlvbl9fbmV4dCBxdW1sLW5hdmlnYXRpb25fX25leHQtLWFjdGl2ZSBtbC04XCIgKGNsaWNrKT1cIm5leHRTbGlkZSgpXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO25leHRTbGlkZSgpXCIgYXJpYS1sYWJlbD1cIm5leHQgc2xpZGVcIiB0aXRsZT1cIm5leHQgc2xpZGVcIiAqbmdJZj1cImFjdGl2ZVwiIHJvbGU9XCJuYXZpZ2F0aW9uXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiZGlzYWJsZU5leHQgPyAnbmF2aWdhdGlvbi1pY29uLWRpc2FibGVkJzogJycgXCIgdGFiaW5kZXg9XCIwXCI+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cInF1bWwtaGVhZGVyX19tZXRhZGF0YSBxdW1sLWhlYWRlcl9fbWV0YWRhdGEtLXBvcnRyYWl0XCIgKm5nSWY9XCIhbG9hZFNjb3JlQm9hcmQgJiYgIWVuZFBhZ2VSZWFjaGVkXCI+XG4gIDxkaXYgY2xhc3M9XCJjdXJyZW50LXNsaWRlIGZub3JtYWxcIiAqbmdJZj1cImN1cnJlbnRTbGlkZUluZGV4XCI+e3tjdXJyZW50U2xpZGVJbmRleH19L3t7dG90YWxOb09mUXVlc3Rpb25zfX08L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1sLTE2XCIgKm5nSWY9XCJjdXJyZW50U29sdXRpb25zICYmIHNob3dGZWVkQmFja1wiPlxuICAgIDxxdW1sLWFucyAoY2xpY2spPVwic2hvd1NvbHV0aW9uLmVtaXQoKVwiIChrZXlkb3duKT1cIm9uQW5zd2VyS2V5RG93bigkZXZlbnQpXCI+PC9xdW1sLWFucz5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJxdW1sLW5hdmlnYXRpb24gbWwtYXV0b1wiPlxuICAgIDxkaXYgY2xhc3M9XCJxdW1sLW5hdmlnYXRpb25fX3ByZXZpb3VzXCIgdGFiaW5kZXg9XCIwXCIgKGNsaWNrKT1cInByZXZTbGlkZSgpXCIgKGtleWRvd24uZW50ZXIpPVwicHJldlNsaWRlKClcIlxuICAgICAgYXJpYS1sYWJlbD1cInByZXZpZXcgc2xpZGVcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicXVtbC1uYXZpZ2F0aW9uX19uZXh0IG1sLThcIiB0YWJpbmRleD1cIjBcIiAoY2xpY2spPVwibmV4dFNsaWRlKClcIiAoa2V5ZG93bi5lbnRlcik9XCJuZXh0U2xpZGUoKVwiXG4gICAgICAqbmdJZj1cIiFhY3RpdmVcIiBhcmlhLWxhYmVsPVwibmV4dCBzbGlkZVwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJxdW1sLW5hdmlnYXRpb25fX25leHQgcXVtbC1uYXZpZ2F0aW9uX19uZXh0LS1hY3RpdmUgbWwtOFwiIHRhYmluZGV4PVwiMFwiIChjbGljayk9XCJuZXh0U2xpZGUoKVwiXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJuZXh0U2xpZGUoKVwiICpuZ0lmPVwiYWN0aXZlXCIgYXJpYS1sYWJlbD1cIm5leHQgc2xpZGVcIj48L2Rpdj5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuXG48cXVtbC1wcm9ncmVzcy1pbmRpY2F0b3JzICpuZ0lmPVwic2hvd1Byb2dyZXNzSW5kaWNhdG9yUG9wVXBcIiAoY2xvc2UpPVwib25Qcm9ncmVzc1BvcHVwQ2xvc2UoKVwiPjwvcXVtbC1wcm9ncmVzcy1pbmRpY2F0b3JzPiJdfQ==