UNPKG

@tekdi/sunbird-quml-player

Version:

The QuML player library components are 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 d

542 lines 99.8 kB
import { Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
import * as _ from 'lodash-es';
import { SectionPlayerComponent } from '../section-player/section-player.component';
import { eventName, pageId, TelemetryType, MimeType } from './../telemetry-constants';
import { fromEvent } from 'rxjs';
import maintain from 'ally.js/esm/maintain/_maintain';
import { WARNING_TIME_CONFIG } from './../player-constants';
import * as i0 from "@angular/core";
import * as i1 from "./../services/viewer-service/viewer-service";
import * as i2 from "./../util-service";
import * as i3 from "../services/transformation-service/transformation.service";
import * as i4 from "@angular/common";
import * as i5 from "@project-sunbird/sunbird-player-sdk-v9";
import * as i6 from "../header/header.component";
import * as i7 from "../scoreboard/scoreboard.component";
import * as i8 from "../section-player/section-player.component";
export class MainPlayerComponent {
    constructor(viewerService, utilService, transformationService) {
        this.viewerService = viewerService;
        this.utilService = utilService;
        this.transformationService = transformationService;
        this.playerEvent = new EventEmitter();
        this.telemetryEvent = new EventEmitter();
        this.isInitialized = false;
        this.isLoading = false;
        this.isSectionsAvailable = false;
        this.isMultiLevelSection = false;
        this.sections = [];
        this.sectionIndex = 0;
        this.parentConfig = {
            loadScoreBoard: false,
            requiresSubmit: false,
            isSectionsAvailable: false,
            isReplayed: false,
            identifier: '',
            contentName: '',
            baseUrl: '',
            isAvailableLocally: false,
            instructions: {},
            questionCount: 0,
            sideMenuConfig: {
                enable: true,
                showShare: true,
                showDownload: false,
                showExit: false,
            },
            showFeedback: false,
            showLegend: true,
            warningTime: WARNING_TIME_CONFIG.DEFAULT_TIME,
            showWarningTimer: WARNING_TIME_CONFIG.SHOW_TIMER
        };
        this.endPageReached = false;
        this.isEndEventRaised = false;
        this.isSummaryEventRaised = false;
        this.showReplay = true;
        this.mainProgressBar = [];
        this.loadScoreBoard = false;
        this.summary = {
            correct: 0,
            partial: 0,
            skipped: 0,
            wrong: 0
        };
        this.isDurationExpired = false;
        this.finalScore = 0;
        this.totalNoOfQuestions = 0;
        this.totalVisitedQuestion = 0;
    }
    onTelemetryEvent(event) {
        this.telemetryEvent.emit(event.detail);
    }
    ngOnInit() {
        this.isInitialized = true;
        if (this.playerConfig) {
            if (typeof this.playerConfig === 'string') {
                try {
                    this.playerConfig = JSON.parse(this.playerConfig);
                }
                catch (error) {
                    console.error('Invalid playerConfig: ', error);
                }
            }
            if (!_.has(this.playerConfig.metadata, 'qumlVersion') && _.get(this.playerConfig.metadata, 'qumlVersion') != 1.1) {
                this.playerConfig.metadata = this.transformationService.getTransformedHierarchy(this.playerConfig.metadata);
            }
            console.log('playerConfig::', this.playerConfig);
            this.isLoading = true;
            this.setConfig();
            this.initializeSections();
        }
    }
    ngOnChanges(changes) {
        if (changes.playerConfig.firstChange && this.isInitialized) {
            // This explicitly calling ngOnInit is for the web-component. Life cycle methods works in different order there.
            this.ngOnInit();
        }
    }
    initializeSections() {
        const childMimeType = _.map(this.playerConfig.metadata.children, 'mimeType');
        this.parentConfig.isSectionsAvailable = this.isSectionsAvailable = childMimeType[0] === MimeType.questionSet;
        this.parentConfig.metadata = { ...this.playerConfig.metadata };
        this.viewerService.sectionQuestions = [];
        if (this.isSectionsAvailable) {
            this.isMultiLevelSection = this.getMultilevelSection(this.playerConfig.metadata);
            if (this.isMultiLevelSection) {
                this.contentError = {
                    messageHeader: 'Unable to load content',
                    messageTitle: 'Multi level sections are not supported as of now'
                };
            }
            else {
                let children = this.playerConfig.metadata.children;
                this.sections = _.map(children, (child) => {
                    let childNodes = child?.children?.map(item => item.identifier) || [];
                    const maxQuestions = child?.maxQuestions;
                    childNodes = child?.shuffle ? _.shuffle(childNodes) : childNodes;
                    if (maxQuestions) {
                        childNodes = childNodes.slice(0, maxQuestions);
                    }
                    if (this.playerConfig.metadata.timeLimits) {
                        child = {
                            ...child,
                            timeLimits: this.playerConfig.metadata.timeLimits,
                            showTimer: this.playerConfig.metadata.showTimer
                        };
                    }
                    return {
                        ...this.playerConfig, metadata: { ...child, childNodes },
                    };
                });
                this.setInitialScores();
                this.activeSection = _.cloneDeep(this.sections[0]);
                this.isLoading = false;
            }
        }
        else {
            let childNodes = [];
            if (this.playerConfig.metadata?.children?.length) {
                childNodes = this.playerConfig.metadata.children.map(item => item.identifier);
            }
            else {
                childNodes = this.playerConfig.metadata.childNodes;
            }
            childNodes = this.playerConfig.metadata?.shuffle ? _.shuffle(childNodes) : childNodes;
            const maxQuestions = this.playerConfig.metadata.maxQuestions;
            /* istanbul ignore else */
            if (maxQuestions) {
                childNodes = childNodes.slice(0, maxQuestions);
            }
            childNodes.forEach((element, index) => {
                this.totalNoOfQuestions++;
                this.mainProgressBar.push({
                    index: (index + 1), class: 'unattempted', value: undefined,
                    score: 0,
                });
            });
            this.playerConfig.metadata.childNodes = childNodes;
            if (!this.playerConfig.metadata?.shuffle) {
                if (this.playerConfig.config?.progressBar?.length) {
                    this.mainProgressBar = _.cloneDeep(this.playerConfig.config.progressBar);
                }
                if (this.playerConfig.config?.questions?.length) {
                    const questionsObj = this.playerConfig.config.questions.find(item => item.id === this.playerConfig.metadata.identifier);
                    if (questionsObj?.questions) {
                        this.viewerService.updateSectionQuestions(this.playerConfig.metadata.identifier, questionsObj.questions);
                    }
                }
            }
            this.activeSection = _.cloneDeep(this.playerConfig);
            this.isLoading = false;
            this.parentConfig.questionCount = this.totalNoOfQuestions;
        }
    }
    setConfig() {
        this.parentConfig.contentName = this.playerConfig.metadata?.name;
        this.parentConfig.identifier = this.playerConfig.metadata?.identifier;
        this.parentConfig.requiresSubmit = this.playerConfig.metadata?.requiresSubmit?.toLowerCase() !== 'no';
        this.parentConfig.instructions = this.playerConfig.metadata?.instructions;
        this.parentConfig.showLegend = this.playerConfig.config?.showLegend !== undefined ? this.playerConfig.config.showLegend : true;
        this.nextContent = this.playerConfig.config?.nextContent;
        this.showEndPage = this.playerConfig.metadata?.showEndPage?.toLowerCase() !== 'no';
        this.parentConfig.showFeedback = this.showFeedBack = this.playerConfig.metadata?.showFeedback;
        this.parentConfig.sideMenuConfig = { ...this.parentConfig.sideMenuConfig, ...this.playerConfig.config.sideMenu };
        this.parentConfig.warningTime = _.get(this.playerConfig, 'config.warningTime', this.parentConfig.warningTime);
        this.parentConfig.showWarningTimer = _.get(this.playerConfig, 'config.showWarningTimer', this.parentConfig.showWarningTimer);
        if (this.playerConfig?.context?.userData) {
            const firstName = this.playerConfig.context.userData?.firstName ?? '';
            const lastName = this.playerConfig.context.userData?.lastName ?? '';
            this.userName = firstName + ' ' + lastName;
        }
        if (this.playerConfig.metadata.isAvailableLocally && this.playerConfig.metadata.basePath) {
            this.parentConfig.baseUrl = this.playerConfig.metadata.basePath;
            this.parentConfig.isAvailableLocally = true;
        }
        this.attempts = {
            max: this.playerConfig.metadata?.maxAttempts,
            current: this.playerConfig.metadata?.currentAttempt ? this.playerConfig.metadata.currentAttempt + 1 : 1
        };
        this.totalScore = this.playerConfig.metadata.outcomeDeclaration.maxScore.defaultValue;
        this.showReplay = this.attempts?.max && this.attempts?.current >= this.attempts.max ? false : true;
        if (typeof this.playerConfig.metadata?.timeLimits === 'string') {
            this.playerConfig.metadata.timeLimits = JSON.parse(this.playerConfig.metadata.timeLimits);
        }
        this.initialTime = new Date().getTime();
        this.emitMaxAttemptEvents();
    }
    getMultilevelSection(obj) {
        let isMultiLevel;
        obj.children.forEach(item => {
            if (item.children && !isMultiLevel) {
                isMultiLevel = this.hasChildren(item.children);
            }
        });
        return isMultiLevel;
    }
    hasChildren(arr) {
        return arr.some(item => item.children);
    }
    emitMaxAttemptEvents() {
        if ((this.playerConfig.metadata?.maxAttempts - 1) === this.playerConfig.metadata?.currentAttempt) {
            this.playerEvent.emit(this.viewerService.generateMaxAttemptEvents(this.attempts?.current, false, true));
        }
        else if (this.playerConfig.metadata?.currentAttempt >= this.playerConfig.metadata?.maxAttempts) {
            this.playerEvent.emit(this.viewerService.generateMaxAttemptEvents(this.attempts?.current, true, false));
        }
    }
    getActiveSectionIndex() {
        return this.sections.findIndex(sec => sec.metadata?.identifier === this.activeSection.metadata?.identifier);
    }
    onShowScoreBoard(event) {
        /* istanbul ignore else */
        if (this.parentConfig.isSectionsAvailable) {
            const activeSectionIndex = this.getActiveSectionIndex();
            this.updateSectionScore(activeSectionIndex);
        }
        this.getSummaryObject();
        this.loadScoreBoard = true;
        this.viewerService.pauseVideo();
    }
    onSectionEnd(event) {
        if (event.isDurationEnded) {
            this.isDurationExpired = true;
        }
        if (this.parentConfig.isSectionsAvailable) {
            const activeSectionIndex = this.getActiveSectionIndex();
            this.updateSectionScore(activeSectionIndex);
            this.setNextSection(event, activeSectionIndex);
        }
        else {
            this.prepareEnd(event);
        }
    }
    onPlayerEvent(event) {
        this.playerEvent.emit(event);
    }
    getSummaryObject() {
        const progressBar = this.isSectionsAvailable ? _.flattenDeep(this.mainProgressBar.map(item => item.children)) : this.mainProgressBar;
        const classObj = _.groupBy(progressBar, 'class');
        this.summary = {
            skipped: _.get(classObj, 'skipped.length') || 0,
            correct: _.get(classObj, 'correct.length') || 0,
            wrong: _.get(classObj, 'wrong.length') || 0,
            partial: _.get(classObj, 'partial.length') || 0
        };
        this.totalVisitedQuestion = this.summary.correct + this.summary.wrong + this.summary.partial + this.summary.skipped;
        this.viewerService.totalNumberOfQuestions = this.totalNoOfQuestions;
    }
    updateSectionScore(activeSectionIndex) {
        this.mainProgressBar[activeSectionIndex].score = this.mainProgressBar[activeSectionIndex].children
            .reduce((accumulator, currentValue) => accumulator + currentValue.score, 0);
    }
    setNextSection(event, activeSectionIndex) {
        this.summary = this.utilService.sumObjectsByKey(this.summary, event.summary);
        const isSectionFullyAttempted = event.summary.skipped === 0 &&
            (event.summary?.correct + event.summary?.wrong) === this.mainProgressBar[activeSectionIndex]?.children?.length;
        const isSectionPartiallyAttempted = event.summary.skipped > 0;
        if (event.isDurationEnded) {
            this.isDurationExpired = true;
            this.prepareEnd(event);
            return;
        }
        let nextSectionIndex = activeSectionIndex + 1;
        /* istanbul ignore else */
        if (event.jumpToSection) {
            const sectionIndex = this.sections.findIndex(sec => sec.metadata?.identifier === event.jumpToSection);
            nextSectionIndex = sectionIndex > -1 ? sectionIndex : nextSectionIndex;
        }
        this.sectionIndex = _.cloneDeep(nextSectionIndex);
        this.mainProgressBar.forEach((item, index) => {
            item.isActive = index === nextSectionIndex;
            if (index === activeSectionIndex) {
                if (isSectionFullyAttempted) {
                    item.class = 'attempted';
                }
                else if (isSectionPartiallyAttempted) {
                    item.class = 'partial';
                }
            }
        });
        if (nextSectionIndex < this.sections.length) {
            this.activeSection = _.cloneDeep(this.sections[nextSectionIndex]);
        }
        else {
            this.prepareEnd(event);
        }
    }
    prepareEnd(event) {
        this.viewerService.pauseVideo();
        this.calculateScore();
        this.setDurationSpent();
        this.getSummaryObject();
        if (this.parentConfig.requiresSubmit && !this.isDurationExpired) {
            this.loadScoreBoard = true;
        }
        else {
            this.endPageReached = true;
            this.loadScoreBoard = false;
            this.viewerService.raiseSummaryEvent(this.totalVisitedQuestion, this.endPageReached, this.finalScore, this.summary);
            this.raiseEndEvent(this.totalVisitedQuestion, this.endPageReached, this.finalScore);
            this.isSummaryEventRaised = true;
            this.isEndEventRaised = true;
        }
    }
    replayContent() {
        this.parentConfig.isReplayed = true;
        this.loadScoreBoard = false;
        this.endPageReached = false;
        this.isDurationExpired = false;
        this.isEndEventRaised = false;
        this.attempts.current = this.attempts.current + 1;
        this.showReplay = this.attempts?.max && this.attempts?.current >= this.attempts.max ? false : true;
        this.totalNoOfQuestions = 0;
        this.totalVisitedQuestion = 0;
        this.mainProgressBar = [];
        this.jumpToQuestion = undefined;
        this.summary = {
            correct: 0,
            partial: 0,
            skipped: 0,
            wrong: 0
        };
        this.sections = [];
        this.initialTime = new Date().getTime();
        this.initializeSections();
        this.endPageReached = false;
        this.loadScoreBoard = false;
        this.activeSection = this.isSectionsAvailable ? _.cloneDeep(this.sections[0]) : this.playerConfig;
        /* istanbul ignore else */
        if (this.attempts?.max === this.attempts?.current) {
            this.playerEvent.emit(this.viewerService.generateMaxAttemptEvents(_.get(this.attempts, 'current'), false, true));
        }
        this.viewerService.raiseHeartBeatEvent(eventName.replayClicked, TelemetryType.interact, pageId.endPage);
        setTimeout(() => {
            this.parentConfig.isReplayed = false;
            const element = document.querySelector('li.info-page');
            /* istanbul ignore else */
            if (element) {
                element.scrollIntoView({ behavior: 'smooth' });
            }
        }, 1000);
    }
    setInitialScores(activeSectionIndex = 0) {
        const alphabets = 'abcdefghijklmnopqrstuvwxyz'.split('');
        this.sections.forEach((section, i) => {
            this.mainProgressBar.push({
                index: alphabets[i].toLocaleUpperCase(), class: 'unattempted', value: undefined,
                score: 0,
                isActive: i === activeSectionIndex,
                identifier: section.metadata?.identifier
            });
            const children = [];
            section.metadata.childNodes.forEach((child, index) => {
                children.push({
                    index: (index + 1), class: 'unattempted', value: undefined,
                    score: 0,
                });
                this.totalNoOfQuestions++;
            });
            this.mainProgressBar[this.mainProgressBar.length - 1] = {
                ..._.last(this.mainProgressBar), children
            };
        });
        this.parentConfig.questionCount = this.totalNoOfQuestions;
    }
    calculateScore() {
        this.finalScore = this.mainProgressBar.reduce((accumulator, currentValue) => accumulator + currentValue.score, 0);
        this.generateOutComeLabel();
        return this.finalScore;
    }
    exitContent(event) {
        this.calculateScore();
        /* istanbul ignore else */
        if (event?.type === 'EXIT') {
            this.viewerService.raiseHeartBeatEvent(eventName.endPageExitClicked, TelemetryType.interact, pageId.endPage);
            this.getSummaryObject();
            this.viewerService.raiseSummaryEvent(this.totalVisitedQuestion, this.endPageReached, this.finalScore, this.summary);
            this.isSummaryEventRaised = true;
            this.raiseEndEvent(this.totalVisitedQuestion, this.endPageReached, this.finalScore);
        }
    }
    raiseEndEvent(currentQuestionIndex, endPageSeen, score) {
        if (this.isEndEventRaised) {
            return;
        }
        this.isEndEventRaised = true;
        this.viewerService.metaData.progressBar = this.mainProgressBar;
        this.viewerService.raiseEndEvent(currentQuestionIndex, endPageSeen, score);
        /* istanbul ignore else */
        if (_.get(this.attempts, 'current') >= _.get(this.attempts, 'max')) {
            this.playerEvent.emit(this.viewerService.generateMaxAttemptEvents(_.get(this.attempts, 'current'), true, false));
        }
    }
    setDurationSpent() {
        /* istanbul ignore else */
        if (this.playerConfig.metadata?.summaryType !== 'Score') {
            this.viewerService.metaData.duration = new Date().getTime() - this.initialTime;
            this.durationSpent = this.utilService.getTimeSpentText(this.initialTime);
        }
    }
    onScoreBoardLoaded(event) {
        if (event?.scoreBoardLoaded) {
            this.calculateScore();
        }
    }
    onScoreBoardSubmitted() {
        this.endPageReached = true;
        this.getSummaryObject();
        this.setDurationSpent();
        this.viewerService.raiseHeartBeatEvent(eventName.scoreBoardSubmitClicked, TelemetryType.interact, pageId.submitPage);
        this.viewerService.raiseSummaryEvent(this.totalVisitedQuestion, this.endPageReached, this.finalScore, this.summary);
        this.raiseEndEvent(this.totalVisitedQuestion, this.endPageReached, this.finalScore);
        this.loadScoreBoard = false;
        this.isSummaryEventRaised = true;
    }
    generateOutComeLabel() {
        this.outcomeLabel = this.finalScore.toString();
        switch (_.get(this.playerConfig, 'metadata.summaryType')) {
            case 'Complete': {
                this.outcomeLabel = this.totalScore ? `${this.finalScore} / ${this.totalScore}` : this.outcomeLabel;
                break;
            }
            case 'Duration': {
                this.outcomeLabel = '';
                break;
            }
        }
    }
    goToQuestion(event) {
        /* istanbul ignore else */
        if (this.parentConfig.isSectionsAvailable && event.identifier) {
            const sectionIndex = this.sections.findIndex(sec => sec.metadata?.identifier === event.identifier);
            this.activeSection = _.cloneDeep(this.sections[sectionIndex]);
            this.mainProgressBar.forEach((item, index) => {
                item.isActive = index === sectionIndex;
            });
        }
        this.jumpToQuestion = event;
        this.loadScoreBoard = false;
    }
    playNextContent(event) {
        this.viewerService.raiseHeartBeatEvent(event?.type, TelemetryType.interact, pageId.endPage, event?.identifier);
    }
    toggleScreenRotate(event) {
        this.viewerService.raiseHeartBeatEvent(eventName.deviceRotationClicked, TelemetryType.interact, this.sectionPlayer.myCarousel.getCurrentSlideIndex() + 1);
    }
    sideBarEvents(event) {
        /* istanbul ignore else */
        if (event.type === 'OPEN_MENU' || event.type === 'CLOSE_MENU') {
            this.handleSideBarAccessibility(event);
        }
        this.viewerService.raiseHeartBeatEvent(event.type, TelemetryType.interact, this.sectionPlayer.myCarousel.getCurrentSlideIndex() + 1);
    }
    handleSideBarAccessibility(event) {
        const navBlock = document.querySelector('.navBlock');
        const overlayInput = document.querySelector('#overlay-input');
        const overlayButton = document.querySelector('#overlay-button');
        const sideBarList = document.querySelector('#sidebar-list');
        if (event.type === 'OPEN_MENU') {
            const isMobile = this.playerConfig.config?.sideMenu?.showExit;
            this.disabledHandle = isMobile ? maintain.hidden({ filter: [sideBarList, overlayButton, overlayInput] }) : maintain.tabFocus({ context: navBlock });
            this.subscription = fromEvent(document, 'keydown').subscribe((e) => {
                console.log("===========", e.key);
                /* istanbul ignore else */
                if (e['key'] === 'Escape') {
                    const inputChecked = document.getElementById('overlay-input');
                    inputChecked.checked = false;
                    document.getElementById('playerSideMenu').style.visibility = 'hidden';
                    document.querySelector('.navBlock').style.marginLeft = '-100%';
                    this.viewerService.raiseHeartBeatEvent('CLOSE_MENU', TelemetryType.interact, this.sectionPlayer.myCarousel.getCurrentSlideIndex() + 1);
                    this.disabledHandle.disengage();
                    this.subscription.unsubscribe();
                    this.disabledHandle = null;
                    this.subscription = null;
                }
            });
        }
        else if (event.type === 'CLOSE_MENU' && this.disabledHandle) {
            this.disabledHandle.disengage();
            this.disabledHandle = null;
            /* istanbul ignore else */
            if (this.subscription) {
                this.subscription.unsubscribe();
                this.subscription = null;
            }
        }
    }
    ngOnDestroy() {
        this.calculateScore();
        this.getSummaryObject();
        /* istanbul ignore else */
        if (this.isSummaryEventRaised === false) {
            this.viewerService.raiseSummaryEvent(this.totalVisitedQuestion, this.endPageReached, this.finalScore, this.summary);
        }
        /* istanbul ignore else */
        if (this.subscription) {
            this.subscription.unsubscribe();
        }
        this.raiseEndEvent(this.totalVisitedQuestion, this.endPageReached, this.finalScore);
    }
    /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MainPlayerComponent, deps: [{ token: i1.ViewerService }, { token: i2.UtilService }, { token: i3.TransformationService }], target: i0.ɵɵFactoryTarget.Component }); }
    /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MainPlayerComponent, selector: "quml-main-player", inputs: { playerConfig: "playerConfig" }, outputs: { playerEvent: "playerEvent", telemetryEvent: "telemetryEvent" }, host: { listeners: { "document:TelemetryEvent": "onTelemetryEvent($event)", "window:beforeunload": "ngOnDestroy()" } }, viewQueries: [{ propertyName: "sectionPlayer", first: true, predicate: SectionPlayerComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Need to show loading here -->\n<sb-player-start-page *ngIf=\"isLoading\" [title]=\"parentConfig?.contentName\"></sb-player-start-page>\n\n<sb-player-side-menu-icon *ngIf=\"parentConfig?.sideMenuConfig?.enable && !endPageReached\" (sidebarMenuEvent)=\"sideBarEvents($event)\"></sb-player-side-menu-icon>\n<quml-header *ngIf=\"loadScoreBoard && parentConfig?.requiresSubmit && !endPageReached\" [showLegend]=\"parentConfig?.showLegend\"\n  [disablePreviousNavigation]=\"true\" [disableNext]=\"true\" [attempts]=\"attempts\" [loadScoreBoard]=\"true\"\n  [showDeviceOrientation]=\"playerConfig?.config?.showDeviceOrientation\" (toggleScreenRotate)=\"toggleScreenRotate()\"></quml-header>\n<sb-player-sidebar [title]=\"parentConfig?.contentName\" [config]=\"parentConfig?.sideMenuConfig\" (sidebarEvent)=\"sideBarEvents($event)\">\n</sb-player-sidebar>\n\n<div *ngIf=\"!isLoading\" class=\"main-container\">\n  <div class=\"main-container\" [hidden]=\"!activeSection || loadScoreBoard || endPageReached\">\n    <quml-section-player *ngIf=\"activeSection\" [sectionConfig]=\"activeSection\" (sectionEnd)=\"onSectionEnd($event)\" [attempts]=\"attempts\"\n      [mainProgressBar]=\"mainProgressBar\" [parentConfig]=\"parentConfig\" [sectionIndex]=\"sectionIndex\"\n      [jumpToQuestion]=\"jumpToQuestion\" (showScoreBoard)=\"onShowScoreBoard($event)\"\n      (playerEvent)=\"onPlayerEvent($event)\">\n    </quml-section-player>\n  </div>\n\n  <!-- Show scoreboard -->\n  <quml-scoreboard *ngIf=\"loadScoreBoard && parentConfig?.requiresSubmit && !endPageReached\"\n    (scoreBoardLoaded)=\"onScoreBoardLoaded($event)\" (submitClicked)=\"onScoreBoardSubmitted()\"\n    [contentName]=\"parentConfig.contentName\" [scores]=\"mainProgressBar\" [totalNoOfQuestions]=\"totalNoOfQuestions\"\n    [showFeedBack]=\"showFeedBack\" (emitQuestionNo)=\"goToQuestion($event)\"\n    [isSections]=\"parentConfig?.isSectionsAvailable\" [summary]=\"summary\">\n  </quml-scoreboard>\n\n  <!-- Show player end page -->\n  <div class=\"endPage-container\" *ngIf=\"endPageReached\" [ngClass]=\"endPageReached ? 'endPage-container-height': ''\">\n    <sb-player-end-page *ngIf=\"endPageReached && showEndPage\" [contentName]=\"parentConfig.contentName\"\n      [outcome]=\"outcomeLabel\" [outcomeLabel]=\"'Score: '\" [userName]=\"userName\" [timeSpentLabel]=\"durationSpent\"\n      (replayContent)=\"replayContent()\" (exitContent)=\"exitContent($event)\"\n      [showExit]=\"parentConfig?.sideMenuConfig.showExit\" [showReplay]=\"showReplay\" [nextContent]=\"nextContent\"\n      (playNextContent)=\"playNextContent($event)\">\n\n      <span class=\"sb-color-primary mt-8 fnormal font-weight-bold d-block\"\n        *ngIf=\"attempts?.max && attempts?.current && attempts.max !== attempts.current\">Attempt no\n        {{attempts.current}}/{{attempts.max}}\n      </span>\n\n      <span class=\"attempts sb-color-primary mt-8 fnormal font-weight-bold d-block\"\n        *ngIf=\"attempts?.max === attempts?.current\">{{attempts.current}}/{{attempts.max}} attempts completed\n      </span>\n    </sb-player-end-page>\n  </div>\n\n\n  <!-- Show content error -->\n  <div *ngIf=\"isMultiLevelSection\">\n    <sb-player-contenterror [errorMsg]=\"contentError\"></sb-player-contenterror>\n  </div>\n</div>", styles: ["::ng-deep :root{--quml-main-bg: #fff}::ng-deep #overlay-button{top:.6rem!important}.main-container{width:100%;height:100%;background:var(--quml-main-bg)}.endPage-container-height{height:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.StartPageComponent, selector: "sb-player-start-page", inputs: ["title", "progress"] }, { kind: "component", type: i5.EndPageComponent, selector: "sb-player-end-page", inputs: ["showExit", "showReplay", "contentName", "outcome", "outcomeLabel", "userName", "timeSpentLabel", "nextContent"], outputs: ["replayContent", "exitContent", "playNextContent"] }, { kind: "component", type: i5.SidebarComponent, selector: "sb-player-sidebar", inputs: ["title", "config"], outputs: ["sidebarEvent", "toggleMenu"] }, { kind: "component", type: i5.SideMenuIconComponent, selector: "sb-player-side-menu-icon", outputs: ["sidebarMenuEvent"] }, { kind: "component", type: i5.ContenterrorComponent, selector: "sb-player-contenterror", inputs: ["errorMsg"] }, { kind: "component", type: i6.HeaderComponent, selector: "quml-header", inputs: ["questions", "duration", "warningTime", "showWarningTimer", "disablePreviousNavigation", "showTimer", "totalNoOfQuestions", "currentSlideIndex", "active", "initializeTimer", "endPageReached", "loadScoreBoard", "replayed", "currentSolutions", "showFeedBack", "disableNext", "startPageInstruction", "showStartPage", "attempts", "showDeviceOrientation", "showLegend"], outputs: ["nextSlideClicked", "prevSlideClicked", "durationEnds", "showSolution", "toggleScreenRotate"] }, { kind: "component", type: i7.ScoreboardComponent, selector: "quml-scoreboard", inputs: ["scores", "totalNoOfQuestions", "contentName", "showFeedBack", "isSections", "summary"], outputs: ["submitClicked", "emitQuestionNo", "scoreBoardLoaded"] }, { kind: "component", type: i8.SectionPlayerComponent, selector: "quml-section-player", inputs: ["sectionConfig", "attempts", "jumpToQuestion", "mainProgressBar", "sectionIndex", "parentConfig"], outputs: ["playerEvent", "sectionEnd", "showScoreBoard"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MainPlayerComponent, decorators: [{
            type: Component,
            args: [{ selector: 'quml-main-player', template: "<!-- Need to show loading here -->\n<sb-player-start-page *ngIf=\"isLoading\" [title]=\"parentConfig?.contentName\"></sb-player-start-page>\n\n<sb-player-side-menu-icon *ngIf=\"parentConfig?.sideMenuConfig?.enable && !endPageReached\" (sidebarMenuEvent)=\"sideBarEvents($event)\"></sb-player-side-menu-icon>\n<quml-header *ngIf=\"loadScoreBoard && parentConfig?.requiresSubmit && !endPageReached\" [showLegend]=\"parentConfig?.showLegend\"\n  [disablePreviousNavigation]=\"true\" [disableNext]=\"true\" [attempts]=\"attempts\" [loadScoreBoard]=\"true\"\n  [showDeviceOrientation]=\"playerConfig?.config?.showDeviceOrientation\" (toggleScreenRotate)=\"toggleScreenRotate()\"></quml-header>\n<sb-player-sidebar [title]=\"parentConfig?.contentName\" [config]=\"parentConfig?.sideMenuConfig\" (sidebarEvent)=\"sideBarEvents($event)\">\n</sb-player-sidebar>\n\n<div *ngIf=\"!isLoading\" class=\"main-container\">\n  <div class=\"main-container\" [hidden]=\"!activeSection || loadScoreBoard || endPageReached\">\n    <quml-section-player *ngIf=\"activeSection\" [sectionConfig]=\"activeSection\" (sectionEnd)=\"onSectionEnd($event)\" [attempts]=\"attempts\"\n      [mainProgressBar]=\"mainProgressBar\" [parentConfig]=\"parentConfig\" [sectionIndex]=\"sectionIndex\"\n      [jumpToQuestion]=\"jumpToQuestion\" (showScoreBoard)=\"onShowScoreBoard($event)\"\n      (playerEvent)=\"onPlayerEvent($event)\">\n    </quml-section-player>\n  </div>\n\n  <!-- Show scoreboard -->\n  <quml-scoreboard *ngIf=\"loadScoreBoard && parentConfig?.requiresSubmit && !endPageReached\"\n    (scoreBoardLoaded)=\"onScoreBoardLoaded($event)\" (submitClicked)=\"onScoreBoardSubmitted()\"\n    [contentName]=\"parentConfig.contentName\" [scores]=\"mainProgressBar\" [totalNoOfQuestions]=\"totalNoOfQuestions\"\n    [showFeedBack]=\"showFeedBack\" (emitQuestionNo)=\"goToQuestion($event)\"\n    [isSections]=\"parentConfig?.isSectionsAvailable\" [summary]=\"summary\">\n  </quml-scoreboard>\n\n  <!-- Show player end page -->\n  <div class=\"endPage-container\" *ngIf=\"endPageReached\" [ngClass]=\"endPageReached ? 'endPage-container-height': ''\">\n    <sb-player-end-page *ngIf=\"endPageReached && showEndPage\" [contentName]=\"parentConfig.contentName\"\n      [outcome]=\"outcomeLabel\" [outcomeLabel]=\"'Score: '\" [userName]=\"userName\" [timeSpentLabel]=\"durationSpent\"\n      (replayContent)=\"replayContent()\" (exitContent)=\"exitContent($event)\"\n      [showExit]=\"parentConfig?.sideMenuConfig.showExit\" [showReplay]=\"showReplay\" [nextContent]=\"nextContent\"\n      (playNextContent)=\"playNextContent($event)\">\n\n      <span class=\"sb-color-primary mt-8 fnormal font-weight-bold d-block\"\n        *ngIf=\"attempts?.max && attempts?.current && attempts.max !== attempts.current\">Attempt no\n        {{attempts.current}}/{{attempts.max}}\n      </span>\n\n      <span class=\"attempts sb-color-primary mt-8 fnormal font-weight-bold d-block\"\n        *ngIf=\"attempts?.max === attempts?.current\">{{attempts.current}}/{{attempts.max}} attempts completed\n      </span>\n    </sb-player-end-page>\n  </div>\n\n\n  <!-- Show content error -->\n  <div *ngIf=\"isMultiLevelSection\">\n    <sb-player-contenterror [errorMsg]=\"contentError\"></sb-player-contenterror>\n  </div>\n</div>", styles: ["::ng-deep :root{--quml-main-bg: #fff}::ng-deep #overlay-button{top:.6rem!important}.main-container{width:100%;height:100%;background:var(--quml-main-bg)}.endPage-container-height{height:100%}\n"] }]
        }], ctorParameters: function () { return [{ type: i1.ViewerService }, { type: i2.UtilService }, { type: i3.TransformationService }]; }, propDecorators: { playerConfig: [{
                type: Input
            }], playerEvent: [{
                type: Output
            }], telemetryEvent: [{
                type: Output
            }], sectionPlayer: [{
                type: ViewChild,
                args: [SectionPlayerComponent]
            }], onTelemetryEvent: [{
                type: HostListener,
                args: ['document:TelemetryEvent', ['$event']]
            }], ngOnDestroy: [{
                type: HostListener,
                args: ['window:beforeunload']
            }] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi1wbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcXVtbC1saWJyYXJ5L3NyYy9saWIvbWFpbi1wbGF5ZXIvbWFpbi1wbGF5ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcXVtbC1saWJyYXJ5L3NyYy9saWIvbWFpbi1wbGF5ZXIvbWFpbi1wbGF5ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbEksT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7QUFDL0IsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFJcEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXRGLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sUUFBUSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7O0FBTTVELE1BQU0sT0FBTyxtQkFBbUI7SUFxRTlCLFlBQ1MsYUFBNEIsRUFDM0IsV0FBd0IsRUFDeEIscUJBQTRDO1FBRjdDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzNCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFyRTVDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN0QyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFJbkQsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFD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QztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7a0lBdGpCVSxtQkFBbUI7c0hBQW5CLG1CQUFtQixvVkFNbkIsc0JBQXNCLHFFQ3hCbkMsNnNHQW1ETTs7NEZEakNPLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxrQkFBa0I7a0tBTW5CLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUU0QixhQUFhO3NCQUEvQyxTQUFTO3VCQUFDLHNCQUFzQjtnQkFxRWpDLGdCQUFnQjtzQkFEZixZQUFZO3VCQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWdlbkQsV0FBVztzQkFEVixZQUFZO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbnRlbnRFcnJvck1lc3NhZ2UgfSBmcm9tICdAcHJvamVjdC1zdW5iaXJkL3N1bmJpcmQtcGxheWVyLXNkay12OS9saWIvcGxheWVyLXV0aWxzL2ludGVyZmFjZXMvZXJyb3JNZXNzYWdlJztcbmltcG9ydCB7IE5leHRDb250ZW50LCBJU2lkZUJhckV2ZW50IH0gZnJvbSAnQHByb2plY3Qtc3VuYmlyZC9zdW5iaXJkLXBsYXllci1zZGstdjkvc3VuYmlyZC1wbGF5ZXItc2RrLmludGVyZmFjZSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBTZWN0aW9uUGxheWVyQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VjdGlvbi1wbGF5ZXIvc2VjdGlvbi1wbGF5ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IElBdHRlbXB0cywgSVBhcmVudENvbmZpZywgSVN1bW1hcnksIFF1bWxQbGF5ZXJDb25maWcgfSBmcm9tICcuLy4uL3F1bWwtbGlicmFyeS1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVmlld2VyU2VydmljZSB9IGZyb20gJy4vLi4vc2VydmljZXMvdmlld2VyLXNlcnZpY2Uvdmlld2VyLXNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNmb3JtYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdHJhbnNmb3JtYXRpb24tc2VydmljZS90cmFuc2Zvcm1hdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGV2ZW50TmFtZSwgcGFnZUlkLCBUZWxlbWV0cnlUeXBlLCBNaW1lVHlwZSB9IGZyb20gJy4vLi4vdGVsZW1ldHJ5LWNvbnN0YW50cyc7XG5pbXBvcnQgeyBVdGlsU2VydmljZSB9IGZyb20gJy4vLi4vdXRpbC1zZXJ2aWNlJztcbmltcG9ydCB7IGZyb21FdmVudCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgbWFpbnRhaW4gZnJvbSAnYWxseS5qcy9lc20vbWFpbnRhaW4vX21haW50YWluJztcbmltcG9ydCB7IFdBUk5JTkdfVElNRV9DT05GSUcgfSBmcm9tICcuLy4uL3BsYXllci1jb25zdGFudHMnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncXVtbC1tYWluLXBsYXllcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYWluLXBsYXllci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21haW4tcGxheWVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTWFpblBsYXllckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBwbGF5ZXJDb25maWc6IFF1bWxQbGF5ZXJDb25maWc7XG4gIEBPdXRwdXQoKSBwbGF5ZXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdGVsZW1ldHJ5RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAVmlld0NoaWxkKFNlY3Rpb25QbGF5ZXJDb21wb25lbnQpIHNlY3Rpb25QbGF5ZXIhOiBTZWN0aW9uUGxheWVyQ29tcG9uZW50O1xuXG4gIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgaXNMb2FkaW5nID0gZmFsc2U7XG4gIGlzU2VjdGlvbnNBdmFpbGFibGUgPSBmYWxzZTtcbiAgaXNNdWx0aUxldmVsU2VjdGlvbiA9IGZhbHNlO1xuICBzZWN0aW9uczogYW55W10gPSBbXTtcbiAgc2VjdGlvbkluZGV4ID0gMDtcbiAgYWN0aXZlU2VjdGlvbjogYW55O1xuICBjb250ZW50RXJyb3I6IGNvbnRlbnRFcnJvck1lc3NhZ2U7XG4gIHBhcmVudENvbmZpZzogSVBhcmVudENvbmZpZyA9IHtcbiAgICBsb2FkU2NvcmVCb2FyZDogZmFsc2UsXG4gICAgcmVxdWlyZXNTdWJtaXQ6IGZhbHNlLFxuICAgIGlzU2VjdGlvbnNBdmFpbGFibGU6IGZhbHNlLFxuICAgIGlzUmVwbGF5ZWQ6IGZhbHNlLFxuICAgIGlkZW50aWZpZXI6ICcnLFxuICAgIGNvbnRlbnROYW1lOiAnJyxcbiAgICBiYXNlVXJsOiAnJyxcbiAgICBpc0F2YWlsYWJsZUxvY2FsbHk6IGZhbHNlLFxuICAgIGluc3RydWN0aW9uczoge30sXG4gICAgcXVlc3Rpb25Db3VudDogMCxcbiAgICBzaWRlTWVudUNvbmZpZzoge1xuICAgICAgZW5hYmxlOiB0cnVlLFxuICAgICAgc2hvd1NoYXJlOiB0cnVlLFxuICAgICAgc2hvd0Rvd25sb2FkOiBmYWxzZSxcbiAgICAgIHNob3dFeGl0OiBmYWxzZSxcbiAgICB9LFxuICAgIHNob3dGZWVkYmFjazogZmFsc2UsXG4gICAgc2hvd0xlZ2VuZDogdHJ1ZSxcbiAgICB3YXJuaW5nVGltZTogV0FSTklOR19USU1FX0NPTkZJRy5ERUZBVUxUX1RJTUUsXG4gICAgc2hvd1dhcm5pbmdUaW1lcjogV0FSTklOR19USU1FX0NPTkZJRy5TSE9XX1RJTUVSXG4gIH07XG5cbiAgc2hvd0VuZFBhZ2U6IGJvb2xlYW47XG4gIHNob3dGZWVkQmFjazogYm9vbGVhbjtcbiAgZW5kUGFnZVJlYWNoZWQgPSBmYWxzZTtcbiAgaXNFbmRFdmVudFJhaXNlZCA9IGZhbHNlO1xuICBpc1N1bW1hcnlFdmVudFJhaXNlZCA9IGZhbHNlO1xuICBzaG93UmVwbGF5ID0gdHJ1ZTtcblxuICBhdHRlbXB0czogSUF0dGVtcHRzO1xuICBtYWluUHJvZ3Jlc3NCYXIgPSBbXTtcbiAgbG9hZFNjb3JlQm9hcmQgPSBmYWxzZTtcbiAgc3VtbWFyeTogSVN1bW1hcnkgPSB7XG4gICAgY29ycmVjdDogMCxcbiAgICBwYXJ0aWFsOiAwLFxuICAgIHNraXBwZWQ6IDAsXG4gICAgd3Jvbmc6IDBcbiAgfTtcbiAgaXNEdXJhdGlvbkV4cGlyZWQgPSBmYWxzZTtcbiAgZmluYWxTY29yZSA9IDA7XG4gIHRvdGFsTm9PZlF1ZXN0aW9ucyA9IDA7XG4gIGR1cmF0aW9uU3BlbnQ6IHN0cmluZztcbiAgb3V0Y29tZUxhYmVsOiBzdHJpbmc7XG4gIHRvdGFsU2NvcmU6IG51bWJlcjtcbiAgaW5pdGlhbFRpbWU6IG51bWJlcjtcbiAgdXNlck5hbWU6IHN0cmluZztcbiAganVtcFRvUXVlc3Rpb246IGFueTtcbiAgdG90YWxWaXNpdGVkUXVlc3Rpb24gPSAwO1xuICBuZXh0Q29udGVudDogTmV4dENvbnRlbnQ7XG4gIGRpc2FibGVkSGFuZGxlOiBhbnk7XG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB2aWV3ZXJTZXJ2aWNlOiBWaWV3ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbFNlcnZpY2U6IFV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNmb3JtYXRpb25TZXJ2aWNlOiBUcmFuc2Zvcm1hdGlvblNlcnZpY2UpIHsgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OlRlbGVtZXRyeUV2ZW50JywgWyckZXZlbnQnXSlcbiAgb25UZWxlbWV0cnlFdmVudChldmVudCkge1xuICAgIHRoaXMudGVsZW1ldHJ5RXZlbnQuZW1pdChldmVudC5kZXRhaWwpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnBsYXllckNvbmZpZykge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLnBsYXllckNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnBsYXllckNvbmZpZyA9IEpTT04ucGFyc2UodGhpcy5wbGF5ZXJDb25maWcpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgcGxheWVyQ29uZmlnOiAnLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKCFfLmhhcyh0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YSwgJ3F1bWxWZXJzaW9uJykgJiYgXy5nZXQodGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGEsICdxdW1sVmVyc2lvbicpICE9IDEuMSkge1xuICAgICAgICB0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YSA9IHRoaXMudHJhbnNmb3JtYXRpb25TZXJ2aWNlLmdldFRyYW5zZm9ybWVkSGllcmFyY2h5KHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhKVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coJ3BsYXllckNvbmZpZzo6JywgdGhpcy5wbGF5ZXJDb25maWcpO1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRDb25maWcoKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVNlY3Rpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLnBsYXllckNvbmZpZy5maXJzdENoYW5nZSAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIC8vIFRoaXMgZXhwbGljaXRseSBjYWxsaW5nIG5nT25Jbml0IGlzIGZvciB0aGUgd2ViLWNvbXBvbmVudC4gTGlmZSBjeWNsZSBtZXRob2RzIHdvcmtzIGluIGRpZmZlcmVudCBvcmRlciB0aGVyZS5cbiAgICAgIHRoaXMubmdPbkluaXQoKTtcbiAgICB9XG4gIH1cblxuICBpbml0aWFsaXplU2VjdGlvbnMoKSB7XG4gICAgY29uc3QgY2hpbGRNaW1lVHlwZSA9IF8ubWFwKHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhLmNoaWxkcmVuLCAnbWltZVR5cGUnKTtcbiAgICB0aGlzLnBhcmVudENvbmZpZy5pc1NlY3Rpb25zQXZhaWxhYmxlID0gdGhpcy5pc1NlY3Rpb25zQXZhaWxhYmxlID0gY2hpbGRNaW1lVHlwZVswXSA9PT0gTWltZVR5cGUucXVlc3Rpb25TZXQ7XG4gICAgdGhpcy5wYXJlbnRDb25maWcubWV0YWRhdGEgPSB7IC4uLnRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhIH07XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnNlY3Rpb25RdWVzdGlvbnMgPSBbXTtcbiAgICBpZiAodGhpcy5pc1NlY3Rpb25zQXZhaWxhYmxlKSB7XG4gICAgICB0aGlzLmlzTXVsdGlMZXZlbFNlY3Rpb24gPSB0aGlzLmdldE11bHRpbGV2ZWxTZWN0aW9uKHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhKTtcblxuICAgICAgaWYgKHRoaXMuaXNNdWx0aUxldmVsU2VjdGlvbikge1xuICAgICAgICB0aGlzLmNvbnRlbnRFcnJvciA9IHtcbiAgICAgICAgICBtZXNzYWdlSGVhZGVyOiAnVW5hYmxlIHRvIGxvYWQgY29udGVudCcsXG4gICAgICAgICAgbWVzc2FnZVRpdGxlOiAnTXVsdGkgbGV2ZWwgc2VjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYXMgb2Ygbm93J1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGEuY2hpbGRyZW47XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBfLm1hcChjaGlsZHJlbiwgKGNoaWxkKSA9PiB7XG4gICAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBjaGlsZD8uY2hpbGRyZW4/Lm1hcChpdGVtID0+IGl0ZW0uaWRlbnRpZmllcikgfHwgW107XG4gICAgICAgICAgY29uc3QgbWF4UXVlc3Rpb25zID0gY2hpbGQ/Lm1heFF1ZXN0aW9ucztcbiAgICAgICAgICBjaGlsZE5vZGVzID0gY2hpbGQ/LnNodWZmbGUgPyBfLnNodWZmbGUoY2hpbGROb2RlcykgOiBjaGlsZE5vZGVzO1xuXG4gICAgICAgICAgaWYgKG1heFF1ZXN0aW9ucykge1xuICAgICAgICAgICAgY2hpbGROb2RlcyA9IGNoaWxkTm9kZXMuc2xpY2UoMCwgbWF4UXVlc3Rpb25zKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGEudGltZUxpbWl0cykge1xuICAgICAgICAgICAgY2hpbGQgPSB7XG4gICAgICAgICAgICAgIC4uLmNoaWxkLFxuICAgICAgICAgICAgICB0aW1lTGltaXRzOiB0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YS50aW1lTGltaXRzLFxuICAgICAgICAgICAgICBzaG93VGltZXI6IHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhLnNob3dUaW1lclxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnRoaXMucGxheWVyQ29uZmlnLCBtZXRhZGF0YTogeyAuLi5jaGlsZCwgY2hpbGROb2RlcyB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFNjb3JlcygpO1xuICAgICAgICB0aGlzLmFjdGl2ZVNlY3Rpb24gPSBfLmNsb25lRGVlcCh0aGlzLnNlY3Rpb25zWzBdKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNoaWxkTm9kZXMgPSBbXTtcbiAgICAgIGlmICh0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YT8uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICBjaGlsZE5vZGVzID0gdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGEuY2hpbGRyZW4ubWFwKGl0ZW0gPT4gaXRlbS5pZGVudGlmaWVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkTm9kZXMgPSB0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YS5jaGlsZE5vZGVzO1xuICAgICAgfVxuXG4gICAgICBjaGlsZE5vZGVzID0gdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGE/LnNodWZmbGUgPyBfLnNodWZmbGUoY2hpbGROb2RlcykgOiBjaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbWF4UXVlc3Rpb25zID0gdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGEubWF4UXVlc3Rpb25zO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChtYXhRdWVzdGlvbnMpIHtcbiAgICAgICAgY2hpbGROb2RlcyA9IGNoaWxkTm9kZXMuc2xpY2UoMCwgbWF4UXVlc3Rpb25zKTtcbiAgICAgIH1cbiAgICAgIGNoaWxkTm9kZXMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgdGhpcy50b3RhbE5vT2ZRdWVzdGlvbnMrKztcbiAgICAgICAgdGhpcy5tYWluUHJvZ3Jlc3NCYXIucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IChpbmRleCArIDEpLCBjbGFzczogJ3VuYXR0ZW1wdGVkJywgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzY29yZTogMCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhLmNoaWxkTm9kZXMgPSBjaGlsZE5vZGVzO1xuXG4gICAgICBpZiAoIXRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhPy5zaHVmZmxlKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllckNvbmZpZy5jb25maWc/LnByb2dyZXNzQmFyPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLm1haW5Qcm9ncmVzc0JhciA9IF8uY2xvbmVEZWVwKHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZy5wcm9ncmVzc0Jhcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZz8ucXVlc3Rpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBxdWVzdGlvbnNPYmogPSB0aGlzLnBsYXllckNvbmZpZy5jb25maWcucXVlc3Rpb25zLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSB0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YS5pZGVudGlmaWVyKTtcbiAgICAgICAgICBpZiAocXVlc3Rpb25zT2JqPy5xdWVzdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU2VydmljZS51cGRhdGVTZWN0aW9uUXVlc3Rpb25zKHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhLmlkZW50aWZpZXIsIHF1ZXN0aW9uc09iai5xdWVzdGlvbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5hY3RpdmVTZWN0aW9uID0gXy5jbG9uZURlZXAodGhpcy5wbGF5ZXJDb25maWcpO1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGFyZW50Q29uZmlnLnF1ZXN0aW9uQ291bnQgPSB0aGlzLnRvdGFsTm9PZlF1ZXN0aW9ucztcbiAgICB9XG4gIH1cblxuICBzZXRDb25maWcoKSB7XG4gICAgdGhpcy5wYXJlbnRDb25maWcuY29udGVudE5hbWUgPSB0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YT8ubmFtZTtcbiAgICB0aGlzLnBhcmVudENvbmZpZy5pZGVudGlmaWVyID0gdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGE/LmlkZW50aWZpZXI7XG4gICAgdGhpcy5wYXJlbnRDb25maWcucmVxdWlyZXNTdWJtaXQgPSB0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YT8ucmVxdWlyZXNTdWJtaXQ/LnRvTG93ZXJDYXNlKCkgIT09ICdubyc7XG4gICAgdGhpcy5wYXJlbnRDb25maWcuaW5zdHJ1Y3Rpb25zID0gdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGE/Lmluc3RydWN0aW9ucztcbiAgICB0aGlzLnBhcmVudENvbmZpZy5zaG93TGVnZW5kID0gdGhpcy5wbGF5ZXJDb25maWcuY29uZmlnPy5zaG93TGVnZW5kICE9PSB1bmRlZmluZWQgPyB0aGlzLnBsYXllckNvbmZpZy5jb25maWcuc2hvd0xlZ2VuZCA6IHRydWU7XG4gICAgdGhpcy5uZXh0Q29udGVudCA9IHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZz8ubmV4dENvbnRlbnQ7XG4gICAgdGhpcy5zaG93RW5kUGFnZSA9IHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhPy5zaG93RW5kUGFnZT8udG9Mb3dlckNhc2UoKSAhPT0gJ25vJztcbiAgICB0aGlzLnBhcmVudENvbmZpZy5zaG93RmVlZGJhY2sgPSB0aGlzLnNob3dGZWVkQmFjayA9IHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhPy5zaG93RmVlZGJhY2s7XG4gICAgdGhpcy5wYXJlbnRDb25maWcuc2lkZU1lbnVDb25maWcgPSB7IC4uLnRoaXMucGFyZW50Q29uZmlnLnNpZGVNZW51Q29uZmlnLCAuLi50aGlzLnBsYXllckNvbmZpZy5jb25maWcuc2lkZU1lbnUgfTtcbiAgICB0aGlzLnBhcmVudENvbmZpZy53YXJuaW5nVGltZSA9ICBfLmdldCh0aGlzLnBsYXllckNvbmZpZywnY29uZmlnLndhcm5pbmdUaW1lJywgdGhpcy5wYXJlbnRDb25maWcud2FybmluZ1RpbWUpO1xuICAgIHRoaXMucGFyZW50Q29uZmlnLnNob3dXYXJuaW5nVGltZXIgPSAgXy5nZXQodGhpcy5wbGF5ZXJDb25maWcsJ2NvbmZpZy5zaG93V2FybmluZ1RpbWVyJywgdGhpcy5wYXJlbnRDb25maWcuc2hvd1dhcm5pbmdUaW1lcilcbiAgICBpZiAodGhpcy5wbGF5ZXJDb25maWc/LmNvbnRleHQ/LnVzZXJEYXRhKSB7XG4gICAgICBjb25zdCBmaXJzdE5hbWUgPSB0aGlzLnBsYXllckNvbmZpZy5jb250ZXh0LnVzZXJEYXRhPy5maXJzdE5hbWUgPz8gJyc7XG4gICAgICBjb25zdCBsYXN0TmFtZSA9IHRoaXMucGxheWVyQ29uZmlnLmNvbnRleHQudXNlckRhdGE/Lmxhc3ROYW1lID8/ICcnO1xuICAgICAgdGhpcy51c2VyTmFtZSA9IGZpcnN0TmFtZSArICcgJyArIGxhc3ROYW1lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YS5pc0F2YWlsYWJsZUxvY2FsbHkgJiYgdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGEuYmFzZVBhdGgpIHtcbiAgICAgIHRoaXMucGFyZW50Q29uZmlnLmJhc2VVcmwgPSB0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YS5iYXNlUGF0aDtcbiAgICAgIHRoaXMucGFyZW50Q29uZmlnLmlzQXZhaWxhYmxlTG9jYWxseSA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5hdHRlbXB0cyA9IHtcbiAgICAgIG1heDogdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGE/Lm1heEF0dGVtcHRzLFxuICAgICAgY3VycmVudDogdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGE/LmN1cnJlbnRBdHRlbXB0ID8gdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGEuY3VycmVudEF0dGVtcHQgKyAxIDogMVxuICAgIH07XG4gICAgdGhpcy50b3RhbFNjb3JlID0gdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGEub3V0Y29tZURlY2xhcmF0aW9uLm1heFNjb3JlLmRlZmF1bHRWYWx1ZTtcbiAgICB0aGlzLnNob3dSZXBsYXkgPSB0aGlzLmF0dGVtcHRzPy5tYXggJiYgdGhpcy5hdHRlbXB0cz8uY3VycmVudCA+PSB0aGlzLmF0dGVtcHRzLm1heCA/IGZhbHNlIDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhPy50aW1lTGltaXRzID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGEudGltZUxpbWl0cyA9IEpTT04ucGFyc2UodGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGEudGltZUxpbWl0cyk7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB0aGlzLmVtaXRNYXhBdHRlbXB0RXZlbnRzKCk7XG4gIH1cblxuICBwcml2YXRlIGdldE11bHRpbGV2ZWxTZWN0aW9uKG9iaikge1xuICAgIGxldCBpc011bHRpTGV2ZWw7XG4gICAgb2JqLmNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiAhaXNNdWx0aUxldmVsKSB7XG4gICAgICAgIGlzTXVsdGlMZXZlbCA9IHRoaXMuaGFzQ2hpbGRyZW4oaXRlbS5jaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICByZXR1cm4gaXNNdWx0aUxldmVsO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNDaGlsZHJlbihhcnIpIHtcbiAgICByZXR1cm4gYXJyLnNvbWUoaXRlbSA9PiBpdGVtLmNoaWxkcmVuKTtcbiAgfVxuXG4gIGVtaXRNYXhBdHRlbXB0RXZlbnRzKCkge1xuICAgIGlmICgodGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGE/Lm1heEF0dGVtcHRzIC0gMSkgPT09IHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhPy5jdXJyZW50QXR0ZW1wdCkge1xuICAgICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KHRoaXMudmlld2VyU2VydmljZS5nZW5lcmF0ZU1heEF0dGVtcHRFdmVudHModGhpcy5hdHRlbXB0cz8uY3VycmVudCwgZmFsc2UsIHRydWUpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhPy5jdXJyZW50QXR0ZW1wdCA+PSB0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YT8ubWF4QXR0ZW1wdHMpIHtcbiAgICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdCh0aGlzLnZpZXdlclNlcnZpY2UuZ2VuZXJhdGVNYXhBdHRlbXB0RXZlbnRzKHRoaXMuYXR0ZW1wdHM/LmN1cnJlbnQsIHRydWUsIGZhbHNlKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0aXZlU2VjdGlvbkluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLnNlY3Rpb25zLmZpbmRJbmRleChzZWMgPT4gc2VjLm1ldGFkYXRhPy5pZGVudGlmaWVyID09PSB0aGlzLmFjdGl2ZVNlY3Rpb24ubWV0YWRhdGE/LmlkZW50aWZpZXIpO1xuICB9XG5cbiAgb25TaG93U2NvcmVCb2FyZChldmVudCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMucGFyZW50Q29uZmlnLmlzU2VjdGlvbnNBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZVNlY3Rpb25JbmRleCA9IHRoaXMuZ2V0QWN0aXZlU2VjdGlvbkluZGV4KCk7XG4gICAgICB0aGlzLnVwZGF0ZVNlY3Rpb25TY29yZShhY3RpdmVTZWN0aW9uSW5kZXgpO1xuICAgIH1cbiAgICB0aGlzLmdldFN1bW1hcnlPYmplY3QoKTtcbiAgICB0aGlzLmxvYWRTY29yZUJvYXJkID0gdHJ1ZTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucGF1c2VWaWRlbygpO1xuICB9XG5cbiAgb25TZWN0aW9uRW5kKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmlzRHVyYXRpb25FbmRlZCkge1xuICAgICAgdGhpcy5pc0R1cmF0aW9uRXhwaXJlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGFyZW50Q29uZmlnLmlzU2VjdGlvbnNBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZVNlY3Rpb25JbmRleCA9IHRoaXMuZ2V0QWN0aXZlU2VjdGlvbkluZGV4KCk7XG4gICAgICB0aGlzLnVwZGF0ZVNlY3Rpb25TY29yZShhY3RpdmVTZWN0aW9uSW5kZXgpO1xuICAgICAgdGhpcy5zZXROZXh0U2VjdGlvbihldmVudCwgYWN0aXZlU2VjdGlvbkluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcmVwYXJlRW5kKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBvblBsYXllckV2ZW50KGV2ZW50KSB7XG4gICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGdldFN1bW1hcnlPYmplY3QoKSB7XG4gICAgY29uc3QgcHJvZ3Jlc3NCYXIgPSB0aGlzLmlzU2VjdGlvbnNBdmFpbGFibGUgPyBfLmZsYXR0ZW5EZWVwKHRoaXMubWFpblByb2dyZXNzQmFyLm1hcChpdGVtID0+IGl0ZW0uY2hpbGRyZW4pKSA6IHRoaXMubWFpblByb2dyZXNzQmFyO1xuICAgIGNvbnN0IGNsYXNzT2JqID0gXy5ncm91cEJ5KHByb2dyZXNzQmFyLCAnY2xhc3MnKTtcbiAgICB0aGlzLnN1bW1hcnkgPSB7XG4gICAgICBza2lwcGVkOiBfLmdldChjbGFzc09iaiwgJ3NraXBwZWQubGVuZ3RoJykgfHwgMCxcbiAgICAgIGNvcnJlY3Q6IF8uZ2V0KGNsYXNzT2JqLCAnY29ycmVjdC5sZW5ndGgnKSB8fCAwLFxuICAgICAgd3Jvbmc6IF8uZ2V0KGNsYXNzT2JqLCAnd3JvbmcubGVuZ3RoJykgfHwgMCxcbiAgICAgIHBhcnRpYWw6IF8uZ2V0KGNsYXNzT2JqLCAncGFydGlhbC5sZW5ndGgnKSB8fCAwXG4gICAgfTtcbiAgICB0aGlzLnRvdGFsVmlzaXRlZFF1ZXN0aW9uID0gdGhpcy5zdW1tYXJ5LmNvcnJlY3QgKyB0aGlzLnN1bW1hcnkud3JvbmcgKyB0aGlzLnN1bW1hcnkucGFydGlhbCArIHRoaXMuc3VtbWFyeS5za2lwcGVkO1xuICAgIHRoaXMudmlld2VyU2VydmljZS50b3RhbE51bWJlck9mUXVlc3Rpb25zID0gdGhpcy50b3RhbE5vT2ZRdWVzdGlvbnM7XG4gIH1cblxuICB1cGRhdGVTZWN0aW9uU2NvcmUoYWN0aXZlU2VjdGlvbkluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLm1haW5Qcm9ncmVzc0JhclthY3RpdmVTZWN0aW9uSW5kZXhdLnNjb3JlID0gdGhpcy5tYWluUHJvZ3Jlc3NCYXJbYWN0aXZlU2VjdGlvbkluZGV4XS5jaGlsZHJlblxuICAgICAgLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4gYWNjdW11bGF0b3IgKyBjdXJyZW50VmFsdWUuc2NvcmUsIDApO1xuICB9XG5cbiAgc2V0TmV4dFNlY3Rpb24oZXZlbnQsIGFjdGl2ZVNlY3Rpb25JbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zdW1tYXJ5ID0gdGhpcy51dGlsU2VydmljZS5zdW1PYmplY3RzQnlLZXkodGhpcy5zdW1tYXJ5LCBldmVudC5zdW1tYXJ5KTtcbiAgICBjb25zdCBpc1NlY3Rpb25GdWxseUF0dGVtcHRlZCA9IGV2ZW50LnN1bW1hcnkuc2tpcHBlZCA9PT0gMCAmJlxuICAgICAgKGV2ZW50LnN1bW1hcnk/LmNvcnJlY3QgKyBldmVudC5zdW1tYXJ5Py53cm9uZykgPT09IHRoaXMubWFpblByb2dyZXNzQmFyW2FjdGl2ZVNlY3Rpb25JbmRleF0/LmNoaWxkcmVuPy5sZW5ndGg7XG4gICAgY29uc3QgaXNTZWN0aW9uUGFydGlhbGx5QXR0ZW1wdGVkID0gZXZlbnQuc3VtbWFyeS5za2lwcGVkID4gMDtcblxuICAgIGlmIChldmVudC5pc0R1cmF0aW9uRW5kZWQpIHtcbiAgICAgIHRoaXMuaXNEdXJhdGlvbkV4cGlyZWQgPSB0cnVlO1xuICAgICAgdGhpcy5wcmVwYXJlRW5kKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV4dFNlY3Rpb25JbmRleCA9IGFjdGl2ZVNlY3Rpb25JbmRleCArIDE7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZXZlbnQuanVtcFRvU2VjdGlvbikge1xuICAgICAgY29uc3Qgc2VjdGlvbkluZGV4ID0gdGhpcy5zZWN0aW9ucy5maW5kSW5kZXgoc2VjID0+IHNlYy5tZXRhZGF0YT8uaWRlbnRpZmllciA9PT0gZXZlbnQuanVtcFRvU2VjdGlvbik7XG4gICAgICBuZXh0U2VjdGlvbkluZGV4ID0gc2VjdGlvbkluZGV4ID4gLTEgPyBzZWN0aW9uSW5kZXggOiBuZXh0U2VjdGlvbkluZGV4O1xuICAgIH1cblxuICAgIHRoaXMuc2VjdGlvbkluZGV4ID0gXy5jbG9uZURlZXAobmV4dFNlY3Rpb25JbmRleCk7XG4gICAgdGhpcy5tYWluUHJvZ3Jlc3NCYXIuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGl0ZW0uaXNBY3RpdmUgPSBpbmRleCA9PT0gbmV4dFNlY3Rpb25JbmRleDtcblxuICAgICAgaWYgKGluZGV4ID09PSBhY3RpdmVTZWN0aW9uSW5kZXgpIHtcbiAgICAgICAgaWYgKGlzU2VjdGlvbkZ1bGx5QXR0ZW1wdGVkKSB7XG4gICAgICAgICAgaXRlbS5jbGFzcyA9ICdhdHRlbXB0ZWQnO1xuICAgICAgICB9IGVsc2UgaWYgKGlzU2VjdGlvblBhcnRpYWxseUF0dGVtcHRlZCkge1xuICAgICAgICAgIGl0ZW0uY2xhc3MgPSAncGFydGlhbCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAobmV4dFNlY3Rpb25JbmRleCA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNlY3Rpb24gPSBfLmNsb25lRGVlcCh0aGlzLnNlY3Rpb25zW25leHRTZWN0aW9uSW5kZXhdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcmVwYXJlRW5kKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcmVwYXJlRW5kKGV2ZW50KSB7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnBhdXNlVmlkZW8oKTtcbiAgICB0aGlzLmNhbGN1bGF0ZVNjb3JlKCk7XG4gICAgdGhpcy5zZXREdXJhdGlvblNwZW50KCk7XG4gICAgdGhpcy5nZXRTdW1tYXJ5T2JqZWN0KCk7XG4gICAgaWYgKHRoaXMucGFyZW50Q29uZmlnLnJlcXVpcmVzU3VibWl0ICYmICF0aGlzLmlzRHVyYXRpb25FeHBpcmVkKSB7XG4gICAgICB0aGlzLmxvYWRTY29yZUJvYXJkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbmRQYWdlUmVhY2hlZCA9IHRydWU7XG4gICAgICB0aGlzLmxvYWRTY29yZUJvYXJkID0gZmFsc2U7XG4gICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VTdW1tYXJ5RXZlbnQodGhpcy50b3RhbFZpc2l0ZWRRdWVzdGlvbiwgdGhpcy5lbmRQYWdlUmVhY2hlZCwgdGhpcy5maW5hbFNjb3JlLCB0aGlzLnN1bW1hcnkpO1xuICAgICAgdGhpcy5yYWlzZUVuZEV2ZW50KHRoaXMudG90YWxWaXNpdGVkUXVlc3Rpb24sIHRoaXMuZW5kUGFnZVJlYWNoZWQsIHRoaXMuZmluYWxTY29yZSk7XG4gICAgICB0aGlzLmlzU3VtbWFyeUV2ZW50UmFpc2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNFbmRFdmVudFJhaXNlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmVwbGF5Q29udGVudCgpIHtcbiAgICB0aGlzLnBhcmVudENvbmZpZy5pc1JlcGxheWVkID0gdHJ1ZTtcbiAgICB0aGlzLmxvYWRTY29yZUJvYXJkID0gZmFsc2U7XG4gICAgdGhpcy5lbmRQYWdlUmVhY2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNEdXJhdGlvbkV4cGlyZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzRW5kRXZlbnRSYWlzZWQgPSBmYWxzZTtcbiAgICB0aGlzLmF0dGVtcHRzLmN1cnJlbnQgPSB0aGlzLmF0dGVtcHRzLmN1cnJlbnQgKyAxO1xuICAgIHRoaXMuc2hvd1JlcGxheSA9IHRoaXMuYXR0ZW1wdHM/Lm1heCAmJiB0aGlzLmF0dGVtcHRzPy5jdXJyZW50ID49IHRoaXMuYXR0ZW1wdHMubWF4ID8gZmFsc2UgOiB0cnVlO1xuICAgIHRoaXMudG90YWxOb09mUXVlc3Rpb25zID0gMDtcbiAgICB0aGlzLnRvdGFsVmlzaXRlZFF1ZXN0aW9uID0gMDtcbiAgICB0aGlzLm1haW5Qcm9ncmVzc0JhciA9IFtdO1xuICAgIHRoaXMuanVtcFRvUXVlc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdW1tYXJ5ID0ge1xuICAgICAgY29ycmVjdDogMCxcbiAgICAgIHBhcnRpYWw6IDAsXG4gICAgICBza2lwcGVkOiAwLFxuICAgICAgd3Jvbmc6IDBcbiAgICB9O1xuICAgIHRoaXMuc2VjdGlvbnMgPSBbXTtcbiAgICB0aGlzLmluaXRpYWxUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdGhpcy5pbml0aWFsaXplU2VjdGlvbnMoKTtcbiAgICB0aGlzLmVuZFBhZ2VSZWFjaGVkID0gZmFsc2U7XG4gICAgdGhpcy5sb2FkU2NvcmVCb2FyZCA9IGZhbHNlO1xuICAgIHRoaXMuYWN0aXZlU2VjdGlvbiA9IHRoaXMuaXNTZWN0aW9uc0F2YWlsYWJsZSA/IF8uY2xvbmVEZWVwKHRoaXMuc2VjdGlvbnNbMF0pIDogdGhpcy5wbGF5ZXJDb25maWc7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5hdHRlbXB0cz8ubWF4ID09PSB0aGlzLmF0dGVtcHRzPy5jdXJyZW50KSB7XG4gICAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQodGhpcy52aWV3ZXJTZXJ2aWNlLmdlbmVyYXRlTWF4QXR0ZW1wdEV2ZW50cyhfLmdldCh0aGlzLmF0dGVtcHRzLCAnY3VycmVudCcpLCBmYWxzZSwgdHJ1ZSkpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudE5hbWUucmVwbGF5Q2xpY2tlZCwgVGVsZW1ldHJ5VHlwZS5pbnRlcmFjdCwgcGFnZUlkLmVuZFBhZ2UpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnBhcmVudENvbmZpZy5pc1JlcGxheWVkID0gZmFsc2U7XG4gICAgICBjb25zdCBlbGVtZW50OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpLmluZm8tcGFnZScpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICB9XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBzZXRJbml0aWFsU2NvcmVzKGFjdGl2ZVNlY3Rpb25JbmRleCA9IDApIHtcbiAgICBjb25zdCBhbHBoYWJldHMgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonLnNwbGl0KCcnKTtcbiAgICB0aGlzLnNlY3Rpb25zLmZvckVhY2goKHNlY3Rpb24sIGkpID0+IHtcbiAgICAgIHRoaXMubWFpblByb2dyZXNzQmFyLnB1c2goe1xuICAgICAgICBpbmRleDogYWxwaGFiZXRzW2ldLnRvTG9jYWxlVXBwZXJDYXNlKCksIGNsYXNzOiAndW5hdHRlbXB0ZWQnLCB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBzY29yZTogMCxcbiAgICAgICAgaXNBY3RpdmU6IGkgPT09IGFjdGl2ZVNlY3Rpb25JbmRleCxcbiAgICAgICAgaWRlbnRpZmllcjogc2VjdGlvbi5tZXRhZGF0YT8uaWRlbnRpZmllclxuICAgICAgfSk7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IFtdO1xuICAgICAgc2VjdGlvbi5tZXRhZGF0YS5jaGlsZE5vZGVzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICBpbmRleDogKGluZGV4ICsgMSksIGNsYXNzOiAndW5hdHRlbXB0ZWQnLCB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHNjb3JlOiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b3RhbE5vT2ZRdWVzdGlvbnMrKztcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tYWluUHJvZ3Jlc3NCYXJbdGhpcy5tYWluUHJvZ3Jlc3NCYXIubGVuZ3RoIC0gMV0gPSB7XG4gICAgICAgIC4uLl8ubGFzdCh0aGlzLm1haW5Qcm9ncmVzc0JhciksIGNoaWxkcmVuXG4gICAgICB9O1xuXG4gICAgfSk7XG4gICAgdGhpcy5wYXJlbnRDb25maWcucXVlc3Rpb25Db3VudCA9IHRoaXMudG90YWxOb09mUXVlc3Rpb25zO1xuICB9XG5cbiAgY2FsY3VsYXRlU2NvcmUoKSB7XG4gICAgdGhpcy5maW5hbFNjb3JlID0gdGhpcy5tYWluUHJvZ3Jlc3NCYXIucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudFZhbHVlKSA9PiBhY2N1bXVsYXRvciArIGN1cnJlbnRWYWx1ZS5zY29yZSwgMCk7XG4gICAgdGhpcy5nZW5lcmF0ZU91dENvbWVMYWJlbCgpO1xuICAgIHJldHVybiB0aGlzLmZpbmFsU2NvcmU7XG4gIH1cblxuICBleGl0Q29udGVudChldmVudCkge1xuICAgIHRoaXMuY2FsY3VsYXRlU2NvcmUoKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChldmVudD8udHlwZSA9PT0gJ0VYSVQnKSB7XG4gICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudE5hbWUuZW5kUGFnZUV4aXRDbGlja2VkLCBUZWxlbWV0cnlUeXBlLmludGVyYWN0LCBwYWdlSWQuZW5kUGFnZSk7XG4gICAgICB0aGlzLmdldFN1bW1hcnlPYmplY3QoKTtcbiAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZVN1bW1hcnlFdmVudCh0aGlzLnRvdGFsVmlzaXRlZFF1ZXN0aW9uLCB0aGlzLmVuZFBhZ2VSZWFjaGVkLCB0aGlzLmZpbmFsU2NvcmUsIHRoaXMuc3VtbWFyeSk7XG4gICAgICB0aGlzLmlzU3VtbWFyeUV2ZW50UmFpc2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMucmFpc2VFbmRFdmVudCh0aGlzLnRvdGFsVmlzaXRlZFF1ZXN0aW9uLCB0aGlzLmVuZFBhZ2VSZWFjaGVkLCB0aGlzLmZpbmFsU2NvcmUpO1xuICAgIH1cbiAgfVxuXG5cbiAgcmFpc2VFbmRFdmVudChjdXJyZW50UXVlc3Rpb25JbmRleCwgZW5kUGFnZVNlZW4sIHNjb3JlKSB7XG4gICAgaWYgKHRoaXMuaXNFbmRFdmVudFJhaXNlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzRW5kRXZlbnRSYWlzZWQgPSB0cnVlO1xuICAgIHRoaXMudmlld2VyU2VydmljZS5tZXRhRGF0YS5wcm9ncmVzc0JhciA9IHRoaXMubWFpblByb2dyZXNzQmFyO1xuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUVuZEV2ZW50KGN1cnJlbnRRdWVzdGlvbkluZGV4LCBlbmRQYWdlU2Vlbiwgc2NvcmUpO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoXy5nZXQodGhpcy5hdHRlbXB0cywgJ2N1cnJlbnQnKSA+PSBfLmdldCh0aGlzLmF0dGVtcHRzLCAnbWF4JykpIHtcbiAgICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdCh0aGlzLnZpZXdlclNlcnZpY2UuZ2VuZXJhdGVNYXhBdHRlbXB0RXZlbnRzKF8uZ2V0KHRoaXMuYXR0ZW1wdHMsICdjdXJyZW50JyksIHRydWUsIGZhbHNlKSk7XG4gICAgfVxuICB9XG5cbiAgc2V0RHVyYXRpb25TcGVudCgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YT8uc3VtbWFyeVR5cGUgIT09ICdTY29yZScpIHtcbiAgICAgIHRoaXMudmlld2VyU2VydmljZS5tZXRhRGF0YS5kdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5pbml0aWFsVGltZTtcbiAgICAgIHRoaXMuZHVyYXRpb25TcGVudCA9IHRoaXMudXRpbFNlcnZpY2UuZ2V0VGltZVNwZW50VGV4dCh0aGlzLmluaXRpYWxUaW1lKTtcbiAgICB9XG4gIH1cblxuICBvblNjb3JlQm9hcmRMb2FkZWQoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQ/LnNjb3JlQm9hcmRMb2FkZWQpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlU2NvcmUoKTtcbiAgICB9XG4gIH1cblxuICBvblNjb3JlQm9hcmRTdWJtaXR0ZWQoKSB7XG4gICAgdGhpcy5lbmRQYWdlUmVhY2hlZCA9IHRydWU7XG4gICAgdGhpcy5nZXRTdW1tYXJ5T2JqZWN0KCk7XG4gICAgdGhpcy5zZXREdXJhdGlvblNwZW50KCk7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZXZlbnROYW1lLnNjb3JlQm9hcmRTdWJtaXRDbGlja2VkLCBUZWxlbWV0cnlUeXBlLmludGVyYWN0LCBwYWdlSWQuc3VibWl0UGFnZSk7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlU3VtbWFyeUV2ZW50KHRoaXMudG90YWxWaXNpdGVkUXVlc3Rpb24sIHRoaXMuZW5kUGFnZVJlYWNoZWQsIHRoaXMuZmluYWxTY29yZSwgdGhpcy5zdW1tYXJ5KTtcbiAgICB0aGlzLnJhaXNlRW5kRXZlbnQodGhpcy50b3RhbFZpc2l0ZWRRdWVzdGlvbiwgdGhpcy5lbmRQYWdlUmVhY2hlZCwgdGhpcy5maW5hbFNjb3JlKTtcbiAgICB0aGlzLmxvYWRTY29yZUJvYXJkID0gZmFsc2U7XG4gICAgdGhpcy5pc1N1bW1hcnlFdmVudFJhaXNlZCA9IHRydWU7XG4gIH1cblxuICBnZW5lcmF0ZU91dENvbWVMYWJlbCgpIHtcbiAgICB0aGlzLm91dGNvbWVMYWJlbCA9IHRoaXMuZmluYWxTY29yZS50b1N0cmluZygpO1xuICAgIHN3aXRjaCAoXy5nZXQodGhpcy5wbGF5ZXJDb25maWcsICdtZXRhZGF0YS5zdW1tYXJ5VHlwZScpKSB7XG4gICAgICBjYXNlICdDb21wbGV0ZSc6IHtcbiAgICAgICAgdGhpcy5vdXRjb21lTGFiZWwgPSB0aGlzLnRvdGFsU2NvcmUgPyBgJHt0aGlzLmZpbmFsU2NvcmV9IC8gJHt0aGlzLnRvdGFsU2NvcmV9YCA6IHRoaXMub3V0Y29tZUxhYmVsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0R1cmF0aW9uJzoge1xuICAgICAgICB0aGlzLm91dGNvbWVMYWJlbCA9ICcnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnb1RvUXVlc3Rpb24oZXZlbnQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnBhcmVudENvbmZpZy5pc1NlY3Rpb25zQXZhaWxhYmxlICYmIGV2ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHNlY3Rpb25JbmRleCA9IHRoaXMuc2VjdGlvbnMuZmluZEluZGV4KHNlYyA9PiBzZWMubWV0YWRhdGE/LmlkZW50aWZpZXIgPT09IGV2ZW50LmlkZW50aWZpZXIpO1xuICAgICAgdGhpcy5hY3RpdmVTZWN0aW9uID0gXy5jbG9uZURlZXAodGhpcy5zZWN0aW9uc1tzZWN0aW9uSW5kZXhdKTtcbiAgICAgIHRoaXMubWFpblByb2dyZXNzQmFyLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGl0ZW0uaXNBY3RpdmUgPSBpbmRleCA9PT0gc2VjdGlvbkluZGV4O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuanVtcFRvUXVlc3Rpb24gPSBldmVudDtcbiAgICB0aGlzLmxvYWRTY29yZUJvYXJkID0gZmFsc2U7XG4gIH1cblxuICBwbGF5TmV4dENvbnRlbnQoZXZlbnQpIHtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudD8udHlwZSwgVGVsZW1ldHJ5VHlwZS5pbnRlcmFjdCwgcGFnZUlkLmVuZFBhZ2UsIGV2ZW50Py5pZGVudGlmaWVyKTtcbiAgfVxuXG4gIHRvZ2dsZVNjcmVlblJvdGF0ZShldmVudD86IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZXZlbnROYW1lLmRldmljZVJvdGF0aW9uQ2xpY2tlZCwgVGVsZW1ldHJ5VHlwZS5pbnRlcmFjdCwgdGhpcy5zZWN0aW9uUGxheWVyLm15Q2Fyb3VzZWwuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSArIDEpO1xuICB9XG5cbiAgc2lkZUJhckV2ZW50cyhldmVudDogSVNpZGVCYXJFdmVudCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdPUEVOX01FTlUnIHx8IGV2ZW50LnR5cGUgPT09ICdDTE9TRV9NRU5VJykge1xuICAgICAgdGhpcy5oYW5kbGVTaWRlQmFyQWNjZXNzaWJpbGl0eShldmVudCk7XG4gICAgfVxuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50LnR5cGUsIFRlbGVtZXRyeVR5cGUuaW50ZXJhY3QsIHRoaXMuc2VjdGlvblBsYXllci5teUNhcm91c2VsLmdldEN1cnJlbnRTbGlkZUluZGV4KCkgKyAxKTtcbiAgfVxuXG4gIGhhbmRsZVNpZGVCYXJBY2Nlc3NpYmlsaXR5KGV2ZW50KSB7XG4gICAgY29uc3QgbmF2QmxvY2s6IEhUTUxJbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubmF2QmxvY2snKTtcbiAgICBjb25zdCBvdmVybGF5SW5wdXQ6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI292ZXJsYXktaW5wdXQnKTtcbiAgICBjb25zdCBvdmVybGF5QnV0dG9uOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNvdmVybGF5LWJ1dHRvbicpO1xuICAgIGNvbnN0IHNpZGVCYXJMaXN0OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzaWRlYmFyLWxpc3QnKTtcblxuICAgIGlmIChldmVudC50eXBlID09PSAnT1BFTl9NRU5VJykge1xuICAgICAgY29uc3QgaXNNb2JpbGUgPSB0aGlzLnBsYXllckNvbmZpZy5jb25maWc/LnNpZGVNZW51Py5zaG93RXhpdDtcbiAgICAgIHRoaXMuZGlzYWJsZWRIYW5kbGUgPSBpc01vYmlsZSA/IG1haW50YWluLmhpZGRlbih7IGZpbHRlcjogW3NpZGVCYXJMaXN0LCBvdmVybGF5QnV0dG9uLCBvdmVybGF5SW5wdXRdIH0pIDogbWFpbnRhaW4udGFiRm9jdXMoeyBjb250ZXh0OiBuYXZCbG9jayB9KTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50KGRvY3VtZW50LCAna2V5ZG93bicpLnN1YnNjcmliZSgoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIj09PT09PT09PT09XCIsIGUua2V5KTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGVbJ2tleSddID09PSAnRXNjYXBlJykge1xuICAgICAgICAgIGNvbnN0IGlucHV0Q2hlY2tlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdmVybGF5LWlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgICBpbnB1dENoZWNrZWQuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGF5ZXJTaWRlTWVudScpLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLm5hdkJsb2NrJykuc3R5bGUubWFyZ2luTGVmdCA9ICctMTAwJSc7XG4gICAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoJ0NMT1NFX01FTlUnLCBUZWxlbWV0cnlUeXBlLmludGVyYWN0LCB0aGlzLnNlY3Rpb25QbGF5ZXIubXlDYXJvdXNlbC5nZXRDdXJyZW50U2xpZGVJbmRleCgpICsgMSk7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlZEhhbmRsZS5kaXNlbmdhZ2UoKTtcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHRoaXMuZGlzYWJsZWRIYW5kbGUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSAnQ0xPU0VfTUVOVScgJiYgdGhpcy5kaXNhYmxlZEhhbmRsZSkge1xuICAgICAgdGhpcy5kaXNhYmxlZEhhbmRsZS5kaXNlbmdhZ2UoKTtcbiAgICAgIHRoaXMuZGlzYWJsZWRIYW5kbGUgPSBudWxsO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJlZm9yZXVubG9hZCcpXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY2FsY3VsYXRlU2NvcmUoKTtcbiAgICB0aGlzLmdldFN1bW1hcnlPYmplY3QoKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmlzU3VtbWFyeUV2ZW50UmFpc2VkID09PSBmYWxzZSkge1xuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlU3VtbWFyeUV2ZW50KHRoaXMudG90YWxWaXNpdGVkUXVlc3Rpb24sIHRoaXMuZW5kUGFnZVJlYWNoZWQsIHRoaXMuZmluYWxTY29yZSwgdGhpcy5zdW1tYXJ5KTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMucmFpc2VFbmRFdmVudCh0aGlzLnRvdGFsVmlzaXRlZFF1ZXN0aW9uLCB0aGlzLmVuZFBhZ2VSZWFjaGVkLCB0aGlzLmZpbmFsU2NvcmUpO1xuICB9XG59XG4iLCI8IS0tIE5lZWQgdG8gc2hvdyBsb2FkaW5nIGhlcmUgLS0+XG48c2ItcGxheWVyLXN0YXJ0LXBhZ2UgKm5nSWY9XCJpc0xvYWRpbmdcIiBbdGl0bGVdPVwicGFyZW50Q29uZmlnPy5jb250ZW50TmFtZVwiPjwvc2ItcGxheWVyLXN0YXJ0LXBhZ2U+XG5cbjxzYi1wbGF5ZXItc2lkZS1tZW51LWljb24gKm5nSWY9XCJwYXJlbnRDb25maWc/LnNpZGVNZW51Q29uZmlnPy5lbmFibGUgJiYgIWVuZFBhZ2VSZWFjaGVkXCIgKHNpZGViYXJNZW51RXZlbnQpPVwic2lkZUJhckV2ZW50cygkZXZlbnQpXCI+PC9zYi1wbGF5ZXItc2lkZS1tZW51LWljb24+XG48cXVtbC1oZWFkZXIgKm5nSWY9XCJsb2FkU2NvcmVCb2FyZCAmJiBwYXJlbnRDb25maWc/LnJlcXVpcmVzU3VibWl0ICYmICFlbmRQYWdlUmVhY2hlZFwiIFtzaG93TGVnZW5kXT1cInBhcmVudENvbmZpZz8uc2hvd0xlZ2VuZFwiXG4gIFtkaXNhYmxlUHJldmlvdXNOYXZpZ2F0aW9uXT1cInRydWVcIiBbZGlzYWJsZU5leHRdPVwidHJ1ZVwiIFthdHRlbXB0c109XCJhdHRlbXB0c1wiIFtsb2FkU2NvcmVCb2FyZF09XCJ0cnVlXCJcbiAgW3Nob3dEZXZpY2VPcmllbnRhdGlvbl09XCJwbGF5ZXJDb25maWc/LmNvbmZpZz8uc2hvd0RldmljZU9yaWVudGF0aW9uXCIgKHRvZ2dsZVNjcmVlblJvdGF0ZSk9XCJ0b2dnbGVTY3JlZW5Sb3RhdGUoKVwiPjwvcXVtbC1oZWFkZXI+XG48c2ItcGxheWVyLXNpZGViYXIgW3RpdGxlXT1cInBhcmVudENvbmZpZz8uY29udGVudE5hbWVcIiBbY29uZmlnXT1cInBhcmVudENvbmZpZz8uc2lkZU1lbnVDb25maWdcIiAoc2lkZWJhckV2ZW50KT1cInNpZGVCYXJFdmVudHMoJGV2ZW50KVwiPlxuPC9zYi1wbGF5ZXItc2lkZWJhcj5cblxuPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmdcIiBjbGFzcz1cIm1haW4tY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJtYWluLWNvbnRhaW5lclwiIFtoaWRkZW5dPVwiIWFjdGl2ZVNlY3Rpb24gfHwgbG9hZFNjb3JlQm9hcmQgfHwgZW5kUGFnZVJlYWNoZWRcIj5cbiAgICA8cXVtbC1zZWN0aW9uLXBsYXllciAqbmdJZj1cImFjdGl2ZVNlY3Rpb25cIiBbc2VjdGlvbkNvbmZpZ109XCJhY3RpdmVTZWN0aW9uXCIgKHNlY3Rpb25FbmQpPVwib25TZWN0aW9uRW5kKCRldmVudClcIiBbYXR0ZW1wdHNdPVwiYXR0ZW1wdHNcIlxuICAgICAgW21haW5Qcm9ncmVzc0Jhcl09XCJtYWluUHJvZ3Jlc3NCYXJcIiBbcGFyZW50Q29uZmlnXT1cInBhcmVudENvbmZpZ1wiIFtzZWN0aW9uSW5kZXhdPVwic2VjdGlvbkluZGV4XCJcbiAgICAgIFtqdW1wVG9RdWVzdGlvbl09XCJqdW1wVG9RdWVzdGlvblwiIChzaG93U2NvcmVCb2FyZCk9XCJvblNob3dTY29yZUJvYXJkKCRldmVudClcIlxuICAgICAgKHBsYXllckV2ZW50KT1cIm9uUGxheWVyRXZlbnQoJGV2ZW50KVwiPlxuICAgIDwvcXVtbC1zZWN0aW9uLXBsYXllcj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTaG93IHNjb3JlYm9hcmQgLS0+XG4gIDxxdW1sLXNjb3JlYm9hcmQgKm5nSWY9XCJsb2FkU2NvcmVCb2FyZCAmJiBwYXJlbnRDb25maWc/LnJlcXVpcmVzU3VibWl0ICYmICFlbmRQYWdlUmVhY2hlZFwiXG4gICAgKHNjb3JlQm9hcmRMb2FkZWQpPVwib25TY29yZUJvYXJkTG9hZGVkKCRldmVudClcIiAoc3VibWl0Q2xpY2tlZCk9XCJvblNjb3JlQm9hcmRTdWJtaXR0ZWQoKVwiXG4gICAgW2NvbnRlbnROYW1lXT1cInBhcmVudENvbmZpZy5jb250ZW50TmFtZVwiIFtzY29yZXNdPVwibWFpblByb2dyZXNzQmFyXCIgW3RvdGFsTm9PZlF1ZXN0aW9uc109XCJ0b3RhbE5vT2ZRdWVzdGlvbnNcIlxuICAgIFtzaG93RmVlZEJhY2tdPVwic2hvd0ZlZWRCYWNrXCIgKGVtaXRRdWVzdGlvbk5vKT1cImdvVG9RdWVzdGlvbigkZXZlbnQpXCJcbiAgICBbaXNTZWN0aW9uc109XCJwYXJlbnRDb25maWc/LmlzU2VjdGlvbnNBdmFpbGFibGVcIiBbc3VtbWFyeV09XCJzdW1tYXJ5XCI+XG4gIDwvcXVtbC1zY29yZWJvYXJkPlxuXG4gIDwhLS0gU2hvdyBwbGF5ZXIgZW5kIHBhZ2UgLS0+XG4gIDxkaXYgY2xhc3M9XCJlbmRQYWdlLWNvbnRhaW5lclwiICpuZ0lmPVwiZW5kUGFnZVJlYWNoZWRcIiBbbmdDbGFzc109XCJlbmRQYWdlUmVhY2hlZCA/ICdlbmRQYWdlLWNvbnRhaW5lci1oZWlnaHQnOiAnJ1wiPlxuICAgIDxzYi1wbGF5ZXItZW5kLXBhZ2UgKm5nSWY9XCJlbmRQYWdlUmVhY2hlZCAmJiBzaG93RW5kUGFnZVwiIFtjb250ZW50TmFtZV09XCJwYXJlbnRDb25maWcuY29udGVudE5hbWVcIlxuICAgICAgW291dGNvbWVdPVwib3V0Y29tZUxhYmVsXCIgW291dGNvbWVMYWJlbF09XCInU2NvcmU6ICdcIiBbdXNlck5hbWVdPVwidXNlck5hbWVcIiBbdGltZVNwZW50TGFiZWxdPVwiZHVyYXRpb25TcGVudFwiXG4gICAgICAocmVwbGF5Q29udGVudCk9XCJyZXBsYXlDb250ZW50KClcIiAoZXhpdENvbnRlbnQpPVwiZXhpdENvbnRlbnQoJGV2ZW50KVwiXG4gICAgICBbc2hvd0V4aXRdPVwicGFyZW50Q29uZmlnPy5zaWRlTWVudUNvbmZpZy5zaG93RXhpdFwiIFtzaG93UmVwbGF5XT1cInNob3dSZXBsYXlcIiBbbmV4dENvbnRlbnRdPVwibmV4dENvbnRlbnRcIlxuICAgICAgKHBsYXlOZXh0Q29udGVudCk9XCJwbGF5TmV4dENvbnRlbnQoJGV2ZW50KVwiPlxuXG4gICAgICA8c3BhbiBjbGFzcz1cInNiLWNvbG9yLXByaW1hcnkgbXQtOCBmbm9ybWFsIGZvbnQtd2VpZ2h0LWJvbGQgZC1ibG9ja1wiXG4gICAgICAgICpuZ0lmPVwiYXR0ZW1wdHM/Lm1heCAmJiBhdHRlbXB0cz8uY3VycmVudCAmJiBhdHRlbXB0cy5tYXggIT09IGF0dGVtcHRzLmN1cnJlbnRcIj5BdHRlbXB0IG5vXG4gICAgICAgIHt7YXR0ZW1wdHMuY3VycmVudH19L3t7YXR0ZW1wdHMubWF4fX1cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPHNwYW4gY2xhc3M9XCJhdHRlbXB0cyBzYi1jb2xvci1wcmltYXJ5IG10LTggZm5vcm1hbCBmb250LXdlaWdodC1ib2xkIGQtYmxvY2tcIlxuICAgICAgICAqbmdJZj1cImF0dGVtcHRzPy5tYXggPT09IGF0dGVtcHRzPy5jdXJyZW50XCI+e3thdHRlbXB0cy5jdXJyZW50fX0ve3thdHRlbXB0cy5tYXh9fSBhdHRlbXB0cyBjb21wbGV0ZWRcbiAgICAgIDwvc3Bhbj5cbiAgICA8L3NiLXBsYXllci1lbmQtcGFnZT5cbiAgPC9kaXY+XG5cblxuICA8IS0tIFNob3cgY29udGVudCBlcnJvciAtLT5cbiAgPGRpdiAqbmdJZj1cImlzTXVsdGlMZXZlbFNlY3Rpb25cIj5cbiAgICA8c2ItcGxheWVyLWNvbnRlbnRlcnJvciBbZXJyb3JNc2ddPVwiY29udGVudEVycm9yXCI+PC9zYi1wbGF5ZXItY29udGVudGVycm9yPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==