<?xml version="1.0" encoding="UTF-8" standalone="no"?><addon xmlns="http://icplayer.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="ModelViewer3D" xsi:schemaLocation="http://icplayer.com ../../tools/addon.xsd">
    <model>
        <property name="model" nameLabel="Model_Viewer_model" type="file"/>
        <property name="modelIOS" nameLabel="Model_Viewer_model_iOS" type="file"/>
        <property name="poster" nameLabel="Model_Viewer_poster" type="file"/>
        <property name="annotations" nameLabel="Model_Viewer_annotations" type="text"/>
        <property name="environmentImage" nameLabel="Model_Viewer_environmentImage" type="image"/>
        <property name="skyboxImage" nameLabel="Model_Viewer_skyboxImage" type="image"/>
        <property name="shadowIntensity" nameLabel="Model_Viewer_shadowIntensity" type="string"/>
        <property name="shadowSoftness" nameLabel="Model_Viewer_shadowSoftness" type="string"/>
        <property name="autoRotate" nameLabel="Model_Viewer_autoRotate" type="boolean"/>
        <property name="scale" nameLabel="Model_Viewer_scale" type="string"/>
        <property name="labelsEnabled" nameLabel="Model_Viewer_labelsEnabled" type="boolean"/>
        <property name="altText" nameLabel="Model_Viewer_altText" type="string"/>
        <property name="attributes" nameLabel="Model_Viewer_attributes" type="text"/>
        <property name="copyInfo" nameLabel="Model_Viewer_copyInfo" type="html"/>
        <property name="interactionPrompt" nameLabel="Model_Viewer_interactionPrompt" type="boolean"/>
        <property name="enableFullscreen" nameLabel="Model_Viewer_enableFullscreen" type="boolean"/>
        <property name="{library}" nameLabel="Model_Viewer_library" type="module-script" value="/file/serve/5059308589809664"/>
        <property displayName="Lang attribute" name="langAttribute" nameLabel="Model_Viewer_lang_attribute" type="string"/>
    </model>
<css>.md-webcam {
    display: none;
    position: absolute;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.modelViewerWrapper {
    width: 100%;
    height: 100%;
}

model-viewer {
    user-select: none;
    width: 100%;
    height: 100%;
    background-color: transparent !important;
}

model-viewer::part(default-progress-bar) {
    background-color: #2196F3;
}

.buttonsContainer {
    position: absolute;
    top: 25px;
    left: auto;
    right: 25px;
}

.copyButton {
    position: absolute;
}

.copyMessage {
    display: none;
    position: absolute;
    top: 0;
    bottom: 75px;
    left: 0;
    right: 0;
    background-color: rgba(0, 0, 0, 0.2);
}

.copyMessage-visible {
    display: block;
}

.copyContainer {
    position: absolute;
    top: 100%;
    left: 50%;
    margin: -170px 0 0 -300px;
    padding: 40px;
    text-align: center;
    width: 520px;
    height: auto;
    max-height: 220px;
    overflow-y: auto;
    background: #fff;
    border-radius: 5px;
    box-shadow: 0px 3px 5px 1px rgba(0, 0, 0, 0.5);
    z-index: 1;
}

.copyButton,
.labelsButton,
.fullscreenButton {
    width: 75px;
    height: 50px;
    background-color: #78909C;
    margin-bottom: 10px;
}

.copyButton-selected,
.labelsButton-selected {
    background-color: #0A8DBD;
}

.Hotspot {
    background: #fff;
    border-radius: 32px;
    border: 0;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);
    box-sizing: border-box;
    cursor: pointer;
    height: 24px;
    padding: 8px;
    position: relative;
    transition: opacity 0.3s;
    width: 24px;
}

.Hotspot:not([data-visible]) {
    background: transparent;
    border: 4px solid #fff;
    box-shadow: none;
    height: 32px;
    pointer-events: none;
    width: 32px;
}

.Hotspot:focus {
    border: 4px solid rgb(0, 128, 200);
    height: 32px;
    outline: none;
    width: 32px;
}

.Hotspot &gt; * {
    opacity: 1;
    transform: translateY(-50%);
}

