@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
200 lines • 25.5 kB
JavaScript
import { ViewChild, Component, Input, EventEmitter, Output } from '@angular/core';
import Epub from 'epubjs';
import { epubPlayerConstants as fromConst } 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 "../services/utilService/util.service";
const _c0 = ["epubViewer"];
const MAX_TIME_TO_LOAD_SPINE = 5 * 60 * 1000; // 5 minutes
export class EpubViewerComponent {
constructor(viwerService, utilService) {
this.viwerService = viwerService;
this.utilService = utilService;
this.actions = new EventEmitter();
this.showFullScreen = false;
this.viewerEvent = new EventEmitter();
}
ngOnInit() {
this.idForRendition = `${this.identifier}-content`;
}
ngOnChanges(changes) {
if (this.rendition && !changes?.showFullScreen?.firstChange) {
this.rendition.resize();
}
}
async ngAfterViewInit() {
try {
if (!this.viwerService.isAvailableLocally) {
this.epubBlob = await this.viwerService.isValidEpubSrc(this.epubSrc);
this.eBook = Epub(this.epubBlob);
}
else if (this.viwerService.isAvailableLocally) {
this.eBook = Epub(this.epubSrc);
}
this.rendition = this.eBook.renderTo(this.idForRendition, {
flow: 'paginated',
width: '100%',
});
this.rendition.on('layout', (layout) => {
this.viwerService.totalNumberOfPages = this.eBook?.navigation?.length;
if (this.eBook.navigation.length > 2) {
this.rendition.spread('none');
this.rendition.flow('scrolled');
this.scrolled = true;
}
else {
this.rendition.spread('auto');
this.scrolled = false;
}
});
this.rendition.on('displayError', (error) => {
this.emitErrorEvent();
});
const spine = await this.utilService.fulfillWithTimeLimit(MAX_TIME_TO_LOAD_SPINE, this.eBook.loaded.spine, null);
if (spine) {
this.displayEpub();
this.lastSection = spine.last();
this.viewerEvent.emit({
type: fromConst.EPUBLOADED,
data: spine
});
this.handleActions(spine);
}
else {
this.emitErrorEvent();
}
}
catch (error) {
this.emitErrorEvent();
}
}
displayEpub() {
const { currentLocation } = this.config;
if (!currentLocation) {
this.rendition.display();
}
this.eBook.ready.then(() => {
return this.eBook.locations.generate(1000);
}).then((locations) => {
const totalPages = this.eBook?.spine?.length;
this.viwerService.totalNumberOfPages = totalPages ? (totalPages - 1) : 0;
if (currentLocation) {
const cfi = this.eBook.locations.cfiFromPercentage(Number(currentLocation));
this.rendition.display(cfi);
}
});
}
handleActions(spine) {
this.actions.subscribe((event) => {
const type = event.type;
if (this.rendition?.location?.start) {
const data = this.rendition.location.start;
if (this.scrolled && data.href === this.lastSection.href) {
this.viwerService.metaData.currentLocation = 0;
this.emitEndEvent();
}
else {
if (this.rendition.location.atEnd || (spine.length === 1 &&
(this.rendition.location.end.displayed.page + 1 >= this.rendition.location.end.displayed.total))) {
this.viwerService.metaData.currentLocation = 0;
this.emitEndEvent();
}
}
if (type === fromConst.NEXT) {
this.rendition.next().then(() => {
this.saveCurrentLocation();
this.viewerEvent.emit({
type: fromConst.PAGECHANGE,
data,
interaction: fromConst.NEXT
});
});
}
else if (type === fromConst.PREVIOUS) {
this.rendition.prev().then(() => {
this.saveCurrentLocation();
this.viewerEvent.emit({
type: fromConst.PAGECHANGE,
data,
interaction: fromConst.PREVIOUS
});
});
}
if (type === fromConst.NAVIGATE_TO_PAGE) {
this.rendition.display(event.data);
this.viewerEvent.emit({
type: fromConst.NAVIGATE_TO_PAGE,
event,
interaction: fromConst.NAVIGATE_TO_PAGE
});
}
if (type === fromConst.INVALID_PAGE_ERROR) {
this.viewerEvent.emit({
type: fromConst.INVALID_PAGE_ERROR,
event,
interaction: fromConst.INVALID_PAGE_ERROR
});
}
}
});
}
saveCurrentLocation() {
const currentLocation = this.rendition.currentLocation();
if (currentLocation?.start?.cfi) {
// Get the Percentage (or location) from that CFI
const currentPageLocation = this.eBook.locations.percentageFromCfi(currentLocation.start.cfi);
this.viwerService.metaData.currentLocation = currentPageLocation;
}
}
emitEndEvent() {
this.viewerEvent.emit({
type: fromConst.END,
data: {
percentage: 100
}
});
}
emitErrorEvent() {
this.viewerEvent.emit({
type: fromConst.ERROR,
errorCode: errorCode.contentLoadFails,
errorMessage: errorMessage.contentLoadFails
});
}
ngOnDestroy() {
this.eBook?.destroy();
}
/** @nocollapse */ static { this.ɵfac = function EpubViewerComponent_Factory(t) { return new (t || EpubViewerComponent)(i0.ɵɵdirectiveInject(i1.ViwerService), i0.ɵɵdirectiveInject(i2.UtilService)); }; }
/** @nocollapse */ static { this.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: EpubViewerComponent, selectors: [["epub-viewer"]], viewQuery: function EpubViewerComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 7);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.epubViewer = _t.first);
} }, inputs: { epubSrc: "epubSrc", config: "config", identifier: "identifier", actions: "actions", showFullScreen: "showFullScreen" }, outputs: { viewerEvent: "viewerEvent" }, features: [i0.ɵɵNgOnChangesFeature], decls: 2, vars: 1, consts: [["epubViewer", ""], [1, "rendition", 3, "id"]], template: function EpubViewerComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "div", 1, 0);
} if (rf & 2) {
i0.ɵɵproperty("id", ctx.idForRendition);
} } }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(EpubViewerComponent, [{
type: Component,
args: [{ selector: 'epub-viewer', template: "<div class=\"rendition\" [id]=\"idForRendition\" #epubViewer></div>" }]
}], () => [{ type: i1.ViwerService }, { type: i2.UtilService }], { epubViewer: [{
type: ViewChild,
args: ['epubViewer', { static: true }]
}], epubSrc: [{
type: Input
}], config: [{
type: Input
}], identifier: [{
type: Input
}], actions: [{
type: Input
}], showFullScreen: [{
type: Input
}], viewerEvent: [{
type: Output
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EpubViewerComponent, { className: "EpubViewerComponent", filePath: "lib/epub-viewer/epub-viewer.component.ts", lineNumber: 16 }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXB1Yi12aWV3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3VuYmlyZC1lcHViLXBsYXllci9zcmMvbGliL2VwdWItdmlld2VyL2VwdWItdmlld2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N1bmJpcmQtZXB1Yi1wbGF5ZXIvc3JjL2xpYi9lcHViLXZpZXdlci9lcHViLXZpZXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUM3RCxZQUFZLEVBQUUsTUFBTSxFQUErQyxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLElBQUksTUFBTSxRQUFRLENBQUM7QUFFMUIsT0FBTyxFQUFFLG1CQUFtQixJQUFJLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7O0FBR2pGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZO0FBTzFELE1BQU0sT0FBTyxtQkFBbUI7SUFlOUIsWUFDUyxZQUEwQixFQUN6QixXQUF3QjtRQUR6QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUN6QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQVJ6QixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNsQyxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN0QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFPNUMsQ0FBQztJQUNMLFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsVUFBVSxDQUFDO0lBQ3JELENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJ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QUssQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5RixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEdBQUcsbUJBQW1CLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFHO1lBQ25CLElBQUksRUFBRTtnQkFDSixVQUFVLEVBQUUsR0FBRzthQUNoQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLO1lBQ3JCLFNBQVMsRUFBRSxTQUFTLENBQUMsZ0JBQWdCO1lBQ3JDLFlBQVksRUFBRSxZQUFZLENBQUMsZ0JBQWdCO1NBQzVDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO3VHQTlLVSxtQkFBbUI7bUdBQW5CLG1CQUFtQjs7Ozs7O1lDZmhDLDRCQUErRDs7WUFBeEMsdUNBQXFCOzs7aUZEZS9CLG1CQUFtQjtjQU4vQixTQUFTOzJCQUVFLGFBQWE7dUVBU29CLFVBQVU7a0JBQXBELFNBQVM7bUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtZQUNoQyxPQUFPO2tCQUFmLEtBQUs7WUFDRyxNQUFNO2tCQUFkLEtBQUs7WUFDRyxVQUFVO2tCQUFsQixLQUFLO1lBQ0csT0FBTztrQkFBZixLQUFLO1lBQ0csY0FBYztrQkFBdEIsS0FBSztZQUNJLFdBQVc7a0JBQXBCLE1BQU07O2tGQVhJLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCxcbiAgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIE9uSW5pdCwgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBFcHViIGZyb20gJ2VwdWJqcyc7XG5pbXBvcnQgeyBWaXdlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy92aWV3ZXJTZXJ2aWNlL3Zpd2VyLXNlcnZpY2UnO1xuaW1wb3J0IHsgZXB1YlBsYXllckNvbnN0YW50cyBhcyBmcm9tQ29uc3QgfSBmcm9tICcuLi9zdW5iaXJkLWVwdWIuY29uc3RhbnQnO1xuaW1wb3J0IHsgZXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UgfSBmcm9tICdAcHJvamVjdC1zdW5iaXJkL3N1bmJpcmQtcGxheWVyLXNkay12OSc7XG5pbXBvcnQgeyBVdGlsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3V0aWxTZXJ2aWNlL3V0aWwuc2VydmljZSc7XG5cbmNvbnN0IE1BWF9USU1FX1RPX0xPQURfU1BJTkUgPSA1ICogNjAgKiAxMDAwOyAvLyA1IG1pbnV0ZXNcbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2VwdWItdmlld2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2VwdWItdmlld2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZXB1Yi12aWV3ZXIuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIEVwdWJWaWV3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgZUJvb2s6IGFueTtcbiAgcmVuZGl0aW9uOiBhbnk7XG4gIGxhc3RTZWN0aW9uOiBhbnk7XG4gIHNjcm9sbGVkOiBib29sZWFuO1xuICBAVmlld0NoaWxkKCdlcHViVmlld2VyJywgeyBzdGF0aWM6IHRydWUgfSkgZXB1YlZpZXdlcjogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgZXB1YlNyYzogc3RyaW5nO1xuICBASW5wdXQoKSBjb25maWc6IGFueTtcbiAgQElucHV0KCkgaWRlbnRpZmllcjogc3RyaW5nO1xuICBASW5wdXQoKSBhY3Rpb25zID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBJbnB1dCgpIHNob3dGdWxsU2NyZWVuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSB2aWV3ZXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBpZEZvclJlbmRpdGlvbjogYW55O1xuICBlcHViQmxvYjogb2JqZWN0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB2aXdlclNlcnZpY2U6IFZpd2VyU2VydmljZSxcbiAgICBwcml2YXRlIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZVxuICApIHsgfVxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmlkRm9yUmVuZGl0aW9uID0gYCR7dGhpcy5pZGVudGlmaWVyfS1jb250ZW50YDtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAodGhpcy5yZW5kaXRpb24gJiYgIWNoYW5nZXM/LnNob3dGdWxsU2NyZWVuPy5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5yZW5kaXRpb24ucmVzaXplKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMudml3ZXJTZXJ2aWNlLmlzQXZhaWxhYmxlTG9jYWxseSkge1xuICAgICAgICB0aGlzLmVwdWJCbG9iID0gYXdhaXQgdGhpcy52aXdlclNlcnZpY2UuaXNWYWxpZEVwdWJTcmModGhpcy5lcHViU3JjKTtcbiAgICAgICAgdGhpcy5lQm9vayA9IEVwdWIodGhpcy5lcHViQmxvYik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudml3ZXJTZXJ2aWNlLmlzQXZhaWxhYmxlTG9jYWxseSkge1xuICAgICAgICB0aGlzLmVCb29rID0gRXB1Yih0aGlzLmVwdWJTcmMpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW5kaXRpb24gPSB0aGlzLmVCb29rLnJlbmRlclRvKHRoaXMuaWRGb3JSZW5kaXRpb24sIHtcbiAgICAgICAgZmxvdzogJ3BhZ2luYXRlZCcsXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVuZGl0aW9uLm9uKCdsYXlvdXQnLCAobGF5b3V0KSA9PiB7XG4gICAgICAgIHRoaXMudml3ZXJTZXJ2aWNlLnRvdGFsTnVtYmVyT2ZQYWdlcyA9IHRoaXMuZUJvb2s/Lm5hdmlnYXRpb24/Lmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuZUJvb2submF2aWdhdGlvbi5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgdGhpcy5yZW5kaXRpb24uc3ByZWFkKCdub25lJyk7XG4gICAgICAgICAgdGhpcy5yZW5kaXRpb24uZmxvdygnc2Nyb2xsZWQnKTtcbiAgICAgICAgICB0aGlzLnNjcm9sbGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlbmRpdGlvbi5zcHJlYWQoJ2F1dG8nKTtcbiAgICAgICAgICB0aGlzLnNjcm9sbGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJlbmRpdGlvbi5vbignZGlzcGxheUVycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdEVycm9yRXZlbnQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzcGluZSA9IGF3YWl0IHRoaXMudXRpbFNlcnZpY2UuZnVsZmlsbFdpdGhUaW1lTGltaXQoTUFYX1RJTUVfVE9fTE9BRF9TUElORSwgdGhpcy5lQm9vay5sb2FkZWQuc3BpbmUsIG51bGwpO1xuXG4gICAgICBpZiAoc3BpbmUpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5RXB1YigpO1xuICAgICAgICB0aGlzLmxhc3RTZWN0aW9uID0gc3BpbmUubGFzdCgpO1xuICAgICAgICB0aGlzLnZpZXdlckV2ZW50LmVtaXQoe1xuICAgICAgICAgIHR5cGU6IGZyb21Db25zdC5FUFVCTE9BREVELFxuICAgICAgICAgIGRhdGE6IHNwaW5lXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmhhbmRsZUFjdGlvbnMoc3BpbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0RXJyb3JFdmVudCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVtaXRFcnJvckV2ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgZGlzcGxheUVwdWIoKSB7XG4gICAgY29uc3QgeyBjdXJyZW50TG9jYXRpb24gfSA9IHRoaXMuY29uZmlnO1xuICAgIGlmICghY3VycmVudExvY2F0aW9uKSB7XG4gICAgICB0aGlzLnJlbmRpdGlvbi5kaXNwbGF5KCk7XG4gICAgfVxuICAgIHRoaXMuZUJvb2sucmVhZHkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5lQm9vay5sb2NhdGlvbnMuZ2VuZXJhdGUoMTAwMCk7XG4gICAgfSkudGhlbigobG9jYXRpb25zKSA9PiB7XG4gICAgICBjb25zdCB0b3RhbFBhZ2VzID0gdGhpcy5lQm9vaz8uc3BpbmU/Lmxlbmd0aDtcbiAgICAgIHRoaXMudml3ZXJTZXJ2aWNlLnRvdGFsTnVtYmVyT2ZQYWdlcyA9IHRvdGFsUGFnZXMgPyAodG90YWxQYWdlcyAtIDEpIDogMDtcbiAgICAgIGlmIChjdXJyZW50TG9jYXRpb24pIHtcbiAgICAgICAgY29uc3QgY2ZpID0gdGhpcy5lQm9vay5sb2NhdGlvbnMuY2ZpRnJvbVBlcmNlbnRhZ2UoTnVtYmVyKGN1cnJlbnRMb2NhdGlvbikpO1xuICAgICAgICB0aGlzLnJlbmRpdGlvbi5kaXNwbGF5KGNmaSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVBY3Rpb25zKHNwaW5lKSB7XG4gICAgdGhpcy5hY3Rpb25zLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBldmVudC50eXBlO1xuICAgICAgaWYgKHRoaXMucmVuZGl0aW9uPy5sb2NhdGlvbj8uc3RhcnQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVuZGl0aW9uLmxvY2F0aW9uLnN0YXJ0O1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxlZCAmJiBkYXRhLmhyZWYgPT09IHRoaXMubGFzdFNlY3Rpb24uaHJlZikge1xuICAgICAgICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLmN1cnJlbnRMb2NhdGlvbiA9IDA7XG4gICAgICAgICAgdGhpcy5lbWl0RW5kRXZlbnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5yZW5kaXRpb24ubG9jYXRpb24uYXRFbmQgfHwgKHNwaW5lLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgKHRoaXMucmVuZGl0aW9uLmxvY2F0aW9uLmVuZC5kaXNwbGF5ZWQucGFnZSArIDEgPj0gdGhpcy5yZW5kaXRpb24ubG9jYXRpb24uZW5kLmRpc3BsYXllZC50b3RhbCkpKSB7XG4gICAgICAgICAgICB0aGlzLnZpd2VyU2VydmljZS5tZXRhRGF0YS5jdXJyZW50TG9jYXRpb24gPSAwO1xuICAgICAgICAgICAgdGhpcy5lbWl0RW5kRXZlbnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IGZyb21Db25zdC5ORVhUKSB7XG4gICAgICAgICAgdGhpcy5yZW5kaXRpb24ubmV4dCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zYXZlQ3VycmVudExvY2F0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdlckV2ZW50LmVtaXQoe1xuICAgICAgICAgICAgICB0eXBlOiBmcm9tQ29uc3QuUEFHRUNIQU5HRSxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgaW50ZXJhY3Rpb246IGZyb21Db25zdC5ORVhUXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBmcm9tQ29uc3QuUFJFVklPVVMpIHtcbiAgICAgICAgICB0aGlzLnJlbmRpdGlvbi5wcmV2KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmVDdXJyZW50TG9jYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMudmlld2VyRXZlbnQuZW1pdCh7XG4gICAgICAgICAgICAgIHR5cGU6IGZyb21Db25zdC5QQUdFQ0hBTkdFLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBpbnRlcmFjdGlvbjogZnJvbUNvbnN0LlBSRVZJT1VTXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gZnJvbUNvbnN0Lk5BVklHQVRFX1RPX1BBR0UpIHtcbiAgICAgICAgICB0aGlzLnJlbmRpdGlvbi5kaXNwbGF5KGV2ZW50LmRhdGEpO1xuICAgICAgICAgIHRoaXMudmlld2VyRXZlbnQuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiBmcm9tQ29uc3QuTkFWSUdBVEVfVE9fUEFHRSxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgaW50ZXJhY3Rpb246IGZyb21Db25zdC5OQVZJR0FURV9UT19QQUdFXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSA9PT0gZnJvbUNvbnN0LklOVkFMSURfUEFHRV9FUlJPUikge1xuICAgICAgICAgIHRoaXMudmlld2VyRXZlbnQuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiBmcm9tQ29uc3QuSU5WQUxJRF9QQUdFX0VSUk9SLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBpbnRlcmFjdGlvbjogZnJvbUNvbnN0LklOVkFMSURfUEFHRV9FUlJPUlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzYXZlQ3VycmVudExvY2F0aW9uKCkge1xuICAgIGNvbnN0IGN1cnJlbnRMb2NhdGlvbiA9IHRoaXMucmVuZGl0aW9uLmN1cnJlbnRMb2NhdGlvbigpO1xuICAgIGlmIChjdXJyZW50TG9jYXRpb24/LnN0YXJ0Py5jZmkpIHtcbiAgICAgIC8vIEdldCB0aGUgUGVyY2VudGFnZSAob3IgbG9jYXRpb24pIGZyb20gdGhhdCBDRklcbiAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTG9jYXRpb24gPSB0aGlzLmVCb29rLmxvY2F0aW9ucy5wZXJjZW50YWdlRnJvbUNmaShjdXJyZW50TG9jYXRpb24uc3RhcnQuY2ZpKTtcbiAgICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLmN1cnJlbnRMb2NhdGlvbiA9IGN1cnJlbnRQYWdlTG9jYXRpb247XG4gICAgfVxuICB9XG5cbiAgZW1pdEVuZEV2ZW50KCkge1xuICAgIHRoaXMudmlld2VyRXZlbnQuZW1pdCh7XG4gICAgICB0eXBlOiBmcm9tQ29uc3QuRU5ELFxuICAgICAgZGF0YToge1xuICAgICAgICBwZXJjZW50YWdlOiAxMDBcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGVtaXRFcnJvckV2ZW50KCkge1xuICAgIHRoaXMudmlld2VyRXZlbnQuZW1pdCh7XG4gICAgICB0eXBlOiBmcm9tQ29uc3QuRVJST1IsXG4gICAgICBlcnJvckNvZGU6IGVycm9yQ29kZS5jb250ZW50TG9hZEZhaWxzLFxuICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvck1lc3NhZ2UuY29udGVudExvYWRGYWlsc1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5lQm9vaz8uZGVzdHJveSgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicmVuZGl0aW9uXCIgW2lkXT1cImlkRm9yUmVuZGl0aW9uXCIgI2VwdWJWaWV3ZXI+PC9kaXY+Il19