UNPKG

@dicdikshaorg/video-player-mobile-v9

Version:

Contains Video 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 devel

445 lines 40.8 kB
/** * @fileoverview added by tsickle * Generated from: lib/services/viewer.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __awaiter } from "tslib"; import { HttpClient } from '@angular/common/http'; import { EventEmitter, Injectable, Optional } from '@angular/core'; import { SunbirdVideoPlayerService } from '../sunbird-video-player.service'; import { UtilService } from './util.service'; import { errorCode, errorMessage } from '@dicdikshaorg/player-sdk-v9'; import { QuestionCursor } from '@project-sunbird/sunbird-quml-player-v9'; import { of } from 'rxjs'; import { map } from 'rxjs/operators'; import * as _ from 'lodash-es'; import * as i0 from "@angular/core"; import * as i1 from "../sunbird-video-player.service"; import * as i2 from "./util.service"; import * as i3 from "@angular/common/http"; import * as i4 from "@project-sunbird/sunbird-quml-player-v9"; export class ViewerService { /** * @param {?} videoPlayerService * @param {?} utilService * @param {?} http * @param {?} questionCursor */ constructor(videoPlayerService, utilService, http, questionCursor) { this.videoPlayerService = videoPlayerService; this.utilService = utilService; this.http = http; this.questionCursor = questionCursor; this.endPageSeen = false; this.timeSpent = '0:0'; this.version = '1.0'; this.playerEvent = new EventEmitter(); this.sidebarMenuEvent = new EventEmitter(); this.isAvailableLocally = false; this.interceptionResponses = {}; this.showScore = false; this.scoreObtained = 0; this.contentMap = {}; this.isEndEventRaised = false; this.PlayerLoadStartedAt = new Date().getTime(); } /** * @param {?} __0 * @return {?} */ initialize({ context, config, metadata }) { this.contentName = metadata.name; this.isAvailableLocally = metadata.isAvailableLocally; this.streamingUrl = metadata.streamingUrl; this.artifactUrl = metadata.artifactUrl; this.mimeType = metadata.streamingUrl ? 'application/x-mpegURL' : metadata.mimeType; this.artifactMimeType = metadata.mimeType; this.isAvailableLocally = metadata.isAvailableLocally; this.traceId = config.traceId; this.interceptionPoints = metadata.interceptionPoints; if (context.userData) { const { userData: { firstName, lastName } } = context; this.userName = firstName === lastName ? firstName : `${firstName} ${lastName}`; } this.metaData = { actions: [], volume: [], playBackSpeeds: [], totalDuration: 0, muted: undefined, currentDuration: undefined, transcripts: [] }; this.transcripts = metadata.transcripts ? metadata.transcripts : []; this.showDownloadPopup = false; this.endPageSeen = false; if (this.isAvailableLocally) { /** @type {?} */ const basePath = (metadata.streamingUrl) ? (metadata.streamingUrl) : (metadata.basePath || metadata.baseDir); this.streamingUrl = `${basePath}/${metadata.artifactUrl}`; this.mimeType = metadata.mimeType; } } /** * @param {?} selectedTranscripts * @return {?} */ handleTranscriptsData(selectedTranscripts) { this.metaData.transcripts = selectedTranscripts; if (!_.isArray(this.transcripts)) { this.raiseExceptionLog('INVALID_TRANSCRIPT_DATATYPE', 'TRANSCRIPT', new Error('Transcript data should be array'), this.traceId); return []; } else { _.forEach(this.transcripts, (/** * @param {?} value * @return {?} */ (value) => { if (!(_.some(this.transcripts, { language: value.language, artifactUrl: value.artifactUrl, languageCode: value.languageCode, identifier: value.identifier }))) { this.raiseExceptionLog('TRANSCRIPT_DATA_MISSING', 'TRANSCRIPT', new Error('Transcript object dose not have required fields'), this.traceId); return []; } else if (!_.isEmpty(selectedTranscripts) && (_.last(selectedTranscripts) !== 'off' && _.last(selectedTranscripts) === value.languageCode)) { value.default = true; } })); } return this.transcripts; } /** * @return {?} */ getPlayerOptions() { return __awaiter(this, void 0, void 0, function* () { if (!this.streamingUrl) { return [{ src: this.artifactUrl, type: this.artifactMimeType }]; } else { /** @type {?} */ const data = yield this.http.head(this.streamingUrl, { responseType: 'blob' }).toPromise().catch((/** * @param {?} error * @return {?} */ error => { // tslint:disable-next-line:max-line-length this.raiseExceptionLog(errorCode.streamingUrlSupport, errorMessage.streamingUrlSupport, new Error(`Streaming Url Not Supported ${this.streamingUrl}`), this.traceId); })); if (data) { return [{ src: this.streamingUrl, type: this.mimeType }]; } else { return [{ src: this.artifactUrl, type: this.artifactMimeType }]; } } }); } /** * @return {?} */ getMarkers() { var _a, _b; if ((_b = (_a = this) === null || _a === void 0 ? void 0 : _a.interceptionPoints) === null || _b === void 0 ? void 0 : _b.items) { try { /** @type {?} */ const interceptionPoints = this.interceptionPoints; this.showScore = true; return interceptionPoints.items.map((/** * @param {?} __0 * @return {?} */ ({ interceptionPoint, identifier, type }) => { return { time: interceptionPoint, type, identifier, duration: 3 }; })); } catch (error) { console.log(error); this.raiseExceptionLog('CPV2_CONT_INTERCEPTION_PARSE', 'error parsing the inteception points string', error, ''); this.showScore = false; } } return null; } /** * @param {?} identifier * @return {?} */ getQuestionSet(identifier) { /** @type {?} */ const content = this.contentMap[identifier]; if (!content) { if (!this.questionCursor) { return null; } else { return this.questionCursor.getQuestionSet(identifier) .pipe(map((/** * @param {?} response * @return {?} */ (response) => { this.contentMap[identifier] = response.questionSet; return this.contentMap[identifier]; }))); } } else { return of(content); } } /** * @return {?} */ preFetchContent() { /** @type {?} */ const nextMarker = this.getNextMarker(); if (nextMarker) { /** @type {?} */ const identifier = nextMarker.identifier; this.getQuestionSet(nextMarker.identifier); } } /** * @return {?} */ getNextMarker() { /** @type {?} */ const currentTime = this.playerInstance.currentTime(); /** @type {?} */ const markersList = this.getMarkers(); if (!markersList) { return null; } return markersList.find((/** * @param {?} marker * @return {?} */ marker => { /** @type {?} */ const markerTime = marker.time; return markerTime > currentTime; })); } /** * @param {?} event * @return {?} */ raiseStartEvent(event) { /** @type {?} */ const duration = new Date().getTime() - this.PlayerLoadStartedAt; /** @type {?} */ const startEvent = { eid: 'START', ver: this.version, edata: { type: 'START', mode: 'play', duration }, metaData: this.metaData }; this.playerEvent.emit(startEvent); this.videoPlayerService.start(duration); this.PlayerLoadStartedAt = new Date().getTime(); } /** * @return {?} */ calculateScore() { this.scoreObtained = Object.values(this.interceptionResponses).reduce(( // tslint:disable-next-line:no-string-literal /** * @param {?} acc * @param {?} response * @return {?} */ (acc, response) => acc + response['score']), 0); } /** * @return {?} */ raiseEndEvent() { if (!this.isEndEventRaised) { this.calculateScore(); /** @type {?} */ const duration = new Date().getTime() - this.PlayerLoadStartedAt; /** @type {?} */ const endEvent = { eid: 'END', ver: this.version, edata: { type: 'END', currentTime: this.currentlength, totalTime: this.totalLength, duration }, metaData: this.metaData }; this.playerEvent.emit(endEvent); this.timeSpent = this.utilService.getTimeSpentText(this.visitedLength); this.videoPlayerService.end(duration, this.totalLength, this.currentlength, this.endPageSeen, this.totalSeekedLength, this.visitedLength / 1000, this.scoreObtained); this.isEndEventRaised = true; } } /** * @param {?} type * @param {?=} extraValues * @return {?} */ raiseHeartBeatEvent(type, extraValues) { if (type === 'REPLAY') { this.interceptionResponses = {}; this.showScore = false; this.scoreObtained = 0; } /** @type {?} */ const hearBeatEvent = { eid: 'HEARTBEAT', ver: this.version, edata: { type, currentPage: 'videostage', extra: extraValues }, metaData: this.metaData }; this.playerEvent.emit(hearBeatEvent); this.videoPlayerService.heartBeat(hearBeatEvent); /** @type {?} */ const interactItems = ['PLAY', 'PAUSE', 'EXIT', 'VOLUME_CHANGE', 'DRAG', 'RATE_CHANGE', 'CLOSE_DOWNLOAD', 'DOWNLOAD', 'NAVIGATE_TO_PAGE', 'NEXT', 'OPEN_MENU', 'PREVIOUS', 'CLOSE_MENU', 'DOWNLOAD_MENU', 'DOWNLOAD_POPUP_CLOSE', 'DOWNLOAD_POPUP_CANCEL', 'SHARE', 'REPLAY', 'FORWARD', 'BACKWARD', 'FULLSCREEN', 'NEXT_CONTENT_PLAY', 'TRANSCRIPT_LANGUAGE_OFF', 'TRANSCRIPT_LANGUAGE_SELECTED', 'VIDEO_MARKER_SELECTED' ]; if (interactItems.includes(type)) { this.videoPlayerService.interact(type.toLowerCase(), 'videostage', extraValues); } } /** * @param {?} pageId * @param {?=} cdata * @return {?} */ raiseImpressionEvent(pageId, cdata = {}) { this.videoPlayerService.impression(pageId, cdata); } // tslint:disable-next-line:no-shadowed-variable /** * @param {?} errorCode * @param {?} errorType * @param {?} stacktrace * @param {?} traceId * @return {?} */ raiseExceptionLog(errorCode, errorType, stacktrace, traceId) { /** @type {?} */ const exceptionLogEvent = { eid: 'ERROR', edata: { err: errorCode, errtype: errorType, requestid: traceId || '', stacktrace: (stacktrace && stacktrace.toString()) || '', } }; this.playerEvent.emit(exceptionLogEvent); this.videoPlayerService.error(errorCode, errorType, stacktrace); } } ViewerService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ ViewerService.ctorParameters = () => [ { type: SunbirdVideoPlayerService }, { type: UtilService }, { type: HttpClient }, { type: QuestionCursor, decorators: [{ type: Optional }] } ]; /** @nocollapse */ ViewerService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ViewerService_Factory() { return new ViewerService(i0.ɵɵinject(i1.SunbirdVideoPlayerService), i0.ɵɵinject(i2.UtilService), i0.ɵɵinject(i3.HttpClient), i0.ɵɵinject(i4.QuestionCursor, 8)); }, token: ViewerService, providedIn: "root" }); if (false) { /** @type {?} */ ViewerService.prototype.endPageSeen; /** @type {?} */ ViewerService.prototype.timeSpent; /** * @type {?} * @private */ ViewerService.prototype.version; /** @type {?} */ ViewerService.prototype.playerEvent; /** @type {?} */ ViewerService.prototype.contentName; /** @type {?} */ ViewerService.prototype.showDownloadPopup; /** @type {?} */ ViewerService.prototype.streamingUrl; /** @type {?} */ ViewerService.prototype.mimeType; /** @type {?} */ ViewerService.prototype.artifactMimeType; /** @type {?} */ ViewerService.prototype.userName; /** @type {?} */ ViewerService.prototype.metaData; /** @type {?} */ ViewerService.prototype.PlayerLoadStartedAt; /** @type {?} */ ViewerService.prototype.totalLength; /** @type {?} */ ViewerService.prototype.currentlength; /** @type {?} */ ViewerService.prototype.totalSeekedLength; /** @type {?} */ ViewerService.prototype.artifactUrl; /** @type {?} */ ViewerService.prototype.visitedLength; /** @type {?} */ ViewerService.prototype.sidebarMenuEvent; /** @type {?} */ ViewerService.prototype.traceId; /** @type {?} */ ViewerService.prototype.isAvailableLocally; /** @type {?} */ ViewerService.prototype.interceptionPoints; /** @type {?} */ ViewerService.prototype.interceptionResponses; /** @type {?} */ ViewerService.prototype.showScore; /** @type {?} */ ViewerService.prototype.scoreObtained; /** @type {?} */ ViewerService.prototype.maxScore; /** @type {?} */ ViewerService.prototype.playerInstance; /** @type {?} */ ViewerService.prototype.contentMap; /** @type {?} */ ViewerService.prototype.isEndEventRaised; /** @type {?} */ ViewerService.prototype.transcripts; /** * @type {?} * @private */ ViewerService.prototype.videoPlayerService; /** * @type {?} * @private */ ViewerService.prototype.utilService; /** * @type {?} * @private */ ViewerService.prototype.http; /** @type {?} */ ViewerService.prototype.questionCursor; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGljZGlrc2hhb3JnL3ZpZGVvLXBsYXllci1tb2JpbGUtdjkvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvdmlld2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRyxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDekUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7Ozs7OztBQUsvQixNQUFNLE9BQU8sYUFBYTs7Ozs7OztJQStCeEIsWUFBb0Isa0JBQTZDLEVBQzdDLFdBQXdCLEVBQ3hCLElBQWdCLEVBQ0wsY0FBOEI7UUFIekMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEyQjtRQUM3QyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ0wsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBaEN0RCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDakIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBY3RD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LDhDQUF1Qzs7SUFDdkMsa0NBQXlCOztJQUN6QixzQ0FBOEI7O0lBQzlCLGlDQUF3Qjs7SUFDeEIsdUNBQTJCOztJQUMzQixtQ0FBdUI7O0lBQ3ZCLHlDQUFnQzs7SUFDaEMsb0NBQWdDOzs7OztJQUNwQiwyQ0FBcUQ7Ozs7O0lBQ3JELG9DQUFnQzs7Ozs7SUFDaEMsNkJBQXdCOztJQUN4Qix1Q0FBaUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGxheWVyQ29uZmlnLCBUcmFuc2NyaXB0cyB9IGZyb20gJy4uL3BsYXllckludGVyZmFjZXMnO1xuaW1wb3J0IHsgU3VuYmlyZFZpZGVvUGxheWVyU2VydmljZSB9IGZyb20gJy4uL3N1bmJpcmQtdmlkZW8tcGxheWVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXRpbFNlcnZpY2UgfSBmcm9tICcuL3V0aWwuc2VydmljZSc7XG5pbXBvcnQgeyBlcnJvckNvZGUgLCBlcnJvck1lc3NhZ2UgfSBmcm9tICdAZGljZGlrc2hhb3JnL3BsYXllci1zZGstdjknO1xuaW1wb3J0IHsgUXVlc3Rpb25DdXJzb3IgfSBmcm9tICdAcHJvamVjdC1zdW5iaXJkL3N1bmJpcmQtcXVtbC1wbGF5ZXItdjknO1xuaW1wb3J0IHsgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVmlld2VyU2VydmljZSB7XG5cbiAgcHVibGljIGVuZFBhZ2VTZWVuID0gZmFsc2U7XG4gIHB1YmxpYyB0aW1lU3BlbnQgPSAnMDowJztcbiAgcHJpdmF0ZSB2ZXJzaW9uID0gJzEuMCc7XG4gIHB1YmxpYyBwbGF5ZXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBwdWJsaWMgY29udGVudE5hbWU6IHN0cmluZztcbiAgcHVibGljIHNob3dEb3dubG9hZFBvcHVwOiBib29sZWFuO1xuICBwdWJsaWMgc3RyZWFtaW5nVXJsOiBzdHJpbmc7XG4gIHB1YmxpYyBtaW1lVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgYXJ0aWZhY3RNaW1lVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgdXNlck5hbWU6IHN0cmluZztcbiAgcHVibGljIG1ldGFEYXRhOiBhbnk7XG4gIHB1YmxpYyBQbGF5ZXJMb2FkU3RhcnRlZEF0OiBudW1iZXI7XG4gIHB1YmxpYyB0b3RhbExlbmd0aDtcbiAgcHVibGljIGN1cnJlbnRsZW5ndGg7XG4gIHB1YmxpYyB0b3RhbFNlZWtlZExlbmd0aDtcbiAgcHVibGljIGFydGlmYWN0VXJsO1xuICBwdWJsaWMgdmlzaXRlZExlbmd0aDtcbiAgcHVibGljIHNpZGViYXJNZW51RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgcHVibGljIHRyYWNlSWQ6IHN0cmluZztcbiAgcHVibGljIGlzQXZhaWxhYmxlTG9jYWxseSA9IGZhbHNlO1xuICBwdWJsaWMgaW50ZXJjZXB0aW9uUG9pbnRzOiBhbnk7XG4gIHB1YmxpYyBpbnRlcmNlcHRpb25SZXNwb25zZXM6IGFueSA9IHt9O1xuICBwdWJsaWMgc2hvd1Njb3JlID0gZmFsc2U7XG4gIHB1YmxpYyBzY29yZU9idGFpbmVkOiBhbnkgPSAwO1xuICBwdWJsaWMgbWF4U2NvcmU6IG51bWJlcjtcbiAgcHVibGljIHBsYXllckluc3RhbmNlOiBhbnk7XG4gIHB1YmxpYyBjb250ZW50TWFwID0ge307XG4gIHB1YmxpYyBpc0VuZEV2ZW50UmFpc2VkID0gZmFsc2U7XG4gIHB1YmxpYyB0cmFuc2NyaXB0czogVHJhbnNjcmlwdHM7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmlkZW9QbGF5ZXJTZXJ2aWNlOiBTdW5iaXJkVmlkZW9QbGF5ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgcXVlc3Rpb25DdXJzb3I6IFF1ZXN0aW9uQ3Vyc29yKSB7XG4gICAgdGhpcy5QbGF5ZXJMb2FkU3RhcnRlZEF0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIH1cblxuICBpbml0aWFsaXplKHsgY29udGV4dCwgY29uZmlnLCBtZXRhZGF0YSB9OiBQbGF5ZXJDb25maWcpIHtcbiAgICB0aGlzLmNvbnRlbnROYW1lID0gbWV0YWRhdGEubmFtZTtcbiAgICB0aGlzLmlzQXZhaWxhYmxlTG9jYWxseSA9IG1ldGFkYXRhLmlzQXZhaWxhYmxlTG9jYWxseTtcbiAgICB0aGlzLnN0cmVhbWluZ1VybCA9IG1ldGFkYXRhLnN0cmVhbWluZ1VybDtcbiAgICB0aGlzLmFydGlmYWN0VXJsID0gbWV0YWRhdGEuYXJ0aWZhY3RVcmw7XG4gICAgdGhpcy5taW1lVHlwZSA9IG1ldGFkYXRhLnN0cmVhbWluZ1VybCA/ICdhcHBsaWNhdGlvbi94LW1wZWdVUkwnIDogbWV0YWRhdGEubWltZVR5cGU7XG4gICAgdGhpcy5hcnRpZmFjdE1pbWVUeXBlID0gbWV0YWRhdGEubWltZVR5cGU7XG4gICAgdGhpcy5pc0F2YWlsYWJsZUxvY2FsbHkgPSBtZXRhZGF0YS5pc0F2YWlsYWJsZUxvY2FsbHk7XG4gICAgdGhpcy50cmFjZUlkID0gY29uZmlnLnRyYWNlSWQ7XG4gICAgdGhpcy5pbnRlcmNlcHRpb25Qb2ludHMgPSBtZXRhZGF0YS5pbnRlcmNlcHRpb25Qb2ludHM7XG4gICAgaWYgKGNvbnRleHQudXNlckRhdGEpIHtcbiAgICAgIGNvbnN0IHsgdXNlckRhdGE6IHsgZmlyc3ROYW1lLCBsYXN0TmFtZSB9IH0gPSBjb250ZXh0O1xuICAgICAgdGhpcy51c2VyTmFtZSA9IGZpcnN0TmFtZSA9PT0gbGFzdE5hbWUgPyBmaXJzdE5hbWUgOiBgJHtmaXJzdE5hbWV9ICR7bGFzdE5hbWV9YDtcbiAgICB9XG4gICAgdGhpcy5tZXRhRGF0YSA9IHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgIF0sXG4gICAgICB2b2x1bWU6IFtdLFxuICAgICAgcGxheUJhY2tTcGVlZHM6IFtdLFxuICAgICAgdG90YWxEdXJhdGlvbjogMCxcbiAgICAgIG11dGVkOiB1bmRlZmluZWQsXG4gICAgICBjdXJyZW50RHVyYXRpb246IHVuZGVmaW5lZCxcbiAgICAgIHRyYW5zY3JpcHRzOiBbXVxuICAgIH07XG4gICAgdGhpcy50cmFuc2NyaXB0cyA9IG1ldGFkYXRhLnRyYW5zY3JpcHRzID8gbWV0YWRhdGEudHJhbnNjcmlwdHMgOiBbXTtcbiAgICB0aGlzLnNob3dEb3dubG9hZFBvcHVwID0gZmFsc2U7XG4gICAgdGhpcy5lbmRQYWdlU2VlbiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmlzQXZhaWxhYmxlTG9jYWxseSkge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSAobWV0YWRhdGEuc3RyZWFtaW5nVXJsKSA/IChtZXRhZGF0YS5zdHJlYW1pbmdVcmwpIDogKG1ldGFkYXRhLmJhc2VQYXRoIHx8IG1ldGFkYXRhLmJhc2VEaXIpO1xuICAgICAgdGhpcy5zdHJlYW1pbmdVcmwgPSBgJHtiYXNlUGF0aH0vJHttZXRhZGF0YS5hcnRpZmFjdFVybH1gO1xuICAgICAgdGhpcy5taW1lVHlwZSA9IG1ldGFkYXRhLm1pbWVUeXBlO1xuICAgIH1cbiAgfVxuICBoYW5kbGVUcmFuc2NyaXB0c0RhdGEoc2VsZWN0ZWRUcmFuc2NyaXB0cykge1xuICAgIHRoaXMubWV0YURhdGEudHJhbnNjcmlwdHMgPSBzZWxlY3RlZFRyYW5zY3JpcHRzO1xuICAgIGlmICghXy5pc0FycmF5KHRoaXMudHJhbnNjcmlwdHMpKSB7XG4gICAgICB0aGlzLnJhaXNlRXhjZXB0aW9uTG9nKCdJTlZBTElEX1RSQU5TQ1JJUFRfREFUQVRZUEUnLCAnVFJBTlNDUklQVCcsIG5ldyBFcnJvcignVHJhbnNjcmlwdCBkYXRhIHNob3VsZCBiZSBhcnJheScpLCB0aGlzLnRyYWNlSWQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLnRyYW5zY3JpcHRzLCAodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCEoXy5zb21lKHRoaXMudHJhbnNjcmlwdHMsIHsgbGFuZ3VhZ2U6IHZhbHVlLmxhbmd1YWdlLCBhcnRpZmFjdFVybDogdmFsdWUuYXJ0aWZhY3RVcmwgLFxuICAgICAgICAgIGxhbmd1YWdlQ29kZTogdmFsdWUubGFuZ3VhZ2VDb2RlLCBpZGVudGlmaWVyOiB2YWx1ZS5pZGVudGlmaWVyfSkpKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZUV4Y2VwdGlvbkxvZygnVFJBTlNDUklQVF9EQVRBX01JU1NJTkcnLCAnVFJBTlNDUklQVCcsXG4gICAgICAgICAgIG5ldyBFcnJvcignVHJhbnNjcmlwdCBvYmplY3QgZG9zZSBub3QgaGF2ZSByZXF1aXJlZCBmaWVsZHMnKSwgdGhpcy50cmFjZUlkKTtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0gZWxzZSBpZiAoIV8uaXNFbXB0eShzZWxlY3RlZFRyYW5zY3JpcHRzKSAmJlxuICAgICAgICAgICggXy5sYXN0KHNlbGVjdGVkVHJhbnNjcmlwdHMpICE9PSAnb2ZmJyAmJiAgXy5sYXN0KHNlbGVjdGVkVHJhbnNjcmlwdHMpID09PSB2YWx1ZS5sYW5ndWFnZUNvZGUpKSB7XG4gICAgICAgICAgdmFsdWUuZGVmYXVsdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmFuc2NyaXB0cztcbiAgfVxuICBhc3luYyBnZXRQbGF5ZXJPcHRpb25zKCkge1xuICAgIGlmICghdGhpcy5zdHJlYW1pbmdVcmwpIHtcbiAgICAgIHJldHVybiBbeyBzcmM6IHRoaXMuYXJ0aWZhY3RVcmwsIHR5cGU6IHRoaXMuYXJ0aWZhY3RNaW1lVHlwZSB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuaHR0cC5oZWFkKHRoaXMuc3RyZWFtaW5nVXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pLnRvUHJvbWlzZSgpLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLnJhaXNlRXhjZXB0aW9uTG9nKGVycm9yQ29kZS5zdHJlYW1pbmdVcmxTdXBwb3J0ICwgZXJyb3JNZXNzYWdlLnN0cmVhbWluZ1VybFN1cHBvcnQgLCBuZXcgRXJyb3IoYFN0cmVhbWluZyBVcmwgTm90IFN1cHBvcnRlZCAgJHt0aGlzLnN0cmVhbWluZ1VybH1gKSwgdGhpcy50cmFjZUlkKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFt7IHNyYzogdGhpcy5zdHJlYW1pbmdVcmwsIHR5cGU6IHRoaXMubWltZVR5cGUgfV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3sgc3JjOiB0aGlzLmFydGlmYWN0VXJsLCB0eXBlOiB0aGlzLmFydGlmYWN0TWltZVR5cGUgfV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0TWFya2VycygpICB7XG4gICAgaWYgKHRoaXM/LmludGVyY2VwdGlvblBvaW50cz8uaXRlbXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGludGVyY2VwdGlvblBvaW50cyA9IHRoaXMuaW50ZXJjZXB0aW9uUG9pbnRzO1xuICAgICAgICB0aGlzLnNob3dTY29yZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBpbnRlcmNlcHRpb25Qb2ludHMuaXRlbXMubWFwKCh7aW50ZXJjZXB0aW9uUG9pbnQsIGlkZW50aWZpZXIsIHR5cGV9KSA9PiB7XG4gICAgICAgIHJldHVybiB7IHRpbWU6IGludGVyY2VwdGlvblBvaW50LCB0eXBlLCBpZGVudGlmaWVyLCBkdXJhdGlvbjogMyB9O1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgdGhpcy5yYWlzZUV4Y2VwdGlvbkxvZygnQ1BWMl9DT05UX0lOVEVSQ0VQVElPTl9QQVJTRScsICdlcnJvciBwYXJzaW5nIHRoZSBpbnRlY2VwdGlvbiBwb2ludHMgc3RyaW5nJywgZXJyb3IsICcnKTtcbiAgICAgICAgdGhpcy5zaG93U2NvcmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuXG4gIGdldFF1ZXN0aW9uU2V0KGlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5jb250ZW50TWFwW2lkZW50aWZpZXJdO1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uQ3Vyc29yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25DdXJzb3IuZ2V0UXVlc3Rpb25TZXQoaWRlbnRpZmllcilcbiAgICAgLnBpcGUobWFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRlbnRNYXBbaWRlbnRpZmllcl0gPSByZXNwb25zZS5xdWVzdGlvblNldDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudE1hcFtpZGVudGlmaWVyXTtcbiAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZihjb250ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcmVGZXRjaENvbnRlbnQoKSB7XG4gICAgY29uc3QgbmV4dE1hcmtlciA9IHRoaXMuZ2V0TmV4dE1hcmtlcigpO1xuICAgIGlmIChuZXh0TWFya2VyKSB7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gbmV4dE1hcmtlci5pZGVudGlmaWVyO1xuICAgICAgdGhpcy5nZXRRdWVzdGlvblNldChuZXh0TWFya2VyLmlkZW50aWZpZXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldE5leHRNYXJrZXIoKSB7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKCk7XG4gICAgY29uc3QgbWFya2Vyc0xpc3QgPSB0aGlzLmdldE1hcmtlcnMoKTtcbiAgICBpZiAoIW1hcmtlcnNMaXN0KSB7IHJldHVybiBudWxsOyB9XG5cbiAgICByZXR1cm4gbWFya2Vyc0xpc3QuZmluZChtYXJrZXIgPT4ge1xuICAgICAgY29uc3QgbWFya2VyVGltZSA9IG1hcmtlci50aW1lO1xuICAgICAgcmV0dXJuIG1hcmtlclRpbWUgPiBjdXJyZW50VGltZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJhaXNlU3RhcnRFdmVudChldmVudCkge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLlBsYXllckxvYWRTdGFydGVkQXQ7XG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IHtcbiAgICAgIGVpZDogJ1NUQVJUJyxcbiAgICAgIHZlcjogdGhpcy52ZXJzaW9uLFxuICAgICAgZWRhdGE6IHtcbiAgICAgICAgdHlwZTogJ1NUQVJUJyxcbiAgICAgICAgbW9kZTogJ3BsYXknLFxuICAgICAgICBkdXJhdGlvblxuICAgICAgfSxcbiAgICAgIG1ldGFEYXRhOiB0aGlzLm1ldGFEYXRhXG4gICAgfTtcbiAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQoc3RhcnRFdmVudCk7XG4gICAgdGhpcy52aWRlb1BsYXllclNlcnZpY2Uuc3RhcnQoZHVyYXRpb24pO1xuICAgIHRoaXMuUGxheWVyTG9hZFN0YXJ0ZWRBdCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9XG5cbiAgY2FsY3VsYXRlU2NvcmUoKSB7XG4gICAgdGhpcy5zY29yZU9idGFpbmVkID0gIE9iamVjdC52YWx1ZXModGhpcy5pbnRlcmNlcHRpb25SZXNwb25zZXMpLnJlZHVjZShcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zdHJpbmctbGl0ZXJhbFxuICAgICAgKGFjYywgcmVzcG9uc2UpID0+IGFjYyArIHJlc3BvbnNlWydzY29yZSddICwgMCk7XG4gIH1cblxuICByYWlzZUVuZEV2ZW50KCkge1xuICAgIGlmICghdGhpcy5pc0VuZEV2ZW50UmFpc2VkKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVNjb3JlKCk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5QbGF5ZXJMb2FkU3RhcnRlZEF0O1xuICAgICAgY29uc3QgZW5kRXZlbnQgPSB7XG4gICAgICAgIGVpZDogJ0VORCcsXG4gICAgICAgIHZlcjogdGhpcy52ZXJzaW9uLFxuICAgICAgICBlZGF0YToge1xuICAgICAgICAgIHR5cGU6ICdFTkQnLFxuICAgICAgICAgIGN1cnJlbnRUaW1lOiB0aGlzLmN1cnJlbnRsZW5ndGgsXG4gICAgICAgICAgdG90YWxUaW1lOiB0aGlzLnRvdGFsTGVuZ3RoLFxuICAgICAgICAgIGR1cmF0aW9uXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGFEYXRhOiB0aGlzLm1ldGFEYXRhXG4gICAgICB9O1xuICAgICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGVuZEV2ZW50KTtcbiAgICAgIHRoaXMudGltZVNwZW50ID0gdGhpcy51dGlsU2VydmljZS5nZXRUaW1lU3BlbnRUZXh0KHRoaXMudmlzaXRlZExlbmd0aCk7XG4gICAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5lbmQoXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICB0aGlzLnRvdGFsTGVuZ3RoLFxuICAgICAgICB0aGlzLmN1cnJlbnRsZW5ndGgsXG4gICAgICAgIHRoaXMuZW5kUGFnZVNlZW4sXG4gICAgICAgIHRoaXMudG90YWxTZWVrZWRMZW5ndGgsXG4gICAgICAgIHRoaXMudmlzaXRlZExlbmd0aCAvIDEwMDAsXG4gICAgICAgIHRoaXMuc2NvcmVPYnRhaW5lZFxuICAgICAgKTtcbiAgICAgIHRoaXMuaXNFbmRFdmVudFJhaXNlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cblxuICByYWlzZUhlYXJ0QmVhdEV2ZW50KHR5cGU6IHN0cmluZywgZXh0cmFWYWx1ZXM/KSB7XG4gICAgaWYgKHR5cGUgPT09ICdSRVBMQVknKSB7XG4gICAgICB0aGlzLmludGVyY2VwdGlvblJlc3BvbnNlcyA9IHt9O1xuICAgICAgdGhpcy5zaG93U2NvcmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2NvcmVPYnRhaW5lZCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IGhlYXJCZWF0RXZlbnQgPSB7XG4gICAgICBlaWQ6ICdIRUFSVEJFQVQnLFxuICAgICAgdmVyOiB0aGlzLnZlcnNpb24sXG4gICAgICBlZGF0YToge1xuICAgICAgICB0eXBlLFxuICAgICAgICBjdXJyZW50UGFnZTogJ3ZpZGVvc3RhZ2UnLFxuICAgICAgICBleHRyYTogZXh0cmFWYWx1ZXNcbiAgICAgIH0sXG4gICAgICBtZXRhRGF0YTogdGhpcy5tZXRhRGF0YVxuICAgIH07XG4gICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGhlYXJCZWF0RXZlbnQpO1xuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmhlYXJ0QmVhdChoZWFyQmVhdEV2ZW50KTtcbiAgICBjb25zdCBpbnRlcmFjdEl0ZW1zID0gWydQTEFZJywgJ1BBVVNFJywgJ0VYSVQnLCAnVk9MVU1FX0NIQU5HRScsICdEUkFHJyxcbiAgICAgICdSQVRFX0NIQU5HRScsICdDTE9TRV9ET1dOTE9BRCcsICdET1dOTE9BRCcsICdOQVZJR0FURV9UT19QQUdFJyxcbiAgICAgICdORVhUJywgJ09QRU5fTUVOVScsICdQUkVWSU9VUycsICdDTE9TRV9NRU5VJywgJ0RPV05MT0FEX01FTlUnLCAnRE9XTkxPQURfUE9QVVBfQ0xPU0UnLCAnRE9XTkxPQURfUE9QVVBfQ0FOQ0VMJyxcbiAgICAgICdTSEFSRScsICdSRVBMQVknLCAnRk9SV0FSRCcsICdCQUNLV0FSRCcsICdGVUxMU0NSRUVOJywgJ05FWFRfQ09OVEVOVF9QTEFZJywgJ1RSQU5TQ1JJUFRfTEFOR1VBR0VfT0ZGJyxcbiAgICAgICdUUkFOU0NSSVBUX0xBTkdVQUdFX1NFTEVDVEVEJywgJ1ZJREVPX01BUktFUl9TRUxFQ1RFRCdcbiAgICBdO1xuICAgIGlmIChpbnRlcmFjdEl0ZW1zLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5pbnRlcmFjdCh0eXBlLnRvTG93ZXJDYXNlKCksICd2aWRlb3N0YWdlJywgZXh0cmFWYWx1ZXMpO1xuICAgIH1cbiAgfVxuXG4gIHJhaXNlSW1wcmVzc2lvbkV2ZW50KHBhZ2VJZDogc3RyaW5nLCBjZGF0YTogYW55ID0ge30pIHtcbiAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5pbXByZXNzaW9uKHBhZ2VJZCwgY2RhdGEpO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlXG4gIHJhaXNlRXhjZXB0aW9uTG9nKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvclR5cGU6IHN0cmluZywgc3RhY2t0cmFjZSwgdHJhY2VJZCkge1xuICAgIGNvbnN0IGV4Y2VwdGlvbkxvZ0V2ZW50ID0ge1xuICAgICAgZWlkOiAnRVJST1InLFxuICAgICAgZWRhdGE6IHtcbiAgICAgICAgZXJyOiBlcnJvckNvZGUsXG4gICAgICAgIGVycnR5cGU6IGVycm9yVHlwZSxcbiAgICAgICAgcmVxdWVzdGlkOiB0cmFjZUlkIHx8ICcnLFxuICAgICAgICBzdGFja3RyYWNlOiAoc3RhY2t0cmFjZSAmJiBzdGFja3RyYWNlLnRvU3RyaW5nKCkpIHx8ICcnLFxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGV4Y2VwdGlvbkxvZ0V2ZW50KTtcbiAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5lcnJvcihlcnJvckNvZGUgLCBlcnJvclR5cGUgLCBzdGFja3RyYWNlKTtcbiAgfVxuXG59XG4iXX0=