.HotspotAnnotation {
    background: #fff;
    border-radius: 4px;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);
    color: rgba(0, 0, 0, 0.8);
    display: block;
    font-family: Futura, Helvetica Neue, sans-serif;
    font-size: 18px;
    font-weight: 700;
    left: calc(100% + 1em);
    max-width: 200px;
    overflow-wrap: break-word;
    padding: 0.5em 1em;
    position: absolute;
    top: 50%;
    width: max-content;
}

.Hotspot:not([data-visible]) &gt; * {
    opacity: 0.5;
    pointer-events: none;
    transform: translateY(calc(-50% + 4px));
    transition: transform 0.3s, opacity 0.3s;
}

.hidden {
    visibility: hidden
}

.error {
    text-align: center;
    color: red;
}
</css><view/><preview/><presenter>function AddonModelViewer3D_create() {
    // to create version on mauthor-dev use storage.googleapis URL
    var presenter = function () { };

    presenter.wasInitiated = false;
    presenter.annotationsVisibility = "visible";
    presenter.isVisibleOnStart = true;
    presenter.areAnnotationsVisibleOnStart = true;
    presenter.fullscreen = {
        isOn: false,
        hasSupport: false,
        requestFullscreenMethod: null,
        exitFullscreenMethod: null,
    };
    presenter.isWCAGOn = false;

    presenter.setPlayerController = function (controller) {
        presenter.playerController = controller;
    };

    presenter.run = function (view, model) {
        if (!presenter.wasInitiated) {
            presenter.init(view, model, false);
        }
    };

    presenter.createPreview = function (view, model) {
        if (!presenter.wasInitiated) {
            presenter.init(view, model, true);
            presenter.disableEvents();
        }
    };

    presenter.init = function (view, model, isPreview) {
        presenter.view = view;
        presenter.$view = $(view);

        const upgradedModel = presenter.upgradeModel(model);
        presenter.configuration = presenter.validateModel(upgradedModel);
        presenter.isVisibleOnStart = presenter.configuration.isVisible;

        if (!presenter.configuration.isValid) {
            showErrorMessage();
            return;
        }

        presenter.extendView(isPreview);
        checkFullscreenSupport();
        !isPreview &amp;&amp; presenter.addHandlers();
        presenter.setAnnotations();
        presenter.setAutoRotation();
        presenter.setInteractionPrompt();
        presenter.handleButtons();
        presenter.handleCopyright();
        presenter.handleFullscreenButton();

        $(presenter.modelViewer).on('load', function () {
            if (presenter.configuration.scale !== undefined &amp;&amp; presenter.configuration.scale !== "") presenter.setScale(presenter.configuration.scale);
        });

        presenter.wasInitiated = true;
    };

    presenter.upgradeModel = function (model) {
        let upgradedModel = presenter.upgradeModelWithEnableFullscreen(model);
        upgradedModel = presenter.upgradeModelWithModelIOS(upgradedModel);
        return presenter.upgradeModelWithLangAttribute(upgradedModel);
    };

    presenter.upgradeModelWithEnableFullscreen = function (model) {
        const upgradedModel = {};
        $.extend(true, upgradedModel, model);

        if (!upgradedModel["enableFullscreen"]) {
            upgradedModel["enableFullscreen"] = "False";
        }

        return upgradedModel;
    };

    presenter.upgradeModelWithModelIOS = function (model) {
        const upgradedModel = {};
        $.extend(true, upgradedModel, model);

        if (!model.hasOwnProperty('modelIOS')) {
            upgradedModel['modelIOS'] = "";
        }

        return upgradedModel;
    };

    presenter.upgradeModelWithLangAttribute = function (model) {
        const upgradedModel = {};
        $.extend(true, upgradedModel, model);

        if (!model.hasOwnProperty('langAttribute')) {
            upgradedModel['langAttribute'] = "";
        }

        return upgradedModel;
    };

    presenter.validateModel = function (model) {
        let isValid = true;
        let additionalAttributes;
        const isVisible = ModelValidationUtils.validateBoolean(model["Is Visible"]);
        const isAutoRotate = ModelValidationUtils.validateBoolean(model["autoRotate"]);
        const areLabelsEnabled = ModelValidationUtils.validateBoolean(model["labelsEnabled"]);
        const isInteractionPrompt = ModelValidationUtils.validateBoolean(model["interactionPrompt"]);
        const environmentImage = model["environmentImage"] === "" ? "neutral" : model["environmentImage"];
        try {
            const attributes = model["attributes"];
            if (attributes &amp;&amp; attributes.trim() !== "") {
                additionalAttributes = JSON.parse(attributes.trim());
            }
        } catch (e) {
            isValid = false;
        }

        return {
            isValid: isValid,
            isVisible: isVisible,
            addonID: model["ID"],
            model: model["model"],
            modelIOS: model["modelIOS"],
            poster: model["poster"],
            annotations: model["annotations"].trim(),
            environmentImage: environmentImage,
            skyboxImage: model["skyboxImage"],
            shadowSoftness: model["shadowSoftness"],
            shadowIntensity: model["shadowIntensity"],
            autoRotate: isAutoRotate,
            scale: model["scale"],
            labelsEnabledOnStart: areLabelsEnabled,
            altText: model["altText"],
            additionalAttributes: additionalAttributes,
            copyInfo: model["copyInfo"],
            interactionPrompt: isInteractionPrompt,
            enableFullscreen: ModelValidationUtils.validateBoolean(model["enableFullscreen"]),
            langTag: model["langAttribute"],
        };
    };

    presenter.extendView = function (isPreview) {
        presenter.modelViewer = document.createElement("model-viewer");
        presenter.handleAttributes(isPreview);

        let parent = presenter.view;
        if (presenter.configuration.enableFullscreen) {
            parent = document.createElement("div");
            parent.classList.add("modelViewerWrapper");
            presenter.wrapper = parent;
            presenter.view.append(parent);
        }
        parent.append(presenter.modelViewer);

        presenter.copyMessage = document.createElement("div");
        presenter.copyMessage.classList.add("copyMessage");
        parent.append(presenter.copyMessage);

        const buttonsContainer = document.createElement("div");
        buttonsContainer.classList.add("buttonsContainer");
        parent.append(buttonsContainer);

        presenter.labelsButton = document.createElement("div");
        presenter.labelsButton.classList.add("labelsButton");
        buttonsContainer.append(presenter.labelsButton);

        presenter.copyButton = document.createElement("div");
        presenter.copyButton.classList.add("copyButton");
        buttonsContainer.append(presenter.copyButton);

        presenter.fullscreenButton = document.createElement("div");
        presenter.fullscreenButton.classList.add("fullscreenButton");
        buttonsContainer.append(presenter.fullscreenButton);
    };

    presenter.handleAttributes = function (isPreview) {
        presenter.modelViewer.setAttribute("src", presenter.configuration.model);
        presenter.modelViewer.setAttribute("poster", presenter.configuration.poster);
        presenter.modelViewer.setAttribute("skybox-image", presenter.configuration.skyboxImage);
        presenter.modelViewer.setAttribute("environment-image", presenter.configuration.environmentImage);
        presenter.modelViewer.setAttribute("shadow-intensity", presenter.configuration.shadowIntensity);
        presenter.modelViewer.setAttribute("shadow-softness", presenter.configuration.shadowSoftness);
        presenter.modelViewer.setAttribute("alt", presenter.configuration.altText);
        presenter.modelViewer.setAttribute("ar", "");
        presenter.modelViewer.setAttribute("camera-controls", "");
        presenter.modelViewer.setAttribute("touch-action", "pan-y");
        !isPreview &amp;&amp; presenter.modelViewer.setAttribute("vr", "");

        if (presenter.isMobileIOS()) {
            presenter.modelViewer.setAttribute("xr-environment", "");
            presenter.modelViewer.setAttribute("ar-mode", "webxr scene-viewer quick-look fallback");
            presenter.configuration.modelIOS &amp;&amp;
                presenter.modelViewer.setAttribute("ios-src", presenter.configuration.modelIOS);
        }
        presenter.addAttributesFromModel();
    };

    presenter.addAttributesFromModel = function () {
        if (!presenter.configuration.additionalAttributes) {
            return;
        }

        const attributes = presenter.configuration.additionalAttributes;

        Object.keys(attributes).forEach(key =&gt; {
            $(presenter.modelViewer).attr(key, attributes[key]);
        });
    };

    presenter.setAnnotations = function () {
        $(presenter.modelViewer).append(presenter.configuration.annotations);
        presenter.configuration.labelsEnabledOnStart ? presenter.showAnnotations() : presenter.hideAnnotations();
        presenter.areAnnotationsVisibleOnStart = presenter.annotationsVisibility === 'visible';
    };

    presenter.setAutoRotation = function () {
        if (presenter.configuration.autoRotate) {
            $(presenter.modelViewer).attr("auto-rotate", true);
        }
    };

    presenter.setInteractionPrompt = function () {
        presenter.configuration.interactionPrompt ? $(presenter.modelViewer).attr("interaction-prompt", "auto") : $(presenter.modelViewer).attr("interaction-prompt", "none");
    };

    presenter.handleButtons = function () {
        presenter.handleDisplayingButtons();

        presenter.configuration.labelsEnabledOnStart ? $(presenter.labelsButton).addClass("labelsButton-selected") : $(presenter.labelsButton).removeClass("labelsButton-selected");

        $(presenter.labelsButton).on("click", function (e) {
            $(presenter.labelsButton).toggleClass("labelsButton-selected");
            $(presenter.labelsButton).hasClass("labelsButton-selected") ? presenter.showAnnotations() : presenter.hideAnnotations();
        });
    };

    presenter.handleCopyright = function () {
        const copyText = '&lt;div class="copyContainer"&gt;' + presenter.configuration.copyInfo + '&lt;/div&gt;';
        $(presenter.copyMessage).append(copyText);

        presenter.copyContainer = $(presenter.copyMessage).find(".copyContainer").get(0);
        const link = presenter.copyContainer.querySelector('a');
        if (link) {
            link.addEventListener('click', function (event) {
                event.preventDefault();
                window.open(link.getAttribute('href'), '_blank');
            });
        }

        $(presenter.copyButton).on("click", function (e) {
            $(presenter.copyButton).toggleClass("copyButton-selected");
            $(presenter.copyMessage).toggleClass("copyMessage-visible");
        });
    };

    presenter.handleFullscreenButton = function () {
        $(presenter.fullscreenButton).on("click", function (e) {
            if (presenter.fullscreen.isOn) {
                presenter.exitFullscreen();
            } else {
                presenter.requestFullscreen();
            }
        });
    };

    presenter.handleDisplayingButtons = function () {
        if (presenter.configuration.annotations === "") {
            $(presenter.labelsButton).addClass("hidden");
        }

        if (presenter.configuration.copyInfo === "") {
            $(presenter.copyButton).addClass("hidden");
        }

        if (!isFullscreenEnabled()) {
            $(presenter.fullscreenButton).addClass("hidden");
        }
    };

    presenter.disableEvents = function () {
        $(presenter.modelViewer).css('pointer-events', 'none');
    };

    presenter.setScale = function (scale) {
        presenter.modelViewer.scale = scale + " " + scale + " " + scale;
    };

    presenter.showAnnotations = function () {
        if (!presenter.configuration.isVisible) { return; }
        presenter.setAnnotationsVisibility("visible");
        $(presenter.labelsButton).addClass("labelsButton-selected");
    };

    presenter.hideAnnotations = function () {
        presenter.setAnnotationsVisibility("hidden");
        $(presenter.labelsButton).removeClass("labelsButton-selected");
    };

    presenter.setAnnotationsVisibility = function (value) {
        $(presenter.modelViewer).find(".Hotspot").css("visibility", value);
        presenter.annotationsVisibility = value;
    };

    presenter.getAnnotationsVisibility = function () {
        return presenter.annotationsVisibility;
    };

    presenter.executeCommand = function (name, params) {
        var commands = {
            'show': presenter.show,
            'hide': presenter.hide,
            'showAnnotations': presenter.showAnnotations,
            'hideAnnotations': presenter.hideAnnotations,
            'getAnnotationsVisibility': presenter.getAnnotationsVisibility,
            'setScale': presenter.setScale,
            'requestFullscreen': presenter.requestFullscreen,
            'exitFullscreen': presenter.exitFullscreen,
        };
        Commands.dispatch(commands, name, params, presenter);
    };

    presenter.setShowErrorsMode = function () { };

    presenter.setWorkMode = function () { };

    presenter.reset = function () {
        if (presenter.isVisibleOnStart !== presenter.configuration.isVisible) {
            presenter.isVisibleOnStart ? presenter.show() : presenter.hide();
        }

        // set annotations visibility to default
        presenter.areAnnotationsVisibleOnStart ? presenter.showAnnotations() : presenter.hideAnnotations();

        if ($(presenter.copyButton).hasClass("copyButton-selected")) {
            $(presenter.copyButton).removeClass("copyButton-selected");
            $(presenter.copyMessage).removeClass("copyMessage-visible");
        }

        // handle animation
        presenter.setAnimationToDefault();
    };

    presenter.getErrorCount = function () {
        return 0;
    };

    presenter.getMaxScore = function () {
        return 0;
    };

    presenter.getScore = function () {
        return 0;
    };

    presenter.changeAnimation = function (animation) {
        $(presenter.modelViewer).attr("animation-name", animation);
    };

    presenter.play = function (repetitions, pingpong) {
        presenter.modelViewer.play(repetitions, pingpong);
    };

    presenter.pause = function () {
        presenter.modelViewer.pause();
    };

    presenter.listAnimations = function () {
        return presenter.modelViewer.availableAnimations;
    };

    presenter.jumpTo = function (time) {
        presenter.modelViewer.currentTime = time;
    };

    presenter.isPaused = function () {
        return presenter.modelViewer.paused;
    };

    presenter.animationDuration = function () {
        return presenter.modelViewer.duration;
    };

    presenter.changeSpeed = function (speed) {
        presenter.modelViewer.timeScale = speed;
    };

    presenter.userPrompt = function (value) {
        $(presenter.modelViewer).attr("interaction-prompt", value);
    };

    presenter.currentTime = function () {
        return presenter.modelViewer.currentTime;
    };

    presenter.getState = function () {
        return JSON.stringify({
            annotationsVisibility: presenter.annotationsVisibility,
            isVisible: presenter.configuration.isVisible,
            isPlaying: !presenter.isPaused(),
            selectedAnimation: $(presenter.modelViewer).attr("animation-name"),
            animationTime: presenter.modelViewer.currentTime
        });
    };

    presenter.setState = function (stateString) {
        if (ModelValidationUtils.isStringEmpty(stateString)) return;

        var state = JSON.parse(stateString);
        presenter.annotationsVisibility = state.annotationsVisibility;

        presenter.annotationsVisibility === "visible" ? presenter.showAnnotations() : presenter.hideAnnotations();

        if (state.isVisible) {
            presenter.show();
        } else {
            presenter.hide();
        }

        presenter.handleAnimationState(state);
    };

    presenter.handleAnimationState = function (state) {
        $(presenter.modelViewer).attr("animation-name", state.selectedAnimation);

        setTimeout(function () {
            state.isPlaying ? presenter.play() : presenter.pause();
            presenter.jumpTo(state.animationTime);
        }, 100);
    };

    presenter.show = function () {
        presenter.setVisibility(true);
        presenter.configuration.isVisible = true;
        if (presenter.annotationsVisibility === "visible") {
            presenter.showAnnotations();
        }
    };

    presenter.hide = function () {
        presenter.setVisibility(false);
        presenter.configuration.isVisible = false;
        $(presenter.modelViewer).find(".Hotspot").css("visibility", "hidden");
    };

    presenter.setVisibility = function (isVisible) {
        presenter.$view.css("visibility", isVisible ? "visible" : "hidden");
    };

    presenter.setAnimationToDefault = function () {
        const animations = presenter.listAnimations();
        const userSelectedAnimations = presenter.getUserSelectedAnimation();
        const isAutoplay = presenter.getAutoplayStatus();
        if (userSelectedAnimations) {
            presenter.changeAnimation(userSelectedAnimations);
        } else if (animations.length) {
            presenter.changeAnimation(animations[0]);
        }

        presenter.jumpTo(0);

        if (isAutoplay) {
            presenter.modelViewer.play();
        } else {
            presenter.pause();
        }
    };

    presenter.getUserSelectedAnimation = function () {
        if (presenter.configuration.additionalAttributes &amp;&amp; presenter.configuration.additionalAttributes.hasOwnProperty('animation-name')) {
            return presenter.configuration.additionalAttributes['animation-name'];
        }
    };

    presenter.getAutoplayStatus = function () {
        if (presenter.configuration.additionalAttributes &amp;&amp; presenter.configuration.additionalAttributes.hasOwnProperty('autoplay')) {
            return presenter.configuration.additionalAttributes['autoplay'];
        }

        return false;
    };

    function showErrorMessage() {
        presenter.$view.addClass('error');
        presenter.$view.html("Additional Attributes must be in JSON format.");
    }

    presenter.addHandlers = function () {
        $(document).on(
            'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange',
            presenter.fullscreenChangedEventReceived
        );
        MutationObserverService.createDestroyObserver(
            presenter.configuration.addonID,
            presenter.destroy,
            presenter.view
        );
        MutationObserverService.setObserver();
    };

    presenter.requestFullscreen = function () {
        if (!isFullscreenEnabled() || presenter.fullscreen.isOn) {
            return;
        }
        presenter.fullscreen.requestMethod.call(presenter.wrapper);
        setUpToFullscreenMode();
    };

    function setUpToFullscreenMode() {
        presenter.fullscreen.isOn = true;
        presenter.playerController.setAbleChangeLayout(false);
        presenter.wrapper.classList.add("modelViewerFullscreen");
    }

    presenter.exitFullscreen = function () {
        if (!isFullscreenEnabled() || !presenter.fullscreen.isOn) {
            return;
        }
        presenter.fullscreen.exitMethod.call(document);
        cleanAfterFullscreenMode();
    };

    presenter.fullscreenChangedEventReceived = function (event) {
        if (!isFullscreenInDocument() &amp;&amp; presenter.fullscreen.isOn) {
            cleanAfterFullscreenMode();
        }
    };

    function cleanAfterFullscreenMode() {
        presenter.fullscreen.isOn = false;
        presenter.playerController.setAbleChangeLayout(true);
        presenter.wrapper.classList.remove("modelViewerFullscreen");
    }

    function isFullscreenEnabled() {
        return presenter.configuration.enableFullscreen &amp;&amp; presenter.fullscreen.hasSupport;
    }

    function checkFullscreenSupport() {
        presenter.fullscreen = {
            isOn: false,
            hasSupport: false,
            requestMethod: null,
            exitMethod: null,
        };

        presenter.fullscreen.hasSupport = !!(
            document.fullscreenEnabled ||
            document.webkitFullscreenEnabled ||
            document.mozFullScreenEnabled ||
            document.msFullscreenEnabled
        );

        if (!isFullscreenEnabled()) {
            return;
        }

        presenter.fullscreen.requestMethod = (
            presenter.wrapper.requestFullscreen ||
            presenter.wrapper.mozRequestFullScreen ||
            presenter.wrapper.msRequestFullscreen ||
            presenter.wrapper.webkitRequestFullScreen ||
            presenter.wrapper.webkitEnterFullscreen ||
            null
        );

        presenter.fullscreen.exitMethod = (
            document.exitFullscreen ||
            document.mozCancelFullScreen ||
            document.msExitFullscreen ||
            document.webkitExitFullscreen ||
            null
        );
    }

    function isFullscreenInDocument() {
        return !!(
            document.fullscreenElement ||
            document.mozFullScreenElement ||
            document.webkitFullscreenElement ||
            document.msFullscreenElement ||
            document.webkitCurrentFullScreenElement ||
            document.fullscreen ||
            document.webkitIsFullScreen ||
            document.mozFullScreen
        );
    }

    presenter.isMobileIOS = function () {
        return window.MobileUtils.isSafariMobile(navigator.userAgent);
    }

    presenter.destroy = function (event) {
        if (event.target !== presenter.view) {
            return;
        }

        presenter.exitFullscreen();
        $(document).off(
            'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange',
            presenter.fullscreenChangedEventReceived
        );
    };

    presenter.keyboardController = function(keyCode, isShift, event) {
        event.preventDefault();
        if (keyCode === window.KeyboardControllerKeys.ENTER) {
            presenter.readAltText();
        }
    };

    presenter.readAltText = function () {
        presenter.speak([window.TTSUtils.getTextVoiceObject(presenter.configuration.altText, presenter.configuration.langTag)]);
    }

    presenter.getTextToSpeechOrNull = function () {
        if (presenter.playerController) {
            return presenter.playerController.getModule('Text_To_Speech1');
        }
        return null;
    };

    presenter.speak = function (data) {
        const tts = presenter.getTextToSpeechOrNull();
        if (tts &amp;&amp; presenter.isWCAGOn) {
            tts.speak(data);
        }
    };

    presenter.setWCAGStatus = function (isWCAGOn) {
        presenter.isWCAGOn = isWCAGOn;
    };

    presenter.isEnterable = function(){ return false;};

    presenter.isSelectable = function(isWCAGOn) {
        return isWCAGOn;
	}

    return presenter;
}
</presenter></addon>