sunbird-epub-player-v1
Version:
Contains Epub player library components powered by angular. These components are designed to be used in sunbird consumption platforms *(mobile app, web portal, offline desktop app)* to drive reusability, maintainability hence reducing the redundant develo
255 lines • 40.1 kB
JavaScript
import { __awaiter } from "tslib";
import { EventEmitter, Component, Output, Input, HostListener, ElementRef, ViewChild, Renderer2 } from '@angular/core';
import { ViwerService } from './services/viewerService/viwer-service';
import { EpubPlayerService } from './sunbird-epub-player.service';
import { epubPlayerConstants, pageId, telemetryType } from './sunbird-epub.constant';
import { ErrorService, errorCode, errorMessage } from '@project-sunbird/sunbird-player-sdk-v9';
import { UtilService } from './services/utilService/util.service';
export class EpubPlayerComponent {
constructor(viwerService, epubPlayerService, errorService, utilService, renderer2) {
this.viwerService = viwerService;
this.epubPlayerService = epubPlayerService;
this.errorService = errorService;
this.utilService = utilService;
this.renderer2 = renderer2;
this.fromConst = epubPlayerConstants;
this.showFullScreen = false;
this.headerActionsEvent = new EventEmitter();
this.telemetryEvent = new EventEmitter();
this.showControls = true;
this.validPage = true;
this.sideMenuConfig = {
showShare: false,
showDownload: false,
showReplay: false,
showExit: false,
showPrint: false
};
this.isInitialized = false;
this.viewState = this.fromConst.LOADING;
this.progress = 0;
this.currentPageIndex = 1;
this.headerConfiguration = {
rotation: false,
goto: true,
navigation: true,
zoom: false
};
this.playerEvent = this.viwerService.playerEvent;
}
onTelemetryEvent(event) {
this.telemetryEvent.emit(event.detail);
}
ngOnInit() {
var _a, _b, _c, _d;
return __awaiter(this, void 0, void 0, function* () {
this.isInitialized = true;
if (this.playerConfig) {
if (typeof this.playerConfig === 'string') {
try {
this.playerConfig = JSON.parse(this.playerConfig);
}
catch (error) {
console.error('Invalid playerConfig: ', error);
}
}
}
// initializing services
this.viwerService.initialize(this.playerConfig);
this.epubPlayerService.initialize(this.playerConfig);
this.traceId = (_b = (_a = this.playerConfig) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.traceId;
// checks online error while loading epub
if (!navigator.onLine && !this.viwerService.isAvailableLocally) {
// tslint:disable-next-line:max-line-length
this.viwerService.raiseExceptionLog(errorCode.internetConnectivity, this.currentPageIndex, errorMessage.internetConnectivity, this.traceId, new Error(errorMessage.internetConnectivity));
}
// checks content compatibility error
const contentCompabilityLevel = (_d = (_c = this.playerConfig) === null || _c === void 0 ? void 0 : _c.metadata) === null || _d === void 0 ? void 0 : _d.compatibilityLevel;
if (contentCompabilityLevel) {
const checkContentCompatible = this.errorService.checkContentCompatibility(contentCompabilityLevel);
if (!(checkContentCompatible === null || checkContentCompatible === void 0 ? void 0 : checkContentCompatible.isCompitable)) {
// tslint:disable-next-line:max-line-length
this.viwerService.raiseExceptionLog(errorCode.contentCompatibility, this.currentPageIndex, errorCode.contentCompatibility, this.traceId, checkContentCompatible.error);
}
}
this.showEpubViewer = true;
this.sideMenuConfig = Object.assign(Object.assign({}, this.sideMenuConfig), this.playerConfig.config.sideMenu);
this.getEpubLoadingProgress();
console.log('preview1', this.playerConfig);
this.nextContent = this.playerConfig.config.nextContent;
});
}
ngOnChanges(changes) {
var _a;
if (changes.showFullScreen && !((_a = changes === null || changes === void 0 ? void 0 : changes.showFullScreen) === null || _a === void 0 ? void 0 : _a.firstChange)) {
this.showFullScreen = changes.showFullScreen.currentValue;
}
if (changes.playerConfig.firstChange && this.isInitialized) {
// Calling for web component explicitly and life cycle works in different order
this.ngOnInit();
}
}
ngAfterViewInit() {
const epubPlayerElement = this.epubPlayerRef.nativeElement;
this.unlistenMouseEnter = this.renderer2.listen(epubPlayerElement, 'mouseenter', () => {
this.showControls = true;
});
this.unlistenMouseLeave = this.renderer2.listen(epubPlayerElement, 'mouseleave', () => {
this.showControls = false;
});
}
headerActions(eventdata) {
this.headerActionsEvent.emit(eventdata);
}
viewerEvent(event) {
if (event.type === this.fromConst.EPUBLOADED) {
this.onEpubLoaded(event);
}
if (event.type === this.fromConst.PAGECHANGE) {
this.onPageChange(event);
}
if (event.type === this.fromConst.END) {
this.onEpubEnded(event);
}
if (event.type === this.fromConst.ERROR) {
this.onEpubLoadFailed(event);
}
if (event.type === this.fromConst.NAVIGATE_TO_PAGE) {
this.onJumpToPage(event);
}
if (event.type === this.fromConst.INVALID_PAGE_ERROR) {
this.validPage = event.data;
this.resetValidPage();
}
}
resetValidPage() {
setTimeout(() => {
this.validPage = true;
}, 5000);
}
onEpubLoaded(event) {
var _a, _b, _c;
clearInterval(this.intervalRef);
this.viewState = this.fromConst.START;
this.viwerService.raiseStartEvent(event.data);
if (((_b = (_a = this.playerConfig.config) === null || _a === void 0 ? void 0 : _a.pagesVisited) === null || _b === void 0 ? void 0 : _b.length) && ((_c = this.playerConfig.config) === null || _c === void 0 ? void 0 : _c.currentLocation)) {
this.currentPageIndex = this.playerConfig.config.pagesVisited[this.playerConfig.config.pagesVisited.length - 1];
}
this.viwerService.metaData.pagesVisited.push(this.currentPageIndex);
}
onPageChange(event) {
var _a;
if ((_a = event === null || event === void 0 ? void 0 : event.data) === null || _a === void 0 ? void 0 : _a.index) {
this.currentPageIndex = event.data.index;
}
this.currentPageIndex = this.utilService.getCurrentIndex(event, this.currentPageIndex);
this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT);
this.viwerService.raiseHeartBeatEvent(event, telemetryType.IMPRESSION);
this.viwerService.metaData.pagesVisited.push(this.currentPageIndex);
}
onJumpToPage(type) {
var _a;
this.currentPageIndex = (_a = type === null || type === void 0 ? void 0 : type.event) === null || _a === void 0 ? void 0 : _a.data;
this.viwerService.raiseHeartBeatEvent(type, telemetryType.INTERACT);
this.viwerService.raiseHeartBeatEvent(type, telemetryType.IMPRESSION);
this.viwerService.metaData.pagesVisited.push(this.currentPageIndex);
}
onEpubEnded(event) {
this.viewState = this.fromConst.END;
this.showEpubViewer = false;
event.data.index = this.currentPageIndex;
this.viwerService.raiseEndEvent(event);
}
onEpubLoadFailed(error) {
this.showContentError = true;
this.viewState = this.fromConst.LOADING;
// tslint:disable-next-line:max-line-length
this.viwerService.raiseExceptionLog(error.errorCode, this.currentPageIndex, error.errorMessage, this.traceId, new Error(error.errorMessage));
}
replayContent(event) {
this.currentPageIndex = 1;
this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT);
this.viewState = this.fromConst.START;
this.viwerService.metaData.pagesVisited.push(this.currentPageIndex);
this.ngOnInit();
}
exitContent(event) {
this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT);
}
sideBarEvents(event) {
this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT);
if (event.type === 'DOWNLOAD') {
this.downloadEpub();
}
}
sidebarMenuEvent(event) {
this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT);
}
getEpubLoadingProgress() {
this.intervalRef = setInterval(() => {
if (this.progress < 95) {
this.progress = this.progress + 5;
}
}, 10);
}
downloadEpub() {
const a = document.createElement('a');
a.href = this.viwerService.artifactUrl;
a.download = this.viwerService.contentName;
a.target = '_blank';
document.body.appendChild(a);
a.click();
a.remove();
this.viwerService.raiseHeartBeatEvent('DOWNLOAD');
}
ngOnDestroy() {
const EndEvent = {
type: this.fromConst.END,
data: {
index: this.currentPageIndex
}
};
this.viwerService.raiseEndEvent(EndEvent);
this.viwerService.isEndEventRaised = false;
this.unlistenMouseEnter();
this.unlistenMouseLeave();
}
playNextContent(event) {
this.viwerService.raiseHeartBeatEventNew(event === null || event === void 0 ? void 0 : event.type, telemetryType.INTERACT, pageId.endPage, event === null || event === void 0 ? void 0 : event.identifier);
}
}
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
EpubPlayerComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'sunbird-epub-player',
template: "<div class=\"sunbird-epub-container\" #epubPlayer>\r\n<div *ngIf=\"viewState === fromConst.LOADING\">\r\n <sb-player-start-page [title]=\"viwerService.contentName\" [progress]=\"progress\"></sb-player-start-page>\r\n</div>\r\n<div class=\"epub-container\" *ngIf=\"showEpubViewer\">\r\n <ng-container *ngIf=\"viewState === fromConst.START\">\r\n <sb-player-header class=\"notVisible\" [totalPages]=\"viwerService?.totalNumberOfPages\" [pageNumber]=\"currentPageIndex\" [config]=\"headerConfiguration\" (actions)=\"headerActions($event)\" [ngClass]=\"{'isVisible': showControls}\"></sb-player-header>\r\n <sb-player-side-menu-icon class=\"notVisible\" [ngClass]=\"{'isVisible': showControls}\" (sidebarMenuEvent)=\"sidebarMenuEvent($event)\">\r\n </sb-player-side-menu-icon>\r\n <sb-player-sidebar [title]=\"viwerService.contentName\" (sidebarEvent)=\"sideBarEvents($event)\"\r\n [config]=\"sideMenuConfig\"></sb-player-sidebar>\r\n <div class=\"sb-epub-reading-status\" *ngIf=\"currentPageIndex && viwerService?.totalNumberOfPages\">\r\n Page {{currentPageIndex}} of {{viwerService?.totalNumberOfPages}} <span></span> {{((currentPageIndex/viwerService?.totalNumberOfPages) * 100).toFixed(0)}}%\r\n </div>\r\n \r\n </ng-container>\r\n <epub-viewer [actions]=\"headerActionsEvent\" [epubSrc]=\"viwerService.src\" [identifier]=\"viwerService.identifier\"\r\n (viewerEvent)=\"viewerEvent($event)\" [config]=\"playerConfig.config\" [showFullScreen]=\"showFullScreen\">\r\n </epub-viewer>\r\n</div>\r\n<sb-player-end-page *ngIf=\"viewState === fromConst.END\" [contentName]=\"viwerService.contentName\"\r\n [outcomeLabel]=\"'Pages read: '\" [outcome]=\"(currentPageIndex -1)\" [showExit]=\"sideMenuConfig.showExit\" [userName]=\"viwerService.userName\"\r\n [timeSpentLabel]=\"viwerService.timeSpent\" (replayContent)=\"replayContent($event)\" (exitContent)=\"exitContent($event)\" [nextContent]=\"nextContent\" (playNextContent)=\"playNextContent($event)\">\r\n</sb-player-end-page>\r\n<sb-player-contenterror *ngIf=\"showContentError\"></sb-player-contenterror>\r\n</div>\r\n<div class=\"pagenotfound__tooltip\" *ngIf=\"!validPage\">\r\n <div class=\"pagenotfound__icon\"></div>\r\n <div class=\"pagenotfound__text\">Page Not Found</div>\r\n</div>\r\n",
styles: [".sunbird-epub-container{height:100%;width:100%;background-color:#fff}.sunbird-epub-palyer-container{width:100%;height:100%;overflow:hidden;position:relative}.sb-epub-reading-status{color:var(--gray-800);font-size:.75rem;position:absolute;left:1rem;bottom:.75rem;display:flex;align-items:center;background:var(--white);border-radius:.5rem;padding:.25em .5rem;z-index:5;line-height:normal}.sb-epub-reading-status span{background:var(--gray-800);width:4px;height:4px;display:block;margin:0 .5em;border-radius:50%}.notVisible,.BtmNotVisible{transition:all .3s ease-in-out;position:absolute;width:100%}.notVisible{top:-10rem}.notVisible.isVisible{top:0rem}.BtmNotVisible{bottom:-10rem}.BtmNotVisible.isVisible{bottom:0rem}:host::ng-deep .sb-player-splash-container{height:100vh!important}:host::ng-deep epub-viewer{position:absolute;top:48px;width:100%;height:calc(100% - 48px);overflow-y:auto;overflow-x:hidden;left:0;background-color:#fff}:host::ng-deep .epub-container{height:100%;position:relative;overflow-x:hidden!important}.pagenotfound__tooltip{position:absolute;top:10%;left:50%;transform:translate(-50%);background:#333;z-index:11111;padding:calculateRem(8px) calculateRem(20px);font-size:calculateRem(14px);color:#fff;border-radius:calculateRem(4px);display:flex;align-items:center}.pagenotfound__icon{width:calculateRem(22px);height:calculateRem(22px);margin-right:calculateRem(12px);background:white;border-radius:50%;position:relative}.pagenotfound__icon:after{content:\"!\";position:absolute;top:50%;left:50%;color:#333;font-size:18px;transform:translate(-50%,-50%)}\n"]
},] }
];
/**
* @type {function(): !Array<(null|{
* type: ?,
* decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>),
* })>}
* @nocollapse
*/
EpubPlayerComponent.ctorParameters = () => [
{ type: ViwerService },
{ type: EpubPlayerService },
{ type: ErrorService },
{ type: UtilService },
{ type: Renderer2 }
];
/** @type {!Object<string, !Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
EpubPlayerComponent.propDecorators = {
epubPlayerRef: [{ type: ViewChild, args: ['epubPlayer', { static: true },] }],
playerConfig: [{ type: Input }],
showFullScreen: [{ type: Input }],
headerActionsEvent: [{ type: Output }],
telemetryEvent: [{ type: Output }],
playerEvent: [{ type: Output }],
onTelemetryEvent: [{ type: HostListener, args: ['document:TelemetryEvent', ['$event'],] }],
ngOnDestroy: [{ type: HostListener, args: ['window:beforeunload',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdW5iaXJkLWVwdWItcGxheWVyL3NyYy9saWIvc3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsWUFBWSxFQUNqRCxVQUFVLEVBQUUsU0FBUyxFQUFpQixTQUFTLEVBQzNELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQVVsRSxNQUFNLE9BQU8sbUJBQW1CO0lBbUM5QixZQUNTLFlBQTBCLEVBQ3pCLGlCQUFvQyxFQUNyQyxZQUEwQixFQUMxQixXQUF3QixFQUN2QixTQUFvQjtRQUpyQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUN6QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3JDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3ZCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUF2QzlCLGNBQVMsR0FBRyxtQkFBbUIsQ0FBQztRQUd2QixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN0Qix1QkFBa0IsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNoRSxtQkFBYyxH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QkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBSztRQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxVQUFVLENBQUMsQ0FBQztJQUNuSCxDQUFDOzs7O1lBeFBGLFNBQVMsU0FBQztnQkFDVCw4Q0FBOEM7Z0JBQzlDLFFBQVEsRUFBRSxxQkFBcUI7Z0JBQy9CLDJ6RUFBbUQ7O2FBRXBEOzs7Ozs7Ozs7O1lBZFEsWUFBWTtZQUVaLGlCQUFpQjtZQUVqQixZQUFZO1lBQ1osV0FBVztZQVArQixTQUFTOzs7OzRCQW1CekQsU0FBUyxTQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7MkJBQ3hDLEtBQUs7NkJBQ0wsS0FBSztpQ0FDTCxNQUFNOzZCQUNOLE1BQU07MEJBQ04sTUFBTTsrQkFzQ04sWUFBWSxTQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDOzBCQXFMbEQsWUFBWSxTQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRXZlbnRFbWl0dGVyLCBDb21wb25lbnQsIE91dHB1dCwgSW5wdXQsIE9uSW5pdCwgSG9zdExpc3RlbmVyLFxyXG4gIE9uRGVzdHJveSwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBBZnRlclZpZXdJbml0LCBSZW5kZXJlcjIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlc1xyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBWaXdlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3ZpZXdlclNlcnZpY2Uvdml3ZXItc2VydmljZSc7XHJcbmltcG9ydCB7IFBsYXllckNvbmZpZyB9IGZyb20gJy4vc3VuYmlyZC1lcHViLXBsYXllci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBFcHViUGxheWVyU2VydmljZSB9IGZyb20gJy4vc3VuYmlyZC1lcHViLXBsYXllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZXB1YlBsYXllckNvbnN0YW50cywgcGFnZUlkLCB0ZWxlbWV0cnlUeXBlIH0gZnJvbSAnLi9zdW5iaXJkLWVwdWIuY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBFcnJvclNlcnZpY2UsIGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHByb2plY3Qtc3VuYmlyZC9zdW5iaXJkLXBsYXllci1zZGstdjknO1xyXG5pbXBvcnQgeyBVdGlsU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdXRpbFNlcnZpY2UvdXRpbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmV4dENvbnRlbnQgfSBmcm9tICdAcHJvamVjdC1zdW5iaXJkL3N1bmJpcmQtcGxheWVyLXNkay12OS9zdW5iaXJkLXBsYXllci1zZGsuaW50ZXJmYWNlJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICdzdW5iaXJkLWVwdWItcGxheWVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFcHViUGxheWVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgZnJvbUNvbnN0ID0gZXB1YlBsYXllckNvbnN0YW50cztcclxuICBAVmlld0NoaWxkKCdlcHViUGxheWVyJywgeyBzdGF0aWM6IHRydWUgfSkgZXB1YlBsYXllclJlZjogRWxlbWVudFJlZjtcclxuICBASW5wdXQoKSBwbGF5ZXJDb25maWc6IFBsYXllckNvbmZpZztcclxuICBASW5wdXQoKSBzaG93RnVsbFNjcmVlbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBoZWFkZXJBY3Rpb25zRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHRlbGVtZXRyeUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBwbGF5ZXJFdmVudDogRXZlbnRFbWl0dGVyPG9iamVjdD47XHJcbiAgcHJpdmF0ZSB1bmxpc3Rlbk1vdXNlRW50ZXI6ICgpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSB1bmxpc3Rlbk1vdXNlTGVhdmU6ICgpID0+IHZvaWQ7XHJcbiAgcHVibGljIHNob3dDb250cm9scyA9IHRydWU7XHJcbiAgcHVibGljIHZhbGlkUGFnZSA9IHRydWU7XHJcbiAgc2hvd0NvbnRlbnRFcnJvcjogYm9vbGVhbjtcclxuICBzaWRlTWVudUNvbmZpZyA9IHtcclxuICAgIHNob3dTaGFyZTogZmFsc2UsXHJcbiAgICBzaG93RG93bmxvYWQ6IGZhbHNlLFxyXG4gICAgc2hvd1JlcGxheTogZmFsc2UsXHJcbiAgICBzaG93RXhpdDogZmFsc2UsXHJcbiAgICBzaG93UHJpbnQ6IGZhbHNlXHJcbiAgfTtcclxuICBwdWJsaWMgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHZpZXdTdGF0ZSA9IHRoaXMuZnJvbUNvbnN0LkxPQURJTkc7XHJcbiAgaW50ZXJ2YWxSZWY6IGFueTtcclxuICBwcm9ncmVzcyA9IDA7XHJcbiAgc2hvd0VwdWJWaWV3ZXI6IGJvb2xlYW47XHJcbiAgcHVibGljIHRyYWNlSWQ6IHN0cmluZztcclxuICBjdXJyZW50UGFnZUluZGV4ID0gMTtcclxuICBoZWFkZXJDb25maWd1cmF0aW9uID0ge1xyXG4gICAgcm90YXRpb246IGZhbHNlLFxyXG4gICAgZ290bzogdHJ1ZSxcclxuICAgIG5hdmlnYXRpb246IHRydWUsXHJcbiAgICB6b29tOiBmYWxzZVxyXG4gIH07XHJcblxyXG4gIG5leHRDb250ZW50OiBOZXh0Q29udGVudDtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyB2aXdlclNlcnZpY2U6IFZpd2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgZXB1YlBsYXllclNlcnZpY2U6IEVwdWJQbGF5ZXJTZXJ2aWNlLFxyXG4gICAgcHVibGljIGVycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlLFxyXG4gICAgcHVibGljIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjJcclxuICApIHtcclxuICAgIHRoaXMucGxheWVyRXZlbnQgPSB0aGlzLnZpd2VyU2VydmljZS5wbGF5ZXJFdmVudDtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OlRlbGVtZXRyeUV2ZW50JywgWyckZXZlbnQnXSlcclxuICBvblRlbGVtZXRyeUV2ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnRlbGVtZXRyeUV2ZW50LmVtaXQoZXZlbnQuZGV0YWlsKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLnBsYXllckNvbmZpZykge1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMucGxheWVyQ29uZmlnID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLnBsYXllckNvbmZpZyA9IEpTT04ucGFyc2UodGhpcy5wbGF5ZXJDb25maWcpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIHBsYXllckNvbmZpZzogJywgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gaW5pdGlhbGl6aW5nIHNlcnZpY2VzXHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5pbml0aWFsaXplKHRoaXMucGxheWVyQ29uZmlnKTtcclxuICAgIHRoaXMuZXB1YlBsYXllclNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnBsYXllckNvbmZpZyk7XHJcbiAgICB0aGlzLnRyYWNlSWQgPSB0aGlzLnBsYXllckNvbmZpZz8uY29uZmlnPy50cmFjZUlkO1xyXG5cclxuXHJcbiAgICAvLyBjaGVja3Mgb25saW5lIGVycm9yIHdoaWxlIGxvYWRpbmcgZXB1YlxyXG4gICAgaWYgKCFuYXZpZ2F0b3Iub25MaW5lICYmICF0aGlzLnZpd2VyU2VydmljZS5pc0F2YWlsYWJsZUxvY2FsbHkpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUV4Y2VwdGlvbkxvZyhlcnJvckNvZGUuaW50ZXJuZXRDb25uZWN0aXZpdHksIHRoaXMuY3VycmVudFBhZ2VJbmRleCwgZXJyb3JNZXNzYWdlLmludGVybmV0Q29ubmVjdGl2aXR5LCB0aGlzLnRyYWNlSWQsIG5ldyBFcnJvcihlcnJvck1lc3NhZ2UuaW50ZXJuZXRDb25uZWN0aXZpdHkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVja3MgY29udGVudCBjb21wYXRpYmlsaXR5IGVycm9yXHJcbiAgICBjb25zdCBjb250ZW50Q29tcGFiaWxpdHlMZXZlbCA9IHRoaXMucGxheWVyQ29uZmlnPy5tZXRhZGF0YT8uY29tcGF0aWJpbGl0eUxldmVsO1xyXG4gICAgaWYgKGNvbnRlbnRDb21wYWJpbGl0eUxldmVsKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrQ29udGVudENvbXBhdGlibGUgPSB0aGlzLmVycm9yU2VydmljZS5jaGVja0NvbnRlbnRDb21wYXRpYmlsaXR5KGNvbnRlbnRDb21wYWJpbGl0eUxldmVsKTtcclxuICAgICAgaWYgKCFjaGVja0NvbnRlbnRDb21wYXRpYmxlPy5pc0NvbXBpdGFibGUpIHtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coZXJyb3JDb2RlLmNvbnRlbnRDb21wYXRpYmlsaXR5LCB0aGlzLmN1cnJlbnRQYWdlSW5kZXgsIGVycm9yQ29kZS5jb250ZW50Q29tcGF0aWJpbGl0eSwgdGhpcy50cmFjZUlkLCBjaGVja0NvbnRlbnRDb21wYXRpYmxlLmVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2hvd0VwdWJWaWV3ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5zaWRlTWVudUNvbmZpZyA9IHsgLi4udGhpcy5zaWRlTWVudUNvbmZpZywgLi4udGhpcy5wbGF5ZXJDb25maWcuY29uZmlnLnNpZGVNZW51IH07XHJcbiAgICB0aGlzLmdldEVwdWJMb2FkaW5nUHJvZ3Jlc3MoKTtcclxuICAgIGNvbnNvbGUubG9nKCdwcmV2aWV3MScsIHRoaXMucGxheWVyQ29uZmlnKTtcclxuICAgIHRoaXMubmV4dENvbnRlbnQgPSB0aGlzLnBsYXllckNvbmZpZy5jb25maWcubmV4dENvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcy5zaG93RnVsbFNjcmVlbiAmJiAhY2hhbmdlcz8uc2hvd0Z1bGxTY3JlZW4/LmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0Z1bGxTY3JlZW4gPSBjaGFuZ2VzLnNob3dGdWxsU2NyZWVuLmN1cnJlbnRWYWx1ZTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzLnBsYXllckNvbmZpZy5maXJzdENoYW5nZSAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgLy8gQ2FsbGluZyBmb3Igd2ViIGNvbXBvbmVudCBleHBsaWNpdGx5IGFuZCBsaWZlIGN5Y2xlIHdvcmtzIGluIGRpZmZlcmVudCBvcmRlclxyXG4gICAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGNvbnN0IGVwdWJQbGF5ZXJFbGVtZW50ID0gdGhpcy5lcHViUGxheWVyUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLnVubGlzdGVuTW91c2VFbnRlciA9IHRoaXMucmVuZGVyZXIyLmxpc3RlbihlcHViUGxheWVyRWxlbWVudCwgJ21vdXNlZW50ZXInLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudW5saXN0ZW5Nb3VzZUxlYXZlID0gdGhpcy5yZW5kZXJlcjIubGlzdGVuKGVwdWJQbGF5ZXJFbGVtZW50LCAnbW91c2VsZWF2ZScsICgpID0+IHtcclxuICAgICAgdGhpcy5zaG93Q29udHJvbHMgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGVhZGVyQWN0aW9ucyhldmVudGRhdGEpIHtcclxuICAgIHRoaXMuaGVhZGVyQWN0aW9uc0V2ZW50LmVtaXQoZXZlbnRkYXRhKTtcclxuICB9XHJcblxyXG4gIHZpZXdlckV2ZW50KGV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gdGhpcy5mcm9tQ29uc3QuRVBVQkxPQURFRCkge1xyXG4gICAgICB0aGlzLm9uRXB1YkxvYWRlZChldmVudCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gdGhpcy5mcm9tQ29uc3QuUEFHRUNIQU5HRSkge1xyXG4gICAgICB0aGlzLm9uUGFnZUNoYW5nZShldmVudCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gdGhpcy5mcm9tQ29uc3QuRU5EKSB7XHJcbiAgICAgIHRoaXMub25FcHViRW5kZWQoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IHRoaXMuZnJvbUNvbnN0LkVSUk9SKSB7XHJcbiAgICAgIHRoaXMub25FcHViTG9hZEZhaWxlZChldmVudCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gdGhpcy5mcm9tQ29uc3QuTkFWSUdBVEVfVE9fUEFHRSkge1xyXG4gICAgICB0aGlzLm9uSnVtcFRvUGFnZShldmVudCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gdGhpcy5mcm9tQ29uc3QuSU5WQUxJRF9QQUdFX0VSUk9SKSB7XHJcbiAgICAgIHRoaXMudmFsaWRQYWdlID0gZXZlbnQuZGF0YTtcclxuICAgICAgdGhpcy5yZXNldFZhbGlkUGFnZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRWYWxpZFBhZ2UoKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy52YWxpZFBhZ2UgPSB0cnVlO1xyXG4gICAgfSwgNTAwMCk7XHJcbiAgfVxyXG5cclxuICBvbkVwdWJMb2FkZWQoZXZlbnQpIHtcclxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbFJlZik7XHJcbiAgICB0aGlzLnZpZXdTdGF0ZSA9IHRoaXMuZnJvbUNvbnN0LlNUQVJUO1xyXG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VTdGFydEV2ZW50KGV2ZW50LmRhdGEpO1xyXG5cclxuICAgIGlmICh0aGlzLnBsYXllckNvbmZpZy5jb25maWc/LnBhZ2VzVmlzaXRlZD8ubGVuZ3RoICYmIHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZz8uY3VycmVudExvY2F0aW9uKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VJbmRleCA9IHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZy5wYWdlc1Zpc2l0ZWRbdGhpcy5wbGF5ZXJDb25maWcuY29uZmlnLnBhZ2VzVmlzaXRlZC5sZW5ndGggLSAxXTtcclxuICAgIH1cclxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLnBhZ2VzVmlzaXRlZC5wdXNoKHRoaXMuY3VycmVudFBhZ2VJbmRleCk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VDaGFuZ2UoZXZlbnQpIHtcclxuICAgIGlmIChldmVudD8uZGF0YT8uaW5kZXgpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZUluZGV4ID0gZXZlbnQuZGF0YS5pbmRleDtcclxuICAgIH1cclxuICAgIHRoaXMuY3VycmVudFBhZ2VJbmRleCA9IHRoaXMudXRpbFNlcnZpY2UuZ2V0Q3VycmVudEluZGV4KGV2ZW50LCB0aGlzLmN1cnJlbnRQYWdlSW5kZXgpO1xyXG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudCwgdGVsZW1ldHJ5VHlwZS5JTlRFUkFDVCk7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50LCB0ZWxlbWV0cnlUeXBlLklNUFJFU1NJT04pO1xyXG4gICAgdGhpcy52aXdlclNlcnZpY2UubWV0YURhdGEucGFnZXNWaXNpdGVkLnB1c2godGhpcy5jdXJyZW50UGFnZUluZGV4KTtcclxuICB9XHJcblxyXG4gIG9uSnVtcFRvUGFnZSh0eXBlKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlSW5kZXggPSB0eXBlPy5ldmVudD8uZGF0YTtcclxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQodHlwZSwgdGVsZW1ldHJ5VHlwZS5JTlRFUkFDVCk7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KHR5cGUsIHRlbGVtZXRyeVR5cGUuSU1QUkVTU0lPTik7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5tZXRhRGF0YS5wYWdlc1Zpc2l0ZWQucHVzaCh0aGlzLmN1cnJlbnRQYWdlSW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgb25FcHViRW5kZWQoZXZlbnQpIHtcclxuICAgIHRoaXMudmlld1N0YXRlID0gdGhpcy5mcm9tQ29uc3QuRU5EO1xyXG4gICAgdGhpcy5zaG93RXB1YlZpZXdlciA9IGZhbHNlO1xyXG4gICAgZXZlbnQuZGF0YS5pbmRleCA9IHRoaXMuY3VycmVudFBhZ2VJbmRleDtcclxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlRW5kRXZlbnQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25FcHViTG9hZEZhaWxlZChlcnJvcikge1xyXG4gICAgdGhpcy5zaG93Q29udGVudEVycm9yID0gdHJ1ZTtcclxuICAgIHRoaXMudmlld1N0YXRlID0gdGhpcy5mcm9tQ29uc3QuTE9BRElORztcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlRXhjZXB0aW9uTG9nKGVycm9yLmVycm9yQ29kZSwgdGhpcy5jdXJyZW50UGFnZUluZGV4LCBlcnJvci5lcnJvck1lc3NhZ2UsIHRoaXMudHJhY2VJZCwgbmV3IEVycm9yKGVycm9yLmVycm9yTWVzc2FnZSkpO1xyXG4gIH1cclxuXHJcbiAgcmVwbGF5Q29udGVudChldmVudCkge1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZXZlbnQsIHRlbGVtZXRyeVR5cGUuSU5URVJBQ1QpO1xyXG4gICAgdGhpcy52aWV3U3RhdGUgPSB0aGlzLmZyb21Db25zdC5TVEFSVDtcclxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLnBhZ2VzVmlzaXRlZC5wdXNoKHRoaXMuY3VycmVudFBhZ2VJbmRleCk7XHJcbiAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgfVxyXG5cclxuICBleGl0Q29udGVudChldmVudCkge1xyXG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudCwgdGVsZW1ldHJ5VHlwZS5JTlRFUkFDVCk7XHJcbiAgfVxyXG5cclxuICBzaWRlQmFyRXZlbnRzKGV2ZW50KSB7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50LCB0ZWxlbWV0cnlUeXBlLklOVEVSQUNUKTtcclxuICAgIGlmIChldmVudC50eXBlID09PSAnRE9XTkxPQUQnKSB7XHJcbiAgICAgIHRoaXMuZG93bmxvYWRFcHViKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaWRlYmFyTWVudUV2ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50LCB0ZWxlbWV0cnlUeXBlLklOVEVSQUNUKTtcclxuICB9XHJcblxyXG4gIGdldEVwdWJMb2FkaW5nUHJvZ3Jlc3MoKSB7XHJcbiAgICB0aGlzLmludGVydmFsUmVmID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5wcm9ncmVzcyA8IDk1KSB7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IHRoaXMucHJvZ3Jlc3MgKyA1O1xyXG4gICAgICB9XHJcbiAgICB9LCAxMCk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEVwdWIoKSB7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYS5ocmVmID0gdGhpcy52aXdlclNlcnZpY2UuYXJ0aWZhY3RVcmw7XHJcbiAgICBhLmRvd25sb2FkID0gdGhpcy52aXdlclNlcnZpY2UuY29udGVudE5hbWU7XHJcbiAgICBhLnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgIGEuY2xpY2soKTtcclxuICAgIGEucmVtb3ZlKCk7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KCdET1dOTE9BRCcpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJlZm9yZXVubG9hZCcpXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBjb25zdCBFbmRFdmVudCA9IHtcclxuICAgICAgdHlwZTogdGhpcy5mcm9tQ29uc3QuRU5ELFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgaW5kZXg6IHRoaXMuY3VycmVudFBhZ2VJbmRleFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VFbmRFdmVudChFbmRFdmVudCk7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5pc0VuZEV2ZW50UmFpc2VkID0gZmFsc2U7XHJcbiAgICB0aGlzLnVubGlzdGVuTW91c2VFbnRlcigpO1xyXG4gICAgdGhpcy51bmxpc3Rlbk1vdXNlTGVhdmUoKTtcclxuICB9XHJcblxyXG4gIHBsYXlOZXh0Q29udGVudChldmVudCkge1xyXG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudE5ldyhldmVudD8udHlwZSwgdGVsZW1ldHJ5VHlwZS5JTlRFUkFDVCwgcGFnZUlkLmVuZFBhZ2UsIGV2ZW50Py5pZGVudGlmaWVyKTtcclxuICB9XHJcbn1cclxuIl19