@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
492 lines • 49.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/sunbird-video-player.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __assign } from "tslib";
import { ChangeDetectorRef, Component, EventEmitter, Input, Output, HostListener, ElementRef, ViewChild, Renderer2 } from '@angular/core';
import { ErrorService, errorCode, errorMessage } from '@dicdikshaorg/player-sdk-v9';
import { ViewerService } from './services/viewer.service';
import { SunbirdVideoPlayerService } from './sunbird-video-player.service';
var SunbirdVideoPlayerComponent = /** @class */ (function () {
function SunbirdVideoPlayerComponent(videoPlayerService, viewerService, cdr, renderer2, errorService) {
var _this = this;
this.videoPlayerService = videoPlayerService;
this.viewerService = viewerService;
this.cdr = cdr;
this.renderer2 = renderer2;
this.errorService = errorService;
this.telemetryEvent = new EventEmitter();
this.viewState = 'player';
this.showControls = true;
this.sideMenuConfig = {
showShare: true,
showDownload: true,
showReplay: true,
showExit: true
};
this.isPaused = false;
this.showQumlPlayer = false;
this.QumlPlayerConfig = {};
this.isFullScreen = false;
this.raiseInternetDisconnectionError = (/**
* @return {?}
*/
function () {
/** @type {?} */
var code = errorCode.internetConnectivity;
/** @type {?} */
var message = errorMessage.internetConnectivity;
/** @type {?} */
var stacktrace = code + ": " + message;
_this.viewerService.raiseExceptionLog(code, message, stacktrace, _this.traceId);
});
this.playerEvent = this.viewerService.playerEvent;
this.viewerService.playerEvent.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.type === 'pause') {
_this.isPaused = true;
_this.showControls = true;
}
if (event.type === 'play') {
_this.isPaused = false;
}
if (event.type === 'loadstart') {
_this.viewerService.raiseStartEvent(event);
}
if (event.type === 'ended') {
_this.viewerService.endPageSeen = true;
_this.viewerService.raiseEndEvent();
_this.viewState = 'end';
}
if (event.type === 'error') {
// tslint:disable-next-line:one-variable-per-declaration
/** @type {?} */
var code = errorCode.contentLoadFails;
/** @type {?} */
var message = errorMessage.contentLoadFails;
if (_this.viewerService.isAvailableLocally) {
code = errorCode.contentLoadFails;
message = errorMessage.contentLoadFails;
}
if (code === errorCode.contentLoadFails) {
_this.showContentError = true;
}
_this.viewerService.raiseExceptionLog(code, message, event, _this.traceId);
}
// tslint:disable-next-line:max-line-length
/** @type {?} */
var events = [{ type: 'volumechange', telemetryEvent: 'VOLUME_CHANGE' }, { type: 'seeking', telemetryEvent: 'DRAG' }, { type: 'fullscreen', telemetryEvent: 'FULLSCREEN' },
{ type: 'ratechange', telemetryEvent: 'RATE_CHANGE' }];
events.forEach((/**
* @param {?} data
* @return {?}
*/
function (data) {
if (event.type === data.type) {
_this.viewerService.raiseHeartBeatEvent(data.telemetryEvent);
}
}));
}));
}
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.onTelemetryEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.telemetryEvent.emit(event.detail);
};
/**
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
if (typeof this.playerConfig === 'string') {
try {
this.playerConfig = JSON.parse(this.playerConfig);
}
catch (error) {
console.error('Invalid playerConfig: ', error);
}
}
setInterval((/**
* @return {?}
*/
function () {
if (!_this.isPaused) {
_this.showControls = false;
}
}), 5000);
/* tslint:disable:no-string-literal */
this.nextContent = this.playerConfig.config.nextContent;
this.traceId = this.playerConfig.config['traceId'];
this.sideMenuConfig = __assign(__assign({}, this.sideMenuConfig), this.playerConfig.config.sideMenu);
this.videoPlayerService.initialize(this.playerConfig);
this.viewerService.initialize(this.playerConfig);
window.addEventListener('offline', this.raiseInternetDisconnectionError, true);
this.QumlPlayerConfig.config = this.playerConfig.config;
this.QumlPlayerConfig.config.sideMenu.enable = false;
this.QumlPlayerConfig.context = this.playerConfig.context;
this.setTelemetryObjectRollup(this.playerConfig.metadata.identifier);
};
/**
* @param {?} changes
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.action) {
if (!this.showQumlPlayer) {
this.playerAction = this.action;
}
}
};
/**
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var videoPlayerElement = this.videoPlayerRef.nativeElement;
this.unlistenMouseMove = this.renderer2.listen(videoPlayerElement, 'mousemove', (/**
* @return {?}
*/
function () {
_this.showControls = true;
}));
this.unlistenTouchStart = this.renderer2.listen(videoPlayerElement, 'touchstart', (/**
* @return {?}
*/
function () {
_this.showControls = true;
}));
/** @type {?} */
var contentCompabilityLevel = this.playerConfig.metadata['compatibilityLevel'];
if (contentCompabilityLevel) {
/** @type {?} */
var checkContentCompatible = this.errorService.checkContentCompatibility(contentCompabilityLevel);
if (!checkContentCompatible['isCompitable']) {
// tslint:disable-next-line:max-line-length
this.viewerService.raiseExceptionLog(errorCode.contentCompatibility, errorMessage.contentCompatibility, checkContentCompatible['error']['message'], this.traceId);
}
}
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.sideBarEvents = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
this.playerEvent.emit(event);
// capturing this event from app code itself
// if (event.type === 'DOWNLOAD') {
// this.downloadVideo();
// }
/** @type {?} */
var events = ['SHARE', 'DOWNLOAD_MENU', 'EXIT', 'CLOSE_MENU', 'OPEN_MENU', 'DOWNLOAD_POPUP_CANCEL', 'DOWNLOAD_POPUP_CLOSE'];
events.forEach((/**
* @param {?} data
* @return {?}
*/
function (data) {
if (event.type === data) {
_this.viewerService.raiseHeartBeatEvent(data);
}
if (event.type === 'EXIT') {
_this.viewerService.sidebarMenuEvent.emit('CLOSE_MENU');
}
}));
};
/**
* @param {?} id
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.setTelemetryObjectRollup = /**
* @param {?} id
* @return {?}
*/
function (id) {
if (this.QumlPlayerConfig.context) {
/** @type {?} */
var hasObjectRollup = this.QumlPlayerConfig && this.QumlPlayerConfig.context && this.QumlPlayerConfig.context.objectRollup;
if (!hasObjectRollup) {
this.QumlPlayerConfig.context.objectRollup = {};
}
/** @type {?} */
var levels = Object.keys(this.QumlPlayerConfig.context.objectRollup);
this.QumlPlayerConfig.context.objectRollup["l" + (levels.length + 1)] = id;
}
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.playContent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.viewerService.raiseHeartBeatEvent(event.type);
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.replayContent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.playerEvent.emit(event);
this.viewState = 'player';
this.viewerService.isEndEventRaised = false;
this.viewerService.raiseHeartBeatEvent('REPLAY');
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.exitContent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.playerEvent.emit(event);
this.viewerService.raiseHeartBeatEvent('EXIT');
};
/**
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.downloadVideo = /**
* @return {?}
*/
function () {
/** @type {?} */
var a = document.createElement('a');
a.href = this.viewerService.artifactUrl;
a.download = this.viewerService.contentName;
a.target = '_blank';
document.body.appendChild(a);
a.click();
a.remove();
this.viewerService.raiseHeartBeatEvent('DOWNLOAD');
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.qumlPlayerEvents = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.eid === 'QUML_SUMMARY') {
this.showQumlPlayer = false;
/** @type {?} */
var score = parseInt(event.edata.extra.find((/**
* @param {?} p
* @return {?}
*/
function (p) { return p.id === 'score'; }))['value'], 10);
this.viewerService.interceptionResponses[this.currentInterceptionTime] = {
score: score,
isSkipped: false
};
/** @type {?} */
var interceptPointElement = document.querySelector("[data-marker-time=\"" + this.currentInterceptionTime + "\"]");
if (interceptPointElement) {
interceptPointElement['style'].background = 'green';
}
this.videoInstance.play();
this.videoInstance.controls(true);
this.viewerService.raiseImpressionEvent('video');
// if currently video is not in full screen and was previously full screen then set it back to full screen again
if (!document.fullscreenElement && this.isFullScreen) {
if (document.getElementsByClassName('video-js')[0]) {
document.getElementsByClassName('video-js')[0].requestFullscreen()
.catch((/**
* @param {?} err
* @return {?}
*/
function (err) { return console.error(err); }));
}
}
}
};
/**
* @param {?} __0
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.questionSetData = /**
* @param {?} __0
* @return {?}
*/
function (_a) {
var response = _a.response, time = _a.time, identifier = _a.identifier;
this.QumlPlayerConfig.metadata = response;
this.QumlPlayerConfig.metadata['showStartPage'] = 'No';
this.QumlPlayerConfig.metadata['showEndPage'] = 'No';
this.currentInterceptionTime = time;
this.currentInterceptionUIId = identifier;
if (document.fullscreenElement) {
this.isFullScreen = true;
document.exitFullscreen()
.catch((/**
* @param {?} err
* @return {?}
*/
function (err) { return console.error(err); }));
}
else {
this.isFullScreen = false;
}
this.showQumlPlayer = true;
this.viewerService.raiseImpressionEvent('interactive-question-set', { id: identifier, type: 'QuestionSet' });
this.viewerService.raiseHeartBeatEvent('VIDEO_MARKER_SELECTED', {
identifier: identifier,
// Question set id,
type: 'QuestionSet',
// Type of interaction
interceptedAt: time // Time when the interception happened
});
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.playerInstance = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.videoInstance = event;
};
/**
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.viewerService.raiseEndEvent();
this.unlistenTouchStart();
this.unlistenMouseMove();
this.viewerService.isEndEventRaised = false;
window.removeEventListener('offline', this.raiseInternetDisconnectionError, true);
};
SunbirdVideoPlayerComponent.decorators = [
{ type: Component, args: [{
selector: 'sunbird-video-player',
template: "<div class=\"sunbird-video-player-container\" #videoPlayer [ngClass]=\"showQumlPlayer ? 'videoPlayerHide': 'videoPlayerShow'\">\n <sb-player-side-menu-icon class=\"sb-player-side-menu-icon notVisible\" tabindex=\"0\" (sidebarMenuEvent)=\"sideBarEvents($event)\"\n\n *ngIf=\"viewState ==='player'\" [ngClass]=\"{'isVisible': showControls}\"></sb-player-side-menu-icon>\n <video-player *ngIf=\"viewState === 'player'\" (questionSetData)=\"questionSetData($event)\" (playerInstance)=\"playerInstance($event)\" [config]=\"playerConfig.config\" [action]=\"playerAction\" [playVideoFromTimestamp]=\"playVideoFromTimestamp\">\n </video-player>\n <sb-player-sidebar *ngIf=\"viewState ==='player'\"\n [title]=\"viewerService.contentName\"\n (sidebarEvent)=\"sideBarEvents($event)\" [config]=\"sideMenuConfig\"></sb-player-sidebar>\n <sb-player-end-page \n [contentName]=\"viewerService.contentName\" \n [outcomeLabel]=\"viewerService.showScore ? 'Score: ': ''\" \n [outcome]=\"viewerService.showScore ? viewerService.scoreObtained + ((viewerService.maxScore && viewerService.maxScore > 0) ? '/' + viewerService.maxScore : '') : ''\"\n [nextContent]=\"nextContent\" [userName]=\"viewerService.userName\" \n [showExit]=\"sideMenuConfig.showExit\"\n [timeSpentLabel]=\"viewerService.timeSpent\" tabindex=\"0\" (playNextContent)=\"playContent($event)\" \n (exitContent)=\"exitContent($event)\" (replayContent)=\"replayContent($event)\"\n *ngIf=\"viewState === 'end'\"></sb-player-end-page>\n <sb-player-contenterror *ngIf=\"showContentError\"></sb-player-contenterror>\n</div>\n\n<div class=\"sunbird-video-player-container\" *ngIf=\"showQumlPlayer\" #qumlPlayer>\n <quml-main-player [playerConfig]=\"QumlPlayerConfig\" (playerEvent)=\"qumlPlayerEvents($event)\"></quml-main-player>\n</div>",
styles: [".sunbird-video-player-container{width:100%;height:100%;overflow:hidden;position:relative}.videoPlayerHide{display:none}.videoPlayerShow{display:block}pdf-menu{position:absolute;top:0;left:0;z-index:99}.BtmNotVisible,.notVisible{transition:1s ease-in-out;position:absolute;width:100%}.notVisible{top:-10rem}.notVisible.isVisible{top:0}.BtmNotVisible{bottom:-10rem}.BtmNotVisible.isVisible{bottom:0}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span{background:0 0!important}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span:after,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span:before,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button:hover span:after,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button:hover span:before{background-color:rgba(255,255,255,.7)!important}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label{background:rgba(51,51,51,.5)}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span:after,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span:before{background-color:rgba(255,255,255,.7)!important}::ng-deep .sunbird-pdf-player{overflow:hidden}::ng-deep .pdfViewer .page{background:0 0!important;-o-border-image:none!important;border-image:none!important;border:0!important}::ng-deep #toolbarContainer{background:0 0!important;height:auto!important}::ng-deep #viewerContainer{position:relative!important;height:calc(100% - 3rem)}::ng-deep .body,::ng-deep .html,::ng-deep .pdf-viewer button,::ng-deep .pdf-viewer input,::ng-deep .pdf-viewer select{font-size:inherit!important}::ng-deep .findbar,::ng-deep .secondaryToolbar,::ng-deep html[dir=ltr] #toolbarContainer,::ng-deep html[dir=rtl] #toolbarContainer{box-shadow:none!important}::ng-deep .zoom{min-height:inherit!important}::ng-deep html[dir=rtl] .sb-pdf-reading-status{left:auto;right:1rem}.sb-pdf-reading-status{color:var(--gray-800);font-size:.75rem;position:absolute;left:1rem;bottom:1rem;display:flex;align-items:center;background:var(--white);border-radius:.5rem;padding:.25em .5rem;z-index:5;line-height:normal}.sb-pdf-reading-status span{background:var(--gray-800);width:.25rem;height:.25rem;display:block;margin:0 .5rem;border-radius:50%}.sbt-pdf-footer{background:var(--white);position:absolute;bottom:0;width:100%;height:3rem;display:flex;align-items:center;justify-content:flex-end;padding:.75rem .5rem}@media all and (orientation:landscape){::ng-deep .visible-only-potrait{display:none}}@media all and (orientation:portrait){::ng-deep #viewerContainer{height:calc(100% - 6rem)!important}::ng-deep .visible-only-landscape{display:none}::ng-deep .visible-only-potrait{display:block}::ng-deep .file-download__popup{height:15.125rem}::ng-deep .pdf-endpage{display:block!important;position:relative}::ng-deep .pdf-endpage__left-panel{margin-top:6rem}::ng-deep .pdf-endpage__right-panel .title-section{position:absolute;top:0;left:0;right:0}}@media all and (max-width:640px){.visible-only-landscape{display:none}.visible-only-potrait{display:block}}@media all and (min-width:640px){.visible-only-landscape{display:block}.visible-only-potrait{display:none}}"]
}] }
];
/** @nocollapse */
SunbirdVideoPlayerComponent.ctorParameters = function () { return [
{ type: SunbirdVideoPlayerService },
{ type: ViewerService },
{ type: ChangeDetectorRef },
{ type: Renderer2 },
{ type: ErrorService }
]; };
SunbirdVideoPlayerComponent.propDecorators = {
playerConfig: [{ type: Input }],
action: [{ type: Input }],
playerEvent: [{ type: Output }],
telemetryEvent: [{ type: Output }],
videoPlayerRef: [{ type: ViewChild, args: ['videoPlayer', { static: true },] }],
playVideoFromTimestamp: [{ type: Input }],
onTelemetryEvent: [{ type: HostListener, args: ['document:TelemetryEvent', ['$event'],] }],
ngOnDestroy: [{ type: HostListener, args: ['window:beforeunload',] }]
};
return SunbirdVideoPlayerComponent;
}());
export { SunbirdVideoPlayerComponent };
if (false) {
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playerConfig;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.action;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playerEvent;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.telemetryEvent;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.videoPlayerRef;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playVideoFromTimestamp;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.viewState;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.traceId;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.nextContent;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.showContentError;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.showControls;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.sideMenuConfig;
/**
* @type {?}
* @private
*/
SunbirdVideoPlayerComponent.prototype.unlistenTouchStart;
/**
* @type {?}
* @private
*/
SunbirdVideoPlayerComponent.prototype.unlistenMouseMove;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.isPaused;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.showQumlPlayer;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.QumlPlayerConfig;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.videoInstance;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.currentInterceptionTime;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.currentInterceptionUIId;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.isFullScreen;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playerAction;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.raiseInternetDisconnectionError;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.videoPlayerService;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.viewerService;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.cdr;
/**
* @type {?}
* @private
*/
SunbirdVideoPlayerComponent.prototype.renderer2;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.errorService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRpY2Rpa3NoYW9yZy92aWRlby1wbGF5ZXItbW9iaWxlLXY5LyIsInNvdXJjZXMiOlsibGliL3N1bmJpcmQtdmlkZW8tcGxheWVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUNqRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBaUIsU0FBUyxFQUM5RCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFHLFNBQVMsRUFBRyxZQUFZLEVBQWlCLE1BQU0sNkJBQTZCLENBQUM7QUFJckcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFO0lBbUNFLHFDQUNTLGtCQUE2QyxFQUM3QyxhQUE0QixFQUM1QixHQUFzQixFQUNyQixTQUFvQixFQUNyQixZQUEwQjtRQUxuQyxpQkErQ0M7UUE5Q1EsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEyQjtRQUM3QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUNyQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBOUJ6QixtQkFBYyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBR3RFLGNBQVMsR0FBRyxRQUFRLENBQUM7UUFJckIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsbUJBQWMsR0FBRztZQUNmLFNBQVMsRUFBRSxJQUFJO1lBQ2YsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO1FB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Q04sTUFBTTtpQ0FDTixTQUFTLFNBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTt5Q0FDekMsS0FBSzttQ0F3RUwsWUFBWSxTQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDOzhCQThLbEQsWUFBWSxTQUFDLHFCQUFxQjs7SUFRckMsa0NBQUM7Q0FBQSxBQTFRRCxJQTBRQztTQXJRWSwyQkFBMkI7OztJQUV0QyxtREFBb0M7O0lBQ3BDLDZDQUEwQjs7SUFDMUIsa0RBQTRDOztJQUM1QyxxREFBc0U7O0lBQ3RFLHFEQUF1RTs7SUFDdkUsNkRBQTRDOztJQUM1QyxnREFBcUI7O0lBQ3JCLDhDQUF1Qjs7SUFDdkIsa0RBQXdCOztJQUN4Qix1REFBMEI7O0lBQzFCLG1EQUFvQjs7SUFDcEIscURBS0U7Ozs7O0lBQ0YseURBQXVDOzs7OztJQUN2Qyx3REFBc0M7O0lBQ3RDLCtDQUFpQjs7SUFDakIscURBQXVCOztJQUN2Qix1REFBMkI7O0lBQzNCLG9EQUFtQjs7SUFDbkIsOERBQXdCOztJQUN4Qiw4REFBd0I7O0lBQ3hCLG1EQUFxQjs7SUFDckIsbURBQXNCOztJQTRGdEIsc0VBS0M7O0lBOUZDLHlEQUFvRDs7SUFDcEQsb0RBQW1DOztJQUNuQywwQ0FBNkI7Ozs7O0lBQzdCLGdEQUE0Qjs7SUFDNUIsbURBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGhyb3dTdG10IH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyxcbiAgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIEFmdGVyVmlld0luaXQsIFJlbmRlcmVyMiwgT25EZXN0cm95XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXJyb3JTZXJ2aWNlICwgZXJyb3JDb2RlICwgZXJyb3JNZXNzYWdlLCBJU2lkZUJhckV2ZW50IH0gZnJvbSAnQGRpY2Rpa3NoYW9yZy9wbGF5ZXItc2RrLXY5JztcblxuaW1wb3J0IHsgUGxheWVyQ29uZmlnIH0gZnJvbSAnLi9wbGF5ZXJJbnRlcmZhY2VzJztcbmltcG9ydCB7IElBY3Rpb24gfSBmcm9tICcuL3BsYXllckludGVyZmFjZXMnO1xuaW1wb3J0IHsgVmlld2VyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdmlld2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VuYmlyZFZpZGVvUGxheWVyU2VydmljZSB9IGZyb20gJy4vc3VuYmlyZC12aWRlby1wbGF5ZXIuc2VydmljZSc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdW5iaXJkLXZpZGVvLXBsYXllcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdW5iaXJkLXZpZGVvLXBsYXllci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N1bmJpcmQtdmlkZW8tcGxheWVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU3VuYmlyZFZpZGVvUGxheWVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgcGxheWVyQ29uZmlnOiBQbGF5ZXJDb25maWc7XG4gIEBJbnB1dCgpIGFjdGlvbj86IElBY3Rpb247XG4gIEBPdXRwdXQoKSBwbGF5ZXJFdmVudDogRXZlbnRFbWl0dGVyPG9iamVjdD47XG4gIEBPdXRwdXQoKSB0ZWxlbWV0cnlFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQFZpZXdDaGlsZCgndmlkZW9QbGF5ZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSB2aWRlb1BsYXllclJlZjogRWxlbWVudFJlZjsgXG4gIEBJbnB1dCgpIHB1YmxpYyBwbGF5VmlkZW9Gcm9tVGltZXN0YW1wOiBhbnk7XG4gIHZpZXdTdGF0ZSA9ICdwbGF5ZXInO1xuICBwdWJsaWMgdHJhY2VJZDogc3RyaW5nO1xuICBwdWJsaWMgbmV4dENvbnRlbnQ6IGFueTtcbiAgc2hvd0NvbnRlbnRFcnJvcjogYm9vbGVhbjtcbiAgc2hvd0NvbnRyb2xzID0gdHJ1ZTtcbiAgc2lkZU1lbnVDb25maWcgPSB7XG4gICAgc2hvd1NoYXJlOiB0cnVlLFxuICAgIHNob3dEb3dubG9hZDogdHJ1ZSxcbiAgICBzaG93UmVwbGF5OiB0cnVlLFxuICAgIHNob3dFeGl0OiB0cnVlXG4gIH07XG4gIHByaXZhdGUgdW5saXN0ZW5Ub3VjaFN0YXJ0OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHVubGlzdGVuTW91c2VNb3ZlOiAoKSA9PiB2b2lkO1xuICBpc1BhdXNlZCA9IGZhbHNlO1xuICBzaG93UXVtbFBsYXllciA9IGZhbHNlO1xuICBRdW1sUGxheWVyQ29uZmlnOiBhbnkgPSB7fTtcbiAgdmlkZW9JbnN0YW5jZTogYW55O1xuICBjdXJyZW50SW50ZXJjZXB0aW9uVGltZTtcbiAgY3VycmVudEludGVyY2VwdGlvblVJSWQ7XG4gIGlzRnVsbFNjcmVlbiA9IGZhbHNlO1xuICBwbGF5ZXJBY3Rpb246IElBY3Rpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZpZGVvUGxheWVyU2VydmljZTogU3VuYmlyZFZpZGVvUGxheWVyU2VydmljZSxcbiAgICBwdWJsaWMgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSxcbiAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgIHB1YmxpYyBlcnJvclNlcnZpY2U6IEVycm9yU2VydmljZVxuICApIHtcbiAgICB0aGlzLnBsYXllckV2ZW50ID0gdGhpcy52aWV3ZXJTZXJ2aWNlLnBsYXllckV2ZW50O1xuICAgIHRoaXMudmlld2VyU2VydmljZS5wbGF5ZXJFdmVudC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdwYXVzZScpIHtcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC50eXBlID09PSAncGxheScpIHtcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdsb2Fkc3RhcnQnKSB7XG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZVN0YXJ0RXZlbnQoZXZlbnQpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdlbmRlZCcpIHtcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmVuZFBhZ2VTZWVuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRW5kRXZlbnQoKTtcbiAgICAgICAgdGhpcy52aWV3U3RhdGUgPSAnZW5kJztcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpvbmUtdmFyaWFibGUtcGVyLWRlY2xhcmF0aW9uXG4gICAgICAgIGxldCBjb2RlID0gZXJyb3JDb2RlLmNvbnRlbnRMb2FkRmFpbHMsXG4gICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5jb250ZW50TG9hZEZhaWxzO1xuICAgICAgICBpZiAodGhpcy52aWV3ZXJTZXJ2aWNlLmlzQXZhaWxhYmxlTG9jYWxseSkge1xuICAgICAgICAgICAgY29kZSA9IGVycm9yQ29kZS5jb250ZW50TG9hZEZhaWxzO1xuICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5jb250ZW50TG9hZEZhaWxzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlID09PSBlcnJvckNvZGUuY29udGVudExvYWRGYWlscykge1xuICAgICAgICAgIHRoaXMuc2hvd0NvbnRlbnRFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRXhjZXB0aW9uTG9nKGNvZGUsIG1lc3NhZ2UsIGV2ZW50LCB0aGlzLnRyYWNlSWQpO1xuXG4gICAgICB9XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICBjb25zdCBldmVudHMgPSBbeyB0eXBlOiAndm9sdW1lY2hhbmdlJywgdGVsZW1ldHJ5RXZlbnQ6ICdWT0xVTUVfQ0hBTkdFJyB9LCB7IHR5cGU6ICdzZWVraW5nJywgdGVsZW1ldHJ5RXZlbnQ6ICdEUkFHJyB9LCB7IHR5cGU6ICdmdWxsc2NyZWVuJywgdGVsZW1ldHJ5RXZlbnQ6ICdGVUxMU0NSRUVOJyB9LFxuICAgICAgeyB0eXBlOiAncmF0ZWNoYW5nZScsIHRlbGVtZXRyeUV2ZW50OiAnUkFURV9DSEFOR0UnIH1dO1xuICAgICAgZXZlbnRzLmZvckVhY2goZGF0YSA9PiB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBkYXRhLnR5cGUpIHtcbiAgICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChkYXRhLnRlbGVtZXRyeUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpUZWxlbWV0cnlFdmVudCcsIFsnJGV2ZW50J10pXG4gIG9uVGVsZW1ldHJ5RXZlbnQoZXZlbnQpIHtcbiAgICB0aGlzLnRlbGVtZXRyeUV2ZW50LmVtaXQoZXZlbnQuZGV0YWlsKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5wbGF5ZXJDb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnBsYXllckNvbmZpZyA9IEpTT04ucGFyc2UodGhpcy5wbGF5ZXJDb25maWcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBwbGF5ZXJDb25maWc6ICcsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNQYXVzZWQpIHtcbiAgICAgICAgdGhpcy5zaG93Q29udHJvbHMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCA1MDAwKTtcblxuICAgIC8qIHRzbGludDpkaXNhYmxlOm5vLXN0cmluZy1saXRlcmFsICovXG4gICAgdGhpcy5uZXh0Q29udGVudCA9IHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZy5uZXh0Q29udGVudDtcbiAgICB0aGlzLnRyYWNlSWQgPSB0aGlzLnBsYXllckNvbmZpZy5jb25maWdbJ3RyYWNlSWQnXTtcbiAgICB0aGlzLnNpZGVNZW51Q29uZmlnID0geyAuLi50aGlzLnNpZGVNZW51Q29uZmlnLCAuLi50aGlzLnBsYXllckNvbmZpZy5jb25maWcuc2lkZU1lbnUgfTtcbiAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5pbml0aWFsaXplKHRoaXMucGxheWVyQ29uZmlnKTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnBsYXllckNvbmZpZyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCB0aGlzLnJhaXNlSW50ZXJuZXREaXNjb25uZWN0aW9uRXJyb3IgLCB0cnVlKTtcbiAgICB0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29uZmlnID0gdGhpcy5wbGF5ZXJDb25maWcuY29uZmlnO1xuICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb25maWcuc2lkZU1lbnUuZW5hYmxlID0gZmFsc2U7XG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQgPSB0aGlzLnBsYXllckNvbmZpZy5jb250ZXh0O1xuICAgIHRoaXMuc2V0VGVsZW1ldHJ5T2JqZWN0Um9sbHVwKHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhLmlkZW50aWZpZXIpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmFjdGlvbikge1xuICAgICAgaWYgKCF0aGlzLnNob3dRdW1sUGxheWVyKSB7XG4gICAgICAgIHRoaXMucGxheWVyQWN0aW9uID0gdGhpcy5hY3Rpb247XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmFpc2VJbnRlcm5ldERpc2Nvbm5lY3Rpb25FcnJvciA9ICgpID0+IHtcbiAgICBjb25zdCBjb2RlID0gZXJyb3JDb2RlLmludGVybmV0Q29ubmVjdGl2aXR5O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UuaW50ZXJuZXRDb25uZWN0aXZpdHk7XG4gICAgY29uc3Qgc3RhY2t0cmFjZSA9IGAke2NvZGV9OiAke21lc3NhZ2V9YDtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coY29kZSwgbWVzc2FnZSwgc3RhY2t0cmFjZSwgdGhpcy50cmFjZUlkKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCB2aWRlb1BsYXllckVsZW1lbnQgPSB0aGlzLnZpZGVvUGxheWVyUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy51bmxpc3Rlbk1vdXNlTW92ZSA9IHRoaXMucmVuZGVyZXIyLmxpc3Rlbih2aWRlb1BsYXllckVsZW1lbnQsICdtb3VzZW1vdmUnLCAoKSA9PiB7XG4gICAgICB0aGlzLnNob3dDb250cm9scyA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB0aGlzLnVubGlzdGVuVG91Y2hTdGFydCA9IHRoaXMucmVuZGVyZXIyLmxpc3Rlbih2aWRlb1BsYXllckVsZW1lbnQsICd0b3VjaHN0YXJ0JywgKCkgPT4ge1xuICAgICAgdGhpcy5zaG93Q29udHJvbHMgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29udGVudENvbXBhYmlsaXR5TGV2ZWwgPSB0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YVsnY29tcGF0aWJpbGl0eUxldmVsJ107XG4gICAgaWYgKGNvbnRlbnRDb21wYWJpbGl0eUxldmVsKSB7XG4gICAgICBjb25zdCBjaGVja0NvbnRlbnRDb21wYXRpYmxlID0gdGhpcy5lcnJvclNlcnZpY2UuY2hlY2tDb250ZW50Q29tcGF0aWJpbGl0eShjb250ZW50Q29tcGFiaWxpdHlMZXZlbCk7XG4gICAgICBpZiAoIWNoZWNrQ29udGVudENvbXBhdGlibGVbJ2lzQ29tcGl0YWJsZSddKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRXhjZXB0aW9uTG9nKGVycm9yQ29kZS5jb250ZW50Q29tcGF0aWJpbGl0eSwgZXJyb3JNZXNzYWdlLmNvbnRlbnRDb21wYXRpYmlsaXR5LCBjaGVja0NvbnRlbnRDb21wYXRpYmxlWydlcnJvciddWydtZXNzYWdlJ10sIHRoaXMudHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2lkZUJhckV2ZW50cyhldmVudDogSVNpZGVCYXJFdmVudCkge1xuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChldmVudCk7XG4gICAgLy8gY2FwdHVyaW5nIHRoaXMgZXZlbnQgZnJvbSBhcHAgY29kZSBpdHNlbGZcbiAgICAvLyBpZiAoZXZlbnQudHlwZSA9PT0gJ0RPV05MT0FEJykge1xuICAgIC8vICAgdGhpcy5kb3dubG9hZFZpZGVvKCk7XG4gICAgLy8gfVxuICAgIGNvbnN0IGV2ZW50cyA9IFsnU0hBUkUnLCAnRE9XTkxPQURfTUVOVScsICdFWElUJywgJ0NMT1NFX01FTlUnLCAnT1BFTl9NRU5VJywgJ0RPV05MT0FEX1BPUFVQX0NBTkNFTCcsICdET1dOTE9BRF9QT1BVUF9DTE9TRSddO1xuICAgIGV2ZW50cy5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IGRhdGEpIHtcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ0VYSVQnKSB7XG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5zaWRlYmFyTWVudUV2ZW50LmVtaXQoJ0NMT1NFX01FTlUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFRlbGVtZXRyeU9iamVjdFJvbGx1cChpZCkge1xuICAgIGlmICh0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29udGV4dCkge1xuICAgICAgY29uc3QgaGFzT2JqZWN0Um9sbHVwID0gdGhpcy5RdW1sUGxheWVyQ29uZmlnICYmIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0ICYmIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0Lm9iamVjdFJvbGx1cDtcbiAgICAgIGlmICghaGFzT2JqZWN0Um9sbHVwKSB7XG4gICAgICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0Lm9iamVjdFJvbGx1cCA9IHt9O1xuICAgICAgfVxuICAgICAgY29uc3QgbGV2ZWxzID0gT2JqZWN0LmtleXModGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQub2JqZWN0Um9sbHVwKTtcbiAgICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0Lm9iamVjdFJvbGx1cFtgbCR7bGV2ZWxzLmxlbmd0aCArICAxfWBdID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgcGxheUNvbnRlbnQoZXZlbnQpIHtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudC50eXBlKTtcbiAgfVxuXG4gIHJlcGxheUNvbnRlbnQoZXZlbnQpIHtcbiAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQoZXZlbnQpO1xuICAgIHRoaXMudmlld1N0YXRlID0gJ3BsYXllcic7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmlzRW5kRXZlbnRSYWlzZWQgPSBmYWxzZTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudCgnUkVQTEFZJyk7XG4gIH1cblxuICBleGl0Q29udGVudChldmVudCkge1xuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChldmVudCk7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoJ0VYSVQnKTtcbiAgfVxuXG4gIGRvd25sb2FkVmlkZW8oKSB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB0aGlzLnZpZXdlclNlcnZpY2UuYXJ0aWZhY3RVcmw7XG4gICAgYS5kb3dubG9hZCA9IHRoaXMudmlld2VyU2VydmljZS5jb250ZW50TmFtZTtcbiAgICBhLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgYS5jbGljaygpO1xuICAgIGEucmVtb3ZlKCk7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoJ0RPV05MT0FEJyk7XG4gIH1cblxuICBxdW1sUGxheWVyRXZlbnRzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmVpZCA9PT0gJ1FVTUxfU1VNTUFSWScpIHtcbiAgICAgIHRoaXMuc2hvd1F1bWxQbGF5ZXIgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNjb3JlID0gcGFyc2VJbnQoZXZlbnQuZWRhdGEuZXh0cmEuZmluZChwID0+IHAuaWQgPT09ICdzY29yZScpWyd2YWx1ZSddLCAxMCk7XG4gICAgICB0aGlzLnZpZXdlclNlcnZpY2UuaW50ZXJjZXB0aW9uUmVzcG9uc2VzW3RoaXMuY3VycmVudEludGVyY2VwdGlvblRpbWVdID0ge1xuICAgICAgICBzY29yZSxcbiAgICAgICAgaXNTa2lwcGVkOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGludGVyY2VwdFBvaW50RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW1hcmtlci10aW1lPVwiJHt0aGlzLmN1cnJlbnRJbnRlcmNlcHRpb25UaW1lfVwiXWApO1xuICAgICAgaWYgKGludGVyY2VwdFBvaW50RWxlbWVudCkge1xuICAgICAgICBpbnRlcmNlcHRQb2ludEVsZW1lbnRbJ3N0eWxlJ10uYmFja2dyb3VuZCA9ICdncmVlbic7XG4gICAgICB9XG4gICAgICB0aGlzLnZpZGVvSW5zdGFuY2UucGxheSgpO1xuICAgICAgdGhpcy52aWRlb0luc3RhbmNlLmNvbnRyb2xzKHRydWUpO1xuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSW1wcmVzc2lvbkV2ZW50KCd2aWRlbycpO1xuICAgICAgLy8gaWYgY3VycmVudGx5IHZpZGVvIGlzIG5vdCBpbiBmdWxsIHNjcmVlbiBhbmQgd2FzIHByZXZpb3VzbHkgZnVsbCBzY3JlZW4gdGhlbiBzZXQgaXQgYmFjayB0byBmdWxsIHNjcmVlbiBhZ2FpblxuICAgICAgaWYgKCFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCAmJiB0aGlzLmlzRnVsbFNjcmVlbikge1xuICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndmlkZW8tanMnKVswXSkge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3ZpZGVvLWpzJylbMF0ucmVxdWVzdEZ1bGxzY3JlZW4oKVxuICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVycikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcXVlc3Rpb25TZXREYXRhKHtyZXNwb25zZSwgdGltZSwgaWRlbnRpZmllcn0pIHtcbiAgICB0aGlzLlF1bWxQbGF5ZXJDb25maWcubWV0YWRhdGEgPSByZXNwb25zZTtcbiAgICB0aGlzLlF1bWxQbGF5ZXJDb25maWcubWV0YWRhdGFbJ3Nob3dTdGFydFBhZ2UnXSA9ICdObyc7XG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLm1ldGFkYXRhWydzaG93RW5kUGFnZSddID0gJ05vJztcbiAgICB0aGlzLmN1cnJlbnRJbnRlcmNlcHRpb25UaW1lID0gdGltZTtcbiAgICB0aGlzLmN1cnJlbnRJbnRlcmNlcHRpb25VSUlkID0gaWRlbnRpZmllcjtcbiAgICBpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaXNGdWxsU2NyZWVuID0gdHJ1ZTtcbiAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVycikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzRnVsbFNjcmVlbiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnNob3dRdW1sUGxheWVyID0gdHJ1ZTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VJbXByZXNzaW9uRXZlbnQoJ2ludGVyYWN0aXZlLXF1ZXN0aW9uLXNldCcsIHsgaWQ6IGlkZW50aWZpZXIsIHR5cGU6ICdRdWVzdGlvblNldCcgfSk7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoJ1ZJREVPX01BUktFUl9TRUxFQ1RFRCcsIHtcbiAgICAgIGlkZW50aWZpZXIsIC8vIFF1ZXN0aW9uIHNldCBpZCxcbiAgICAgIHR5cGU6ICdRdWVzdGlvblNldCcsIC8vIFR5cGUgb2YgaW50ZXJhY3Rpb25cbiAgICAgIGludGVyY2VwdGVkQXQ6IHRpbWUgLy8gVGltZSB3aGVuIHRoZSBpbnRlcmNlcHRpb24gaGFwcGVuZWRcbiAgICB9KTtcbiAgfVxuXG4gIHBsYXllckluc3RhbmNlKGV2ZW50KSB7XG4gICAgdGhpcy52aWRlb0luc3RhbmNlID0gZXZlbnQ7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6YmVmb3JldW5sb2FkJylcbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRW5kRXZlbnQoKTtcbiAgICB0aGlzLnVubGlzdGVuVG91Y2hTdGFydCgpO1xuICAgIHRoaXMudW5saXN0ZW5Nb3VzZU1vdmUoKTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UuaXNFbmRFdmVudFJhaXNlZCA9IGZhbHNlO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdvZmZsaW5lJywgdGhpcy5yYWlzZUludGVybmV0RGlzY29ubmVjdGlvbkVycm9yICwgdHJ1ZSk7XG4gIH1cbn1cbiJdfQ==