@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
147 lines • 19.6 kB
JavaScript
import { Injectable, EventEmitter } from '@angular/core';
import { telemetryType } from '../../sunbird-epub.constant';
import * as i0 from "@angular/core";
import * as i1 from "../utilService/util.service";
import * as i2 from "../../sunbird-epub-player.service";
import * as i3 from "@angular/common/http";
export class ViwerService {
constructor(utilService, epubPlayerService, http) {
this.utilService = utilService;
this.epubPlayerService = epubPlayerService;
this.http = http;
this.currentIndex = 0;
this.totalNumberOfPages = 0;
this.endPageSeen = false;
this.timeSpent = '0:0';
this.version = '1.0';
this.playerEvent = new EventEmitter();
this.isAvailableLocally = false;
this.isEndEventRaised = false;
}
initialize({ context, config, metadata }) {
this.epubPlayerStartTime = this.epubLastPageTime = new Date().getTime();
this.totalNumberOfPages = 0;
this.currentIndex = 0;
this.contentName = metadata.name;
this.identifier = metadata.identifier;
this.artifactUrl = metadata.artifactUrl;
this.isAvailableLocally = metadata.isAvailableLocally;
if (this.isAvailableLocally) {
const basePath = (metadata.streamingUrl) ? (metadata.streamingUrl) : (metadata.basePath || metadata.baseDir);
this.src = `${basePath}/${metadata.artifactUrl}`;
}
else {
this.src = metadata.streamingUrl || metadata.artifactUrl;
}
if (context.userData) {
const { userData: { firstName, lastName } } = context;
this.userName = firstName === lastName ? firstName : `${firstName} ${lastName}`;
}
this.metaData = {
pagesVisited: [],
totalPages: 0,
duration: [],
zoom: [],
rotation: []
};
this.showDownloadPopup = false;
this.endPageSeen = false;
}
raiseStartEvent(event) {
this.currentIndex = event.items[0].index;
const duration = new Date().getTime() - this.epubPlayerStartTime;
const startEvent = {
eid: 'START',
ver: this.version,
edata: {
type: 'START',
currentPage: this.currentIndex,
duration
},
metaData: this.metaData
};
this.playerEvent.emit(startEvent);
this.epubLastPageTime = this.epubPlayerStartTime = new Date().getTime();
this.epubPlayerService.start(duration);
}
raiseHeartBeatEvent(event, teleType) {
if (event.data) {
this.currentIndex = event.data.index;
}
const eventType = event.type ? event.type : event;
const heartBeatEvent = {
eid: 'HEARTBEAT',
ver: this.version,
edata: {
type: eventType,
currentPage: this.currentIndex
},
metaData: this.metaData
};
this.playerEvent.emit(heartBeatEvent);
if (telemetryType.IMPRESSION === teleType) {
this.epubPlayerService.impression(this.currentIndex);
}
if (telemetryType.INTERACT === teleType) {
this.epubPlayerService.interact(eventType.toLowerCase(), this.currentIndex);
}
}
raiseEndEvent(event) {
if (!this.isEndEventRaised) {
this.currentIndex = event.data.index;
const percentage = event.data.percentage || 0;
if (event.data.percentage) {
this.endPageSeen = true;
}
const duration = new Date().getTime() - this.epubPlayerStartTime;
this.metaData.duration = duration;
this.metaData.totalPages = this.totalNumberOfPages;
const endEvent = {
eid: 'END',
ver: this.version,
edata: {
type: 'END',
currentPage: event.data.index,
totalPages: this.totalNumberOfPages,
duration
},
metaData: this.metaData
};
this.playerEvent.emit(endEvent);
const visitedlength = this.currentIndex;
this.timeSpent = this.utilService.getTimeSpentText(this.epubPlayerStartTime);
this.epubPlayerService.end(duration, percentage, this.currentIndex, this.endPageSeen);
}
}
raiseExceptionLog(errorCode, pageIndex, errorType, traceId, stacktrace) {
const exceptionLogEvent = {
eid: 'ERROR',
edata: {
err: errorCode,
errtype: errorType,
requestid: traceId || '',
stacktrace
}
};
this.playerEvent.emit(exceptionLogEvent);
this.epubPlayerService.error(errorCode, errorType, pageIndex, stacktrace);
}
isValidEpubSrc(src) {
return new Promise(async (resolve, reject) => {
this.http.get(src, { responseType: 'blob' }).toPromise().then((res) => {
resolve(res);
}).catch((error) => {
reject(error);
});
});
}
/** @nocollapse */ static { this.ɵfac = function ViwerService_Factory(t) { return new (t || ViwerService)(i0.ɵɵinject(i1.UtilService), i0.ɵɵinject(i2.EpubPlayerService), i0.ɵɵinject(i3.HttpClient)); }; }
/** @nocollapse */ static { this.ɵprov = /** @pureOrBreakMyCode */ i0.ɵɵdefineInjectable({ token: ViwerService, factory: ViwerService.ɵfac, providedIn: 'root' }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ViwerService, [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], () => [{ type: i1.UtilService }, { type: i2.EpubPlayerService }, { type: i3.HttpClient }], null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml3ZXItc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N1bmJpcmQtZXB1Yi1wbGF5ZXIvc3JjL2xpYi9zZXJ2aWNlcy92aWV3ZXJTZXJ2aWNlL3Zpd2VyLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7OztBQU01RCxNQUFNLE9BQU8sWUFBWTtJQW9CdkIsWUFDVSxXQUF3QixFQUN4QixpQkFBb0MsRUFDcEMsSUFBZ0I7UUFGaEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBckJuQixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQix1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFHdkIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNqQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQVN0Qyx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IscUJBQWdCLEdBQUcsS0FBSyxDQUFDO0lBSzVCLENBQUM7SUFFTCxVQUFVLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBZ0I7UUFDcEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDeEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUN0RCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLE1BQU0sUUFBUSxHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQzNELENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQixNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO1lBQ3RELElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNsRixDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLFlBQVksRUFBRSxFQUFFO1lBQ2hCLFVBQVUsRUFBRSxDQUFDO1lBQ2IsUUFBUSxFQUFFLEVBQUU7WUFDWixJQUFJLEVBQUUsRUFBRTtZQUNSLFFBQVEsRUFBRSxFQUFFO1NBQ2IsQ0FBQztRQUNGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFLO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUc7WUFDakIsR0FBRyxFQUFFLE9BQU87WUFDWixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDakIsS0FBSyxFQUFFO2dCQUNMLElBQUksRUFBRSxPQUFPO2dCQUNiLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDOUIsUUFBUTthQUNUO1lBQ0QsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFFBQVM7UUFDbEMsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDbEQsTUFBTSxjQUFjLEdBQUc7WUFDckIsR0FBRyxFQUFFLFdBQVc7WUFDaEIsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ2pCLEtBQUssRUFBRTtnQkFDTCxJQUFJLEVBQUUsU0FBUztnQkFDZixXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVk7YUFDL0I7WUFDRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDeEIsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksYUFBYSxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBSSxhQUFhLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5RSxDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFLO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3JDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQztZQUM5QyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQzFCLENBQUM7WUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQ25ELE1BQU0sUUFBUSxHQUFHO2dCQUNmLEdBQUcsRUFBRSxLQUFLO2dCQUNWLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDakIsS0FBSyxFQUFFO29CQUNMLElBQUksRUFBRSxLQUFLO29CQUNYLFdBQVcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUs7b0JBQzdCLFVBQVUsRUFBRSxJQUFJLENBQUMsa0JBQWtCO29CQUNuQyxRQUFRO2lCQUNUO2dCQUNELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTthQUN4QixDQUFDO1lBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7SUFDSCxDQUFDO0lBR0QsaUJBQWlCLENBQUMsU0FBaUIsRUFBRyxTQUFTLEVBQUUsU0FBaUIsRUFBRyxPQUFPLEVBQUcsVUFBaUI7UUFDOUYsTUFBTSxpQkFBaUIsR0FBRztZQUN4QixHQUFHLEVBQUUsT0FBTztZQUNaLEtBQUssRUFBRTtnQkFDSCxHQUFHLEVBQUUsU0FBUztnQkFDZCxPQUFPLEVBQUUsU0FBUztnQkFDbEIsU0FBUyxFQUFFLE9BQU8sSUFBSSxFQUFFO2dCQUN4QixVQUFVO2FBQ2I7U0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRyxTQUFTLEVBQUUsU0FBUyxFQUFHLFVBQVUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBRztRQUNoQixPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUcsTUFBTSxFQUFFLEVBQUU7WUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3BFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNqQixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Z0dBbkpVLFlBQVk7c0dBQVosWUFBWSxXQUFaLFlBQVksbUJBRlgsTUFBTTs7aUZBRVAsWUFBWTtjQUh4QixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBsYXllckNvbmZpZyB9IGZyb20gJy4uLy4uL3N1bmJpcmQtZXB1Yi1wbGF5ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEVwdWJQbGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3VuYmlyZC1lcHViLXBsYXllci5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbFNlcnZpY2UvdXRpbC5zZXJ2aWNlJztcbmltcG9ydCB7IHRlbGVtZXRyeVR5cGUgfSBmcm9tICcuLi8uLi9zdW5iaXJkLWVwdWIuY29uc3RhbnQnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVml3ZXJTZXJ2aWNlIHtcblxuICBwdWJsaWMgY3VycmVudEluZGV4ID0gMDtcbiAgcHVibGljIHRvdGFsTnVtYmVyT2ZQYWdlcyA9IDA7XG4gIHB1YmxpYyBlcHViUGxheWVyU3RhcnRUaW1lOiBudW1iZXI7XG4gIHB1YmxpYyBlcHViTGFzdFBhZ2VUaW1lOiBudW1iZXI7XG4gIHB1YmxpYyBlbmRQYWdlU2VlbiA9IGZhbHNlO1xuICBwdWJsaWMgdGltZVNwZW50ID0gJzA6MCc7XG4gIHByaXZhdGUgdmVyc2lvbiA9ICcxLjAnO1xuICBwdWJsaWMgcGxheWVyRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgcHVibGljIGNvbnRlbnROYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBsb2FkaW5nUHJvZ3Jlc3M6IG51bWJlcjtcbiAgcHVibGljIHNob3dEb3dubG9hZFBvcHVwOiBib29sZWFuO1xuICBwdWJsaWMgc3JjOiBzdHJpbmc7XG4gIHB1YmxpYyB1c2VyTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgbWV0YURhdGE6IGFueTtcbiAgcHVibGljIGlkZW50aWZpZXI6IGFueTtcbiAgcHVibGljIGFydGlmYWN0VXJsOiBhbnk7XG4gIHB1YmxpYyBpc0F2YWlsYWJsZUxvY2FsbHkgPSBmYWxzZTtcbiAgcHVibGljIGlzRW5kRXZlbnRSYWlzZWQgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB1dGlsU2VydmljZTogVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlcHViUGxheWVyU2VydmljZTogRXB1YlBsYXllclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50XG4gICkgeyB9XG5cbiAgaW5pdGlhbGl6ZSh7IGNvbnRleHQsIGNvbmZpZywgbWV0YWRhdGEgfTogUGxheWVyQ29uZmlnKSB7XG4gICAgdGhpcy5lcHViUGxheWVyU3RhcnRUaW1lID0gdGhpcy5lcHViTGFzdFBhZ2VUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdGhpcy50b3RhbE51bWJlck9mUGFnZXMgPSAwO1xuICAgIHRoaXMuY3VycmVudEluZGV4ID0gMDtcbiAgICB0aGlzLmNvbnRlbnROYW1lID0gbWV0YWRhdGEubmFtZTtcbiAgICB0aGlzLmlkZW50aWZpZXIgPSBtZXRhZGF0YS5pZGVudGlmaWVyO1xuICAgIHRoaXMuYXJ0aWZhY3RVcmwgPSBtZXRhZGF0YS5hcnRpZmFjdFVybDtcbiAgICB0aGlzLmlzQXZhaWxhYmxlTG9jYWxseSA9IG1ldGFkYXRhLmlzQXZhaWxhYmxlTG9jYWxseTtcbiAgICBpZiAodGhpcy5pc0F2YWlsYWJsZUxvY2FsbHkpIHtcbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gKG1ldGFkYXRhLnN0cmVhbWluZ1VybCkgPyAobWV0YWRhdGEuc3RyZWFtaW5nVXJsKSA6IChtZXRhZGF0YS5iYXNlUGF0aCB8fCBtZXRhZGF0YS5iYXNlRGlyKTtcbiAgICAgIHRoaXMuc3JjID0gYCR7YmFzZVBhdGh9LyR7bWV0YWRhdGEuYXJ0aWZhY3RVcmx9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zcmMgPSBtZXRhZGF0YS5zdHJlYW1pbmdVcmwgfHwgbWV0YWRhdGEuYXJ0aWZhY3RVcmw7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LnVzZXJEYXRhKSB7XG4gICAgICBjb25zdCB7IHVzZXJEYXRhOiB7IGZpcnN0TmFtZSwgbGFzdE5hbWUgfSB9ID0gY29udGV4dDtcbiAgICAgIHRoaXMudXNlck5hbWUgPSBmaXJzdE5hbWUgPT09IGxhc3ROYW1lID8gZmlyc3ROYW1lIDogYCR7Zmlyc3ROYW1lfSAke2xhc3ROYW1lfWA7XG4gICAgfVxuICAgIHRoaXMubWV0YURhdGEgPSB7XG4gICAgICBwYWdlc1Zpc2l0ZWQ6IFtdLFxuICAgICAgdG90YWxQYWdlczogMCxcbiAgICAgIGR1cmF0aW9uOiBbXSxcbiAgICAgIHpvb206IFtdLFxuICAgICAgcm90YXRpb246IFtdXG4gICAgfTtcbiAgICB0aGlzLnNob3dEb3dubG9hZFBvcHVwID0gZmFsc2U7XG4gICAgdGhpcy5lbmRQYWdlU2VlbiA9IGZhbHNlO1xuICB9XG5cbiAgcmFpc2VTdGFydEV2ZW50KGV2ZW50KSB7XG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSBldmVudC5pdGVtc1swXS5pbmRleDtcbiAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5lcHViUGxheWVyU3RhcnRUaW1lO1xuICAgIGNvbnN0IHN0YXJ0RXZlbnQgPSB7XG4gICAgICBlaWQ6ICdTVEFSVCcsXG4gICAgICB2ZXI6IHRoaXMudmVyc2lvbixcbiAgICAgIGVkYXRhOiB7XG4gICAgICAgIHR5cGU6ICdTVEFSVCcsXG4gICAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLmN1cnJlbnRJbmRleCxcbiAgICAgICAgZHVyYXRpb25cbiAgICAgIH0sXG4gICAgICBtZXRhRGF0YTogdGhpcy5tZXRhRGF0YVxuICAgIH07XG4gICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KHN0YXJ0RXZlbnQpO1xuICAgIHRoaXMuZXB1Ykxhc3RQYWdlVGltZSA9IHRoaXMuZXB1YlBsYXllclN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHRoaXMuZXB1YlBsYXllclNlcnZpY2Uuc3RhcnQoZHVyYXRpb24pO1xuICB9XG5cbiAgcmFpc2VIZWFydEJlYXRFdmVudChldmVudCwgdGVsZVR5cGU/KSB7XG4gICAgaWYgKGV2ZW50LmRhdGEpIHtcbiAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gZXZlbnQuZGF0YS5pbmRleDtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRUeXBlID0gZXZlbnQudHlwZSA/IGV2ZW50LnR5cGUgOiBldmVudDtcbiAgICBjb25zdCBoZWFydEJlYXRFdmVudCA9IHtcbiAgICAgIGVpZDogJ0hFQVJUQkVBVCcsXG4gICAgICB2ZXI6IHRoaXMudmVyc2lvbixcbiAgICAgIGVkYXRhOiB7XG4gICAgICAgIHR5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgY3VycmVudFBhZ2U6IHRoaXMuY3VycmVudEluZGV4XG4gICAgICB9LFxuICAgICAgbWV0YURhdGE6IHRoaXMubWV0YURhdGFcbiAgICB9O1xuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChoZWFydEJlYXRFdmVudCk7XG4gICAgaWYgKHRlbGVtZXRyeVR5cGUuSU1QUkVTU0lPTiA9PT0gdGVsZVR5cGUpIHtcbiAgICAgIHRoaXMuZXB1YlBsYXllclNlcnZpY2UuaW1wcmVzc2lvbih0aGlzLmN1cnJlbnRJbmRleCk7XG4gICAgfVxuICAgIGlmICh0ZWxlbWV0cnlUeXBlLklOVEVSQUNUID09PSB0ZWxlVHlwZSkge1xuICAgICAgdGhpcy5lcHViUGxheWVyU2VydmljZS5pbnRlcmFjdChldmVudFR5cGUudG9Mb3dlckNhc2UoKSwgdGhpcy5jdXJyZW50SW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHJhaXNlRW5kRXZlbnQoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNFbmRFdmVudFJhaXNlZCkge1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBldmVudC5kYXRhLmluZGV4O1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IGV2ZW50LmRhdGEucGVyY2VudGFnZSB8fCAwO1xuICAgICAgaWYgKGV2ZW50LmRhdGEucGVyY2VudGFnZSkge1xuICAgICAgICB0aGlzLmVuZFBhZ2VTZWVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLmVwdWJQbGF5ZXJTdGFydFRpbWU7XG4gICAgICB0aGlzLm1ldGFEYXRhLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICB0aGlzLm1ldGFEYXRhLnRvdGFsUGFnZXMgPSB0aGlzLnRvdGFsTnVtYmVyT2ZQYWdlcztcbiAgICAgIGNvbnN0IGVuZEV2ZW50ID0ge1xuICAgICAgICBlaWQ6ICdFTkQnLFxuICAgICAgICB2ZXI6IHRoaXMudmVyc2lvbixcbiAgICAgICAgZWRhdGE6IHtcbiAgICAgICAgICB0eXBlOiAnRU5EJyxcbiAgICAgICAgICBjdXJyZW50UGFnZTogZXZlbnQuZGF0YS5pbmRleCxcbiAgICAgICAgICB0b3RhbFBhZ2VzOiB0aGlzLnRvdGFsTnVtYmVyT2ZQYWdlcyxcbiAgICAgICAgICBkdXJhdGlvblxuICAgICAgICB9LFxuICAgICAgICBtZXRhRGF0YTogdGhpcy5tZXRhRGF0YVxuICAgICAgfTtcbiAgICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChlbmRFdmVudCk7XG4gICAgICBjb25zdCB2aXNpdGVkbGVuZ3RoID0gdGhpcy5jdXJyZW50SW5kZXg7XG4gICAgICB0aGlzLnRpbWVTcGVudCA9IHRoaXMudXRpbFNlcnZpY2UuZ2V0VGltZVNwZW50VGV4dCh0aGlzLmVwdWJQbGF5ZXJTdGFydFRpbWUpO1xuICAgICAgdGhpcy5lcHViUGxheWVyU2VydmljZS5lbmQoZHVyYXRpb24sIHBlcmNlbnRhZ2UsIHRoaXMuY3VycmVudEluZGV4LCB0aGlzLmVuZFBhZ2VTZWVuKTtcbiAgICB9XG4gIH1cblxuXG4gIHJhaXNlRXhjZXB0aW9uTG9nKGVycm9yQ29kZTogc3RyaW5nICwgcGFnZUluZGV4LCBlcnJvclR5cGU6IHN0cmluZyAsIHRyYWNlSWQgLCBzdGFja3RyYWNlOiBFcnJvciApIHtcbiAgICBjb25zdCBleGNlcHRpb25Mb2dFdmVudCA9IHtcbiAgICAgIGVpZDogJ0VSUk9SJyxcbiAgICAgIGVkYXRhOiB7XG4gICAgICAgICAgZXJyOiBlcnJvckNvZGUsXG4gICAgICAgICAgZXJydHlwZTogZXJyb3JUeXBlLFxuICAgICAgICAgIHJlcXVlc3RpZDogdHJhY2VJZCB8fCAnJyxcbiAgICAgICAgICBzdGFja3RyYWNlXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQoZXhjZXB0aW9uTG9nRXZlbnQpO1xuICAgIHRoaXMuZXB1YlBsYXllclNlcnZpY2UuZXJyb3IoZXJyb3JDb2RlICwgZXJyb3JUeXBlLCBwYWdlSW5kZXggLCBzdGFja3RyYWNlKTtcbiAgfVxuXG4gIGlzVmFsaWRFcHViU3JjKHNyYyk6IFByb21pc2U8QmxvYj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSAsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5odHRwLmdldChzcmMsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSkudG9Qcm9taXNlKCkudGhlbigocmVzKSA9PiB7XG4gICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==