UNPKG

@project-sunbird/sunbird-epub-player-v9

Version:

The Epub player library is 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 development

343 lines 52.4 kB
import { EventEmitter, Component, Output, Input, HostListener, ViewChild } from '@angular/core'; import { epubPlayerConstants, telemetryType } from './sunbird-epub.constant'; import { errorCode, errorMessage } from '@project-sunbird/sunbird-player-sdk-v9'; import * as i0 from "@angular/core"; import * as i1 from "./services/viewerService/viwer-service"; import * as i2 from "./sunbird-epub-player.service"; import * as i3 from "@project-sunbird/sunbird-player-sdk-v9"; import * as i4 from "./services/utilService/util.service"; import * as i5 from "@angular/common"; import * as i6 from "./epub-viewer/epub-viewer.component"; const _c0 = ["epubPlayer"]; const _c1 = a0 => ({ "isVisible": a0 }); function EpubPlayerComponent_div_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div"); i0.ɵɵelement(1, "sb-player-start-page", 6); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(); i0.ɵɵproperty("title", ctx_r0.viwerService.contentName)("progress", ctx_r0.progress); } } function EpubPlayerComponent_div_3_ng_container_1_div_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 13); i0.ɵɵtext(1); i0.ɵɵelement(2, "span"); i0.ɵɵtext(3); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(3); i0.ɵɵadvance(); i0.ɵɵtextInterpolate2(" Page ", ctx_r0.currentPageIndex, " of ", ctx_r0.viwerService == null ? null : ctx_r0.viwerService.totalNumberOfPages, " "); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", (ctx_r0.currentPageIndex / (ctx_r0.viwerService == null ? null : ctx_r0.viwerService.totalNumberOfPages) * 100).toFixed(0), "% "); } } function EpubPlayerComponent_div_3_ng_container_1_Template(rf, ctx) { if (rf & 1) { const _r3 = i0.ɵɵgetCurrentView(); i0.ɵɵelementContainerStart(0); i0.ɵɵelementStart(1, "sb-player-header", 9); i0.ɵɵlistener("actions", function EpubPlayerComponent_div_3_ng_container_1_Template_sb_player_header_actions_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.headerActions($event)); }); i0.ɵɵelementEnd(); i0.ɵɵelementStart(2, "sb-player-side-menu-icon", 10); i0.ɵɵlistener("sidebarMenuEvent", function EpubPlayerComponent_div_3_ng_container_1_Template_sb_player_side_menu_icon_sidebarMenuEvent_2_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.sidebarMenuEvent($event)); }); i0.ɵɵelementEnd(); i0.ɵɵelementStart(3, "sb-player-sidebar", 11); i0.ɵɵlistener("sidebarEvent", function EpubPlayerComponent_div_3_ng_container_1_Template_sb_player_sidebar_sidebarEvent_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.sideBarEvents($event)); }); i0.ɵɵelementEnd(); i0.ɵɵtemplate(4, EpubPlayerComponent_div_3_ng_container_1_div_4_Template, 4, 3, "div", 12); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵproperty("totalPages", ctx_r0.viwerService == null ? null : ctx_r0.viwerService.totalNumberOfPages)("pageNumber", ctx_r0.currentPageIndex)("config", ctx_r0.headerConfiguration)("ngClass", i0.ɵɵpureFunction1(8, _c1, ctx_r0.showControls)); i0.ɵɵadvance(); i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(10, _c1, ctx_r0.showControls)); i0.ɵɵadvance(); i0.ɵɵproperty("title", ctx_r0.viwerService.contentName)("config", ctx_r0.sideMenuConfig); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx_r0.currentPageIndex && (ctx_r0.viwerService == null ? null : ctx_r0.viwerService.totalNumberOfPages)); } } function EpubPlayerComponent_div_3_Template(rf, ctx) { if (rf & 1) { const _r2 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 7); i0.ɵɵtemplate(1, EpubPlayerComponent_div_3_ng_container_1_Template, 5, 12, "ng-container", 2); i0.ɵɵelementStart(2, "epub-viewer", 8); i0.ɵɵlistener("viewerEvent", function EpubPlayerComponent_div_3_Template_epub_viewer_viewerEvent_2_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.viewerEvent($event)); }); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx_r0.viewState === ctx_r0.fromConst.START); i0.ɵɵadvance(); i0.ɵɵproperty("actions", ctx_r0.headerActionsEvent)("epubSrc", ctx_r0.viwerService.src)("identifier", ctx_r0.viwerService.identifier)("config", ctx_r0.playerConfig.config)("showFullScreen", ctx_r0.showFullScreen); } } function EpubPlayerComponent_sb_player_end_page_4_Template(rf, ctx) { if (rf & 1) { const _r4 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "sb-player-end-page", 14); i0.ɵɵlistener("replayContent", function EpubPlayerComponent_sb_player_end_page_4_Template_sb_player_end_page_replayContent_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.replayContent($event)); })("exitContent", function EpubPlayerComponent_sb_player_end_page_4_Template_sb_player_end_page_exitContent_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.exitContent($event)); }); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵproperty("contentName", ctx_r0.viwerService.contentName)("outcomeLabel", "Pages read: ")("outcome", ctx_r0.currentPageIndex - 1)("showExit", ctx_r0.sideMenuConfig.showExit)("userName", ctx_r0.viwerService.userName)("timeSpentLabel", ctx_r0.viwerService.timeSpent); } } function EpubPlayerComponent_sb_player_contenterror_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sb-player-contenterror"); } } function EpubPlayerComponent_div_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 15); i0.ɵɵelement(1, "div", 16); i0.ɵɵelementStart(2, "div", 17); i0.ɵɵtext(3, "Page Not Found"); i0.ɵɵelementEnd()(); } } 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); } async ngOnInit() { 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 = this.playerConfig?.config?.traceId; // checks online error while loading epub if (!navigator.onLine && !this.viwerService.isAvailableLocally) { // eslint-disable-next-line max-len this.viwerService.raiseExceptionLog(errorCode.internetConnectivity, this.currentPageIndex, errorMessage.internetConnectivity, this.traceId, new Error(errorMessage.internetConnectivity)); } // checks content compatibility error const contentCompabilityLevel = this.playerConfig?.metadata?.compatibilityLevel; if (contentCompabilityLevel) { const checkContentCompatible = this.errorService.checkContentCompatibility(contentCompabilityLevel); if (!checkContentCompatible?.isCompitable) { // eslint-disable-next-line max-len this.viwerService.raiseExceptionLog(errorCode.contentCompatibility, this.currentPageIndex, errorCode.contentCompatibility, this.traceId, checkContentCompatible.error); } } this.showEpubViewer = true; this.sideMenuConfig = { ...this.sideMenuConfig, ...this.playerConfig.config.sideMenu }; this.getEpubLoadingProgress(); } } ngOnChanges(changes) { if (changes.showFullScreen && !changes?.showFullScreen?.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) { clearInterval(this.intervalRef); this.viewState = this.fromConst.START; this.viwerService.raiseStartEvent(event.data); if (this.playerConfig.config?.pagesVisited?.length && this.playerConfig.config?.currentLocation) { this.currentPageIndex = this.playerConfig.config.pagesVisited[this.playerConfig.config.pagesVisited.length - 1]; } this.viwerService.metaData.pagesVisited.push(this.currentPageIndex); } onPageChange(event) { if (event?.data?.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) { this.currentPageIndex = type?.event?.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; // eslint-disable-next-line max-len 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(); } /** @nocollapse */ static { this.ɵfac = function EpubPlayerComponent_Factory(t) { return new (t || EpubPlayerComponent)(i0.ɵɵdirectiveInject(i1.ViwerService), i0.ɵɵdirectiveInject(i2.EpubPlayerService), i0.ɵɵdirectiveInject(i3.ErrorService), i0.ɵɵdirectiveInject(i4.UtilService), i0.ɵɵdirectiveInject(i0.Renderer2)); }; } /** @nocollapse */ static { this.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: EpubPlayerComponent, selectors: [["sunbird-epub-player"]], viewQuery: function EpubPlayerComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 7); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.epubPlayerRef = _t.first); } }, hostBindings: function EpubPlayerComponent_HostBindings(rf, ctx) { if (rf & 1) { i0.ɵɵlistener("TelemetryEvent", function EpubPlayerComponent_TelemetryEvent_HostBindingHandler($event) { return ctx.onTelemetryEvent($event); }, false, i0.ɵɵresolveDocument)("beforeunload", function EpubPlayerComponent_beforeunload_HostBindingHandler() { return ctx.ngOnDestroy(); }, false, i0.ɵɵresolveWindow); } }, inputs: { playerConfig: "playerConfig", showFullScreen: "showFullScreen" }, outputs: { headerActionsEvent: "headerActionsEvent", telemetryEvent: "telemetryEvent", playerEvent: "playerEvent" }, features: [i0.ɵɵNgOnChangesFeature], decls: 7, vars: 5, consts: [["epubPlayer", ""], [1, "sunbird-epub-container"], [4, "ngIf"], ["class", "epub-container", 4, "ngIf"], [3, "contentName", "outcomeLabel", "outcome", "showExit", "userName", "timeSpentLabel", "replayContent", "exitContent", 4, "ngIf"], ["class", "pagenotfound__tooltip", 4, "ngIf"], [3, "title", "progress"], [1, "epub-container"], [3, "viewerEvent", "actions", "epubSrc", "identifier", "config", "showFullScreen"], [1, "notVisible", 3, "actions", "totalPages", "pageNumber", "config", "ngClass"], [1, "notVisible", 3, "sidebarMenuEvent", "ngClass"], [3, "sidebarEvent", "title", "config"], ["class", "sb-epub-reading-status", 4, "ngIf"], [1, "sb-epub-reading-status"], [3, "replayContent", "exitContent", "contentName", "outcomeLabel", "outcome", "showExit", "userName", "timeSpentLabel"], [1, "pagenotfound__tooltip"], [1, "pagenotfound__icon"], [1, "pagenotfound__text"]], template: function EpubPlayerComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 1, 0); i0.ɵɵtemplate(2, EpubPlayerComponent_div_2_Template, 2, 2, "div", 2)(3, EpubPlayerComponent_div_3_Template, 3, 6, "div", 3)(4, EpubPlayerComponent_sb_player_end_page_4_Template, 1, 6, "sb-player-end-page", 4)(5, EpubPlayerComponent_sb_player_contenterror_5_Template, 1, 0, "sb-player-contenterror", 2); i0.ɵɵelementEnd(); i0.ɵɵtemplate(6, EpubPlayerComponent_div_6_Template, 4, 0, "div", 5); } if (rf & 2) { i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx.viewState === ctx.fromConst.LOADING); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx.showEpubViewer); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx.viewState === ctx.fromConst.END); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx.showContentError); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", !ctx.validPage); } }, dependencies: [i5.NgClass, i5.NgIf, i3.StartPageComponent, i3.EndPageComponent, i3.SidebarComponent, i3.SideMenuIconComponent, i3.HeaderComponent, i3.ContenterrorComponent, i6.EpubViewerComponent], styles: [".sunbird-epub-container[_ngcontent-%COMP%]{height:100%;width:100%;background-color:#fff}.sunbird-epub-palyer-container[_ngcontent-%COMP%]{width:100%;height:100%;overflow:hidden;position:relative}.sb-epub-reading-status[_ngcontent-%COMP%]{color:var(--gray-800);font-size:.75rem;position:absolute;left:1rem;bottom:.75rem;display:flex;-webkit-box-align:center;align-items:center;background:var(--white);border-radius:.5rem;padding:.25em .5rem;z-index:5;line-height:normal}.sb-epub-reading-status[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{background:var(--gray-800);width:4px;height:4px;display:block;margin:0 .5em;border-radius:50%}.notVisible[_ngcontent-%COMP%], .BtmNotVisible[_ngcontent-%COMP%]{transition:all .3s ease-in-out;position:absolute;width:100%}.notVisible[_ngcontent-%COMP%]{top:-10rem}.notVisible.isVisible[_ngcontent-%COMP%]{top:0rem}.BtmNotVisible[_ngcontent-%COMP%]{bottom:-10rem}.BtmNotVisible.isVisible[_ngcontent-%COMP%]{bottom:0rem}[_nghost-%COMP%] .sb-player-splash-container{height:100vh!important}[_nghost-%COMP%] epub-viewer{position:absolute;top:48px;width:100%;height:calc(100% - 48px);overflow-y:auto;overflow-x:hidden;left:0;background-color:#fff;overflow-y:scroll!important}[_nghost-%COMP%] .epub-container{height:100%;position:relative;overflow-x:hidden!important}.pagenotfound__tooltip[_ngcontent-%COMP%]{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[_ngcontent-%COMP%]{width:calculateRem(22px);height:calculateRem(22px);margin-right:calculateRem(12px);background:#fff;border-radius:50%;position:relative}.pagenotfound__icon[_ngcontent-%COMP%]:after{content:\"!\";position:absolute;top:50%;left:50%;color:#333;font-size:18px;transform:translate(-50%,-50%)}"] }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(EpubPlayerComponent, [{ type: Component, args: [{ selector: 'sunbird-epub-player', template: "<div class=\"sunbird-epub-container\" #epubPlayer>\n<div *ngIf=\"viewState === fromConst.LOADING\">\n <sb-player-start-page [title]=\"viwerService.contentName\" [progress]=\"progress\"></sb-player-start-page>\n</div>\n<div class=\"epub-container\" *ngIf=\"showEpubViewer\">\n <ng-container *ngIf=\"viewState === fromConst.START\">\n <sb-player-header class=\"notVisible\" [totalPages]=\"viwerService?.totalNumberOfPages\" [pageNumber]=\"currentPageIndex\" [config]=\"headerConfiguration\" (actions)=\"headerActions($event)\" [ngClass]=\"{'isVisible': showControls}\"></sb-player-header>\n <sb-player-side-menu-icon class=\"notVisible\" [ngClass]=\"{'isVisible': showControls}\" (sidebarMenuEvent)=\"sidebarMenuEvent($event)\">\n </sb-player-side-menu-icon>\n <sb-player-sidebar [title]=\"viwerService.contentName\" (sidebarEvent)=\"sideBarEvents($event)\"\n [config]=\"sideMenuConfig\"></sb-player-sidebar>\n <div class=\"sb-epub-reading-status\" *ngIf=\"currentPageIndex && viwerService?.totalNumberOfPages\">\n Page {{currentPageIndex}} of {{viwerService?.totalNumberOfPages}} <span></span> {{((currentPageIndex/viwerService?.totalNumberOfPages) * 100).toFixed(0)}}%\n </div>\n \n </ng-container>\n <epub-viewer [actions]=\"headerActionsEvent\" [epubSrc]=\"viwerService.src\" [identifier]=\"viwerService.identifier\"\n (viewerEvent)=\"viewerEvent($event)\" [config]=\"playerConfig.config\" [showFullScreen]=\"showFullScreen\">\n </epub-viewer>\n</div>\n<sb-player-end-page *ngIf=\"viewState === fromConst.END\" [contentName]=\"viwerService.contentName\"\n [outcomeLabel]=\"'Pages read: '\" [outcome]=\"(currentPageIndex -1)\" [showExit]=\"sideMenuConfig.showExit\" [userName]=\"viwerService.userName\"\n [timeSpentLabel]=\"viwerService.timeSpent\" (replayContent)=\"replayContent($event)\" (exitContent)=\"exitContent($event)\">\n</sb-player-end-page>\n<sb-player-contenterror *ngIf=\"showContentError\"></sb-player-contenterror>\n</div>\n<div class=\"pagenotfound__tooltip\" *ngIf=\"!validPage\">\n <div class=\"pagenotfound__icon\"></div>\n <div class=\"pagenotfound__text\">Page Not Found</div>\n</div>\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;-webkit-box-align:center;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;overflow-y:scroll!important}: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:#fff;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: i1.ViwerService }, { type: i2.EpubPlayerService }, { type: i3.ErrorService }, { type: i4.UtilService }, { type: i0.Renderer2 }], { 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'] }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EpubPlayerComponent, { className: "EpubPlayerComponent", filePath: "lib/sunbird-epub-player.component.ts", lineNumber: 17 }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdW5iaXJkLWVwdWItcGxheWVyL3NyYy9saWIvc3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdW5iaXJkLWVwdWItcGxheWVyL3NyYy9saWIvc3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLFlBQVksRUFDNUMsU0FBUyxFQUFzRCxNQUFNLGVBQWUsQ0FBQztBQUk5RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0UsT0FBTyxFQUFnQixTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7Ozs7Ozs7O0lDTC9GLDJCQUE2QztJQUN6QywwQ0FBc0c7SUFDMUcsaUJBQU07OztJQURvQixjQUFrQztJQUFDLEFBQW5DLHVEQUFrQyw2QkFBc0I7OztJQVMxRSwrQkFBaUc7SUFDN0YsWUFBa0U7SUFBQSx1QkFBYTtJQUFDLFlBQ3BGO0lBQUEsaUJBQU07OztJQURGLGNBQWtFO0lBQWxFLGtKQUFrRTtJQUFjLGVBQ3BGO0lBRG9GLDRKQUNwRjs7OztJQVJKLDZCQUFvRDtJQUNoRCwyQ0FBOE47SUFBMUUsbU5BQVcsNEJBQXFCLEtBQUM7SUFBeUMsaUJBQW1CO0lBQ2pQLG9EQUFtSTtJQUE5Qyw2T0FBb0IsK0JBQXdCLEtBQUM7SUFDbEksaUJBQTJCO0lBQzNCLDZDQUM4QjtJQUR3Qiw4TkFBZ0IsNEJBQXFCLEtBQUM7SUFDOUQsaUJBQW9CO0lBQ2xELDBGQUFpRzs7OztJQUw1RCxjQUErQztJQUFrRyxBQUFqRSxBQUFoQyxBQUFoRCx3R0FBK0Ms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aUNBQWdEO1lBd0JoRCxBQUpBLEFBaEJBLEFBSEEsb0VBQTZDLHVEQUdNLHFGQWtCdUUsNkZBRXpFO1lBQ2pELGlCQUFNO1lBQ04sb0VBQXNEOztZQXpCaEQsZUFBcUM7WUFBckMsOERBQXFDO1lBR2QsY0FBb0I7WUFBcEIseUNBQW9CO1lBZ0I1QixjQUFpQztZQUFqQywwREFBaUM7WUFJN0IsY0FBc0I7WUFBdEIsMkNBQXNCO1lBRVgsY0FBZ0I7WUFBaEIscUNBQWdCOzs7aUZEVnZDLG1CQUFtQjtjQU4vQixTQUFTOzJCQUVFLHFCQUFxQjswSkFNWSxhQUFhO2tCQUF2RCxTQUFTO21CQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFDaEMsWUFBWTtrQkFBcEIsS0FBSztZQUNHLGNBQWM7a0JBQXRCLEtBQUs7WUFDSSxrQkFBa0I7a0JBQTNCLE1BQU07WUFDRyxjQUFjO2tCQUF2QixNQUFNO1lBQ0csV0FBVztrQkFBcEIsTUFBTTtZQXNDUCxnQkFBZ0I7a0JBRGYsWUFBWTttQkFBQyx5QkFBeUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQWtMbkQsV0FBVztrQkFEVixZQUFZO21CQUFDLHFCQUFxQjs7a0ZBN054QixtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIENvbXBvbmVudCwgT3V0cHV0LCBJbnB1dCwgT25Jbml0LCBIb3N0TGlzdGVuZXIsXG4gIE9uRGVzdHJveSwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBBZnRlclZpZXdJbml0LCBSZW5kZXJlcjIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVml3ZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy92aWV3ZXJTZXJ2aWNlL3Zpd2VyLXNlcnZpY2UnO1xuaW1wb3J0IHsgUGxheWVyQ29uZmlnIH0gZnJvbSAnLi9zdW5iaXJkLWVwdWItcGxheWVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBFcHViUGxheWVyU2VydmljZSB9IGZyb20gJy4vc3VuYmlyZC1lcHViLXBsYXllci5zZXJ2aWNlJztcbmltcG9ydCB7IGVwdWJQbGF5ZXJDb25zdGFudHMsIHRlbGVtZXRyeVR5cGUgfSBmcm9tICcuL3N1bmJpcmQtZXB1Yi5jb25zdGFudCc7XG5pbXBvcnQgeyBFcnJvclNlcnZpY2UsIGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHByb2plY3Qtc3VuYmlyZC9zdW5iaXJkLXBsYXllci1zZGstdjknO1xuaW1wb3J0IHsgVXRpbFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3V0aWxTZXJ2aWNlL3V0aWwuc2VydmljZSc7XG5cblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnc3VuYmlyZC1lcHViLXBsYXllcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdW5iaXJkLWVwdWItcGxheWVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEVwdWJQbGF5ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgZnJvbUNvbnN0ID0gZXB1YlBsYXllckNvbnN0YW50cztcbiAgQFZpZXdDaGlsZCgnZXB1YlBsYXllcicsIHsgc3RhdGljOiB0cnVlIH0pIGVwdWJQbGF5ZXJSZWY6IEVsZW1lbnRSZWY7XG4gIEBJbnB1dCgpIHBsYXllckNvbmZpZzogUGxheWVyQ29uZmlnO1xuICBASW5wdXQoKSBzaG93RnVsbFNjcmVlbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgaGVhZGVyQWN0aW9uc0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdGVsZW1ldHJ5RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBwbGF5ZXJFdmVudDogRXZlbnRFbWl0dGVyPG9iamVjdD47XG4gIHByaXZhdGUgdW5saXN0ZW5Nb3VzZUVudGVyOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHVubGlzdGVuTW91c2VMZWF2ZTogKCkgPT4gdm9pZDtcbiAgcHVibGljIHNob3dDb250cm9scyA9IHRydWU7XG4gIHB1YmxpYyB2YWxpZFBhZ2UgPSB0cnVlO1xuICBzaG93Q29udGVudEVycm9yOiBib29sZWFuO1xuICBzaWRlTWVudUNvbmZpZyA9IHtcbiAgICBzaG93U2hhcmU6IGZhbHNlLFxuICAgIHNob3dEb3dubG9hZDogZmFsc2UsXG4gICAgc2hvd1JlcGxheTogZmFsc2UsXG4gICAgc2hvd0V4aXQ6IGZhbHNlLFxuICAgIHNob3dQcmludDogZmFsc2VcbiAgfTtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgdmlld1N0YXRlID0gdGhpcy5mcm9tQ29uc3QuTE9BRElORztcbiAgaW50ZXJ2YWxSZWY6IGFueTtcbiAgcHJvZ3Jlc3MgPSAwO1xuICBzaG93RXB1YlZpZXdlcjogYm9vbGVhbjtcbiAgcHVibGljIHRyYWNlSWQ6IHN0cmluZztcbiAgY3VycmVudFBhZ2VJbmRleCA9IDE7XG4gIGhlYWRlckNvbmZpZ3VyYXRpb24gPSB7XG4gICAgcm90YXRpb246IGZhbHNlLFxuICAgIGdvdG86IHRydWUsXG4gICAgbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICB6b29tOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB2aXdlclNlcnZpY2U6IFZpd2VyU2VydmljZSxcbiAgICBwcml2YXRlIGVwdWJQbGF5ZXJTZXJ2aWNlOiBFcHViUGxheWVyU2VydmljZSxcbiAgICBwdWJsaWMgZXJyb3JTZXJ2aWNlOiBFcnJvclNlcnZpY2UsXG4gICAgcHVibGljIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyXG4gICkge1xuICAgIHRoaXMucGxheWVyRXZlbnQgPSB0aGlzLnZpd2VyU2VydmljZS5wbGF5ZXJFdmVudDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OlRlbGVtZXRyeUV2ZW50JywgWyckZXZlbnQnXSlcbiAgb25UZWxlbWV0cnlFdmVudChldmVudCkge1xuICAgIHRoaXMudGVsZW1ldHJ5RXZlbnQuZW1pdChldmVudC5kZXRhaWwpO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5wbGF5ZXJDb25maWcpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMucGxheWVyQ29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5wbGF5ZXJDb25maWcgPSBKU09OLnBhcnNlKHRoaXMucGxheWVyQ29uZmlnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgcGxheWVyQ29uZmlnOiAnLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGluaXRpYWxpemluZyBzZXJ2aWNlc1xuICAgIHRoaXMudml3ZXJTZXJ2aWNlLmluaXRpYWxpemUodGhpcy5wbGF5ZXJDb25maWcpO1xuICAgIHRoaXMuZXB1YlBsYXllclNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnBsYXllckNvbmZpZyk7XG4gICAgdGhpcy50cmFjZUlkID0gdGhpcy5wbGF5ZXJDb25maWc/LmNvbmZpZz8udHJhY2VJZDtcbiAgICAvLyBjaGVja3Mgb25saW5lIGVycm9yIHdoaWxlIGxvYWRpbmcgZXB1YlxuICAgIGlmICghbmF2aWdhdG9yLm9uTGluZSAmJiAhdGhpcy52aXdlclNlcnZpY2UuaXNBdmFpbGFibGVMb2NhbGx5KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coZXJyb3JDb2RlLmludGVybmV0Q29ubmVjdGl2aXR5LCB0aGlzLmN1cnJlbnRQYWdlSW5kZXgsIGVycm9yTWVzc2FnZS5pbnRlcm5ldENvbm5lY3Rpdml0eSwgdGhpcy50cmFjZUlkLCBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlLmludGVybmV0Q29ubmVjdGl2aXR5KSk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2tzIGNvbnRlbnQgY29tcGF0aWJpbGl0eSBlcnJvclxuICAgIGNvbnN0IGNvbnRlbnRDb21wYWJpbGl0eUxldmVsID0gdGhpcy5wbGF5ZXJDb25maWc/Lm1ldGFkYXRhPy5jb21wYXRpYmlsaXR5TGV2ZWw7XG4gICAgaWYgKGNvbnRlbnRDb21wYWJpbGl0eUxldmVsKSB7XG4gICAgICBjb25zdCBjaGVja0NvbnRlbnRDb21wYXRpYmxlID0gdGhpcy5lcnJvclNlcnZpY2UuY2hlY2tDb250ZW50Q29tcGF0aWJpbGl0eShjb250ZW50Q29tcGFiaWxpdHlMZXZlbCk7XG4gICAgICBpZiAoIWNoZWNrQ29udGVudENvbXBhdGlibGU/LmlzQ29tcGl0YWJsZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUV4Y2VwdGlvbkxvZyhlcnJvckNvZGUuY29udGVudENvbXBhdGliaWxpdHksIHRoaXMuY3VycmVudFBhZ2VJbmRleCwgZXJyb3JDb2RlLmNvbnRlbnRDb21wYXRpYmlsaXR5LCB0aGlzLnRyYWNlSWQsIGNoZWNrQ29udGVudENvbXBhdGlibGUuZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2hvd0VwdWJWaWV3ZXIgPSB0cnVlO1xuICAgIHRoaXMuc2lkZU1lbnVDb25maWcgPSB7IC4uLnRoaXMuc2lkZU1lbnVDb25maWcsIC4uLnRoaXMucGxheWVyQ29uZmlnLmNvbmZpZy5zaWRlTWVudSB9O1xuICAgIHRoaXMuZ2V0RXB1YkxvYWRpbmdQcm9ncmVzcygpO1xuICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMuc2hvd0Z1bGxTY3JlZW4gJiYgIWNoYW5nZXM/LnNob3dGdWxsU2NyZWVuPy5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5zaG93RnVsbFNjcmVlbiA9IGNoYW5nZXMuc2hvd0Z1bGxTY3JlZW4uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5wbGF5ZXJDb25maWcuZmlyc3RDaGFuZ2UgJiYgdGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICAvLyBDYWxsaW5nIGZvciB3ZWIgY29tcG9uZW50IGV4cGxpY2l0bHkgYW5kIGxpZmUgY3ljbGUgd29ya3MgaW4gZGlmZmVyZW50IG9yZGVyXG4gICAgICB0aGlzLm5nT25Jbml0KCk7XG4gICAgfVxuICB9XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCBlcHViUGxheWVyRWxlbWVudCA9IHRoaXMuZXB1YlBsYXllclJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMudW5saXN0ZW5Nb3VzZUVudGVyID0gdGhpcy5yZW5kZXJlcjIubGlzdGVuKGVwdWJQbGF5ZXJFbGVtZW50LCAnbW91c2VlbnRlcicsICgpID0+IHtcbiAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRoaXMudW5saXN0ZW5Nb3VzZUxlYXZlID0gdGhpcy5yZW5kZXJlcjIubGlzdGVuKGVwdWJQbGF5ZXJFbGVtZW50LCAnbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBoZWFkZXJBY3Rpb25zKGV2ZW50ZGF0YSkge1xuICAgIHRoaXMuaGVhZGVyQWN0aW9uc0V2ZW50LmVtaXQoZXZlbnRkYXRhKTtcbiAgfVxuXG4gIHZpZXdlckV2ZW50KGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IHRoaXMuZnJvbUNvbnN0LkVQVUJMT0FERUQpIHtcbiAgICAgIHRoaXMub25FcHViTG9hZGVkKGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IHRoaXMuZnJvbUNvbnN0LlBBR0VDSEFOR0UpIHtcbiAgICAgIHRoaXMub25QYWdlQ2hhbmdlKGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IHRoaXMuZnJvbUNvbnN0LkVORCkge1xuICAgICAgdGhpcy5vbkVwdWJFbmRlZChldmVudCk7XG4gICAgfVxuICAgIGlmIChldmVudC50eXBlID09PSB0aGlzLmZyb21Db25zdC5FUlJPUikge1xuICAgICAgdGhpcy5vbkVwdWJMb2FkRmFpbGVkKGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IHRoaXMuZnJvbUNvbnN0Lk5BVklHQVRFX1RPX1BBR0UpIHtcbiAgICAgIHRoaXMub25KdW1wVG9QYWdlKGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IHRoaXMuZnJvbUNvbnN0LklOVkFMSURfUEFHRV9FUlJPUikge1xuICAgICAgdGhpcy52YWxpZFBhZ2UgPSBldmVudC5kYXRhO1xuICAgICAgdGhpcy5yZXNldFZhbGlkUGFnZSgpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0VmFsaWRQYWdlKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy52YWxpZFBhZ2UgPSB0cnVlO1xuICAgIH0sIDUwMDApO1xuICB9XG5cbiAgb25FcHViTG9hZGVkKGV2ZW50KSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsUmVmKTtcbiAgICB0aGlzLnZpZXdTdGF0ZSA9IHRoaXMuZnJvbUNvbnN0LlNUQVJUO1xuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlU3RhcnRFdmVudChldmVudC5kYXRhKTtcblxuICAgIGlmICh0aGlzLnBsYXllckNvbmZpZy5jb25maWc/LnBhZ2VzVmlzaXRlZD8ubGVuZ3RoICYmIHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZz8uY3VycmVudExvY2F0aW9uKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlSW5kZXggPSB0aGlzLnBsYXllckNvbmZpZy5jb25maWcucGFnZXNWaXNpdGVkW3RoaXMucGxheWVyQ29uZmlnLmNvbmZpZy5wYWdlc1Zpc2l0ZWQubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLnBhZ2VzVmlzaXRlZC5wdXNoKHRoaXMuY3VycmVudFBhZ2VJbmRleCk7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQ/LmRhdGE/LmluZGV4KSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlSW5kZXggPSBldmVudC5kYXRhLmluZGV4O1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRQYWdlSW5kZXggPSB0aGlzLnV0aWxTZXJ2aWNlLmdldEN1cnJlbnRJbmRleChldmVudCwgdGhpcy5jdXJyZW50UGFnZUluZGV4KTtcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50LCB0ZWxlbWV0cnlUeXBlLklOVEVSQUNUKTtcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50LCB0ZWxlbWV0cnlUeXBlLklNUFJFU1NJT04pO1xuICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLnBhZ2VzVmlzaXRlZC5wdXNoKHRoaXMuY3VycmVudFBhZ2VJbmRleCk7XG4gIH1cblxuICBvbkp1bXBUb1BhZ2UodHlwZSkge1xuICAgIHRoaXMuY3VycmVudFBhZ2VJbmRleCA9IHR5cGU/LmV2ZW50Py5kYXRhO1xuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQodHlwZSwgdGVsZW1ldHJ5VHlwZS5JTlRFUkFDVCk7XG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudCh0eXBlLCB0ZWxlbWV0cnlUeXBlLklNUFJFU1NJT04pO1xuICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLnBhZ2VzVmlzaXRlZC5wdXNoKHRoaXMuY3VycmVudFBhZ2VJbmRleCk7XG4gIH1cblxuICBvbkVwdWJFbmRlZChldmVudCkge1xuICAgIHRoaXMudmlld1N0YXRlID0gdGhpcy5mcm9tQ29uc3QuRU5EO1xuICAgIHRoaXMuc2hvd0VwdWJWaWV3ZXIgPSBmYWxzZTtcbiAgICBldmVudC5kYXRhLmluZGV4ID0gdGhpcy5jdXJyZW50UGFnZUluZGV4O1xuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlRW5kRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgb25FcHViTG9hZEZhaWxlZChlcnJvcikge1xuICAgIHRoaXMuc2hvd0NvbnRlbnRFcnJvciA9IHRydWU7XG4gICAgdGhpcy52aWV3U3RhdGUgPSB0aGlzLmZyb21Db25zdC5MT0FESU5HO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coZXJyb3IuZXJyb3JDb2RlLCB0aGlzLmN1cnJlbnRQYWdlSW5kZXgsIGVycm9yLmVycm9yTWVzc2FnZSwgdGhpcy50cmFjZUlkLCBuZXcgRXJyb3IoZXJyb3IuZXJyb3JNZXNzYWdlKSk7XG4gIH1cblxuICByZXBsYXlDb250ZW50KGV2ZW50KSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZUluZGV4ID0gMTtcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50LCB0ZWxlbWV0cnlUeXBlLklOVEVSQUNUKTtcbiAgICB0aGlzLnZpZXdTdGF0ZSA9IHRoaXMuZnJvbUNvbnN0LlNUQVJUO1xuICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLnBhZ2VzVmlzaXRlZC5wdXNoKHRoaXMuY3VycmVudFBhZ2VJbmRleCk7XG4gICAgdGhpcy5uZ09uSW5pdCgpO1xuICB9XG5cbiAgZXhpdENvbnRlbnQoZXZlbnQpIHtcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50LCB0ZWxlbWV0cnlUeXBlLklOVEVSQUNUKTtcbiAgfVxuXG4gIHNpZGVCYXJFdmVudHMoZXZlbnQpIHtcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50LCB0ZWxlbWV0cnlUeXBlLklOVEVSQUNUKTtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ0RPV05MT0FEJykge1xuICAgICAgdGhpcy5kb3dubG9hZEVwdWIoKTtcbiAgICB9XG4gIH1cblxuICBzaWRlYmFyTWVudUV2ZW50KGV2ZW50KSB7XG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudCwgdGVsZW1ldHJ5VHlwZS5JTlRFUkFDVCk7XG4gIH1cblxuICBnZXRFcHViTG9hZGluZ1Byb2dyZXNzKCkge1xuICAgIHRoaXMuaW50ZXJ2YWxSZWYgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9ncmVzcyA8IDk1KSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSB0aGlzLnByb2dyZXNzICsgNTtcbiAgICAgIH1cbiAgICB9LCAxMCk7XG4gIH1cblxuICBkb3dubG9hZEVwdWIoKSB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB0aGlzLnZpd2VyU2VydmljZS5hcnRpZmFjdFVybDtcbiAgICBhLmRvd25sb2FkID0gdGhpcy52aXdlclNlcnZpY2UuY29udGVudE5hbWU7XG4gICAgYS50YXJnZXQgPSAnX2JsYW5rJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBhLnJlbW92ZSgpO1xuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoJ0RPV05MT0FEJyk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6YmVmb3JldW5sb2FkJylcbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgY29uc3QgRW5kRXZlbnQgPSB7XG4gICAgICB0eXBlOiB0aGlzLmZyb21Db25zdC5FTkQsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGluZGV4OiB0aGlzLmN1cnJlbnRQYWdlSW5kZXhcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlRW5kRXZlbnQoRW5kRXZlbnQpO1xuICAgIHRoaXMudml3ZXJTZXJ2aWNlLmlzRW5kRXZlbnRSYWlzZWQgPSBmYWxzZTtcbiAgICB0aGlzLnVubGlzdGVuTW91c2VFbnRlcigpO1xuICAgIHRoaXMudW5saXN0ZW5Nb3VzZUxlYXZlKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzdW5iaXJkLWVwdWItY29udGFpbmVyXCIgI2VwdWJQbGF5ZXI+XG48ZGl2ICpuZ0lmPVwidmlld1N0YXRlID09PSBmcm9tQ29uc3QuTE9BRElOR1wiPlxuICAgIDxzYi1wbGF5ZXItc3RhcnQtcGFnZSBbdGl0bGVdPVwidml3ZXJTZXJ2aWNlLmNvbnRlbnROYW1lXCIgW3Byb2dyZXNzXT1cInByb2dyZXNzXCI+PC9zYi1wbGF5ZXItc3RhcnQtcGFnZT5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImVwdWItY29udGFpbmVyXCIgKm5nSWY9XCJzaG93RXB1YlZpZXdlclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3U3RhdGUgPT09IGZyb21Db25zdC5TVEFSVFwiPlxuICAgICAgICA8c2ItcGxheWVyLWhlYWRlciBjbGFzcz1cIm5vdFZpc2libGVcIiBbdG90YWxQYWdlc109XCJ2aXdlclNlcnZpY2U/LnRvdGFsTnVtYmVyT2ZQYWdlc1wiIFtwYWdlTnVtYmVyXT1cImN1cnJlbnRQYWdlSW5kZXhcIiBbY29uZmlnXT1cImhlYWRlckNvbmZpZ3VyYXRpb25cIiAoYWN0aW9ucyk9XCJoZWFkZXJBY3Rpb25zKCRldmVudClcIiBbbmdDbGFzc109XCJ7J2lzVmlzaWJsZSc6IHNob3dDb250cm9sc31cIj48L3NiLXBsY