!function(t,e){"use strict";function r(r,a,i,l,u){function f(){B=t.devicePixelRatio>1,i=c(i),a.delay>=0&&setTimeout(function(){s(!0)},a.delay),(a.delay<0||a.combined)&&(l.e=function(t,e){var n,i=0;return function(o,l){function u(){i=+new Date,e.call(r,o)}var f=+new Date-i;n&&clearTimeout(n),f>t||!a.enableThrottle||l?u():n=setTimeout(u,t-f)}}(a.throttle,function(t){"resize"===t.type&&(z=w=-1),s(t.all)}),l.a=function(t){t=c(t),i.push.apply(i,t)},l.g=function(){return i=n(i).filter(function(){return!n(this).data(a.loadedName)})},l.f=function(t){for(var e=0;e<t.length;e++){var r=i.filter(function(){return this===t[e]});r.length&&s(!1,r)}},s(),n(a.appendScroll).on("scroll."+u+" resize."+u,l.e))}function c(t){var i=a.defaultImage,o=a.placeholder,l=a.imageBase,u=a.srcsetAttribute,f=a.loaderAttribute,c=a._f||{};t=n(t).filter(function(){var t=n(this),r=m(this);return!t.data(a.handledName)&&(t.attr(a.attribute)||t.attr(u)||t.attr(f)||c[r]!==e)}).data("plugin_"+a.name,r);for(var s=0,d=t.length;s<d;s++){var A=n(t[s]),g=m(t[s]),h=A.attr(a.imageBaseAttribute)||l;g===I&&h&&A.attr(u)&&A.attr(u,b(A.attr(u),h)),c[g]===e||A.attr(f)||A.attr(f,c[g]),g===I&&i&&!A.attr(N)?A.attr(N,i):g===I||!o||A.css(C)&&"none"!==A.css(C)||A.css(C,"url('"+o+"')")}return t}function s(t,e){if(i.length){for(var o=e||i,l=!1,u=a.imageBase||"",f=a.srcsetAttribute,c=a.handledName,s=0;s<o.length;s++)if(t||e||A(o[s])){var g=n(o[s]),h=m(o[s]),b=g.attr(a.attribute),v=g.attr(a.imageBaseAttribute)||u,p=g.attr(a.loaderAttribute);g.data(c)||a.visibleOnly&&!g.is(":visible")||!((b||g.attr(f))&&(h===I&&(v+b!==g.attr(N)||g.attr(f)!==g.attr(E))||h!==I&&v+b!==g.css(C))||p)||(l=!0,g.data(c,!0),d(g,h,v,p))}l&&(i=n(i).filter(function(){return!n(this).data(c)}))}else a.autoDestroy&&r.destroy()}function d(t,e,r,i){++y;var o=function(){p("onError",t),v(),o=n.noop};p("beforeLoad",t);var l=a.attribute,u=a.srcsetAttribute,f=a.sizesAttribute,c=a.retinaAttribute,s=a.removeAttribute,d=a.loadedName,A=t.attr(c);if(i){var g=function(){s&&t.removeAttr(a.loaderAttribute),t.data(d,!0),p(L,t),setTimeout(v,1),g=n.noop};t.off(D).one(D,o).one(T,g),p(i,t,function(e){e?(t.off(T),g()):(t.off(D),o())})||t.trigger(D)}else{var h=n(new Image);h.one(D,o).one(T,function(){t.hide(),e===I?t.attr(F,h.attr(F)).attr(E,h.attr(E)).attr(N,h.attr(N)):t.css(C,"url('"+h.attr(N)+"')"),t[a.effect](a.effectTime),s&&(t.removeAttr(l+" "+u+" "+c+" "+a.imageBaseAttribute),f!==F&&t.removeAttr(f)),t.data(d,!0),p(L,t),h.remove(),v()});var m=(B&&A?A:t.attr(l))||"";h.attr(F,t.attr(f)).attr(E,t.attr(u)).attr(N,m?r+m:null),h.complete&&h.trigger(T)}}function A(t){var e=t.getBoundingClientRect(),r=a.scrollDirection,n=a.threshold,i=h()+n>e.top&&-n<e.bottom,o=g()+n>e.left&&-n<e.right;return"vertical"===r?i:("horizontal"===r||i)&&o}function g(){return z>=0?z:z=n(t).width()}function h(){return w>=0?w:w=n(t).height()}function m(t){return t.tagName.toLowerCase()}function b(t,e){if(e){var r=t.split(",");t="";for(var a=0,n=r.length;a<n;a++)t+=e+r[a].trim()+(a!==n-1?",":"")}return t}function v(){--y,i.length||y||p("onFinishedAll")}function p(t,e,n){return!!(t=a[t])&&(t.apply(r,[].slice.call(arguments,1)),!0)}var y=0,z=-1,w=-1,B=!1,L="afterLoad",T="load",D="error",I="img",N="src",E="srcset",F="sizes",C="background-image";"event"===a.bind||o?f():n(t).on(T+"."+u,f)}function a(a,o){var l=this,u=n.extend({},l.config,o),f={},c=u.name+"-"+ ++i;return l.config=function(t,r){return r===e?u[t]:(u[t]=r,l)},l.addItems=function(t){return f.a&&f.a("string"===n.type(t)?n(t):t),l},l.getItems=function(){return f.g?f.g():{}},l.update=function(t){return f.e&&f.e({},!t),l},l.force=function(t){return f.f&&f.f("string"===n.type(t)?n(t):t),l},l.loadAll=function(){return f.e&&f.e({all:!0},!0),l},l.destroy=function(){return n(u.appendScroll).off("."+c,f.e),n(t).off("."+c),f={},e},r(l,u,a,f,c),u.chainable?a:l}var n=t.jQuery||t.Zepto,i=0,o=!1;n.fn.Lazy=n.fn.lazy=function(t){return new a(this,t)},n.Lazy=n.lazy=function(t,r,i){if(n.isFunction(r)&&(i=r,r=[]),n.isFunction(i)){t=n.isArray(t)?t:[t],r=n.isArray(r)?r:[r];for(var o=a.prototype.config,l=o._f||(o._f={}),u=0,f=t.length;u<f;u++)(o[t[u]]===e||n.isFunction(o[t[u]]))&&(o[t[u]]=i);for(var c=0,s=r.length;c<s;c++)l[r[c]]=t[0]}},a.prototype.config={name:"lazy",chainable:!0,autoDestroy:!0,bind:"load",threshold:500,visibleOnly:!1,appendScroll:t,scrollDirection:"both",imageBase:null,defaultImage:"data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==",placeholder:null,delay:-1,combined:!1,attribute:"data-src",srcsetAttribute:"data-srcset",sizesAttribute:"data-sizes",retinaAttribute:"data-retina",loaderAttribute:"data-loader",imageBaseAttribute:"data-imagebase",removeAttribute:!0,handledName:"handled",loadedName:"loaded",effect:"show",effectTime:0,enableThrottle:!0,throttle:250,beforeLoad:e,afterLoad:e,onError:e,onFinishedAll:e},n(t).on("load",function(){o=!0})}(window);
(()=>{function t(i){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(i)}function i(i,e,a){return(e=function(i){var e=function(i){if("object"!=t(i)||!i)return i;var e=i[Symbol.toPrimitive];if(void 0!==e){var a=e.call(i,"string");if("object"!=t(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(i)}(i);return"symbol"==t(e)?e:e+""}(e))in i?Object.defineProperty(i,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):i[e]=a,i}!function(e){function a(){e(".zoom-instagram-widget__items").each(function(){e(this).find(".zoom-instagram-widget__item").each(function(){var t=e(this);if(!t.hasClass("wpz-insta-loaded")&&!t.data("shimmer-init")){t.data("shimmer-init",!0);var i=t.find("img.zoom-instagram-link, img.zoom-instagram-link-new").first();0!==i.length?i[0].complete&&i[0].naturalWidth>0?t.addClass("wpz-insta-loaded"):(i.on("load.shimmer",function(){t.addClass("wpz-insta-loaded")}),i.on("error.shimmer",function(){t.addClass("wpz-insta-loaded")})):t.addClass("wpz-insta-loaded")}})})}e(document).ready(function(){a()}),window.wpzInstaImageShimmerInit=a,e(window).on("load",function(){var n=!1;function o(){e(".wpzinsta-pro-load-more-btn").off("click.loadmore").on("click.loadmore",function(n){n.preventDefault();var o=e(this),s=o.closest(".wpzinsta-pro-load-more-wrapper"),r=o.closest(".zoom-instagram"),d=r.find(".zoom-instagram-widget__items");if("true"!==s.attr("data-disabled")&&!o.prop("disabled")&&!o.hasClass("loading")){var l=o.attr("data-feed-id"),c=o.attr("data-item-amount"),p=o.attr("data-image-size"),m=o.attr("data-allowed-post-types"),g=o.attr("data-next-url"),f=o.attr("data-nonce"),u=parseInt(o.attr("data-cache-offset")||"-1",10);if(u<0&&!g)o.hide();else{o.addClass("loading").prop("disabled",!0),s.addClass("loading");var w=o.find(".button-text").text();o.find(".button-text").text("Loading...");var h=-1!==window.location.search.indexOf("wpz-insta-widget-preview"),z={action:"wpzoom_instagram_load_more",feed_id:l,item_amount:c,image_size:p,allowed_post_types:m,next:g,_wpnonce:f};u>=0&&(z.cache_offset=u),h&&(z.preview=1),e.ajax({url:wpzInstaAjax.ajaxurl,type:"POST",dataType:"json",data:z,success:function(n){if(n.success&&n.data.html){var s=d.find("li").length;if(d.append(n.data.html),n.data.has_more?(void 0!==n.data.cache_offset&&n.data.cache_offset>=0?o.attr("data-cache-offset",n.data.cache_offset):o.attr("data-cache-offset","-1"),n.data.next_url&&o.attr("data-next-url",n.data.next_url)):o.hide(),d.zoomLoadAsyncImages(),a(),d.hasClass("layout-masonry"))if("function"==typeof e.fn.masonry){var l=d.find("li").slice(s);d.data("masonry")||d.masonry({itemSelector:".zoom-instagram-widget__item",columnWidth:".masonry-items-sizer",percentPosition:!0,gutter:parseInt(d.data("spacing")||10)}),d.masonry("appended",l)}else setTimeout(function(){d.zoomInstagramWidget({onlyNewItems:!0,startIndex:s})},100);else setTimeout(function(){d.zoomInstagramWidget({onlyNewItems:!0,startIndex:s})},100);if("1"===d.attr("data-lightbox")&&n.data.lightbox_html){var c=r.find(".wpz-insta-lightbox-wrapper .swiper-wrapper");if(c.length>0){c.append(n.data.lightbox_html);var p=c.parent();p.length>0&&p.get(0).swiper&&p.get(0).swiper.update(),c.find(".image-wrapper > .swiper").each(function(){if(!this.swiper){var t=e(this),a=t.closest(".image-wrapper");new Swiper(this,i(i(i(i(i(i(i(i(i(i({lazy:{threshold:50},watchSlidesVisibility:!0,preloadImages:!1},"lazy",!0),"direction","horizontal"),"loop",!1),"spaceBetween",20),"nested",!0),"watchOverflow",!0),"pagination",{el:t.find("> .swiper-pagination").get(0),type:"bullets",clickable:!0,hideOnClick:!1}),"navigation",{nextEl:t.find("> .swiper-button-next").get(0),prevEl:t.find("> .swiper-button-prev").get(0)}),"keyboard",{enabled:!0,onlyInViewport:!0}),"on",{init:function(){"function"==typeof window.wpzInstaUpdateProductTagVisibility&&window.wpzInstaUpdateProductTagVisibility(a,0)},activeIndexChange:function(){var t=this.slides[this.activeIndex],i=e(t).find("video").get(0);i&&i.play(),"function"==typeof window.wpzInstaUpdateProductTagVisibility&&window.wpzInstaUpdateProductTagVisibility(a,this.activeIndex)}}))}});var m=d.find("li").slice(s).find(".zoom-instagram-link");m.length>0&&(m.magnificPopup({items:{type:"inline",src:c.closest(".wpz-insta-lightbox-wrapper")},closeBtnInside:!1,mainClass:"wpzoom-lightbox",midClick:!0,callbacks:{open:function(){var i=e.magnificPopup.instance.st.el,a=this.content.find("> .swiper").get(0).swiper;if(this.content.find('> .swiper > .swiper-wrapper > .swiper-slide[data-uid="'+i.data("mfp-src")+'"] video')&&this.content.find('> .swiper > .swiper-wrapper > .swiper-slide[data-uid="'+i.data("mfp-src")+'"] video').trigger("play"),"object"===t(a)){var n=this.content.find('> .swiper > .swiper-wrapper > .swiper-slide[data-uid="'+i.data("mfp-src")+'"]').index();a.slideTo(n)}},afterClose:function(){p.find("video").each(function(){this.pause(),this.currentTime=0})}}}),m.addClass("magnific-active"))}else d.zoomLightbox()}r.trigger("wpz-insta:loaded-more",[n.data])}else console.error("Load more failed:",n.data||"Unknown error"),o.hide()},error:function(t,i,e){console.error("AJAX load more error:",e),o.hide()},complete:function(){o.removeClass("loading").prop("disabled",!1),s.removeClass("loading"),o.find(".button-text").text(w)}})}}})}function s(){e(".zoom-instagram-widget__items").each(function(){var t=e(this);t.hasClass("layout-masonry")&&"function"==typeof e.fn.masonry?t.data("masonry")?t.masonry("layout"):t.masonry({itemSelector:".zoom-instagram-widget__item",columnWidth:".masonry-items-sizer",percentPosition:!0,gutter:parseInt(t.data("spacing")||10)}):t.zoomInstagramWidget()}),n=!1}a(),o(),e.fn.zoomLoadAsyncImages=function(){return-1!==window.location.search.indexOf("wpz-insta-widget-preview")?this:e(this).each(function(){var t=e(this),i=t.data("image-width"),a=t.data("image-resolution"),n=t.find("li").filter(function(){return e(this).data("media-id")}).map(function(){return{"media-id":e(this).attr("data-media-id"),nonce:e(this).attr("data-nonce"),"regenerate-thumbnails":e(this)[0].hasAttribute("data-regenerate-thumbnails")}});n.length&&function(e,n){n=n||3;for(var o=0;o<e.length;o+=n)e.slice(o,o+n).forEach(function(e){wp.ajax.post("wpzoom_instagram_get_image_async",{"media-id":e["media-id"],nonce:e.nonce,"image-resolution":a,"image-width":i,"regenerate-thumbnails":e["regenerate-thumbnails"]}).done(function(i){t.find('li[data-media-id="'+e["media-id"]+'"] .zoom-instagram-link').css("background-image","url("+i.image_src+")")}).fail(function(){})})}(n.toArray(),3)})},e.fn.zoomLightbox=function(){return e(this).each(function(){var a=e(this).closest(".widget").find(".wpz-insta-lightbox-wrapper > .swiper");if(0===a.length&&(a=e(this).closest(".zoom-instagram").find(".wpz-insta-lightbox-wrapper > .swiper")),0===a.length&&(a=e(this).parent().parent().find(".wpz-insta-lightbox-wrapper > .swiper")),a.closest(".wpz-insta-lightbox-wrapper"),a.length>0&&"undefined"!=typeof Swiper){var n=function(t,i){var a=t.find(".wpz-insta-lightbox-tags");0!==a.length&&a.find(".wpz-insta-lightbox-tag").each(function(){var t=e(this),a=parseInt(t.attr("data-album-index"),10);-1===a||a===i?t.addClass("wpz-insta-lightbox-tag--visible"):t.removeClass("wpz-insta-lightbox-tag--visible")})},o=a.find(".image-wrapper > .swiper");new Swiper(a.get(0),i(i(i(i(i(i(i(i(i({lazy:{threshold:50},watchSlidesVisibility:!0,preloadImages:!1},"lazy",!0),"direction","horizontal"),"loop",!1),"spaceBetween",20),"autoHeight",!1),"watchOverflow",!0),"navigation",{nextEl:a.find("> .swiper-button-next").get(0),prevEl:a.find("> .swiper-button-prev").get(0)}),"keyboard",{enabled:!0,onlyInViewport:!0}),"on",{activeIndexChange:function(){var t=this.slides[this.activeIndex],i=e(t),a=i.find("video").get(0);a&&a.play(),"function"==typeof window.wpzInstaInitProductCarousel&&window.wpzInstaInitProductCarousel(i)}})),o.each(function(){var t=e(this),a=t.closest(".image-wrapper");new Swiper(t.get(0),i(i(i(i(i(i(i(i(i(i({lazy:{threshold:50},watchSlidesVisibility:!0,preloadImages:!1},"lazy",!0),"direction","horizontal"),"loop",!1),"spaceBetween",20),"nested",!0),"watchOverflow",!0),"pagination",{el:t.find("> .swiper-pagination").get(0),type:"bullets",clickable:!0,hideOnClick:!1}),"navigation",{nextEl:t.find("> .swiper-button-next").get(0),prevEl:t.find("> .swiper-button-prev").get(0)}),"keyboard",{enabled:!0,onlyInViewport:!0}),"on",{init:function(){n(a,0)},activeIndexChange:function(){var t=this.slides[this.activeIndex],i=e(t).find("video").get(0);i&&i.play(),n(a,this.activeIndex)}}))}),window.wpzInstaUpdateProductTagVisibility=n;var s=e(this).closest(".widget").find(".zoom-instagram-widget__items");0===s.length&&(s=e(this).closest(".zoom-instagram").find(".zoom-instagram-widget__items")),0===s.length&&(s=e(this)),s.find(".zoom-instagram-link").magnificPopup({items:{type:"inline",src:a.closest(".wpz-insta-lightbox-wrapper")},closeBtnInside:!1,mainClass:"wpzoom-lightbox",midClick:!0,callbacks:{open:function(){var i=e.magnificPopup.instance.st.el,a=this.content.find("> .swiper").get(0).swiper;this.content.find('> .swiper > .swiper-wrapper > .swiper-slide[data-uid="'+i.data("mfp-src")+'"] video')&&this.content.find('> .swiper > .swiper-wrapper > .swiper-slide[data-uid="'+i.data("mfp-src")+'"] video').trigger("play"),"object"===t(a)&&a.slideTo(this.content.find('> .swiper > .swiper-wrapper > .swiper-slide[data-uid="'+i.data("mfp-src")+'"]').index());var n=this.content.find('> .swiper > .swiper-wrapper > .swiper-slide[data-uid="'+i.data("mfp-src")+'"]');"function"==typeof window.wpzInstaInitProductCarousel&&window.wpzInstaInitProductCarousel(n)},afterClose:function(){a.find("video").each(function(){this.pause(),this.currentTime=0})}}}),s.find(".zoom-instagram-link").addClass("magnific-active")}})},window.wpzInstaInitProductCarousel=function(t){t.find(".wpz-insta-lightbox-product--carousel").each(function(){var t=e(this);if(!t.data("carousel-initialized")){var i=t.find(".wpz-insta-lightbox-product__carousel-inner"),a=i.find(".wpz-insta-lightbox-product__card"),n=t.find(".wpz-insta-lightbox-product__carousel-prev"),o=t.find(".wpz-insta-lightbox-product__carousel-next"),s=t.find(".wpz-insta-lightbox-product__carousel-dots");if(a.length<=1)return n.hide(),o.hide(),void s.hide();var r=0,d=a.length;s.empty();for(var l=function(t){var i=e('<span class="wpz-insta-lightbox-product__carousel-dot"></span>');0===t&&i.addClass("active"),i.on("click",function(){m(t)}),s.append(i)},c=0;c<d;c++)l(c);n.on("click",function(){r>0&&m(r-1)}),o.on("click",function(){r<d-1&&m(r+1)}),p(),t.data("carousel-initialized",!0)}function p(){i.css("transform","translateX(-"+100*r+"%)"),s.find(".wpz-insta-lightbox-product__carousel-dot").removeClass("active").eq(r).addClass("active"),n.prop("disabled",0===r),o.prop("disabled",r===d-1)}function m(t){t>=0&&t<d&&(r=t,p())}})},e.fn.zoomInstagramWidget=function(t){return e(this).each(function(){var i,a,n=e(this),o=t||{},s=n.data("images-per-row"),r=n.data("image-width"),d=n.data("image-spacing"),l=(n.data("image-lazy-loading"),n.width());l/r<s?(i=s,a=Math.floor((l-1-(s-1)*d)/s)):(i=Math.floor((l-1)/r),a=Math.floor((l-1-(i-1)*d)/i)),(o.onlyNewItems&&void 0!==o.startIndex?n.find("li").slice(o.startIndex):n.find("li")).each(function(t){var a=(o.onlyNewItems&&void 0!==o.startIndex?o.startIndex+t:t)+1;a%i==1?e(this).css("clear","left"):e(this).css("clear","none"),a%i==0?e(this).css("margin-right","0"):(e(this).css("margin-right",d+"px"),e(this).css("margin-bottom",d+"px"))}),n.find("a.zoom-instagram-link").css({width:a,height:a}),n.find("a.zoom-instagram-link-old").lazy(),n.find(".zoom-instagram-link-new").lazy(),n.removeClass("zoom-instagram-widget__items--no-js")})},e(window).on("resize orientationchange",function(){n||(n=!0,(window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)})(s))}),e(".zoom-instagram-widget__items").each(function(){var t=e(this);t.hasClass("layout-masonry")&&"function"==typeof e.fn.masonry?t.masonry({itemSelector:".zoom-instagram-widget__item",columnWidth:".masonry-items-sizer",percentPosition:!0,gutter:parseInt(t.data("spacing")||10)}):t.zoomInstagramWidget()}),e(".zoom-instagram-widget__items").zoomLoadAsyncImages(),e('.zoom-instagram-widget__items[data-lightbox="1"]').zoomLightbox();var r=_.debounce(function(){var t=e(".zoom-instagram-widget__items");t.length&&(t.each(function(){var t=e(this);t.hasClass("layout-masonry")&&"function"==typeof e.fn.masonry?t.masonry({itemSelector:".zoom-instagram-widget__item",columnWidth:".masonry-items-sizer",percentPosition:!0,gutter:parseInt(t.data("spacing")||10)}):t.zoomInstagramWidget()}),e(".zoom-instagram-widget__items").zoomLoadAsyncImages())},1500);e(document).on("panels_setup_preview",r),e(document).on("wpz-insta:loaded-more",function(){o()}),e(window).on("elementor/frontend/init",function(){elementorFrontend.hooks.addAction("frontend/element_ready/widget",function(t){"wpzoom-elementor-instagram-widget.default"==t.data("widget_type")&&t.find(".zoom-instagram-widget__items").each(function(){var t=e(this);t.hasClass("layout-masonry")&&"function"==typeof e.fn.masonry?t.masonry({itemSelector:".zoom-instagram-widget__item",columnWidth:".masonry-items-sizer",percentPosition:!0,gutter:parseInt(t.data("spacing")||10)}):t.zoomInstagramWidget()})})})})}(jQuery),document.body.addEventListener("click",function(t){var i=t.target.closest(".wpz-insta-link-product-btn");if(i&&(t.preventDefault(),t.stopPropagation(),"function"==typeof window.parent.postMessage)){var e=i.closest(".zoom-instagram-widget__item"),a=e&&e.getAttribute("data-media-type")||"image",n="",o=e?e.querySelector("img.zoom-instagram-link"):null;o&&(n=o.getAttribute("src")||o.getAttribute("data-src")||""),window.parent.postMessage({action:"wpz-insta-open-product-link",mediaId:i.getAttribute("data-media-id")||"",feedId:i.getAttribute("data-feed-id")||"",productId:i.getAttribute("data-product-id")||"",mediaType:a,imageUrl:n},"*")}},!0)})();
(()=>{var __webpack_modules__={265(){(()=>{"use strict";var __webpack_modules__={"./src/index.ts":(__unused_webpack_module,exports,__webpack_require__)=>{eval("\nexports.__esModule=true;\nexports.Zuck=void 0;\nvar utils_1=__webpack_require__(/*! ./utils */ \"./src/utils.ts\");\nvar options_1=__webpack_require__(/*! ./options */ \"./src/options.ts\");\nvar modal_1=__webpack_require__(/*! ./modal */ \"./src/modal.ts\");\nvar Zuck=function (timeline, options){\n    if(!timeline.id){\n        timeline.setAttribute('id', (0, utils_1.generateId)());\n    }\n    var id=timeline.id;\n    var _a=(0, options_1.loadOptions)(options), option=_a.option, callbackOption=_a.callback, templateOption=_a.template, languageOption=_a.language;\n    var data=option('stories')||[];\n    var internalData={};\n    /* data functions */\n    var saveLocalData=function (key, data){\n        try {\n            if(option('localStorage')&&(0, utils_1.hasWindow)()){\n                var keyName=\"zuck-\".concat(id, \"-\").concat(key);\n                window.localStorage[keyName]=JSON.stringify(data);\n            }\n        }\n        catch (e){ }\n    };\n    var getLocalData=function (key){\n        if(option('localStorage')&&(0, utils_1.hasWindow)()){\n            var keyName=\"zuck-\".concat(id, \"-\").concat(key);\n            return window.localStorage[keyName]\n                ? JSON.parse(window.localStorage[keyName])\n:undefined;\n        }\n        else {\n            return undefined;\n        }\n    };\n    internalData.seenItems=getLocalData('seenItems')||{};\n    var playVideoItem=function (storyViewer, elements, unmute){\n        var itemElement=elements===null||elements===void 0 ? void 0:elements[1];\n        var itemPointer=elements===null||elements===void 0 ? void 0:elements[0];\n        if(!itemElement||!itemPointer){\n            return false;\n        }\n        var cur=internalData.currentVideoElement;\n        if(cur){\n            cur.pause();\n        }\n        if(itemElement.getAttribute('data-type')==='video'){\n            var video_1=itemElement.querySelector('video');\n            if(!video_1){\n                internalData.currentVideoElement=undefined;\n                return false;\n            }\n            var setDuration=function (){\n                var duration=video_1.duration;\n                var itemPointerProgress=itemPointer.querySelector('.progress');\n                if(+video_1.dataset.length){\n                    duration=+video_1.dataset.length;\n                }\n                if(duration&&itemPointerProgress){\n                    itemPointerProgress.style.animationDuration=\"\".concat(duration, \"s\");\n                }\n            };\n            setDuration();\n            video_1.addEventListener('loadedmetadata', setDuration);\n            internalData.currentVideoElement=video_1;\n            video_1.play();\n            try {\n                unmuteVideoItem(video_1, storyViewer);\n            }\n            catch (e){\n                console.warn('Could not unmute video', unmute);\n            }\n        }\n        else {\n            internalData.currentVideoElement=undefined;\n        }\n    };\n    var findStoryIndex=function (id){\n        return data.findIndex(function (item){ return item.id===id; });\n    };\n    var pauseVideoItem=function (){\n        var video=internalData.currentVideoElement;\n        if(video){\n            try {\n                video.pause();\n            }\n            catch (e){ }\n        }\n    };\n    var unmuteVideoItem=function (video, storyViewer){\n        video.muted=false;\n        video.volume=1.0;\n        video.removeAttribute('muted');\n        video.play();\n        if(video.paused){\n            video.muted=true;\n            video.play();\n        }\n        if(storyViewer){\n            storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.remove('paused');\n        }\n    };\n    var parseItems=function (story, forceUpdate){\n        var storyId=(story===null||story===void 0 ? void 0:story.getAttribute('data-id'))||'';\n        var storyIndex=findStoryIndex(storyId);\n        var storyItems=document.querySelectorAll(\"#\".concat(id, \" [data-id=\\\"\").concat(storyId, \"\\\"] .items > li\"));\n        var items=[];\n        if(!option('reactive')||forceUpdate){\n            storyItems.forEach(function (_a){\n                var firstElementChild=_a.firstElementChild;\n                var a=firstElementChild;\n                var img=a===null||a===void 0 ? void 0:a.firstElementChild;\n                var li=a===null||a===void 0 ? void 0:a.parentElement;\n                var item={\n                    id: (a===null||a===void 0 ? void 0:a.getAttribute('data-id'))||(li===null||li===void 0 ? void 0:li.getAttribute('data-id')),\n                    src: a===null||a===void 0 ? void 0:a.getAttribute('href'),\n                    length: (0, utils_1.safeNum)(a===null||a===void 0 ? void 0:a.getAttribute('data-length')),\n                    type: a===null||a===void 0 ? void 0:a.getAttribute('data-type'),\n                    time: (a===null||a===void 0 ? void 0:a.getAttribute('data-time'))||(li===null||li===void 0 ? void 0:li.getAttribute('data-time')),\n                    link: (a===null||a===void 0 ? void 0:a.getAttribute('data-link'))||'',\n                    linkText: a===null||a===void 0 ? void 0:a.getAttribute('data-linkText'),\n                    preview: img===null||img===void 0 ? void 0:img.getAttribute('src'),\n                    seen: li===null||li===void 0 ? void 0:li.classList.contains('seen')\n                };\n                var all=a===null||a===void 0 ? void 0:a.attributes;\n                var reserved=[\n                    'data-id',\n                    'href',\n                    'data-length',\n                    'data-type',\n                    'data-time',\n                    'data-link',\n                    'data-linkText'\n                ];\n                if(all){\n                    for (var z=0; z < all.length; z++){\n                        if(reserved.indexOf(all[z].nodeName)===-1){\n                            item[all[z].nodeName.replace('data-', '')]=all===null||all===void 0 ? void 0:all[z].nodeValue;\n                        }\n                    }\n                }\n                // destruct the remaining attributes as options\n                items.push(item);\n            });\n            data[storyIndex].items=items;\n            var callback=callbackOption('onDataUpdate');\n            if(callback){\n                callback(data, function (){ });\n            }\n        }\n    };\n    var parseStory=function (story){\n        var _a, _b;\n        var storyId=(story===null||story===void 0 ? void 0:story.getAttribute('data-id'))||'';\n        var storyIndex=findStoryIndex(storyId);\n        var seen=false;\n        if(internalData.seenItems[storyId]){\n            seen=true;\n        }\n        try {\n            var storyData={};\n            if(storyIndex!==-1){\n                storyData=data[storyIndex];\n            }\n            storyData.id=storyId;\n            storyData.photo=story===null||story===void 0 ? void 0:story.getAttribute('data-photo');\n            storyData.name=(_a=story===null||story===void 0 ? void 0:story.querySelector('.name'))===null||_a===void 0 ? void 0:_a.innerText;\n            storyData.link=(_b=story===null||story===void 0 ? void 0:story.querySelector('.item-link'))===null||_b===void 0 ? void 0:_b.getAttribute('href');\n            storyData.lastUpdated=(0, utils_1.safeNum)((story===null||story===void 0 ? void 0:story.getAttribute('data-last-updated'))||\n                (story===null||story===void 0 ? void 0:story.getAttribute('data-time')));\n            storyData.seen=seen;\n            if(!storyData.items){\n                storyData.items=[];\n            }\n            if(storyIndex===-1){\n                data.push(storyData);\n            }\n            else {\n                data[storyIndex]=storyData;\n            }\n        }\n        catch (e){\n            data[storyIndex]={\n                items: []\n            };\n        }\n        if(story){\n            story.onclick=function (e){\n                e.preventDefault();\n                modal.show(storyId);\n            };\n        }\n        var callback=callbackOption('onDataUpdate');\n        if(callback){\n            callback(data, function (){ });\n        }\n    };\n    var add=function (data, append){\n        var _a, _b, _c, _d;\n        var storyId=data['id']||'';\n        var storyEl=document.querySelector(\"#\".concat(id, \" [data-id=\\\"\").concat(storyId, \"\\\"]\"));\n        var items=data['items'];\n        var story=null;\n        var preview=undefined;\n        if(items===null||items===void 0 ? void 0:items[0]){\n            preview=((_a=items===null||items===void 0 ? void 0:items[0])===null||_a===void 0 ? void 0:_a.preview)||'';\n        }\n        if(internalData.seenItems[storyId]===true){\n            data.seen=true;\n        }\n        if(data){\n            data.currentPreview=preview;\n        }\n        if(!storyEl){\n            var storyItem=document.createElement('div');\n            storyItem.innerHTML=templateOption('timelineItem')(data);\n            story=storyItem.firstElementChild;\n        }\n        else {\n            story=storyEl;\n        }\n        if(data.seen===false){\n            internalData.seenItems[storyId]=false;\n            saveLocalData('seenItems', internalData.seenItems);\n        }\n        story===null||story===void 0 ? void 0:story.setAttribute('data-id', storyId);\n        if(data['photo']){\n            story===null||story===void 0 ? void 0:story.setAttribute('data-photo', data['photo']);\n        }\n        story===null||story===void 0 ? void 0:story.setAttribute('data-time', (_b=data['time'])===null||_b===void 0 ? void 0:_b.toString());\n        if(data['lastUpdated']){\n            story===null||story===void 0 ? void 0:story.setAttribute('data-last-updated', (_c=data['lastUpdated'])===null||_c===void 0 ? void 0:_c.toString());\n        }\n        else {\n            story===null||story===void 0 ? void 0:story.setAttribute('data-last-updated', (_d=data['time'])===null||_d===void 0 ? void 0:_d.toString());\n        }\n        parseStory(story);\n        if(!storyEl&&!option('reactive')){\n            if(append){\n                timeline.appendChild(story);\n            }\n            else {\n                (0, utils_1.prepend)(timeline, story);\n            }\n        }\n        items===null||items===void 0 ? void 0:items.forEach(function (item){\n            addItem(storyId, item, append);\n        });\n        if(!append){\n            updateStorySeenPosition();\n        }\n    };\n    var update=add;\n    var next=function (){\n        modal.next();\n    };\n    var remove=function (storyId){\n        var _a;\n        var story=document.querySelector(\"#\".concat(id, \" > [data-id=\\\"\").concat(storyId, \"\\\"]\"));\n        (_a=story===null||story===void 0 ? void 0:story.parentNode)===null||_a===void 0 ? void 0:_a.removeChild(story);\n    };\n    var addItem=function (storyId, data, append){\n        var story=document.querySelector(\"#\".concat(id, \" > [data-id=\\\"\").concat(storyId, \"\\\"]\"));\n        if(!option('reactive')){\n            var li=document.createElement('li');\n            var el=story===null||story===void 0 ? void 0:story.querySelectorAll('.items')[0];\n            if(data['id']){\n                li.className=data['seen'] ? 'seen':'';\n                li.setAttribute('data-id', data['id']);\n            }\n            li.innerHTML=templateOption('timelineStoryItem')(data);\n            if(append){\n                el===null||el===void 0 ? void 0:el.appendChild(li);\n            }\n            else {\n                (0, utils_1.prepend)(el, li);\n            }\n        }\n        parseItems(story);\n    };\n    var removeItem=function (storyId, itemId){\n        var _a;\n        var item=document.querySelector(\"#\".concat(id, \" > [data-id=\\\"\").concat(storyId, \"\\\"] [data-id=\\\"\").concat(itemId, \"\\\"]\"));\n        if(!option('reactive')){\n            (_a=item===null||item===void 0 ? void 0:item.parentNode)===null||_a===void 0 ? void 0:_a.removeChild(item);\n            data.forEach(function (story){\n                if(story.id===storyId){\n                    story.items=story.items.filter(function (item){ return item.id!==itemId; });\n                }\n            });\n        }\n    };\n    var nextItem=function (direction, event){\n        var currentStory=internalData.currentStory;\n        var currentStoryIndex=findStoryIndex(internalData.currentStory);\n        var currentItem=data[currentStoryIndex].currentItem;\n        var storyViewer=document.querySelector(\"#zuck-modal .story-viewer[data-story-id=\\\"\".concat(currentStory, \"\\\"]\"));\n        var directionNumber=direction==='previous' ? -1:1;\n        if(!storyViewer){\n            return false;\n        }\n        var currentItemElements=storyViewer.querySelectorAll(\"[data-index=\\\"\".concat(currentItem, \"\\\"]\"));\n        var currentPointer=currentItemElements[0];\n        var currentItemElement=currentItemElements[1];\n        var navigateItem=currentItem + directionNumber;\n        var nextItems=storyViewer.querySelectorAll(\"[data-index=\\\"\".concat(navigateItem, \"\\\"]\"));\n        var nextPointer=nextItems[0];\n        var nextItem=nextItems[1];\n        if(storyViewer&&nextPointer&&nextItem){\n            var navigateItemCallback=function (){\n                if(direction==='previous'){\n                    currentPointer===null||currentPointer===void 0 ? void 0:currentPointer.classList.remove('seen');\n                    currentItemElement===null||currentItemElement===void 0 ? void 0:currentItemElement.classList.remove('seen');\n                }\n                else {\n                    currentPointer===null||currentPointer===void 0 ? void 0:currentPointer.classList.add('seen');\n                    currentItemElement===null||currentItemElement===void 0 ? void 0:currentItemElement.classList.add('seen');\n                }\n                currentPointer===null||currentPointer===void 0 ? void 0:currentPointer.classList.remove('active');\n                currentItemElement===null||currentItemElement===void 0 ? void 0:currentItemElement.classList.remove('active');\n                nextPointer===null||nextPointer===void 0 ? void 0:nextPointer.classList.remove('seen');\n                nextPointer===null||nextPointer===void 0 ? void 0:nextPointer.classList.add('active');\n                nextItem===null||nextItem===void 0 ? void 0:nextItem.classList.remove('seen');\n                nextItem===null||nextItem===void 0 ? void 0:nextItem.classList.add('active');\n                storyViewer\n                    .querySelectorAll('.time')\n                    .forEach(function (el){\n                    el.innerText=(0, utils_1.timeAgo)(Number(nextItem.getAttribute('data-time')), option('language'));\n                });\n                data[currentStoryIndex].currentItem=\n                    data[currentStoryIndex].currentItem + directionNumber;\n                var nextVideo=nextItem.querySelector('video');\n                if(nextVideo){\n                    nextVideo.currentTime=0;\n                }\n                playVideoItem(storyViewer, nextItems, event);\n            };\n            var callback=callbackOption('onNavigateItem');\n            callback = !callback\n                ? callbackOption('onNextItem')\n:callbackOption('onNavigateItem');\n            callback(currentStory, nextItem.getAttribute('data-story-id'), navigateItemCallback);\n        }\n        else if(storyViewer){\n            if(direction!=='previous'){\n                modal.next();\n            }\n        }\n        return true;\n    };\n    var navigateItem=nextItem;\n    var updateStorySeenPosition=function (){\n        document\n            .querySelectorAll(\"#\".concat(id, \" .story.seen\"))\n            .forEach(function (el){\n            var storyId=el===null||el===void 0 ? void 0:el.getAttribute('data-id');\n            var storyIndex=findStoryIndex(storyId);\n            if(storyId){\n                var newData=data[storyIndex];\n                var timeline_1=el===null||el===void 0 ? void 0:el.parentNode;\n                if(!option('reactive')&&timeline_1){\n                    timeline_1.removeChild(el);\n                }\n                update(newData, true);\n            }\n        });\n    };\n    var init=function (){\n        if(timeline&&timeline.querySelector('.story')){\n            timeline.querySelectorAll('.story').forEach(function (story){\n                parseStory(story);\n                parseItems(story);\n            });\n        }\n        if(option('backNative')&&(0, utils_1.hasWindow)()){\n            if(window.location.hash===\"#!\".concat(id)){\n                window.location.hash='';\n            }\n            window.addEventListener('popstate', function (){\n                if(window.location.hash!==\"#!\".concat(id)){\n                    window.location.hash='';\n                }\n            }, false);\n        }\n        if(!option('reactive')){\n            var seenItems_1=getLocalData('seenItems');\n            if(seenItems_1){\n                Object.entries(seenItems_1).forEach(function (_a){\n                    var key=_a[1];\n                    if(key&&data[key]){\n                        data[key].seen=seenItems_1[key] ? true:false;\n                    }\n                });\n            }\n        }\n        option('stories').forEach(function (item){\n            add(item, true);\n        });\n        updateStorySeenPosition();\n        var avatars=option('avatars') ? 'user-icon':'story-preview';\n        var list=option('list') ? 'list':'carousel';\n        var rtl=option('rtl') ? 'rtl':'';\n        timeline.className +=\" stories \".concat(avatars, \" \").concat(list, \" \").concat(\"\".concat(option('skin')).toLowerCase(), \" \").concat(rtl);\n        return {\n            id: id,\n            option: option,\n            callback: callbackOption,\n            template: templateOption,\n            language: languageOption,\n            navigateItem: navigateItem,\n            saveLocalData: saveLocalData,\n            getLocalData: getLocalData,\n            data: data,\n            internalData: internalData,\n            add: add,\n            update: update,\n            next: next,\n            remove: remove,\n            addItem: addItem,\n            removeItem: removeItem,\n            nextItem: nextItem,\n            findStoryIndex: findStoryIndex,\n            updateStorySeenPosition: updateStorySeenPosition,\n            playVideoItem: playVideoItem,\n            pauseVideoItem: pauseVideoItem,\n            unmuteVideoItem: unmuteVideoItem\n        };\n    };\n    var zuck=init();\n    var modal=(0, modal_1.modal)(zuck);\n    return zuck;\n};\nexports.Zuck=Zuck;\nexports[\"default\"]=exports.Zuck;\n\n\n//# sourceURL=webpack://Zuck/./src/index.ts?")},"./src/modal.ts":(__unused_webpack_module,exports,__webpack_require__)=>{eval("\nexports.__esModule=true;\nexports.modal=void 0;\nvar utils_1=__webpack_require__(/*! ./utils */ \"./src/utils.ts\");\nvar modal=function (zuck){\n    var id=zuck.id;\n    var modalZuckContainer=document.querySelector('#zuck-modal');\n    if(!modalZuckContainer&&!zuck.hasModal){\n        zuck.hasModal=true;\n        modalZuckContainer=document.createElement('div');\n        modalZuckContainer.id='zuck-modal';\n        if(zuck.option('cubeEffect')){\n            modalZuckContainer.className='with-cube';\n        }\n        modalZuckContainer.innerHTML='<div id=\"zuck-modal-content\"></div>';\n        modalZuckContainer.style.display='none';\n        modalZuckContainer.setAttribute('tabIndex', '1');\n        modalZuckContainer.onkeyup=function (_a){\n            var keyCode=_a.keyCode;\n            var code=keyCode;\n            if(code===27){\n                modalZuckContainer.modal.close();\n            }\n            else if(code===13||code===32){\n                modalZuckContainer.modal.next();\n            }\n        };\n        if(zuck.option('openEffect')){\n            modalZuckContainer===null||modalZuckContainer===void 0 ? void 0:modalZuckContainer.classList.add('with-effects');\n        }\n        if(zuck.option('rtl')){\n            modalZuckContainer===null||modalZuckContainer===void 0 ? void 0:modalZuckContainer.classList.add('rtl');\n        }\n        (0, utils_1.onTransitionEnd)(modalZuckContainer, function (){\n            var modalContent=document.querySelector('#zuck-modal-content');\n            if(modalZuckContainer===null||modalZuckContainer===void 0 ? void 0:modalZuckContainer.classList.contains('closed')){\n                if(modalContent){\n                    modalContent.innerHTML='';\n                }\n                modalZuckContainer.style.display='none';\n                modalZuckContainer.classList.remove('closed');\n                modalZuckContainer.classList.remove('animated');\n            }\n        });\n        document.body.appendChild(modalZuckContainer);\n    }\n    var translate=function (element, to, duration, ease){\n        var _a;\n        if(to===undefined||(to&&isNaN(to))){\n            return;\n        }\n        var direction=to > 0 ? 1:-1;\n        var modalWidth=((_a=document.querySelector('#zuck-modal'))===null||_a===void 0 ? void 0:_a.offsetWidth)||1;\n        var to3d=(Math.abs(to) / modalWidth) * 90 * direction;\n        if(zuck.option('cubeEffect')){\n            var scaling=to3d===0 ? 'scale(0.95)':'scale(0.930,0.930)';\n            var modalContent=document.querySelector('#zuck-modal-content');\n            if(modalContent){\n                modalContent.style.transform=scaling;\n            }\n            if(to3d < -90||to3d > 90){\n                return false;\n            }\n        }\n        var transform = !zuck.option('cubeEffect')\n            ? \"translate3d(\".concat(to, \"px, 0, 0)\")\n:\"rotateY(\".concat(to3d, \"deg)\");\n        if(element){\n            if(ease){\n                element.style.transitionTimingFunction=ease;\n            }\n            element.style.transitionDuration=\"\".concat(duration, \"ms\");\n            element.style.transform=transform;\n        }\n    };\n    var fullScreen=function (elem, cancel){\n        var anyDocument=document;\n        var anyElem=elem;\n        try {\n            if(cancel){\n                if(anyDocument.fullscreenElement||\n                    anyDocument.webkitFullscreenElement||\n                    anyDocument.mozFullScreenElement||\n                    anyDocument.msFullscreenElement){\n                    if(anyDocument.exitFullscreen){\n                        anyDocument.exitFullscreen()[\"catch\"](function (){ });\n                    }\n                    else if(anyDocument.mozCancelFullScreen){\n                        anyDocument.mozCancelFullScreen()[\"catch\"](function (){ });\n                    }\n                }\n            }\n            else {\n                if(anyElem.requestFullscreen){\n                    anyElem.requestFullscreen();\n                }\n                else if(anyElem.msRequestFullscreen){\n                    anyElem.msRequestFullscreen();\n                }\n                else if(anyElem.mozRequestFullScreen){\n                    anyElem.mozRequestFullScreen();\n                }\n                else if(anyElem.webkitRequestFullscreen){\n                    anyElem.webkitRequestFullscreen();\n                }\n            }\n        }\n        catch (e){\n            console.warn(\"[Zuck.js] Can't access fullscreen\");\n        }\n    };\n    var moveStoryItem=function (direction){\n        var modalContainer=document.querySelector('#zuck-modal');\n        var modalSlider=document.querySelector(\"#zuck-modal-slider-\".concat(id));\n        var target='';\n        var useless='';\n        var transform=0;\n        var slideItems={\n            previous: document.querySelector('#zuck-modal .story-viewer.previous'),\n            next: document.querySelector('#zuck-modal .story-viewer.next'),\n            viewing: document.querySelector('#zuck-modal .story-viewer.viewing')\n        };\n        if((!slideItems.previous&&!direction)||\n            (!slideItems.next&&direction)){\n            if(!zuck.option('rtl')){\n                return false;\n            }\n        }\n        if(!direction){\n            target='previous';\n            useless='next';\n        }\n        else {\n            target='next';\n            useless='previous';\n        }\n        var transitionTime=600;\n        if(zuck.option('cubeEffect')){\n            if(target==='previous'){\n                transform=(0, utils_1.safeNum)(modalContainer===null||modalContainer===void 0 ? void 0:modalContainer.slideWidth);\n            }\n            else if(target==='next'){\n                transform=(0, utils_1.safeNum)(modalContainer===null||modalContainer===void 0 ? void 0:modalContainer.slideWidth) * -1;\n            }\n        }\n        else {\n            transform=(0, utils_1.findPos)(slideItems[target])[0] * -1;\n        }\n        translate(modalSlider, transform, transitionTime, null);\n        setTimeout(function (){\n            var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n            // set page data when transition complete\n            if(zuck.option('rtl')){\n                var tmp=target;\n                target=useless;\n                useless=tmp;\n            }\n            if(target!==''&&slideItems[target]&&useless!==''){\n                var currentStory=(_a=slideItems[target])===null||_a===void 0 ? void 0:_a.getAttribute('data-story-id');\n                zuck.internalData.currentStory=currentStory;\n                var oldStory=document.querySelector(\"#zuck-modal .story-viewer.\".concat(useless));\n                if(oldStory){\n                    (_b=oldStory===null||oldStory===void 0 ? void 0:oldStory.parentNode)===null||_b===void 0 ? void 0:_b.removeChild(oldStory);\n                }\n                if(slideItems.viewing){\n                    (_c=slideItems.viewing)===null||_c===void 0 ? void 0:_c.classList.add('stopped');\n                    (_d=slideItems.viewing)===null||_d===void 0 ? void 0:_d.classList.add(useless);\n                    (_e=slideItems.viewing)===null||_e===void 0 ? void 0:_e.classList.remove('viewing');\n                }\n                if(slideItems[target]){\n                    (_f=slideItems[target])===null||_f===void 0 ? void 0:_f.classList.remove('stopped');\n                    (_g=slideItems[target])===null||_g===void 0 ? void 0:_g.classList.remove(target);\n                    (_h=slideItems[target])===null||_h===void 0 ? void 0:_h.classList.add('viewing');\n                }\n                var newTimelineItem=getStoryMorningGlory(target);\n                if(newTimelineItem){\n                    createStoryViewer(newTimelineItem, target);\n                }\n                var storyId=zuck.internalData.currentStory;\n                var storyIndex=zuck.findStoryIndex(storyId);\n                var storyWrap=document.querySelector(\"#zuck-modal [data-story-id=\\\"\".concat(storyId, \"\\\"]\"));\n                var items=undefined;\n                if(storyWrap){\n                    items=storyWrap.querySelectorAll('[data-index].active');\n                    var duration=(_j=items===null||items===void 0 ? void 0:items[0])===null||_j===void 0 ? void 0:_j.firstElementChild;\n                    zuck.data[storyIndex].currentItem=(0, utils_1.safeNum)((_k=items===null||items===void 0 ? void 0:items[0])===null||_k===void 0 ? void 0:_k.getAttribute('data-index'));\n                    if(items===null||items===void 0 ? void 0:items[0]){\n                        items[0].innerHTML=zuck.template('viewerItemPointerProgress')(duration.style.cssText);\n                        (0, utils_1.onAnimationEnd)(duration, function (){\n                            zuck.nextItem();\n                        });\n                    }\n                }\n                translate(modalSlider, 0, 0, null);\n                if(items){\n                    var storyViewer=document.querySelector(\"#zuck-modal .story-viewer[data-story-id=\\\"\".concat(currentStory, \"\\\"]\"));\n                    zuck.playVideoItem(storyViewer, items);\n                }\n                zuck.callback('onView')(zuck.internalData.currentStory);\n            }\n        }, transitionTime + 50);\n    };\n    var createStoryViewer=function (storyData, className, forcePlay){\n        var modalSlider=document.querySelector(\"#zuck-modal-slider-\".concat(id));\n        var storyItems=storyData['items'];\n        storyData.time=storyItems&&(storyItems===null||storyItems===void 0 ? void 0:storyItems[0]['time']);\n        var htmlItems='';\n        var pointerItems='';\n        var storyId=storyData['id'];\n        var slides=document.createElement('div');\n        var currentItem=storyData['currentItem']||0;\n        var exists=document.querySelector(\"#zuck-modal .story-viewer[data-story-id=\\\"\".concat(storyId, \"\\\"]\"));\n        if(exists){\n            return false;\n        }\n        slides.className='slides';\n        storyItems.forEach(function (item, i){\n            if(currentItem > i){\n                storyData.items[i].seen=true;\n                item.seen=true;\n            }\n            pointerItems +=zuck.template('viewerItemPointer')(i, currentItem, item);\n            htmlItems +=zuck.template('viewerItemBody')(i, currentItem, item);\n        });\n        slides.innerHTML=htmlItems;\n        var video=slides.querySelector('video');\n        var addMuted=function (video){\n            if(video.muted){\n                storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.add('muted');\n            }\n            else {\n                storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.remove('muted');\n            }\n        };\n        if(video){\n            video.onwaiting=function (){\n                if(video.paused){\n                    storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.add('paused');\n                    storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.add('loading');\n                }\n            };\n            video.onplay=function (){\n                addMuted(video);\n                storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.remove('stopped');\n                storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.remove('paused');\n                storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.remove('loading');\n            };\n            video.onload=\n                video.onplaying=\n                    video.oncanplay=\n                        function (){\n                            addMuted(video);\n                            storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.remove('loading');\n                        };\n            video.onvolumechange=function (){\n                addMuted(video);\n            };\n        }\n        var storyViewerWrap=document.createElement('div');\n        storyViewerWrap.innerHTML=zuck.template('viewerItem')(storyData, storyItems[currentItem]);\n        var storyViewer=storyViewerWrap.firstElementChild;\n        var storyViewerPointerWrap=storyViewer.querySelector('.slides-pointers .wrap');\n        storyViewer.className=\"story-viewer muted \".concat(className, \" \").concat(!forcePlay ? 'stopped':'', \" \").concat(zuck.option('backButton') ? 'with-back-button':'');\n        if(storyId){\n            storyViewer.setAttribute('data-story-id', storyId);\n        }\n        if(storyViewerPointerWrap){\n            storyViewerPointerWrap.innerHTML=pointerItems;\n        }\n        storyViewer\n            .querySelectorAll('.close, .back')\n            .forEach(function (el){\n            el.onclick=function (e){\n                e.preventDefault();\n                modalZuckContainer.modal.close();\n            };\n        });\n        storyViewer.appendChild(slides);\n        if(className==='viewing'){\n            zuck.playVideoItem(storyViewer, storyViewer.querySelectorAll(\"[data-index=\\\"\".concat(currentItem, \"\\\"].active\")), undefined);\n        }\n        storyViewer\n            .querySelectorAll('.slides-pointers [data-index] > .progress')\n            .forEach(function (el){\n            (0, utils_1.onAnimationEnd)(el, function (){\n                zuck.nextItem(undefined);\n            });\n        });\n        if(!modalSlider){\n            return;\n        }\n        if(className==='previous'){\n            (0, utils_1.prepend)(modalSlider, storyViewer);\n        }\n        else {\n            modalSlider.appendChild(storyViewer);\n        }\n    };\n    var createStoryTouchEvents=function (modalSlider){\n        var modalContainer=document.querySelector('#zuck-modal');\n        var enableMouseEvents=true;\n        var position=null;\n        var touchOffset=null;\n        var isScrolling=null;\n        var delta=null;\n        var timer=undefined;\n        var nextTimer=undefined;\n        var touchStart=function (event){\n            var storyViewer=document.querySelector('#zuck-modal .viewing');\n            var storyViewerWrap=document.querySelector('#zuck-modal .story-viewer');\n            if(event.target.nodeName==='A'){\n                return;\n            }\n            var touches=event.touches\n                ? event.touches[0]\n:event;\n            var pos=(0, utils_1.findPos)(document.querySelector('#zuck-modal .story-viewer.viewing'));\n            if(modalContainer){\n                modalContainer.slideWidth=storyViewerWrap===null||storyViewerWrap===void 0 ? void 0:storyViewerWrap.offsetWidth;\n                modalContainer.slideHeight=storyViewerWrap===null||storyViewerWrap===void 0 ? void 0:storyViewerWrap.offsetHeight;\n            }\n            position={\n                x: pos[0],\n                y: pos[1]\n            };\n            var clientX=touches.clientX;\n            var clientY=touches.clientY;\n            touchOffset={\n                x: clientX,\n                y: clientY,\n                time: Date.now(),\n                valid: true\n            };\n            if(clientY < 80||clientY > (0, utils_1.safeNum)(modalContainer===null||modalContainer===void 0 ? void 0:modalContainer.slideHeight) - 80){\n                touchOffset.valid=false;\n            }\n            else {\n                event.preventDefault();\n                isScrolling=undefined;\n                delta={};\n                if(enableMouseEvents){\n                    modalSlider===null||modalSlider===void 0 ? void 0:modalSlider.addEventListener('mousemove', touchMove);\n                    modalSlider===null||modalSlider===void 0 ? void 0:modalSlider.addEventListener('mouseup', touchEnd);\n                    modalSlider===null||modalSlider===void 0 ? void 0:modalSlider.addEventListener('mouseleave', touchEnd);\n                }\n                modalSlider===null||modalSlider===void 0 ? void 0:modalSlider.addEventListener('touchmove', touchMove);\n                modalSlider===null||modalSlider===void 0 ? void 0:modalSlider.addEventListener('touchend', touchEnd);\n                if(storyViewer){\n                    storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.add('paused');\n                }\n                zuck.pauseVideoItem();\n                timer=setTimeout(function (){\n                    if(storyViewer){\n                        storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.add('longPress');\n                    }\n                }, 600);\n                nextTimer=setTimeout(function (){\n                    clearInterval(nextTimer);\n                    nextTimer=undefined;\n                }, 250);\n            }\n        };\n        var touchMove=function (event){\n            var touches=event.touches\n                ? event.touches[0]\n:event;\n            var clientX=touches.clientX;\n            var clientY=touches.clientY;\n            if(touchOffset&&touchOffset.valid){\n                delta={\n                    x: clientX - touchOffset.x,\n                    y: clientY - touchOffset.y\n                };\n                if(typeof isScrolling==='undefined'){\n                    isScrolling = !!(isScrolling||Math.abs(delta.x) < Math.abs(delta.y));\n                }\n                if(!isScrolling&&touchOffset){\n                    event.preventDefault();\n                    translate(modalSlider, (0, utils_1.safeNum)(position===null||position===void 0 ? void 0:position.x) + (0, utils_1.safeNum)(delta===null||delta===void 0 ? void 0:delta.x), 0, null);\n                }\n            }\n        };\n        var touchEnd=function (event){\n            var storyViewer=document.querySelector('#zuck-modal .viewing');\n            var lastTouchOffset=touchOffset;\n            var duration=touchOffset ? Date.now() - touchOffset.time:undefined;\n            var isValid=(Number(duration) < 300&&Math.abs((0, utils_1.safeNum)(delta===null||delta===void 0 ? void 0:delta.x)) > 25)||\n                Math.abs((0, utils_1.safeNum)(delta===null||delta===void 0 ? void 0:delta.x)) > (0, utils_1.safeNum)(modalContainer===null||modalContainer===void 0 ? void 0:modalContainer.slideWidth) / 3;\n            var direction=(0, utils_1.safeNum)(delta===null||delta===void 0 ? void 0:delta.x) < 0;\n            var index=direction\n                ? document.querySelector('#zuck-modal .story-viewer.next')\n:document.querySelector('#zuck-modal .story-viewer.previous');\n            var isOutOfBounds=(direction&&!index)||(!direction&&!index);\n            if(touchOffset&&!touchOffset.valid){\n            }\n            else {\n                if(delta){\n                    if(!isScrolling){\n                        if(isValid&&!isOutOfBounds){\n                            moveStoryItem(direction);\n                        }\n                        else {\n                            translate(modalSlider, (0, utils_1.safeNum)(position===null||position===void 0 ? void 0:position.x), 300);\n                        }\n                    }\n                    touchOffset=undefined;\n                    if(enableMouseEvents){\n                        modalSlider===null||modalSlider===void 0 ? void 0:modalSlider.removeEventListener('mousemove', touchMove);\n                        modalSlider===null||modalSlider===void 0 ? void 0:modalSlider.removeEventListener('mouseup', touchEnd);\n                        modalSlider===null||modalSlider===void 0 ? void 0:modalSlider.removeEventListener('mouseleave', touchEnd);\n                    }\n                    modalSlider===null||modalSlider===void 0 ? void 0:modalSlider.removeEventListener('touchmove', touchMove);\n                    modalSlider===null||modalSlider===void 0 ? void 0:modalSlider.removeEventListener('touchend', touchEnd);\n                }\n                var video=zuck.internalData.currentVideoElement;\n                if(timer){\n                    clearInterval(timer);\n                }\n                if(storyViewer){\n                    zuck.playVideoItem(storyViewer, storyViewer.querySelectorAll('.active'), undefined);\n                    storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.remove('longPress');\n                    storyViewer===null||storyViewer===void 0 ? void 0:storyViewer.classList.remove('paused');\n                }\n                if(nextTimer){\n                    clearInterval(nextTimer);\n                    nextTimer=undefined;\n                    var navigateItem=function (){\n                        if(!direction){\n                            if((0, utils_1.safeNum)(lastTouchOffset===null||lastTouchOffset===void 0 ? void 0:lastTouchOffset.x) > document.body.offsetWidth / 3||\n                                !zuck.option('previousTap')){\n                                if(zuck.option('rtl')){\n                                    zuck.navigateItem('previous', event);\n                                }\n                                else {\n                                    zuck.navigateItem('next', event);\n                                }\n                            }\n                            else {\n                                if(zuck.option('rtl')){\n                                    zuck.navigateItem('next', event);\n                                }\n                                else {\n                                    zuck.navigateItem('previous', event);\n                                }\n                            }\n                        }\n                    };\n                    var storyViewerViewing=document.querySelector('#zuck-modal .viewing');\n                    if(storyViewerViewing&&video){\n                        if(storyViewerViewing===null||storyViewerViewing===void 0 ? void 0:storyViewerViewing.classList.contains('muted')){\n                            zuck.unmuteVideoItem(video, storyViewerViewing);\n                        }\n                        else {\n                            navigateItem();\n                        }\n                    }\n                    else {\n                        navigateItem();\n                        return false;\n                    }\n                }\n            }\n        };\n        modalSlider===null||modalSlider===void 0 ? void 0:modalSlider.addEventListener('touchstart', touchStart);\n        if(enableMouseEvents){\n            modalSlider===null||modalSlider===void 0 ? void 0:modalSlider.addEventListener('mousedown', touchStart);\n        }\n    };\n    var getStoryMorningGlory=function (what){\n        // my wife told me to stop singing Wonderwall. I SAID MAYBE.\n        var currentStory=zuck.internalData.currentStory;\n        if(currentStory&&what!==''){\n            var element=document.querySelector(\"#\".concat(id, \" [data-id=\\\"\").concat(currentStory, \"\\\"]\"));\n            var foundStory=what==='previous'\n                ? element.previousElementSibling\n:element.nextElementSibling;\n            if(foundStory){\n                var storyId=foundStory.getAttribute('data-id');\n                var storyIndex=zuck.findStoryIndex(storyId);\n                var data=zuck.data[storyIndex]||false;\n                return data;\n            }\n        }\n        return false;\n    };\n    var show=function (storyId){\n        var modalContainer=document.querySelector('#zuck-modal');\n        var callback=function (){\n            var modalContent=document.querySelector('#zuck-modal-content');\n            modalContent.innerHTML=\"<div id=\\\"zuck-modal-slider-\".concat(id, \"\\\" class=\\\"slider\\\"></div>\");\n            if(!modalContent||!storyId){\n                return;\n            }\n            var storyIndex=zuck.findStoryIndex(storyId);\n            var storyData=zuck.data[storyIndex];\n            var currentItem=storyData.currentItem||0;\n            var modalSlider=document.querySelector(\"#zuck-modal-slider-\".concat(id));\n            createStoryTouchEvents(modalSlider);\n            zuck.internalData.currentStory=storyId;\n            storyData.currentItem=currentItem;\n            if(zuck.option('backNative')&&(0, utils_1.hasWindow)()){\n                window.location.hash=\"#!\".concat(id);\n            }\n            var previousItemData=getStoryMorningGlory('previous');\n            if(previousItemData){\n                createStoryViewer(previousItemData, 'previous');\n            }\n            createStoryViewer(storyData, 'viewing', true);\n            var nextItemData=getStoryMorningGlory('next');\n            if(nextItemData){\n                createStoryViewer(nextItemData, 'next');\n            }\n            if(zuck.option('autoFullScreen')){\n                modalContainer===null||modalContainer===void 0 ? void 0:modalContainer.classList.add('fullscreen');\n            }\n            var tryFullScreen=function (){\n                if((modalContainer===null||modalContainer===void 0 ? void 0:modalContainer.classList.contains('fullscreen'))&&\n                    zuck.option('autoFullScreen')&&\n                    document.body.offsetWidth <=1024){\n                    fullScreen(modalContainer);\n                }\n                modalContainer===null||modalContainer===void 0 ? void 0:modalContainer.focus();\n            };\n            var storyViewerWrap=document.querySelector('#zuck-modal .story-viewer');\n            if(zuck.option('openEffect')&&modalContainer){\n                var storyEl=document.querySelector(\"#\".concat(id, \" [data-id=\\\"\").concat(storyId, \"\\\"] .item-preview\"));\n                var pos=(0, utils_1.findPos)(storyEl);\n                modalContainer.style.marginLeft=\"\".concat(pos[0] + (0, utils_1.safeNum)(storyEl===null||storyEl===void 0 ? void 0:storyEl.offsetWidth) / 2, \"px\");\n                modalContainer.style.marginTop=\"\".concat(pos[1] + (0, utils_1.safeNum)(storyEl===null||storyEl===void 0 ? void 0:storyEl.offsetHeight) / 2, \"px\");\n                modalContainer.style.display='block';\n                modalContainer.slideWidth=(storyViewerWrap===null||storyViewerWrap===void 0 ? void 0:storyViewerWrap.offsetWidth)||0;\n                setTimeout(function (){\n                    modalContainer===null||modalContainer===void 0 ? void 0:modalContainer.classList.add('animated');\n                }, 10);\n                setTimeout(function (){\n                    tryFullScreen();\n                }, 300); // because effects\n            }\n            else {\n                if(modalContainer){\n                    modalContainer.style.display='block';\n                    modalContainer.slideWidth=(storyViewerWrap===null||storyViewerWrap===void 0 ? void 0:storyViewerWrap.offsetWidth)||0;\n                }\n                tryFullScreen();\n            }\n            zuck.callback('onView')(storyId);\n        };\n        zuck.callback('onOpen')(storyId, callback);\n    };\n    var next=function (){\n        var callback=function (){\n            var lastStory=zuck.internalData.currentStory;\n            var lastStoryIndex=zuck.findStoryIndex(lastStory);\n            var lastStoryTimelineElement=document.querySelector(\"#\".concat(id, \" [data-id=\\\"\").concat(lastStory, \"\\\"]\"));\n            if(lastStoryTimelineElement){\n                lastStoryTimelineElement===null||lastStoryTimelineElement===void 0 ? void 0:lastStoryTimelineElement.classList.add('seen');\n                zuck.data[lastStoryIndex].seen=true;\n                zuck.internalData.seenItems[lastStory]=true;\n                zuck.saveLocalData('seenItems', zuck.internalData.seenItems);\n                zuck.updateStorySeenPosition();\n            }\n            var stories=document.querySelector('#zuck-modal .story-viewer.next');\n            if(!stories){\n                modalZuckContainer.modal.close();\n            }\n            else {\n                if(zuck.option('rtl')){\n                    moveStoryItem(false);\n                }\n                else {\n                    moveStoryItem(true);\n                }\n            }\n        };\n        zuck.callback('onEnd')(zuck.internalData.currentStory, callback);\n    };\n    var close=function (){\n        var modalContainer=document.querySelector('#zuck-modal');\n        var modalContent=document.querySelector('#zuck-modal-content');\n        var callback=function (){\n            if(zuck.option('backNative')&&(0, utils_1.hasWindow)()){\n                window.location.hash='';\n            }\n            fullScreen(modalContainer, true);\n            if(modalContainer){\n                if(zuck.option('openEffect')){\n                    modalContainer.classList.add('closed');\n                }\n                else {\n                    if(modalContent){\n                        modalContent.innerHTML='';\n                    }\n                    modalContainer.style.display='none';\n                }\n            }\n        };\n        zuck.callback('onClose')(zuck.internalData.currentStory, callback);\n    };\n    modalZuckContainer.modal={\n        show: show,\n        next: next,\n        close: close\n    };\n    return modalZuckContainer.modal;\n};\nexports.modal=modal;\n\n\n//# sourceURL=webpack://Zuck/./src/modal.ts?")},"./src/options.ts":(__unused_webpack_module,exports,__webpack_require__)=>{eval('\nexports.__esModule=true;\nexports.loadOptions=exports.option=exports.optionsDefault=void 0;\nvar utils_1=__webpack_require__(/*! ./utils */ "./src/utils.ts");\nvar optionsDefault=function (option){ return ({\n    rtl: false,\n    skin: \'snapgram\',\n    avatars: true,\n    stories: [],\n    backButton: true,\n    backNative: false,\n    paginationArrows: false,\n    previousTap: true,\n    autoFullScreen: false,\n    openEffect: true,\n    cubeEffect: false,\n    list: false,\n    localStorage: true,\n    callbacks: {\n        onOpen: function (storyId, callback){\n            // on open story viewer\n            callback();\n        },\n        onView: function (storyId, callback){\n            // on view story\n            callback===null||callback===void 0 ? void 0:callback();\n        },\n        onEnd: function (storyId, callback){\n            // on end story\n            callback();\n        },\n        onClose: function (storyId, callback){\n            // on close story viewer\n            callback();\n        },\n        onNextItem: function (storyId, nextStoryId, callback){\n            // on navigate item of story\n            callback();\n        },\n        onNavigateItem: function (storyId, nextStoryId, callback){\n            // use to update state on your reactive framework\n            callback();\n        },\n        onDataUpdate: function (data, callback){\n            // use to update state on your reactive framework\n            callback();\n        }\n    },\n    template: {\n        timelineItem: function (itemData){\n            return "\\n        <div class=\\"story ".concat(itemData[\'seen\']===true ? \'seen\':\'\', "\\">\\n          <a class=\\"item-link\\" ").concat(itemData[\'link\'] ? "href=\\"".concat(itemData[\'link\']||\'\', "\\""):\'\', ">\\n            <span class=\\"item-preview\\">\\n              <img lazy=\\"eager\\" src=\\"").concat(option(\'avatars\')||!itemData[\'currentPreview\']\n                ? itemData[\'photo\']\n:itemData[\'currentPreview\'], "\\" />\\n            </span>\\n            <span class=\\"info\\" itemProp=\\"author\\" itemScope itemType=\\"http://schema.org/Person\\">\\n              <strong class=\\"name\\" itemProp=\\"name\\">").concat(itemData[\'name\'], "</strong>\\n              <span class=\\"time\\">").concat((0, utils_1.timeAgo)(itemData[\'lastUpdated\']||itemData[\'time\'], option(\'language\'))||\'\', "</span>\\n            </span>\\n          </a>\\n\\n          <ul class=\\"items\\"></ul>\\n        </div>");\n        },\n        timelineStoryItem: function (itemData){\n            var reserved=[\n                \'id\',\n                \'seen\',\n                \'src\',\n                \'link\',\n                \'linkText\',\n                \'loop\',\n                \'time\',\n                \'type\',\n                \'length\',\n                \'preview\'\n            ];\n            var attributes="";\n            for (var dataKey in itemData){\n                if(reserved.indexOf(dataKey)===-1){\n                    if(itemData[dataKey]!==undefined&&itemData[dataKey]!==false){\n                        attributes +=" data-".concat(dataKey, "=\\"").concat(itemData[dataKey], "\\"");\n                    }\n                }\n            }\n            reserved.forEach(function (dataKey){\n                if(itemData[dataKey]!==undefined&&itemData[dataKey]!==false){\n                    attributes +=" data-".concat(dataKey, "=\\"").concat(itemData[dataKey], "\\"");\n                }\n            });\n            return "<a href=\\"".concat(itemData[\'src\'], "\\" ").concat(attributes, ">\\n                <img loading=\\"auto\\" src=\\"").concat(itemData[\'preview\'], "\\" />\\n              </a>");\n        },\n        viewerItem: function (storyData, currentStoryItem){\n            return "<div class=\\"story-viewer\\">\\n                <div class=\\"head\\">\\n                  <div class=\\"left\\">\\n                    ".concat(option(\'backButton\') ? \'<a class="back">&lsaquo;</a>\':\'\', "\\n\\n                    <span class=\\"item-preview\\">\\n                      <img lazy=\\"eager\\" class=\\"profilePhoto\\" src=\\"").concat(storyData[\'photo\'], "\\" />\\n                    </span>\\n\\n                    <div class=\\"info\\">\\n                      <strong class=\\"name\\">").concat(storyData[\'name\'], "</strong>\\n                      <span class=\\"time\\">").concat((0, utils_1.timeAgo)(storyData[\'time\'], option(\'language\'))||\'\', "</span>\\n                    </div>\\n                  </div>\\n\\n                  <div class=\\"right\\">\\n                    <span class=\\"time\\">\\n                      ").concat((0, utils_1.timeAgo)(currentStoryItem[\'time\'], option(\'language\'))||\n                \'\', "\\n                    </span>\\n                    <span class=\\"loading\\"></span>\\n                    <a class=\\"close\\" tabIndex=\\"2\\">&times;</a>\\n                  </div>\\n                </div>\\n\\n                <div class=\\"slides-pointers\\">\\n                  <div class=\\"wrap\\"></div>\\n                </div>\\n\\n                ").concat(option(\'paginationArrows\')\n                ? "\\n                    <div class=\\"slides-pagination\\">\\n                      <span class=\\"previous\\">&lsaquo;</span>\\n                      <span class=\\"next\\">&rsaquo;</span>\\n                    </div>"\n:\'\', "\\n              </div>");\n        },\n        viewerItemPointerProgress: function (style){\n            return "<span class=\\"progress\\" style=\\"".concat(style, "\\"></span>");\n        },\n        viewerItemPointer: function (index, currentIndex, item){\n            return "<span\\n                class=\\"\\n                  ".concat(currentIndex===index ? \'active\':\'\', "\\n                  ").concat(item[\'seen\']===true ? \'seen\':\'\', "\\n                \\"\\n                data-index=\\"").concat(index, "\\" data-item-id=\\"").concat(item[\'id\'], "\\">\\n                  ").concat(option(\'template\')[\'viewerItemPointerProgress\']("animation-duration:".concat((0, utils_1.safeNum)(item[\'length\']) ? item[\'length\']:\'3\', "s")), "\\n              </span>");\n        },\n        viewerItemBody: function (index, currentIndex, item){\n            return "<div\\n                class=\\"\\n                  item\\n                  ".concat(item[\'seen\']===true ? \'seen\':\'\', "\\n                  ").concat(currentIndex===index ? \'active\':\'\', "\\n                \\"\\n                data-time=\\"").concat(item[\'time\'], "\\"\\n                data-type=\\"").concat(item[\'type\'], "\\"\\n                data-index=\\"").concat(index, "\\"\\n                data-item-id=\\"").concat(item[\'id\'], "\\">\\n                ").concat(item[\'type\']===\'video\'\n                ? "<video class=\\"media\\" data-length=\\"".concat(item.length, "\\" ").concat(item.loop ? \'loop\':\'\', " muted webkit-playsinline playsinline preload=\\"auto\\" src=\\"").concat(item[\'src\'], "\\" ").concat(item[\'type\'], "></video>\\n                    <b class=\\"tip muted\\">").concat(option(\'language\')[\'unmute\'], "</b>")\n:"<img loading=\\"auto\\" class=\\"media\\" src=\\"".concat(item[\'src\'], "\\" ").concat(item[\'type\'], " />\\n                "), "\\n\\n                ").concat(item[\'link\']\n                ? "<a class=\\"tip link\\" href=\\"".concat(item[\'link\'], "\\" rel=\\"noopener\\" target=\\"_blank\\">\\n                        ").concat(item[\'linkText\']||option(\'language\')[\'visitLink\'], "\\n                      </a>")\n:\'\', "\\n              </div>");\n        }\n    },\n    language: {\n        unmute: \'Touch to unmute\',\n        keyboardTip: \'Press space to see next\',\n        visitLink: \'Visit link\',\n        time: {\n            ago: \'ago\',\n            hour: \'hour ago\',\n            hours: \'hours ago\',\n            minute: \'minute ago\',\n            minutes: \'minutes ago\',\n            fromnow: \'from now\',\n            seconds: \'seconds ago\',\n            yesterday: \'yesterday\',\n            tomorrow: \'tomorrow\',\n            days: \'days ago\'\n        }\n    }\n});};\nexports.optionsDefault=optionsDefault;\nvar option=function (options, _name){\n    var self=function (name){\n        return typeof (options===null||options===void 0 ? void 0:options[name])!==\'undefined\'\n            ? options===null||options===void 0 ? void 0:options[name]\n:(0, exports.optionsDefault)(self)[name];\n    };\n    return self(_name);\n};\nexports.option=option;\nvar loadOptions=function (options){\n    return {\n        option: function (name){\n            return (0, exports.option)(options, name);\n        },\n        callback: function (name){\n            var customOpts=(0, exports.option)(options, \'callbacks\');\n            return typeof customOpts[name]!==undefined\n                ? customOpts[name]\n:(0, exports.option)(undefined, \'callbacks\')[name];\n        },\n        template: function (name){\n            var customOpts=(0, exports.option)(options, \'template\');\n            return typeof customOpts[name]!==undefined\n                ? customOpts[name]\n:(0, exports.option)(undefined, \'template\')[name];\n        },\n        language: function (name){\n            var customOpts=(0, exports.option)(options, \'language\');\n            return typeof customOpts[name]!==undefined\n                ? customOpts[name]\n:(0, exports.option)(undefined, \'language\')[name];\n        }\n    };\n};\nexports.loadOptions=loadOptions;\n\n\n//# sourceURL=webpack://Zuck/./src/options.ts?')},"./src/utils.ts":(__unused_webpack_module,exports)=>{eval("\nexports.__esModule=true;\nexports.timeAgo=exports.findPos=exports.generateId=exports.prepend=exports.onTransitionEnd=exports.onAnimationEnd=exports.safeNum=exports.hasWindow=void 0;\nvar hasWindow=function (){\n    return typeof window!=='undefined';\n};\nexports.hasWindow=hasWindow;\nvar safeNum=function (num){\n    return num ? Number(num):0;\n};\nexports.safeNum=safeNum;\nvar onAnimationEnd=function (el, func){\n    el.addEventListener('animationend', func);\n};\nexports.onAnimationEnd=onAnimationEnd;\nvar onTransitionEnd=function (el, func){\n    if(!el.transitionEndEvent){\n        el.transitionEndEvent=true;\n        el.addEventListener('transitionend', func);\n    }\n};\nexports.onTransitionEnd=onTransitionEnd;\nvar prepend=function (parent, child){\n    if(!child||!parent){\n        return;\n    }\n    if(parent===null||parent===void 0 ? void 0:parent.firstChild){\n        parent.insertBefore(child, parent===null||parent===void 0 ? void 0:parent.firstChild);\n    }\n    else {\n        parent.appendChild(child);\n    }\n};\nexports.prepend=prepend;\nvar generateId=function (){\n    return 'stories-' + Math.random().toString(36).substr(2, 9);\n};\nexports.generateId=generateId;\nvar findPos=function (obj, offsetY, offsetX, stop){\n    var curleft=0;\n    var curtop=0;\n    if(obj){\n        if(obj.offsetParent){\n            do {\n                curleft +=obj.offsetLeft;\n                curtop +=obj.offsetTop;\n                if(obj===stop){\n                    break;\n                }\n            } while ((obj=obj.offsetParent));\n        }\n        if(offsetY){\n            curtop=curtop - offsetY;\n        }\n        if(offsetX){\n            curleft=curleft - offsetX;\n        }\n    }\n    return [curleft, curtop];\n};\nexports.findPos=findPos;\nvar timeAgo=function (time, languageObject){\n    var language=(languageObject===null||languageObject===void 0 ? void 0:languageObject.time)||undefined;\n    var timeNumber=time instanceof Date ? time.getTime():(0, exports.safeNum)(time) * 1000;\n    var dateObj=new Date(timeNumber);\n    var dateStr=dateObj.getTime();\n    var seconds=(new Date().getTime() - dateStr) / 1000;\n    var formats=[\n        [60, \" \".concat((language===null||language===void 0 ? void 0:language.seconds)||''), 1],\n        [120, \"1 \".concat((language===null||language===void 0 ? void 0:language.minute)||''), ''],\n        [3600, \" \".concat((language===null||language===void 0 ? void 0:language.minutes)||''), 60],\n        [7200, \"1 \".concat((language===null||language===void 0 ? void 0:language.hour)||''), ''],\n        [86400, \" \".concat((language===null||language===void 0 ? void 0:language.hours)||''), 3600],\n        [172800, \" \".concat((language===null||language===void 0 ? void 0:language.yesterday)||''), ''],\n        [604800, \" \".concat((language===null||language===void 0 ? void 0:language.days)||''), 86400]\n    ];\n    var currentFormat=1;\n    if(seconds < 0){\n        seconds=Math.abs(seconds);\n        currentFormat=2;\n    }\n    var result=false;\n    formats.forEach(function (format){\n        var formatKey=format[0];\n        if(seconds < formatKey&&!result){\n            if(typeof format[2]==='string'){\n                result=format[currentFormat];\n            }\n            else if(format!==null){\n                result=Math.floor(seconds / format[2]) + format[1];\n            }\n        }\n    });\n    if(!result){\n        var day=dateObj.getDate();\n        var month=dateObj.getMonth();\n        var year=dateObj.getFullYear();\n        return \"\".concat(day, \"/\").concat(month + 1, \"/\").concat(year);\n    }\n    else {\n        return result;\n    }\n};\nexports.timeAgo=timeAgo;\n\n\n//# sourceURL=webpack://Zuck/./src/utils.ts?")}},__webpack_module_cache__={};function __nested_webpack_require_66663__(t){var n=__webpack_module_cache__[t];if(void 0!==n)return n.exports;var e=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t](e,e.exports,__nested_webpack_require_66663__),e.exports}var __nested_webpack_exports__=__nested_webpack_require_66663__("./src/index.ts");this.y=__nested_webpack_exports__.default})()}},__webpack_module_cache__={};function __webpack_require__(t){var n=__webpack_module_cache__[t];if(void 0!==n)return n.exports;var e=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t].call(e.exports,e,e.exports,__webpack_require__),e.exports}(()=>{"use strict";var t=__webpack_require__(265);!function(n){var e='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z"/></svg>',o='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"/></svg>';function i(){var t=n("#zuck-modal .wpz-insta-mute-btn");t.length&&(n("#zuck-modal .story-viewer.viewing .slides .item.active").find("video").length>0?(t.show(),t.html(v?e:o),t.attr("aria-label",v?"Unmute":"Mute")):t.hide())}function a(){n("#zuck-modal video").each(function(){this.muted=v,v||(this.volume=1)}),n("#zuck-modal .story-viewer").removeClass("muted"),i()}function r(t){t&&(t.preventDefault(),t.stopPropagation()),v=!v,a()}!function(){var t="wpz-insta-stories-modal-fix";if(!document.getElementById(t)){var n=document.createElement("style");if(n.id=t,n.textContent="\n\t\t\t/* Body scroll lock when stories modal is open */\n\t\t\tbody.wpz-insta-stories-open {\n\t\t\t\toverflow: hidden !important;\n\t\t\t\tposition: fixed !important;\n\t\t\t\twidth: 100% !important;\n\t\t\t\theight: 100% !important;\n\t\t\t}\n\n\t\t\t/* Full-screen overlay background */\n\t\t\t.wpz-insta-stories-overlay {\n\t\t\t\tposition: fixed !important;\n\t\t\t\ttop: 0 !important;\n\t\t\t\tleft: 0 !important;\n\t\t\t\tright: 0 !important;\n\t\t\t\tbottom: 0 !important;\n\t\t\t\twidth: 100% !important;\n\t\t\t\theight: 100% !important;\n\t\t\t\tbackground: #000 !important;\n\t\t\t\tz-index: 99999 !important;\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t\t.wpz-insta-stories-overlay.active {\n\t\t\t\tdisplay: block !important;\n\t\t\t}\n\n\t\t\t/* Fix iOS Safari viewport height issue */\n\t\t\t#zuck-modal {\n\t\t\t\tposition: fixed !important;\n\t\t\t\ttop: 0 !important;\n\t\t\t\tleft: 0 !important;\n\t\t\t\tright: 0 !important;\n\t\t\t\tbottom: 0 !important;\n\t\t\t\twidth: 100% !important;\n\t\t\t\theight: 100% !important;\n\t\t\t\theight: 100dvh !important;\n\t\t\t\tmin-height: -webkit-fill-available !important;\n\t\t\t\tz-index: 100000 !important;\n\t\t\t\tbackground: #000 !important;\n\t\t\t}\n\t\t\t#zuck-modal-content,\n\t\t\t#zuck-modal-content .story-viewer,\n\t\t\t#zuck-modal-content .story-viewer > .slides,\n\t\t\t#zuck-modal-content .story-viewer > .slides > * {\n\t\t\t\theight: 100% !important;\n\t\t\t\theight: 100dvh !important;\n\t\t\t\tmin-height: -webkit-fill-available !important;\n\t\t\t}\n\t\t\t/* Ensure the slider also uses full height */\n\t\t\t#zuck-modal .slider {\n\t\t\t\theight: 100% !important;\n\t\t\t\theight: 100dvh !important;\n\t\t\t\tmin-height: -webkit-fill-available !important;\n\t\t\t}\n\t\t\t#zuck-modal .slider > * {\n\t\t\t\theight: 100% !important;\n\t\t\t\theight: 100dvh !important;\n\t\t\t\tmin-height: -webkit-fill-available !important;\n\t\t\t}\n\n\t\t\t/* Custom mute/unmute button styling */\n\t\t\t#zuck-modal .story-viewer .head .right .wpz-insta-mute-btn {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: flex-start;\n\t\t\t\tjustify-content: center;\n\t\t\t\twidth: 42px;\n\t\t\t\theight: 42px;\n\t\t\t\tbackground: none;\n\t\t\t\tborder: none;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tcursor: pointer;\n\t\t\t\tpadding: 0;\n\t\t\t\tmargin-right: 8px;\n\t\t\t\tvertical-align: middle;\n\t\t\t\ttransition: background 0.2s ease;\n\t\t\t}\n\t\t\t#zuck-modal .story-viewer .head .right .wpz-insta-mute-btn:hover {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.5);\n\t\t\t}\n\t\t\t#zuck-modal .story-viewer .head .right .wpz-insta-mute-btn svg {\n\t\t\t\twidth: 30px;\n\t\t\t\theight: 30px;\n\t\t\t\tfill: #fff;\n\t\t\t}\n\t\t\t/* Hide the default Zuck.js mute tip since we have our own button */\n\t\t\t#zuck-modal .story-viewer .tip.muted {\n\t\t\t\tdisplay: none !important;\n\t\t\t}\n\t\t",document.head.appendChild(n),!document.getElementById("wpz-insta-stories-overlay")){var e=document.createElement("div");e.id="wpz-insta-stories-overlay",e.className="wpz-insta-stories-overlay",document.body.appendChild(e)}}}();var s=new Set,l=null;function d(t){if(!t.wpzMuteEnforced){t.wpzMuteEnforced=!0;var n=Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype,"muted");Object.defineProperty(t,"muted",{get:function(){return n.get.call(this)},set:function(t){v?n.set.call(this,!0):n.set.call(this,t)},configurable:!0});var e=Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype,"volume");Object.defineProperty(t,"volume",{get:function(){return e.get.call(this)},set:function(t){v?e.set.call(this,0):e.set.call(this,t)},configurable:!0}),n.set.call(t,v),e.set.call(t,v?0:1)}}var c=null,u=0,m=!1,v=!0;function p(){-1===window.location.search.indexOf("wpz-insta-widget-preview")&&n(".wpz-insta-stories").each(function(){var m,p,f,y,w,g,k,h,I,_,S,b,x,z=n(this),E=z.get(0);if(!s.has(E)){var V=z.attr("data-stories");if(V){var D;try{D=JSON.parse(V)}catch(t){return void console.error("Instagram Stories: Failed to parse stories data",t)}if(D&&D.items&&0!==D.items.length){s.add(E);var C=++u,L=[{id:"wpz-feed-"+C+"-"+(D.id||"story"),photo:D.photo||"",name:D.name||"",link:D.link||"",lastUpdated:D.lastUpdated||Math.floor(Date.now()/1e3),seen:!1,items:D.items.map(function(t,n){return{id:t.id||"item-"+n,type:t.type||"photo",src:t.src||"",preview:t.preview||t.src||"",length:t.length||("video"===t.type?0:5),link:t.link||"",linkText:t.linkText||"View on Instagram",time:t.time||Math.floor(Date.now()/1e3),seen:!1}})}],q="wpz-insta-zuck-"+C,T=n("<div>").attr("id",q).addClass("wpz-insta-zuck-container").css({position:"absolute",left:"-9999px",top:"-9999px",width:"1px",height:"1px",overflow:"hidden"});n("body").append(T);var O=new t.y(T.get(0),{skin:"snapgram",avatars:!0,list:!1,cubeEffect:!0,autoFullScreen:!1,backButton:!0,backNative:!1,previousTap:!0,localStorage:!1,stories:L,language:{unmute:"undefined"!=typeof wpzInstaStories&&(null===(m=wpzInstaStories)||void 0===m||null===(m=m.i18n)||void 0===m?void 0:m.unmute)||"Touch to unmute",keyboardTip:"undefined"!=typeof wpzInstaStories&&(null===(p=wpzInstaStories)||void 0===p||null===(p=p.i18n)||void 0===p?void 0:p.keyboardTip)||"Press space to see next",visitLink:"undefined"!=typeof wpzInstaStories&&(null===(f=wpzInstaStories)||void 0===f||null===(f=f.i18n)||void 0===f?void 0:f.visitLink)||"Visit link",time:{ago:"undefined"!=typeof wpzInstaStories&&(null===(y=wpzInstaStories)||void 0===y||null===(y=y.i18n)||void 0===y?void 0:y.ago)||"ago",hour:"undefined"!=typeof wpzInstaStories&&(null===(w=wpzInstaStories)||void 0===w||null===(w=w.i18n)||void 0===w?void 0:w.hour)||"hour",hours:"undefined"!=typeof wpzInstaStories&&(null===(g=wpzInstaStories)||void 0===g||null===(g=g.i18n)||void 0===g?void 0:g.hours)||"hours",minute:"undefined"!=typeof wpzInstaStories&&(null===(k=wpzInstaStories)||void 0===k||null===(k=k.i18n)||void 0===k?void 0:k.minute)||"minute",minutes:"undefined"!=typeof wpzInstaStories&&(null===(h=wpzInstaStories)||void 0===h||null===(h=h.i18n)||void 0===h?void 0:h.minutes)||"minutes",fromnow:"undefined"!=typeof wpzInstaStories&&(null===(I=wpzInstaStories)||void 0===I||null===(I=I.i18n)||void 0===I?void 0:I.fromnow)||"from now",seconds:"undefined"!=typeof wpzInstaStories&&(null===(_=wpzInstaStories)||void 0===_||null===(_=_.i18n)||void 0===_?void 0:_.seconds)||"seconds",yesterday:"undefined"!=typeof wpzInstaStories&&(null===(S=wpzInstaStories)||void 0===S||null===(S=S.i18n)||void 0===S?void 0:S.yesterday)||"yesterday",tomorrow:"undefined"!=typeof wpzInstaStories&&(null===(b=wpzInstaStories)||void 0===b||null===(b=b.i18n)||void 0===b?void 0:b.tomorrow)||"tomorrow",days:"undefined"!=typeof wpzInstaStories&&(null===(x=wpzInstaStories)||void 0===x||null===(x=x.i18n)||void 0===x?void 0:x.days)||"days"}},callbacks:{onOpen:function(t,s){var u;if((u=document.getElementById("wpz-insta-stories-overlay"))&&u.classList.add("active"),document.body.classList.add("wpz-insta-stories-open"),document.body.dataset.scrollY=window.scrollY,c&&c!==O){var m=n("#zuck-modal-content");m.length&&m.html("")}c=O;var p=O.findStoryIndex(t);-1!==p&&O.data[p]&&(O.data[p].currentItem=0,O.data[p].seen=!1,O.data[p].items&&O.data[p].items.forEach(function(t){t.seen=!1})),s(),function(){if(!l){l=new MutationObserver(function(t){t.forEach(function(t){if("attributes"===t.type&&"class"===t.attributeName){var n=t.target;n.classList&&n.classList.contains("muted")&&n.classList.contains("story-viewer")&&n.classList.remove("muted")}"childList"===t.type&&t.addedNodes.length>0&&t.addedNodes.forEach(function(t){t.nodeType===Node.ELEMENT_NODE&&("VIDEO"===t.tagName&&d(t),(t.querySelectorAll?t.querySelectorAll("video"):[]).forEach(function(t){d(t)}))})})});var t=document.getElementById("zuck-modal");t&&(l.observe(t,{attributes:!0,attributeFilter:["class"],childList:!0,subtree:!0}),t.querySelectorAll("video").forEach(d))}}(),setTimeout(function(){!function(){var t=n("#zuck-modal");if(t.length)if(t.find(".wpz-insta-mute-btn").length)i();else{var a=t.find(".story-viewer .head .right");if(a.length){var s=a.find(".close"),l=n("<button>").addClass("wpz-insta-mute-btn").attr("type","button").attr("aria-label",v?"Unmute":"Mute").html(v?e:o).on("click",r);s.length?s.before(l):a.append(l)}}}(),a()},100)},onView:function(t){setTimeout(a,50)},onEnd:function(t,n){n()},onClose:function(t,n){l&&(l.disconnect(),l=null),function(){var t=document.getElementById("wpz-insta-stories-overlay");t&&t.classList.remove("active"),document.body.classList.remove("wpz-insta-stories-open");var n=document.body.dataset.scrollY;n&&window.scrollTo(0,parseInt(n,10))}(),c=null;var e=O.findStoryIndex(t);-1!==e&&O.data[e]&&(O.data[e].currentItem=0,O.data[e].seen=!1,O.data[e].items&&O.data[e].items.forEach(function(t){t.seen=!1})),n()},onNavigateItem:function(t,n,e){e(),setTimeout(a,50)}}});z.data("zuck",O),z.data("zuck-container-id",q),z.on("click.wpzInstaStories",function(t){t.preventDefault(),t.stopPropagation();var e=n("#"+q).find(".story > a");e.length&&e.get(0).click()}),z.on("keydown.wpzInstaStories",function(t){"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),n(this).trigger("click"))})}}}})}n(document).on("keydown.wpzInstaStories",function(t){n("#zuck-modal").is(":visible")&&c&&("ArrowRight"!==t.key&&"ArrowDown"!==t.key||(t.preventDefault(),c.navigateItem("next",t)),"ArrowLeft"!==t.key&&"ArrowUp"!==t.key||(t.preventDefault(),c.navigateItem("previous",t)))}),function(){if(!m){m=!0;var t=0,e=0,o=0,i=!1;document.addEventListener("touchstart",function(a){if(n("#zuck-modal").is(":visible")&&n(a.target).closest(".story-viewer").length){var r=a.touches[0];t=r.clientX,e=r.clientY,o=e,i=!0}},{passive:!0}),document.addEventListener("touchmove",function(a){if(i)if(n("#zuck-modal").is(":visible")){var r=a.touches[0],s=Math.abs(r.clientX-t),l=r.clientY-e;o=r.clientY,s>30&&s>Math.abs(l)&&(a.preventDefault(),a.stopPropagation())}else i=!1},{passive:!1}),document.addEventListener("touchend",function(a){if(i){var r=n("#zuck-modal");if(r.is(":visible")){var s=o-e,l=Math.abs(a.changedTouches[0].clientX-t);if(i=!1,s>100&&s>l){var d=r.find(".close");d.length&&d.get(0).click()}}else i=!1}},{passive:!0})}}(),n(document).ready(p),n(window).on("load",p),window.wpzInstaInitStories=p}(jQuery)})()})();
(function (global, factory){
typeof exports==='object'&&typeof module!=='undefined' ? module.exports=factory(require('global/window'), require('global/document')) :
typeof define==='function'&&define.amd ? define(['global/window', 'global/document'], factory) :
(global=global||self, global.videojs=factory(global.window, global.document));
}(this, function (window$1, document){ 'use strict';
window$1=window$1&&window$1.hasOwnProperty('default') ? window$1['default']:window$1;
document=document&&document.hasOwnProperty('default') ? document['default']:document;
var version="7.7.4";
var history=[];
var LogByTypeFactory=function LogByTypeFactory(name, log){
return function (type, level, args){
var lvl=log.levels[level];
var lvlRegExp=new RegExp("^(" + lvl + ")$");
if(type!=='log'){
args.unshift(type.toUpperCase() + ':');
}
args.unshift(name + ':');
if(history){
history.push([].concat(args));
var splice=history.length - 1000;
history.splice(0, splice > 0 ? splice:0);
}
if(!window$1.console){
return;
}
var fn=window$1.console[type];
if(!fn&&type==='debug'){
fn=window$1.console.info||window$1.console.log;
}
if(!fn||!lvl||!lvlRegExp.test(type)){
return;
}
fn[Array.isArray(args) ? 'apply':'call'](window$1.console, args);
};};
function createLogger(name){
var level='info';
var logByType;
var log=function log(){
for (var _len=arguments.length, args=new Array(_len), _key=0; _key < _len; _key++){
args[_key]=arguments[_key];
}
logByType('log', level, args);
};
logByType=LogByTypeFactory(name, log);
log.createLogger=function (subname){
return createLogger(name + ': ' + subname);
};
log.levels={
all: 'debug|log|warn|error',
off: '',
debug: 'debug|log|warn|error',
info: 'log|warn|error',
warn: 'warn|error',
error: 'error',
DEFAULT: level
};
log.level=function (lvl){
if(typeof lvl==='string'){
if(!log.levels.hasOwnProperty(lvl)){
throw new Error("\"" + lvl + "\" in not a valid log level");
}
level=lvl;
}
return level;
};
log.history=function (){
return history ? [].concat(history):[];
};
log.history.filter=function (fname){
return (history||[]).filter(function (historyItem){
return new RegExp(".*" + fname + ".*").test(historyItem[0]);
});
};
log.history.clear=function (){
if(history){
history.length=0;
}};
log.history.disable=function (){
if(history!==null){
history.length=0;
history=null;
}};
log.history.enable=function (){
if(history===null){
history=[];
}};
log.error=function (){
for (var _len2=arguments.length, args=new Array(_len2), _key2=0; _key2 < _len2; _key2++){
args[_key2]=arguments[_key2];
}
return logByType('error', level, args);
};
log.warn=function (){
for (var _len3=arguments.length, args=new Array(_len3), _key3=0; _key3 < _len3; _key3++){
args[_key3]=arguments[_key3];
}
return logByType('warn', level, args);
};
log.debug=function (){
for (var _len4=arguments.length, args=new Array(_len4), _key4=0; _key4 < _len4; _key4++){
args[_key4]=arguments[_key4];
}
return logByType('debug', level, args);
};
return log;
}
var log=createLogger('VIDEOJS');
var createLogger$1=log.createLogger;
function createCommonjsModule(fn, module){
return module={ exports: {}}, fn(module, module.exports), module.exports;
}
var _extends_1=createCommonjsModule(function (module){
function _extends(){
module.exports=_extends=Object.assign||function (target){
for (var i=1; i < arguments.length; i++){
var source=arguments[i];
for (var key in source){
if(Object.prototype.hasOwnProperty.call(source, key)){
target[key]=source[key];
}}
}
return target;
};
return _extends.apply(this, arguments);
}
module.exports=_extends;
});
var toString=Object.prototype.toString;
var keys=function keys(object){
return isObject(object) ? Object.keys(object):[];
};
function each(object, fn){
keys(object).forEach(function (key){
return fn(object[key], key);
});
}
function reduce(object, fn, initial){
if(initial===void 0){
initial=0;
}
return keys(object).reduce(function (accum, key){
return fn(accum, object[key], key);
}, initial);
}
function assign(target){
for (var _len=arguments.length, sources=new Array(_len > 1 ? _len - 1:0), _key=1; _key < _len; _key++){
sources[_key - 1]=arguments[_key];
}
if(Object.assign){
return _extends_1.apply(void 0, [target].concat(sources));
}
sources.forEach(function (source){
if(!source){
return;
}
each(source, function (value, key){
target[key]=value;
});
});
return target;
}
function isObject(value){
return !!value&&typeof value==='object';
}
function isPlain(value){
return isObject(value)&&toString.call(value)==='[object Object]'&&value.constructor===Object;
}
function computedStyle(el, prop){
if(!el||!prop){
return '';
}
if(typeof window$1.getComputedStyle==='function'){
var computedStyleValue=window$1.getComputedStyle(el);
return computedStyleValue ? computedStyleValue.getPropertyValue(prop)||computedStyleValue[prop]:'';
}
return '';
}
function isNonBlankString(str){
return typeof str==='string'&&Boolean(str.trim());
}
function throwIfWhitespace(str){
if(str.indexOf(' ') >=0){
throw new Error('class has illegal whitespace characters');
}}
function classRegExp(className){
return new RegExp('(^|\\s)' + className + '($|\\s)');
}
function isReal(){
return document===window$1.document;
}
function isEl(value){
return isObject(value)&&value.nodeType===1;
}
function isInFrame(){
try {
return window$1.parent!==window$1.self;
} catch (x){
return true;
}}
function createQuerier(method){
return function (selector, context){
if(!isNonBlankString(selector)){
return document[method](null);
}
if(isNonBlankString(context)){
context=document.querySelector(context);
}
var ctx=isEl(context) ? context:document;
return ctx[method]&&ctx[method](selector);
};}
function createEl(tagName, properties, attributes, content){
if(tagName===void 0){
tagName='div';
}
if(properties===void 0){
properties={};}
if(attributes===void 0){
attributes={};}
var el=document.createElement(tagName);
Object.getOwnPropertyNames(properties).forEach(function (propName){
var val=properties[propName];
if(propName.indexOf('aria-')!==-1||propName==='role'||propName==='type'){
log.warn('Setting attributes in the second argument of createEl()\n' + 'has been deprecated. Use the third argument instead.\n' + ("createEl(type, properties, attributes). Attempting to set " + propName + " to " + val + "."));
el.setAttribute(propName, val);
}else if(propName==='textContent'){
textContent(el, val);
}else if(el[propName]!==val){
el[propName]=val;
}});
Object.getOwnPropertyNames(attributes).forEach(function (attrName){
el.setAttribute(attrName, attributes[attrName]);
});
if(content){
appendContent(el, content);
}
return el;
}
function textContent(el, text){
if(typeof el.textContent==='undefined'){
el.innerText=text;
}else{
el.textContent=text;
}
return el;
}
function prependTo(child, parent){
if(parent.firstChild){
parent.insertBefore(child, parent.firstChild);
}else{
parent.appendChild(child);
}}
function hasClass(element, classToCheck){
throwIfWhitespace(classToCheck);
if(element.classList){
return element.classList.contains(classToCheck);
}
return classRegExp(classToCheck).test(element.className);
}
function addClass(element, classToAdd){
if(element.classList){
element.classList.add(classToAdd);
}else if(!hasClass(element, classToAdd)){
element.className=(element.className + ' ' + classToAdd).trim();
}
return element;
}
function removeClass(element, classToRemove){
if(element.classList){
element.classList.remove(classToRemove);
}else{
throwIfWhitespace(classToRemove);
element.className=element.className.split(/\s+/).filter(function (c){
return c!==classToRemove;
}).join(' ');
}
return element;
}
function toggleClass(element, classToToggle, predicate){
var has=hasClass(element, classToToggle);
if(typeof predicate==='function'){
predicate=predicate(element, classToToggle);
}
if(typeof predicate!=='boolean'){
predicate = !has;
}
if(predicate===has){
return;
}
if(predicate){
addClass(element, classToToggle);
}else{
removeClass(element, classToToggle);
}
return element;
}
function setAttributes(el, attributes){
Object.getOwnPropertyNames(attributes).forEach(function (attrName){
var attrValue=attributes[attrName];
if(attrValue===null||typeof attrValue==='undefined'||attrValue===false){
el.removeAttribute(attrName);
}else{
el.setAttribute(attrName, attrValue===true ? '':attrValue);
}});
}
function getAttributes(tag){
var obj={};
var knownBooleans=',' + 'autoplay,controls,playsinline,loop,muted,default,defaultMuted' + ',';
if(tag&&tag.attributes&&tag.attributes.length > 0){
var attrs=tag.attributes;
for (var i=attrs.length - 1; i >=0; i--){
var attrName=attrs[i].name;
var attrVal=attrs[i].value;
if(typeof tag[attrName]==='boolean'||knownBooleans.indexOf(',' + attrName + ',')!==-1){
attrVal=attrVal!==null ? true:false;
}
obj[attrName]=attrVal;
}}
return obj;
}
function getAttribute(el, attribute){
return el.getAttribute(attribute);
}
function setAttribute(el, attribute, value){
el.setAttribute(attribute, value);
}
function removeAttribute(el, attribute){
el.removeAttribute(attribute);
}
function blockTextSelection(){
document.body.focus();
document.onselectstart=function (){
return false;
};}
function unblockTextSelection(){
document.onselectstart=function (){
return true;
};}
function getBoundingClientRect(el){
if(el&&el.getBoundingClientRect&&el.parentNode){
var rect=el.getBoundingClientRect();
var result={};
['bottom', 'height', 'left', 'right', 'top', 'width'].forEach(function (k){
if(rect[k]!==undefined){
result[k]=rect[k];
}});
if(!result.height){
result.height=parseFloat(computedStyle(el, 'height'));
}
if(!result.width){
result.width=parseFloat(computedStyle(el, 'width'));
}
return result;
}}
function findPosition(el){
var box;
if(el.getBoundingClientRect&&el.parentNode){
box=el.getBoundingClientRect();
}
if(!box){
return {
left: 0,
top: 0
};}
var docEl=document.documentElement;
var body=document.body;
var clientLeft=docEl.clientLeft||body.clientLeft||0;
var scrollLeft=window$1.pageXOffset||body.scrollLeft;
var left=box.left + scrollLeft - clientLeft;
var clientTop=docEl.clientTop||body.clientTop||0;
var scrollTop=window$1.pageYOffset||body.scrollTop;
var top=box.top + scrollTop - clientTop;
return {
left: Math.round(left),
top: Math.round(top)
};}
function getPointerPosition(el, event){
var position={};
var box=findPosition(el);
var boxW=el.offsetWidth;
var boxH=el.offsetHeight;
var boxY=box.top;
var boxX=box.left;
var pageY=event.pageY;
var pageX=event.pageX;
if(event.changedTouches){
pageX=event.changedTouches[0].pageX;
pageY=event.changedTouches[0].pageY;
}
position.y=Math.max(0, Math.min(1, (boxY - pageY + boxH) / boxH));
position.x=Math.max(0, Math.min(1, (pageX - boxX) / boxW));
return position;
}
function isTextNode(value){
return isObject(value)&&value.nodeType===3;
}
function emptyEl(el){
while (el.firstChild){
el.removeChild(el.firstChild);
}
return el;
}
function normalizeContent(content){
if(typeof content==='function'){
content=content();
}
return (Array.isArray(content) ? content:[content]).map(function (value){
if(typeof value==='function'){
value=value();
}
if(isEl(value)||isTextNode(value)){
return value;
}
if(typeof value==='string'&&/\S/.test(value)){
return document.createTextNode(value);
}}).filter(function (value){
return value;
});
}
function appendContent(el, content){
normalizeContent(content).forEach(function (node){
return el.appendChild(node);
});
return el;
}
function insertContent(el, content){
return appendContent(emptyEl(el), content);
}
function isSingleLeftClick(event){
if(event.button===undefined&&event.buttons===undefined){
return true;
}
if(event.button===0&&event.buttons===undefined){
return true;
}
if(event.type==='mouseup'&&event.button===0&&event.buttons===0){
return true;
}
if(event.button!==0||event.buttons!==1){
return false;
}
return true;
}
var $=createQuerier('querySelector');
var $$=createQuerier('querySelectorAll');
var Dom=Object.freeze({
isReal: isReal,
isEl: isEl,
isInFrame: isInFrame,
createEl: createEl,
textContent: textContent,
prependTo: prependTo,
hasClass: hasClass,
addClass: addClass,
removeClass: removeClass,
toggleClass: toggleClass,
setAttributes: setAttributes,
getAttributes: getAttributes,
getAttribute: getAttribute,
setAttribute: setAttribute,
removeAttribute: removeAttribute,
blockTextSelection: blockTextSelection,
unblockTextSelection: unblockTextSelection,
getBoundingClientRect: getBoundingClientRect,
findPosition: findPosition,
getPointerPosition: getPointerPosition,
isTextNode: isTextNode,
emptyEl: emptyEl,
normalizeContent: normalizeContent,
appendContent: appendContent,
insertContent: insertContent,
isSingleLeftClick: isSingleLeftClick,
$: $,
$$: $$
});
var _windowLoaded=false;
var videojs;
var autoSetup=function autoSetup(){
if(!isReal()||videojs.options.autoSetup===false){
return;
}
var vids=Array.prototype.slice.call(document.getElementsByTagName('video'));
var audios=Array.prototype.slice.call(document.getElementsByTagName('audio'));
var divs=Array.prototype.slice.call(document.getElementsByTagName('video-js'));
var mediaEls=vids.concat(audios, divs);
if(mediaEls&&mediaEls.length > 0){
for (var i=0, e=mediaEls.length; i < e; i++){
var mediaEl=mediaEls[i];
if(mediaEl&&mediaEl.getAttribute){
if(mediaEl.player===undefined){
var options=mediaEl.getAttribute('data-setup');
if(options!==null){
videojs(mediaEl);
}}
}else{
autoSetupTimeout(1);
break;
}}
}else if(!_windowLoaded){
autoSetupTimeout(1);
}};
function autoSetupTimeout(wait, vjs){
if(vjs){
videojs=vjs;
}
window$1.setTimeout(autoSetup, wait);
}
function setWindowLoaded(){
_windowLoaded=true;
window$1.removeEventListener('load', setWindowLoaded);
}
if(isReal()){
if(document.readyState==='complete'){
setWindowLoaded();
}else{
window$1.addEventListener('load', setWindowLoaded);
}}
var createStyleElement=function createStyleElement(className){
var style=document.createElement('style');
style.className=className;
return style;
};
var setTextContent=function setTextContent(el, content){
if(el.styleSheet){
el.styleSheet.cssText=content;
}else{
el.textContent=content;
}};
var _initialGuid=3;
var _guid=_initialGuid;
function newGUID(){
return _guid++;
}
var FakeWeakMap;
if(!window$1.WeakMap){
FakeWeakMap =
function (){
function FakeWeakMap(){
this.vdata='vdata' + Math.floor(window$1.performance&&window$1.performance.now()||Date.now());
this.data={};}
var _proto=FakeWeakMap.prototype;
_proto.set=function set(key, value){
var access=key[this.vdata]||newGUID();
if(!key[this.vdata]){
key[this.vdata]=access;
}
this.data[access]=value;
return this;
};
_proto.get=function get(key){
var access=key[this.vdata];
if(access){
return this.data[access];
}
log('We have no data for this element', key);
return undefined;
};
_proto.has=function has(key){
var access=key[this.vdata];
return access in this.data;
};
_proto["delete"]=function _delete(key){
var access=key[this.vdata];
if(access){
delete this.data[access];
delete key[this.vdata];
}};
return FakeWeakMap;
}();
}
var DomData=window$1.WeakMap ? new WeakMap():new FakeWeakMap();
function _cleanUpEvents(elem, type){
if(!DomData.has(elem)){
return;
}
var data=DomData.get(elem);
if(data.handlers[type].length===0){
delete data.handlers[type];
if(elem.removeEventListener){
elem.removeEventListener(type, data.dispatcher, false);
}else if(elem.detachEvent){
elem.detachEvent('on' + type, data.dispatcher);
}}
if(Object.getOwnPropertyNames(data.handlers).length <=0){
delete data.handlers;
delete data.dispatcher;
delete data.disabled;
}
if(Object.getOwnPropertyNames(data).length===0){
DomData["delete"](elem);
}}
function _handleMultipleEvents(fn, elem, types, callback){
types.forEach(function (type){
fn(elem, type, callback);
});
}
function fixEvent(event){
if(event.fixed_){
return event;
}
function returnTrue(){
return true;
}
function returnFalse(){
return false;
}
if(!event||!event.isPropagationStopped){
var old=event||window$1.event;
event={};
for (var key in old){
if(key!=='layerX'&&key!=='layerY'&&key!=='keyLocation'&&key!=='webkitMovementX'&&key!=='webkitMovementY'){
if(!(key==='returnValue'&&old.preventDefault)){
event[key]=old[key];
}}
}
if(!event.target){
event.target=event.srcElement||document;
}
if(!event.relatedTarget){
event.relatedTarget=event.fromElement===event.target ? event.toElement:event.fromElement;
}
event.preventDefault=function (){
if(old.preventDefault){
old.preventDefault();
}
event.returnValue=false;
old.returnValue=false;
event.defaultPrevented=true;
};
event.defaultPrevented=false;
event.stopPropagation=function (){
if(old.stopPropagation){
old.stopPropagation();
}
event.cancelBubble=true;
old.cancelBubble=true;
event.isPropagationStopped=returnTrue;
};
event.isPropagationStopped=returnFalse;
event.stopImmediatePropagation=function (){
if(old.stopImmediatePropagation){
old.stopImmediatePropagation();
}
event.isImmediatePropagationStopped=returnTrue;
event.stopPropagation();
};
event.isImmediatePropagationStopped=returnFalse;
if(event.clientX!==null&&event.clientX!==undefined){
var doc=document.documentElement;
var body=document.body;
event.pageX=event.clientX + (doc&&doc.scrollLeft||body&&body.scrollLeft||0) - (doc&&doc.clientLeft||body&&body.clientLeft||0);
event.pageY=event.clientY + (doc&&doc.scrollTop||body&&body.scrollTop||0) - (doc&&doc.clientTop||body&&body.clientTop||0);
}
event.which=event.charCode||event.keyCode;
if(event.button!==null&&event.button!==undefined){
event.button=event.button & 1 ? 0:event.button & 4 ? 1:event.button & 2 ? 2:0;
}}
event.fixed_=true;
return event;
}
var _supportsPassive;
var supportsPassive=function supportsPassive(){
if(typeof _supportsPassive!=='boolean'){
_supportsPassive=false;
try {
var opts=Object.defineProperty({}, 'passive', {
get: function get(){
_supportsPassive=true;
}});
window$1.addEventListener('test', null, opts);
window$1.removeEventListener('test', null, opts);
} catch (e){
}}
return _supportsPassive;
};
var passiveEvents=['touchstart', 'touchmove'];
function on(elem, type, fn){
if(Array.isArray(type)){
return _handleMultipleEvents(on, elem, type, fn);
}
if(!DomData.has(elem)){
DomData.set(elem, {});
}
var data=DomData.get(elem);
if(!data.handlers){
data.handlers={};}
if(!data.handlers[type]){
data.handlers[type]=[];
}
if(!fn.guid){
fn.guid=newGUID();
}
data.handlers[type].push(fn);
if(!data.dispatcher){
data.disabled=false;
data.dispatcher=function (event, hash){
if(data.disabled){
return;
}
event=fixEvent(event);
var handlers=data.handlers[event.type];
if(handlers){
var handlersCopy=handlers.slice(0);
for (var m=0, n=handlersCopy.length; m < n; m++){
if(event.isImmediatePropagationStopped()){
break;
}else{
try {
handlersCopy[m].call(elem, event, hash);
} catch (e){
log.error(e);
}}
}}
};}
if(data.handlers[type].length===1){
if(elem.addEventListener){
var options=false;
if(supportsPassive()&&passiveEvents.indexOf(type) > -1){
options={
passive: true
};}
elem.addEventListener(type, data.dispatcher, options);
}else if(elem.attachEvent){
elem.attachEvent('on' + type, data.dispatcher);
}}
}
function off(elem, type, fn){
if(!DomData.has(elem)){
return;
}
var data=DomData.get(elem);
if(!data.handlers){
return;
}
if(Array.isArray(type)){
return _handleMultipleEvents(off, elem, type, fn);
}
var removeType=function removeType(el, t){
data.handlers[t]=[];
_cleanUpEvents(el, t);
};
if(type===undefined){
for (var t in data.handlers){
if(Object.prototype.hasOwnProperty.call(data.handlers||{}, t)){
removeType(elem, t);
}}
return;
}
var handlers=data.handlers[type];
if(!handlers){
return;
}
if(!fn){
removeType(elem, type);
return;
}
if(fn.guid){
for (var n=0; n < handlers.length; n++){
if(handlers[n].guid===fn.guid){
handlers.splice(n--, 1);
}}
}
_cleanUpEvents(elem, type);
}
function trigger(elem, event, hash){
var elemData=DomData.has(elem) ? DomData.get(elem):{};
var parent=elem.parentNode||elem.ownerDocument;
if(typeof event==='string'){
event={
type: event,
target: elem
};}else if(!event.target){
event.target=elem;
}
event=fixEvent(event);
if(elemData.dispatcher){
elemData.dispatcher.call(elem, event, hash);
}
if(parent&&!event.isPropagationStopped()&&event.bubbles===true){
trigger.call(null, parent, event, hash);
}else if(!parent&&!event.defaultPrevented&&event.target&&event.target[event.type]){
if(!DomData.has(event.target)){
DomData.set(event.target, {});
}
var targetData=DomData.get(event.target);
if(event.target[event.type]){
targetData.disabled=true;
if(typeof event.target[event.type]==='function'){
event.target[event.type]();
}
targetData.disabled=false;
}}
return !event.defaultPrevented;
}
function one(elem, type, fn){
if(Array.isArray(type)){
return _handleMultipleEvents(one, elem, type, fn);
}
var func=function func(){
off(elem, type, func);
fn.apply(this, arguments);
};
func.guid=fn.guid=fn.guid||newGUID();
on(elem, type, func);
}
function any(elem, type, fn){
var func=function func(){
off(elem, type, func);
fn.apply(this, arguments);
};
func.guid=fn.guid=fn.guid||newGUID();
on(elem, type, func);
}
var Events=Object.freeze({
fixEvent: fixEvent,
on: on,
off: off,
trigger: trigger,
one: one,
any: any
});
var UPDATE_REFRESH_INTERVAL=30;
var bind=function bind(context, fn, uid){
if(!fn.guid){
fn.guid=newGUID();
}
var bound=fn.bind(context);
bound.guid=uid ? uid + '_' + fn.guid:fn.guid;
return bound;
};
var throttle=function throttle(fn, wait){
var last=window$1.performance.now();
var throttled=function throttled(){
var now=window$1.performance.now();
if(now - last >=wait){
fn.apply(void 0, arguments);
last=now;
}};
return throttled;
};
var debounce=function debounce(func, wait, immediate, context){
if(context===void 0){
context=window$1;
}
var timeout;
var cancel=function cancel(){
context.clearTimeout(timeout);
timeout=null;
};
var debounced=function debounced(){
var self=this;
var args=arguments;
var _later=function later(){
timeout=null;
_later=null;
if(!immediate){
func.apply(self, args);
}};
if(!timeout&&immediate){
func.apply(self, args);
}
context.clearTimeout(timeout);
timeout=context.setTimeout(_later, wait);
};
debounced.cancel=cancel;
return debounced;
};
var EventTarget=function EventTarget(){};
EventTarget.prototype.allowedEvents_={};
EventTarget.prototype.on=function (type, fn){
var ael=this.addEventListener;
this.addEventListener=function (){};
on(this, type, fn);
this.addEventListener=ael;
};
EventTarget.prototype.addEventListener=EventTarget.prototype.on;
EventTarget.prototype.off=function (type, fn){
off(this, type, fn);
};
EventTarget.prototype.removeEventListener=EventTarget.prototype.off;
EventTarget.prototype.one=function (type, fn){
var ael=this.addEventListener;
this.addEventListener=function (){};
one(this, type, fn);
this.addEventListener=ael;
};
EventTarget.prototype.any=function (type, fn){
var ael=this.addEventListener;
this.addEventListener=function (){};
any(this, type, fn);
this.addEventListener=ael;
};
EventTarget.prototype.trigger=function (event){
var type=event.type||event;
if(typeof event==='string'){
event={
type: type
};}
event=fixEvent(event);
if(this.allowedEvents_[type]&&this['on' + type]){
this['on' + type](event);
}
trigger(this, event);
};
EventTarget.prototype.dispatchEvent=EventTarget.prototype.trigger;
var EVENT_MAP;
EventTarget.prototype.queueTrigger=function (event){
var _this=this;
if(!EVENT_MAP){
EVENT_MAP=new Map();
}
var type=event.type||event;
var map=EVENT_MAP.get(this);
if(!map){
map=new Map();
EVENT_MAP.set(this, map);
}
var oldTimeout=map.get(type);
map["delete"](type);
window$1.clearTimeout(oldTimeout);
var timeout=window$1.setTimeout(function (){
if(map.size===0){
map=null;
EVENT_MAP["delete"](_this);
}
_this.trigger(event);
}, 0);
map.set(type, timeout);
};
var isEvented=function isEvented(object){
return object instanceof EventTarget||!!object.eventBusEl_&&['on', 'one', 'off', 'trigger'].every(function (k){
return typeof object[k]==='function';
});
};
var addEventedCallback=function addEventedCallback(target, callback){
if(isEvented(target)){
callback();
}else{
if(!target.eventedCallbacks){
target.eventedCallbacks=[];
}
target.eventedCallbacks.push(callback);
}};
var isValidEventType=function isValidEventType(type){
return (
typeof type==='string'&&/\S/.test(type)||Array.isArray(type)&&!!type.length
);
};
var validateTarget=function validateTarget(target){
if(!target.nodeName&&!isEvented(target)){
throw new Error('Invalid target; must be a DOM node or evented object.');
}};
var validateEventType=function validateEventType(type){
if(!isValidEventType(type)){
throw new Error('Invalid event type; must be a non-empty string or array.');
}};
var validateListener=function validateListener(listener){
if(typeof listener!=='function'){
throw new Error('Invalid listener; must be a function.');
}};
var normalizeListenArgs=function normalizeListenArgs(self, args){
var isTargetingSelf=args.length < 3||args[0]===self||args[0]===self.eventBusEl_;
var target;
var type;
var listener;
if(isTargetingSelf){
target=self.eventBusEl_;
if(args.length >=3){
args.shift();
}
type=args[0];
listener=args[1];
}else{
target=args[0];
type=args[1];
listener=args[2];
}
validateTarget(target);
validateEventType(type);
validateListener(listener);
listener=bind(self, listener);
return {
isTargetingSelf: isTargetingSelf,
target: target,
type: type,
listener: listener
};};
var listen=function listen(target, method, type, listener){
validateTarget(target);
if(target.nodeName){
Events[method](target, type, listener);
}else{
target[method](type, listener);
}};
var EventedMixin={
on: function on(){
var _this=this;
for (var _len=arguments.length, args=new Array(_len), _key=0; _key < _len; _key++){
args[_key]=arguments[_key];
}
var _normalizeListenArgs=normalizeListenArgs(this, args),
isTargetingSelf=_normalizeListenArgs.isTargetingSelf,
target=_normalizeListenArgs.target,
type=_normalizeListenArgs.type,
listener=_normalizeListenArgs.listener;
listen(target, 'on', type, listener);
if(!isTargetingSelf){
var removeListenerOnDispose=function removeListenerOnDispose(){
return _this.off(target, type, listener);
};
removeListenerOnDispose.guid=listener.guid;
var removeRemoverOnTargetDispose=function removeRemoverOnTargetDispose(){
return _this.off('dispose', removeListenerOnDispose);
};
removeRemoverOnTargetDispose.guid=listener.guid;
listen(this, 'on', 'dispose', removeListenerOnDispose);
listen(target, 'on', 'dispose', removeRemoverOnTargetDispose);
}},
one: function one(){
var _this2=this;
for (var _len2=arguments.length, args=new Array(_len2), _key2=0; _key2 < _len2; _key2++){
args[_key2]=arguments[_key2];
}
var _normalizeListenArgs2=normalizeListenArgs(this, args),
isTargetingSelf=_normalizeListenArgs2.isTargetingSelf,
target=_normalizeListenArgs2.target,
type=_normalizeListenArgs2.type,
listener=_normalizeListenArgs2.listener;
if(isTargetingSelf){
listen(target, 'one', type, listener);
}else{
var wrapper=function wrapper(){
_this2.off(target, type, wrapper);
for (var _len3=arguments.length, largs=new Array(_len3), _key3=0; _key3 < _len3; _key3++){
largs[_key3]=arguments[_key3];
}
listener.apply(null, largs);
};
wrapper.guid=listener.guid;
listen(target, 'one', type, wrapper);
}},
any: function any(){
var _this3=this;
for (var _len4=arguments.length, args=new Array(_len4), _key4=0; _key4 < _len4; _key4++){
args[_key4]=arguments[_key4];
}
var _normalizeListenArgs3=normalizeListenArgs(this, args),
isTargetingSelf=_normalizeListenArgs3.isTargetingSelf,
target=_normalizeListenArgs3.target,
type=_normalizeListenArgs3.type,
listener=_normalizeListenArgs3.listener;
if(isTargetingSelf){
listen(target, 'any', type, listener);
}else{
var wrapper=function wrapper(){
_this3.off(target, type, wrapper);
for (var _len5=arguments.length, largs=new Array(_len5), _key5=0; _key5 < _len5; _key5++){
largs[_key5]=arguments[_key5];
}
listener.apply(null, largs);
};
wrapper.guid=listener.guid;
listen(target, 'any', type, wrapper);
}},
off: function off$1(targetOrType, typeOrListener, listener){
if(!targetOrType||isValidEventType(targetOrType)){
off(this.eventBusEl_, targetOrType, typeOrListener);
}else{
var target=targetOrType;
var type=typeOrListener;
validateTarget(target);
validateEventType(type);
validateListener(listener);
listener=bind(this, listener);
this.off('dispose', listener);
if(target.nodeName){
off(target, type, listener);
off(target, 'dispose', listener);
}else if(isEvented(target)){
target.off(type, listener);
target.off('dispose', listener);
}}
},
trigger: function trigger$1(event, hash){
return trigger(this.eventBusEl_, event, hash);
}};
function evented(target, options){
if(options===void 0){
options={};}
var _options=options,
eventBusKey=_options.eventBusKey;
if(eventBusKey){
if(!target[eventBusKey].nodeName){
throw new Error("The eventBusKey \"" + eventBusKey + "\" does not refer to an element.");
}
target.eventBusEl_=target[eventBusKey];
}else{
target.eventBusEl_=createEl('span', {
className: 'vjs-event-bus'
});
}
assign(target, EventedMixin);
if(target.eventedCallbacks){
target.eventedCallbacks.forEach(function (callback){
callback();
});
}
target.on('dispose', function (){
target.off();
window$1.setTimeout(function (){
target.eventBusEl_=null;
}, 0);
});
return target;
}
var StatefulMixin={
state: {},
setState: function setState(stateUpdates){
var _this=this;
if(typeof stateUpdates==='function'){
stateUpdates=stateUpdates();
}
var changes;
each(stateUpdates, function (value, key){
if(_this.state[key]!==value){
changes=changes||{};
changes[key]={
from: _this.state[key],
to: value
};}
_this.state[key]=value;
});
if(changes&&isEvented(this)){
this.trigger({
changes: changes,
type: 'statechanged'
});
}
return changes;
}};
function stateful(target, defaultState){
assign(target, StatefulMixin);
target.state=assign({}, target.state, defaultState);
if(typeof target.handleStateChanged==='function'&&isEvented(target)){
target.on('statechanged', target.handleStateChanged);
}
return target;
}
var toLowerCase=function toLowerCase(string){
if(typeof string!=='string'){
return string;
}
return string.replace(/./, function (w){
return w.toLowerCase();
});
};
var toTitleCase=function toTitleCase(string){
if(typeof string!=='string'){
return string;
}
return string.replace(/./, function (w){
return w.toUpperCase();
});
};
var titleCaseEquals=function titleCaseEquals(str1, str2){
return toTitleCase(str1)===toTitleCase(str2);
};
function mergeOptions(){
var result={};
for (var _len=arguments.length, sources=new Array(_len), _key=0; _key < _len; _key++){
sources[_key]=arguments[_key];
}
sources.forEach(function (source){
if(!source){
return;
}
each(source, function (value, key){
if(!isPlain(value)){
result[key]=value;
return;
}
if(!isPlain(result[key])){
result[key]={};}
result[key]=mergeOptions(result[key], value);
});
});
return result;
}
var Component =
function (){
function Component(player, options, ready){
if(!player&&this.play){
this.player_=player=this;
}else{
this.player_=player;
}
this.isDisposed_=false;
this.parentComponent_=null;
this.options_=mergeOptions({}, this.options_);
options=this.options_=mergeOptions(this.options_, options);
this.id_=options.id||options.el&&options.el.id;
if(!this.id_){
var id=player&&player.id&&player.id()||'no_player';
this.id_=id + "_component_" + newGUID();
}
this.name_=options.name||null;
if(options.el){
this.el_=options.el;
}else if(options.createEl!==false){
this.el_=this.createEl();
}
if(options.evented!==false){
evented(this, {
eventBusKey: this.el_ ? 'el_':null
});
}
stateful(this, this.constructor.defaultState);
this.children_=[];
this.childIndex_={};
this.childNameIndex_={};
var SetSham;
if(!window$1.Set){
SetSham =
function (){
function SetSham(){
this.set_={};}
var _proto2=SetSham.prototype;
_proto2.has=function has(key){
return key in this.set_;
};
_proto2["delete"]=function _delete(key){
var has=this.has(key);
delete this.set_[key];
return has;
};
_proto2.add=function add(key){
this.set_[key]=1;
return this;
};
_proto2.forEach=function forEach(callback, thisArg){
for (var key in this.set_){
callback.call(thisArg, key, key, this);
}};
return SetSham;
}();
}
this.setTimeoutIds_=window$1.Set ? new Set():new SetSham();
this.setIntervalIds_=window$1.Set ? new Set():new SetSham();
this.rafIds_=window$1.Set ? new Set():new SetSham();
this.clearingTimersOnDispose_=false;
if(options.initChildren!==false){
this.initChildren();
}
this.ready(ready);
if(options.reportTouchActivity!==false){
this.enableTouchActivity();
}}
var _proto=Component.prototype;
_proto.dispose=function dispose(){
if(this.isDisposed_){
return;
}
this.trigger({
type: 'dispose',
bubbles: false
});
this.isDisposed_=true;
if(this.children_){
for (var i=this.children_.length - 1; i >=0; i--){
if(this.children_[i].dispose){
this.children_[i].dispose();
}}
}
this.children_=null;
this.childIndex_=null;
this.childNameIndex_=null;
this.parentComponent_=null;
if(this.el_){
if(this.el_.parentNode){
this.el_.parentNode.removeChild(this.el_);
}
if(DomData.has(this.el_)){
DomData["delete"](this.el_);
}
this.el_=null;
}
this.player_=null;
}
;
_proto.isDisposed=function isDisposed(){
return Boolean(this.isDisposed_);
}
;
_proto.player=function player(){
return this.player_;
}
;
_proto.options=function options(obj){
if(!obj){
return this.options_;
}
this.options_=mergeOptions(this.options_, obj);
return this.options_;
}
;
_proto.el=function el(){
return this.el_;
}
;
_proto.createEl=function createEl$1(tagName, properties, attributes){
return createEl(tagName, properties, attributes);
}
;
_proto.localize=function localize(string, tokens, defaultValue){
if(defaultValue===void 0){
defaultValue=string;
}
var code=this.player_.language&&this.player_.language();
var languages=this.player_.languages&&this.player_.languages();
var language=languages&&languages[code];
var primaryCode=code&&code.split('-')[0];
var primaryLang=languages&&languages[primaryCode];
var localizedString=defaultValue;
if(language&&language[string]){
localizedString=language[string];
}else if(primaryLang&&primaryLang[string]){
localizedString=primaryLang[string];
}
if(tokens){
localizedString=localizedString.replace(/\{(\d+)\}/g, function (match, index){
var value=tokens[index - 1];
var ret=value;
if(typeof value==='undefined'){
ret=match;
}
return ret;
});
}
return localizedString;
}
;
_proto.contentEl=function contentEl(){
return this.contentEl_||this.el_;
}
;
_proto.id=function id(){
return this.id_;
}
;
_proto.name=function name(){
return this.name_;
}
;
_proto.children=function children(){
return this.children_;
}
;
_proto.getChildById=function getChildById(id){
return this.childIndex_[id];
}
;
_proto.getChild=function getChild(name){
if(!name){
return;
}
return this.childNameIndex_[name];
}
;
_proto.addChild=function addChild(child, options, index){
if(options===void 0){
options={};}
if(index===void 0){
index=this.children_.length;
}
var component;
var componentName;
if(typeof child==='string'){
componentName=toTitleCase(child);
var componentClassName=options.componentClass||componentName;
options.name=componentName;
var ComponentClass=Component.getComponent(componentClassName);
if(!ComponentClass){
throw new Error("Component " + componentClassName + " does not exist");
}
if(typeof ComponentClass!=='function'){
return null;
}
component=new ComponentClass(this.player_||this, options);
}else{
component=child;
}
if(component.parentComponent_){
component.parentComponent_.removeChild(component);
}
this.children_.splice(index, 0, component);
component.parentComponent_=this;
if(typeof component.id==='function'){
this.childIndex_[component.id()]=component;
}
componentName=componentName||component.name&&toTitleCase(component.name());
if(componentName){
this.childNameIndex_[componentName]=component;
this.childNameIndex_[toLowerCase(componentName)]=component;
}
if(typeof component.el==='function'&&component.el()){
var refNode=null;
if(this.children_[index + 1]&&this.children_[index + 1].el_){
refNode=this.children_[index + 1].el_;
}
this.contentEl().insertBefore(component.el(), refNode);
}
return component;
}
;
_proto.removeChild=function removeChild(component){
if(typeof component==='string'){
component=this.getChild(component);
}
if(!component||!this.children_){
return;
}
var childFound=false;
for (var i=this.children_.length - 1; i >=0; i--){
if(this.children_[i]===component){
childFound=true;
this.children_.splice(i, 1);
break;
}}
if(!childFound){
return;
}
component.parentComponent_=null;
this.childIndex_[component.id()]=null;
this.childNameIndex_[toTitleCase(component.name())]=null;
this.childNameIndex_[toLowerCase(component.name())]=null;
var compEl=component.el();
if(compEl&&compEl.parentNode===this.contentEl()){
this.contentEl().removeChild(component.el());
}}
;
_proto.initChildren=function initChildren(){
var _this=this;
var children=this.options_.children;
if(children){
var parentOptions=this.options_;
var handleAdd=function handleAdd(child){
var name=child.name;
var opts=child.opts;
if(parentOptions[name]!==undefined){
opts=parentOptions[name];
}
if(opts===false){
return;
}
if(opts===true){
opts={};}
opts.playerOptions=_this.options_.playerOptions;
var newChild=_this.addChild(name, opts);
if(newChild){
_this[name]=newChild;
}};
var workingChildren;
var Tech=Component.getComponent('Tech');
if(Array.isArray(children)){
workingChildren=children;
}else{
workingChildren=Object.keys(children);
}
workingChildren
.concat(Object.keys(this.options_).filter(function (child){
return !workingChildren.some(function (wchild){
if(typeof wchild==='string'){
return child===wchild;
}
return child===wchild.name;
});
})).map(function (child){
var name;
var opts;
if(typeof child==='string'){
name=child;
opts=children[name]||_this.options_[name]||{};}else{
name=child.name;
opts=child;
}
return {
name: name,
opts: opts
};}).filter(function (child){
var c=Component.getComponent(child.opts.componentClass||toTitleCase(child.name));
return c&&!Tech.isTech(c);
}).forEach(handleAdd);
}}
;
_proto.buildCSSClass=function buildCSSClass(){
return '';
}
;
_proto.ready=function ready(fn, sync){
if(sync===void 0){
sync=false;
}
if(!fn){
return;
}
if(!this.isReady_){
this.readyQueue_=this.readyQueue_||[];
this.readyQueue_.push(fn);
return;
}
if(sync){
fn.call(this);
}else{
this.setTimeout(fn, 1);
}}
;
_proto.triggerReady=function triggerReady(){
this.isReady_=true;
this.setTimeout(function (){
var readyQueue=this.readyQueue_;
this.readyQueue_=[];
if(readyQueue&&readyQueue.length > 0){
readyQueue.forEach(function (fn){
fn.call(this);
}, this);
}
this.trigger('ready');
}, 1);
}
;
_proto.$=function $$1(selector, context){
return $(selector, context||this.contentEl());
}
;
_proto.$$=function $$$1(selector, context){
return $$(selector, context||this.contentEl());
}
;
_proto.hasClass=function hasClass$1(classToCheck){
return hasClass(this.el_, classToCheck);
}
;
_proto.addClass=function addClass$1(classToAdd){
addClass(this.el_, classToAdd);
}
;
_proto.removeClass=function removeClass$1(classToRemove){
removeClass(this.el_, classToRemove);
}
;
_proto.toggleClass=function toggleClass$1(classToToggle, predicate){
toggleClass(this.el_, classToToggle, predicate);
}
;
_proto.show=function show(){
this.removeClass('vjs-hidden');
}
;
_proto.hide=function hide(){
this.addClass('vjs-hidden');
}
;
_proto.lockShowing=function lockShowing(){
this.addClass('vjs-lock-showing');
}
;
_proto.unlockShowing=function unlockShowing(){
this.removeClass('vjs-lock-showing');
}
;
_proto.getAttribute=function getAttribute$1(attribute){
return getAttribute(this.el_, attribute);
}
;
_proto.setAttribute=function setAttribute$1(attribute, value){
setAttribute(this.el_, attribute, value);
}
;
_proto.removeAttribute=function removeAttribute$1(attribute){
removeAttribute(this.el_, attribute);
}
;
_proto.width=function width(num, skipListeners){
return this.dimension('width', num, skipListeners);
}
;
_proto.height=function height(num, skipListeners){
return this.dimension('height', num, skipListeners);
}
;
_proto.dimensions=function dimensions(width, height){
this.width(width, true);
this.height(height);
}
;
_proto.dimension=function dimension(widthOrHeight, num, skipListeners){
if(num!==undefined){
if(num===null||num!==num){
num=0;
}
if(('' + num).indexOf('%')!==-1||('' + num).indexOf('px')!==-1){
this.el_.style[widthOrHeight]=num;
}else if(num==='auto'){
this.el_.style[widthOrHeight]='';
}else{
this.el_.style[widthOrHeight]=num + 'px';
}
if(!skipListeners){
this.trigger('componentresize');
}
return;
}
if(!this.el_){
return 0;
}
var val=this.el_.style[widthOrHeight];
var pxIndex=val.indexOf('px');
if(pxIndex!==-1){
return parseInt(val.slice(0, pxIndex), 10);
}
return parseInt(this.el_['offset' + toTitleCase(widthOrHeight)], 10);
}
;
_proto.currentDimension=function currentDimension(widthOrHeight){
var computedWidthOrHeight=0;
if(widthOrHeight!=='width'&&widthOrHeight!=='height'){
throw new Error('currentDimension only accepts width or height value');
}
computedWidthOrHeight=computedStyle(this.el_, widthOrHeight);
computedWidthOrHeight=parseFloat(computedWidthOrHeight);
if(computedWidthOrHeight===0||isNaN(computedWidthOrHeight)){
var rule="offset" + toTitleCase(widthOrHeight);
computedWidthOrHeight=this.el_[rule];
}
return computedWidthOrHeight;
}
;
_proto.currentDimensions=function currentDimensions(){
return {
width: this.currentDimension('width'),
height: this.currentDimension('height')
};}
;
_proto.currentWidth=function currentWidth(){
return this.currentDimension('width');
}
;
_proto.currentHeight=function currentHeight(){
return this.currentDimension('height');
}
;
_proto.focus=function focus(){
this.el_.focus();
}
;
_proto.blur=function blur(){
this.el_.blur();
}
;
_proto.handleKeyDown=function handleKeyDown(event){
if(this.player_){
event.stopPropagation();
this.player_.handleKeyDown(event);
}}
;
_proto.handleKeyPress=function handleKeyPress(event){
this.handleKeyDown(event);
}
;
_proto.emitTapEvents=function emitTapEvents(){
var touchStart=0;
var firstTouch=null;
var tapMovementThreshold=10;
var touchTimeThreshold=200;
var couldBeTap;
this.on('touchstart', function (event){
if(event.touches.length===1){
firstTouch={
pageX: event.touches[0].pageX,
pageY: event.touches[0].pageY
};
touchStart=window$1.performance.now();
couldBeTap=true;
}});
this.on('touchmove', function (event){
if(event.touches.length > 1){
couldBeTap=false;
}else if(firstTouch){
var xdiff=event.touches[0].pageX - firstTouch.pageX;
var ydiff=event.touches[0].pageY - firstTouch.pageY;
var touchDistance=Math.sqrt(xdiff * xdiff + ydiff * ydiff);
if(touchDistance > tapMovementThreshold){
couldBeTap=false;
}}
});
var noTap=function noTap(){
couldBeTap=false;
}; // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s
this.on('touchleave', noTap);
this.on('touchcancel', noTap);
this.on('touchend', function (event){
firstTouch=null;
if(couldBeTap===true){
var touchTime=window$1.performance.now() - touchStart;
if(touchTime < touchTimeThreshold){
event.preventDefault();
this.trigger('tap');
}}
});
}
;
_proto.enableTouchActivity=function enableTouchActivity(){
if(!this.player()||!this.player().reportUserActivity){
return;
}
var report=bind(this.player(), this.player().reportUserActivity);
var touchHolding;
this.on('touchstart', function (){
report();
this.clearInterval(touchHolding);
touchHolding=this.setInterval(report, 250);
});
var touchEnd=function touchEnd(event){
report();
this.clearInterval(touchHolding);
};
this.on('touchmove', report);
this.on('touchend', touchEnd);
this.on('touchcancel', touchEnd);
}
;
_proto.setTimeout=function setTimeout(fn, timeout){
var _this2=this;
var timeoutId;
fn=bind(this, fn);
this.clearTimersOnDispose_();
timeoutId=window$1.setTimeout(function (){
if(_this2.setTimeoutIds_.has(timeoutId)){
_this2.setTimeoutIds_["delete"](timeoutId);
}
fn();
}, timeout);
this.setTimeoutIds_.add(timeoutId);
return timeoutId;
}
;
_proto.clearTimeout=function clearTimeout(timeoutId){
if(this.setTimeoutIds_.has(timeoutId)){
this.setTimeoutIds_["delete"](timeoutId);
window$1.clearTimeout(timeoutId);
}
return timeoutId;
}
;
_proto.setInterval=function setInterval(fn, interval){
fn=bind(this, fn);
this.clearTimersOnDispose_();
var intervalId=window$1.setInterval(fn, interval);
this.setIntervalIds_.add(intervalId);
return intervalId;
}
;
_proto.clearInterval=function clearInterval(intervalId){
if(this.setIntervalIds_.has(intervalId)){
this.setIntervalIds_["delete"](intervalId);
window$1.clearInterval(intervalId);
}
return intervalId;
}
;
_proto.requestAnimationFrame=function requestAnimationFrame(fn){
var _this3=this;
if(!this.supportsRaf_){
return this.setTimeout(fn, 1000 / 60);
}
this.clearTimersOnDispose_();
var id;
fn=bind(this, fn);
id=window$1.requestAnimationFrame(function (){
if(_this3.rafIds_.has(id)){
_this3.rafIds_["delete"](id);
}
fn();
});
this.rafIds_.add(id);
return id;
}
;
_proto.cancelAnimationFrame=function cancelAnimationFrame(id){
if(!this.supportsRaf_){
return this.clearTimeout(id);
}
if(this.rafIds_.has(id)){
this.rafIds_["delete"](id);
window$1.cancelAnimationFrame(id);
}
return id;
}
;
_proto.clearTimersOnDispose_=function clearTimersOnDispose_(){
var _this4=this;
if(this.clearingTimersOnDispose_){
return;
}
this.clearingTimersOnDispose_=true;
this.one('dispose', function (){
[['rafIds_', 'cancelAnimationFrame'], ['setTimeoutIds_', 'clearTimeout'], ['setIntervalIds_', 'clearInterval']].forEach(function (_ref){
var idName=_ref[0],
cancelName=_ref[1];
_this4[idName].forEach(_this4[cancelName], _this4);
});
_this4.clearingTimersOnDispose_=false;
});
}
;
Component.registerComponent=function registerComponent(name, ComponentToRegister){
if(typeof name!=='string'||!name){
throw new Error("Illegal component name, \"" + name + "\"; must be a non-empty string.");
}
var Tech=Component.getComponent('Tech');
var isTech=Tech&&Tech.isTech(ComponentToRegister);
var isComp=Component===ComponentToRegister||Component.prototype.isPrototypeOf(ComponentToRegister.prototype);
if(isTech||!isComp){
var reason;
if(isTech){
reason='techs must be registered using Tech.registerTech()';
}else{
reason='must be a Component subclass';
}
throw new Error("Illegal component, \"" + name + "\"; " + reason + ".");
}
name=toTitleCase(name);
if(!Component.components_){
Component.components_={};}
var Player=Component.getComponent('Player');
if(name==='Player'&&Player&&Player.players){
var players=Player.players;
var playerNames=Object.keys(players);
if(players&&playerNames.length > 0&&playerNames.map(function (pname){
return players[pname];
}).every(Boolean)){
throw new Error('Can not register Player component after player has been created.');
}}
Component.components_[name]=ComponentToRegister;
Component.components_[toLowerCase(name)]=ComponentToRegister;
return ComponentToRegister;
}
;
Component.getComponent=function getComponent(name){
if(!name||!Component.components_){
return;
}
return Component.components_[name];
};
return Component;
}();
Component.prototype.supportsRaf_=typeof window$1.requestAnimationFrame==='function'&&typeof window$1.cancelAnimationFrame==='function';
Component.registerComponent('Component', Component);
function _assertThisInitialized(self){
if(self===void 0){
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self;
}
var assertThisInitialized=_assertThisInitialized;
function _inheritsLoose(subClass, superClass){
subClass.prototype=Object.create(superClass.prototype);
subClass.prototype.constructor=subClass;
subClass.__proto__=superClass;
}
var inheritsLoose=_inheritsLoose;
var USER_AGENT=window$1.navigator&&window$1.navigator.userAgent||'';
var webkitVersionMap=/AppleWebKit\/([\d.]+)/i.exec(USER_AGENT);
var appleWebkitVersion=webkitVersionMap ? parseFloat(webkitVersionMap.pop()):null;
var IS_IPOD=/iPod/i.test(USER_AGENT);
var IOS_VERSION=function (){
var match=USER_AGENT.match(/OS (\d+)_/i);
if(match&&match[1]){
return match[1];
}
return null;
}();
var IS_ANDROID=/Android/i.test(USER_AGENT);
var ANDROID_VERSION=function (){
var match=USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i);
if(!match){
return null;
}
var major=match[1]&&parseFloat(match[1]);
var minor=match[2]&&parseFloat(match[2]);
if(major&&minor){
return parseFloat(match[1] + '.' + match[2]);
}else if(major){
return major;
}
return null;
}();
var IS_NATIVE_ANDROID=IS_ANDROID&&ANDROID_VERSION < 5&&appleWebkitVersion < 537;
var IS_FIREFOX=/Firefox/i.test(USER_AGENT);
var IS_EDGE=/Edge/i.test(USER_AGENT);
var IS_CHROME = !IS_EDGE&&(/Chrome/i.test(USER_AGENT)||/CriOS/i.test(USER_AGENT));
var CHROME_VERSION=function (){
var match=USER_AGENT.match(/(Chrome|CriOS)\/(\d+)/);
if(match&&match[2]){
return parseFloat(match[2]);
}
return null;
}();
var IE_VERSION=function (){
var result=/MSIE\s(\d+)\.\d/.exec(USER_AGENT);
var version=result&&parseFloat(result[1]);
if(!version&&/Trident\/7.0/i.test(USER_AGENT)&&/rv:11.0/.test(USER_AGENT)){
version=11.0;
}
return version;
}();
var IS_SAFARI=/Safari/i.test(USER_AGENT)&&!IS_CHROME&&!IS_ANDROID&&!IS_EDGE;
var IS_WINDOWS=/Windows/i.test(USER_AGENT);
var TOUCH_ENABLED=isReal()&&('ontouchstart' in window$1||window$1.navigator.maxTouchPoints||window$1.DocumentTouch&&window$1.document instanceof window$1.DocumentTouch);
var IS_IPAD=/iPad/i.test(USER_AGENT)||IS_SAFARI&&TOUCH_ENABLED&&!/iPhone/i.test(USER_AGENT);
var IS_IPHONE=/iPhone/i.test(USER_AGENT)&&!IS_IPAD;
var IS_IOS=IS_IPHONE||IS_IPAD||IS_IPOD;
var IS_ANY_SAFARI=(IS_SAFARI||IS_IOS)&&!IS_CHROME;
var browser=Object.freeze({
IS_IPOD: IS_IPOD,
IOS_VERSION: IOS_VERSION,
IS_ANDROID: IS_ANDROID,
ANDROID_VERSION: ANDROID_VERSION,
IS_NATIVE_ANDROID: IS_NATIVE_ANDROID,
IS_FIREFOX: IS_FIREFOX,
IS_EDGE: IS_EDGE,
IS_CHROME: IS_CHROME,
CHROME_VERSION: CHROME_VERSION,
IE_VERSION: IE_VERSION,
IS_SAFARI: IS_SAFARI,
IS_WINDOWS: IS_WINDOWS,
TOUCH_ENABLED: TOUCH_ENABLED,
IS_IPAD: IS_IPAD,
IS_IPHONE: IS_IPHONE,
IS_IOS: IS_IOS,
IS_ANY_SAFARI: IS_ANY_SAFARI
});
function rangeCheck(fnName, index, maxIndex){
if(typeof index!=='number'||index < 0||index > maxIndex){
throw new Error("Failed to execute '" + fnName + "' on 'TimeRanges': The index provided (" + index + ") is non-numeric or out of bounds (0-" + maxIndex + ").");
}}
function getRange(fnName, valueIndex, ranges, rangeIndex){
rangeCheck(fnName, rangeIndex, ranges.length - 1);
return ranges[rangeIndex][valueIndex];
}
function createTimeRangesObj(ranges){
if(ranges===undefined||ranges.length===0){
return {
length: 0,
start: function start(){
throw new Error('This TimeRanges object is empty');
},
end: function end(){
throw new Error('This TimeRanges object is empty');
}};}
return {
length: ranges.length,
start: getRange.bind(null, 'start', 0, ranges),
end: getRange.bind(null, 'end', 1, ranges)
};}
function createTimeRanges(start, end){
if(Array.isArray(start)){
return createTimeRangesObj(start);
}else if(start===undefined||end===undefined){
return createTimeRangesObj();
}
return createTimeRangesObj([[start, end]]);
}
function bufferedPercent(buffered, duration){
var bufferedDuration=0;
var start;
var end;
if(!duration){
return 0;
}
if(!buffered||!buffered.length){
buffered=createTimeRanges(0, 0);
}
for (var i=0; i < buffered.length; i++){
start=buffered.start(i);
end=buffered.end(i);
if(end > duration){
end=duration;
}
bufferedDuration +=end - start;
}
return bufferedDuration / duration;
}
var FullscreenApi={
prefixed: true
};
var apiMap=[['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror', 'fullscreen'],
['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror', '-webkit-full-screen'],
['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror', '-moz-full-screen'],
['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError', '-ms-fullscreen']];
var specApi=apiMap[0];
var browserApi;
for (var i=0; i < apiMap.length; i++){
if(apiMap[i][1] in document){
browserApi=apiMap[i];
break;
}}
if(browserApi){
for (var _i=0; _i < browserApi.length; _i++){
FullscreenApi[specApi[_i]]=browserApi[_i];
}
FullscreenApi.prefixed=browserApi[0]!==specApi[0];
}
function MediaError(value){
if(value instanceof MediaError){
return value;
}
if(typeof value==='number'){
this.code=value;
}else if(typeof value==='string'){
this.message=value;
}else if(isObject(value)){
if(typeof value.code==='number'){
this.code=value.code;
}
assign(this, value);
}
if(!this.message){
this.message=MediaError.defaultMessages[this.code]||'';
}}
MediaError.prototype.code=0;
MediaError.prototype.message='';
MediaError.prototype.status=null;
MediaError.errorTypes=['MEDIA_ERR_CUSTOM', 'MEDIA_ERR_ABORTED', 'MEDIA_ERR_NETWORK', 'MEDIA_ERR_DECODE', 'MEDIA_ERR_SRC_NOT_SUPPORTED', 'MEDIA_ERR_ENCRYPTED'];
MediaError.defaultMessages={
1: 'You aborted the media playback',
2: 'A network error caused the media download to fail part-way.',
3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.',
4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.',
5: 'The media is encrypted and we do not have the keys to decrypt it.'
};
for (var errNum=0; errNum < MediaError.errorTypes.length; errNum++){
MediaError[MediaError.errorTypes[errNum]]=errNum;
MediaError.prototype[MediaError.errorTypes[errNum]]=errNum;
}
var tuple=SafeParseTuple;
function SafeParseTuple(obj, reviver){
var json;
var error=null;
try {
json=JSON.parse(obj, reviver);
} catch (err){
error=err;
}
return [error, json];
}
function isPromise(value){
return value!==undefined&&value!==null&&typeof value.then==='function';
}
function silencePromise(value){
if(isPromise(value)){
value.then(null, function (e){});
}}
var trackToJson_=function trackToJson_(track){
var ret=['kind', 'label', 'language', 'id', 'inBandMetadataTrackDispatchType', 'mode', 'src'].reduce(function (acc, prop, i){
if(track[prop]){
acc[prop]=track[prop];
}
return acc;
}, {
cues: track.cues&&Array.prototype.map.call(track.cues, function (cue){
return {
startTime: cue.startTime,
endTime: cue.endTime,
text: cue.text,
id: cue.id
};})
});
return ret;
};
var textTracksToJson=function textTracksToJson(tech){
var trackEls=tech.$$('track');
var trackObjs=Array.prototype.map.call(trackEls, function (t){
return t.track;
});
var tracks=Array.prototype.map.call(trackEls, function (trackEl){
var json=trackToJson_(trackEl.track);
if(trackEl.src){
json.src=trackEl.src;
}
return json;
});
return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function (track){
return trackObjs.indexOf(track)===-1;
}).map(trackToJson_));
};
var jsonToTextTracks=function jsonToTextTracks(json, tech){
json.forEach(function (track){
var addedTrack=tech.addRemoteTextTrack(track).track;
if(!track.src&&track.cues){
track.cues.forEach(function (cue){
return addedTrack.addCue(cue);
});
}});
return tech.textTracks();
};
var textTrackConverter={
textTracksToJson: textTracksToJson,
jsonToTextTracks: jsonToTextTracks,
trackToJson_: trackToJson_
};
var keycode=createCommonjsModule(function (module, exports){
function keyCode(searchInput){
if(searchInput&&'object'===typeof searchInput){
var hasKeyCode=searchInput.which||searchInput.keyCode||searchInput.charCode;
if(hasKeyCode) searchInput=hasKeyCode;
}
if('number'===typeof searchInput) return names[searchInput];
var search=String(searchInput);
var foundNamedKey=codes[search.toLowerCase()];
if(foundNamedKey) return foundNamedKey;
var foundNamedKey=aliases[search.toLowerCase()];
if(foundNamedKey) return foundNamedKey;
if(search.length===1) return search.charCodeAt(0);
return undefined;
}
keyCode.isEventKey=function isEventKey(event, nameOrCode){
if(event&&'object'===typeof event){
var keyCode=event.which||event.keyCode||event.charCode;
if(keyCode===null||keyCode===undefined){
return false;
}
if(typeof nameOrCode==='string'){
var foundNamedKey=codes[nameOrCode.toLowerCase()];
if(foundNamedKey){
return foundNamedKey===keyCode;
}
var foundNamedKey=aliases[nameOrCode.toLowerCase()];
if(foundNamedKey){
return foundNamedKey===keyCode;
}}else if(typeof nameOrCode==='number'){
return nameOrCode===keyCode;
}
return false;
}};
exports=module.exports=keyCode;
var codes=exports.code=exports.codes={
'backspace': 8,
'tab': 9,
'enter': 13,
'shift': 16,
'ctrl': 17,
'alt': 18,
'pause/break': 19,
'caps lock': 20,
'esc': 27,
'space': 32,
'page up': 33,
'page down': 34,
'end': 35,
'home': 36,
'left': 37,
'up': 38,
'right': 39,
'down': 40,
'insert': 45,
'delete': 46,
'command': 91,
'left command': 91,
'right command': 93,
'numpad *': 106,
'numpad +': 107,
'numpad -': 109,
'numpad .': 110,
'numpad /': 111,
'num lock': 144,
'scroll lock': 145,
'my computer': 182,
'my calculator': 183,
';': 186,
'=': 187,
',': 188,
'-': 189,
'.': 190,
'/': 191,
'`': 192,
'[': 219,
'\\': 220,
']': 221,
"'": 222 
};
var aliases=exports.aliases={
'windows': 91,
'⇧': 16,
'⌥': 18,
'⌃': 17,
'⌘': 91,
'ctl': 17,
'control': 17,
'option': 18,
'pause': 19,
'break': 19,
'caps': 20,
'return': 13,
'escape': 27,
'spc': 32,
'spacebar': 32,
'pgup': 33,
'pgdn': 34,
'ins': 45,
'del': 46,
'cmd': 91
};
for (i=97; i < 123; i++){
codes[String.fromCharCode(i)]=i - 32;
}
for (var i=48; i < 58; i++){
codes[i - 48]=i;
}
for (i=1; i < 13; i++){
codes['f' + i]=i + 111;
}
for (i=0; i < 10; i++){
codes['numpad ' + i]=i + 96;
}
var names=exports.names=exports.title={};
for (i in codes){
names[codes[i]]=i;
}
for (var alias in aliases){
codes[alias]=aliases[alias];
}});
var keycode_1=keycode.code;
var keycode_2=keycode.codes;
var keycode_3=keycode.aliases;
var keycode_4=keycode.names;
var keycode_5=keycode.title;
var MODAL_CLASS_NAME='vjs-modal-dialog';
var ModalDialog =
function (_Component){
inheritsLoose(ModalDialog, _Component);
function ModalDialog(player, options){
var _this;
_this=_Component.call(this, player, options)||this;
_this.opened_=_this.hasBeenOpened_=_this.hasBeenFilled_=false;
_this.closeable(!_this.options_.uncloseable);
_this.content(_this.options_.content);
_this.contentEl_=createEl('div', {
className: MODAL_CLASS_NAME + "-content"
}, {
role: 'document'
});
_this.descEl_=createEl('p', {
className: MODAL_CLASS_NAME + "-description vjs-control-text",
id: _this.el().getAttribute('aria-describedby')
});
textContent(_this.descEl_, _this.description());
_this.el_.appendChild(_this.descEl_);
_this.el_.appendChild(_this.contentEl_);
return _this;
}
var _proto=ModalDialog.prototype;
_proto.createEl=function createEl(){
return _Component.prototype.createEl.call(this, 'div', {
className: this.buildCSSClass(),
tabIndex: -1
}, {
'aria-describedby': this.id() + "_description",
'aria-hidden': 'true',
'aria-label': this.label(),
'role': 'dialog'
});
};
_proto.dispose=function dispose(){
this.contentEl_=null;
this.descEl_=null;
this.previouslyActiveEl_=null;
_Component.prototype.dispose.call(this);
}
;
_proto.buildCSSClass=function buildCSSClass(){
return MODAL_CLASS_NAME + " vjs-hidden " + _Component.prototype.buildCSSClass.call(this);
}
;
_proto.label=function label(){
return this.localize(this.options_.label||'Modal Window');
}
;
_proto.description=function description(){
var desc=this.options_.description||this.localize('This is a modal window.');
if(this.closeable()){
desc +=' ' + this.localize('This modal can be closed by pressing the Escape key or activating the close button.');
}
return desc;
}
;
_proto.open=function open(){
if(!this.opened_){
var player=this.player();
this.trigger('beforemodalopen');
this.opened_=true;
if(this.options_.fillAlways||!this.hasBeenOpened_&&!this.hasBeenFilled_){
this.fill();
}
this.wasPlaying_ = !player.paused();
if(this.options_.pauseOnOpen&&this.wasPlaying_){
player.pause();
}
this.on('keydown', this.handleKeyDown);
this.hadControls_=player.controls();
player.controls(false);
this.show();
this.conditionalFocus_();
this.el().setAttribute('aria-hidden', 'false');
this.trigger('modalopen');
this.hasBeenOpened_=true;
}}
;
_proto.opened=function opened(value){
if(typeof value==='boolean'){
this[value ? 'open':'close']();
}
return this.opened_;
}
;
_proto.close=function close(){
if(!this.opened_){
return;
}
var player=this.player();
this.trigger('beforemodalclose');
this.opened_=false;
if(this.wasPlaying_&&this.options_.pauseOnOpen){
player.play();
}
this.off('keydown', this.handleKeyDown);
if(this.hadControls_){
player.controls(true);
}
this.hide();
this.el().setAttribute('aria-hidden', 'true');
this.trigger('modalclose');
this.conditionalBlur_();
if(this.options_.temporary){
this.dispose();
}}
;
_proto.closeable=function closeable(value){
if(typeof value==='boolean'){
var closeable=this.closeable_ = !!value;
var close=this.getChild('closeButton');
if(closeable&&!close){
var temp=this.contentEl_;
this.contentEl_=this.el_;
close=this.addChild('closeButton', {
controlText: 'Close Modal Dialog'
});
this.contentEl_=temp;
this.on(close, 'close', this.close);
}
if(!closeable&&close){
this.off(close, 'close', this.close);
this.removeChild(close);
close.dispose();
}}
return this.closeable_;
}
;
_proto.fill=function fill(){
this.fillWith(this.content());
}
;
_proto.fillWith=function fillWith(content){
var contentEl=this.contentEl();
var parentEl=contentEl.parentNode;
var nextSiblingEl=contentEl.nextSibling;
this.trigger('beforemodalfill');
this.hasBeenFilled_=true;
parentEl.removeChild(contentEl);
this.empty();
insertContent(contentEl, content);
this.trigger('modalfill');
if(nextSiblingEl){
parentEl.insertBefore(contentEl, nextSiblingEl);
}else{
parentEl.appendChild(contentEl);
}
var closeButton=this.getChild('closeButton');
if(closeButton){
parentEl.appendChild(closeButton.el_);
}}
;
_proto.empty=function empty(){
this.trigger('beforemodalempty');
emptyEl(this.contentEl());
this.trigger('modalempty');
}
;
_proto.content=function content(value){
if(typeof value!=='undefined'){
this.content_=value;
}
return this.content_;
}
;
_proto.conditionalFocus_=function conditionalFocus_(){
var activeEl=document.activeElement;
var playerEl=this.player_.el_;
this.previouslyActiveEl_=null;
if(playerEl.contains(activeEl)||playerEl===activeEl){
this.previouslyActiveEl_=activeEl;
this.focus();
}}
;
_proto.conditionalBlur_=function conditionalBlur_(){
if(this.previouslyActiveEl_){
this.previouslyActiveEl_.focus();
this.previouslyActiveEl_=null;
}}
;
_proto.handleKeyDown=function handleKeyDown(event){
event.stopPropagation();
if(keycode.isEventKey(event, 'Escape')&&this.closeable()){
event.preventDefault();
this.close();
return;
}
if(!keycode.isEventKey(event, 'Tab')){
return;
}
var focusableEls=this.focusableEls_();
var activeEl=this.el_.querySelector(':focus');
var focusIndex;
for (var i=0; i < focusableEls.length; i++){
if(activeEl===focusableEls[i]){
focusIndex=i;
break;
}}
if(document.activeElement===this.el_){
focusIndex=0;
}
if(event.shiftKey&&focusIndex===0){
focusableEls[focusableEls.length - 1].focus();
event.preventDefault();
}else if(!event.shiftKey&&focusIndex===focusableEls.length - 1){
focusableEls[0].focus();
event.preventDefault();
}}
;
_proto.focusableEls_=function focusableEls_(){
var allChildren=this.el_.querySelectorAll('*');
return Array.prototype.filter.call(allChildren, function (child){
return (child instanceof window$1.HTMLAnchorElement||child instanceof window$1.HTMLAreaElement)&&child.hasAttribute('href')||(child instanceof window$1.HTMLInputElement||child instanceof window$1.HTMLSelectElement||child instanceof window$1.HTMLTextAreaElement||child instanceof window$1.HTMLButtonElement)&&!child.hasAttribute('disabled')||child instanceof window$1.HTMLIFrameElement||child instanceof window$1.HTMLObjectElement||child instanceof window$1.HTMLEmbedElement||child.hasAttribute('tabindex')&&child.getAttribute('tabindex')!==-1||child.hasAttribute('contenteditable');
});
};
return ModalDialog;
}(Component);
ModalDialog.prototype.options_={
pauseOnOpen: true,
temporary: true
};
Component.registerComponent('ModalDialog', ModalDialog);
var TrackList =
function (_EventTarget){
inheritsLoose(TrackList, _EventTarget);
function TrackList(tracks){
var _this;
if(tracks===void 0){
tracks=[];
}
_this=_EventTarget.call(this)||this;
_this.tracks_=[];
Object.defineProperty(assertThisInitialized(_this), 'length', {
get: function get(){
return this.tracks_.length;
}});
for (var i=0; i < tracks.length; i++){
_this.addTrack(tracks[i]);
}
return _this;
}
var _proto=TrackList.prototype;
_proto.addTrack=function addTrack(track){
var index=this.tracks_.length;
if(!('' + index in this)){
Object.defineProperty(this, index, {
get: function get(){
return this.tracks_[index];
}});
}
if(this.tracks_.indexOf(track)===-1){
this.tracks_.push(track);
this.trigger({
track: track,
type: 'addtrack',
target: this
});
}}
;
_proto.removeTrack=function removeTrack(rtrack){
var track;
for (var i=0, l=this.length; i < l; i++){
if(this[i]===rtrack){
track=this[i];
if(track.off){
track.off();
}
this.tracks_.splice(i, 1);
break;
}}
if(!track){
return;
}
this.trigger({
track: track,
type: 'removetrack',
target: this
});
}
;
_proto.getTrackById=function getTrackById(id){
var result=null;
for (var i=0, l=this.length; i < l; i++){
var track=this[i];
if(track.id===id){
result=track;
break;
}}
return result;
};
return TrackList;
}(EventTarget);
TrackList.prototype.allowedEvents_={
change: 'change',
addtrack: 'addtrack',
removetrack: 'removetrack'
};
for (var event in TrackList.prototype.allowedEvents_){
TrackList.prototype['on' + event]=null;
}
var disableOthers=function disableOthers(list, track){
for (var i=0; i < list.length; i++){
if(!Object.keys(list[i]).length||track.id===list[i].id){
continue;
}
list[i].enabled=false;
}};
var AudioTrackList =
function (_TrackList){
inheritsLoose(AudioTrackList, _TrackList);
function AudioTrackList(tracks){
var _this;
if(tracks===void 0){
tracks=[];
}
for (var i=tracks.length - 1; i >=0; i--){
if(tracks[i].enabled){
disableOthers(tracks, tracks[i]);
break;
}}
_this=_TrackList.call(this, tracks)||this;
_this.changing_=false;
return _this;
}
var _proto=AudioTrackList.prototype;
_proto.addTrack=function addTrack(track){
var _this2=this;
if(track.enabled){
disableOthers(this, track);
}
_TrackList.prototype.addTrack.call(this, track);
if(!track.addEventListener){
return;
}
track.enabledChange_=function (){
if(_this2.changing_){
return;
}
_this2.changing_=true;
disableOthers(_this2, track);
_this2.changing_=false;
_this2.trigger('change');
};
track.addEventListener('enabledchange', track.enabledChange_);
};
_proto.removeTrack=function removeTrack(rtrack){
_TrackList.prototype.removeTrack.call(this, rtrack);
if(rtrack.removeEventListener&&rtrack.enabledChange_){
rtrack.removeEventListener('enabledchange', rtrack.enabledChange_);
rtrack.enabledChange_=null;
}};
return AudioTrackList;
}(TrackList);
var disableOthers$1=function disableOthers(list, track){
for (var i=0; i < list.length; i++){
if(!Object.keys(list[i]).length||track.id===list[i].id){
continue;
}
list[i].selected=false;
}};
var VideoTrackList =
function (_TrackList){
inheritsLoose(VideoTrackList, _TrackList);
function VideoTrackList(tracks){
var _this;
if(tracks===void 0){
tracks=[];
}
for (var i=tracks.length - 1; i >=0; i--){
if(tracks[i].selected){
disableOthers$1(tracks, tracks[i]);
break;
}}
_this=_TrackList.call(this, tracks)||this;
_this.changing_=false;
Object.defineProperty(assertThisInitialized(_this), 'selectedIndex', {
get: function get(){
for (var _i=0; _i < this.length; _i++){
if(this[_i].selected){
return _i;
}}
return -1;
},
set: function set(){}});
return _this;
}
var _proto=VideoTrackList.prototype;
_proto.addTrack=function addTrack(track){
var _this2=this;
if(track.selected){
disableOthers$1(this, track);
}
_TrackList.prototype.addTrack.call(this, track);
if(!track.addEventListener){
return;
}
track.selectedChange_=function (){
if(_this2.changing_){
return;
}
_this2.changing_=true;
disableOthers$1(_this2, track);
_this2.changing_=false;
_this2.trigger('change');
};
track.addEventListener('selectedchange', track.selectedChange_);
};
_proto.removeTrack=function removeTrack(rtrack){
_TrackList.prototype.removeTrack.call(this, rtrack);
if(rtrack.removeEventListener&&rtrack.selectedChange_){
rtrack.removeEventListener('selectedchange', rtrack.selectedChange_);
rtrack.selectedChange_=null;
}};
return VideoTrackList;
}(TrackList);
var TextTrackList =
function (_TrackList){
inheritsLoose(TextTrackList, _TrackList);
function TextTrackList(){
return _TrackList.apply(this, arguments)||this;
}
var _proto=TextTrackList.prototype;
_proto.addTrack=function addTrack(track){
var _this=this;
_TrackList.prototype.addTrack.call(this, track);
if(!this.queueChange_){
this.queueChange_=function (){
return _this.queueTrigger('change');
};}
if(!this.triggerSelectedlanguagechange){
this.triggerSelectedlanguagechange_=function (){
return _this.trigger('selectedlanguagechange');
};}
track.addEventListener('modechange', this.queueChange_);
var nonLanguageTextTrackKind=['metadata', 'chapters'];
if(nonLanguageTextTrackKind.indexOf(track.kind)===-1){
track.addEventListener('modechange', this.triggerSelectedlanguagechange_);
}};
_proto.removeTrack=function removeTrack(rtrack){
_TrackList.prototype.removeTrack.call(this, rtrack);
if(rtrack.removeEventListener){
if(this.queueChange_){
rtrack.removeEventListener('modechange', this.queueChange_);
}
if(this.selectedlanguagechange_){
rtrack.removeEventListener('modechange', this.triggerSelectedlanguagechange_);
}}
};
return TextTrackList;
}(TrackList);
var HtmlTrackElementList =
function (){
function HtmlTrackElementList(trackElements){
if(trackElements===void 0){
trackElements=[];
}
this.trackElements_=[];
Object.defineProperty(this, 'length', {
get: function get(){
return this.trackElements_.length;
}});
for (var i=0, length=trackElements.length; i < length; i++){
this.addTrackElement_(trackElements[i]);
}}
var _proto=HtmlTrackElementList.prototype;
_proto.addTrackElement_=function addTrackElement_(trackElement){
var index=this.trackElements_.length;
if(!('' + index in this)){
Object.defineProperty(this, index, {
get: function get(){
return this.trackElements_[index];
}});
}
if(this.trackElements_.indexOf(trackElement)===-1){
this.trackElements_.push(trackElement);
}}
;
_proto.getTrackElementByTrack_=function getTrackElementByTrack_(track){
var trackElement_;
for (var i=0, length=this.trackElements_.length; i < length; i++){
if(track===this.trackElements_[i].track){
trackElement_=this.trackElements_[i];
break;
}}
return trackElement_;
}
;
_proto.removeTrackElement_=function removeTrackElement_(trackElement){
for (var i=0, length=this.trackElements_.length; i < length; i++){
if(trackElement===this.trackElements_[i]){
if(this.trackElements_[i].track&&typeof this.trackElements_[i].track.off==='function'){
this.trackElements_[i].track.off();
}
if(typeof this.trackElements_[i].off==='function'){
this.trackElements_[i].off();
}
this.trackElements_.splice(i, 1);
break;
}}
};
return HtmlTrackElementList;
}();
var TextTrackCueList =
function (){
function TextTrackCueList(cues){
TextTrackCueList.prototype.setCues_.call(this, cues);
Object.defineProperty(this, 'length', {
get: function get(){
return this.length_;
}});
}
var _proto=TextTrackCueList.prototype;
_proto.setCues_=function setCues_(cues){
var oldLength=this.length||0;
var i=0;
var l=cues.length;
this.cues_=cues;
this.length_=cues.length;
var defineProp=function defineProp(index){
if(!('' + index in this)){
Object.defineProperty(this, '' + index, {
get: function get(){
return this.cues_[index];
}});
}};
if(oldLength < l){
i=oldLength;
for (; i < l; i++){
defineProp.call(this, i);
}}
}
;
_proto.getCueById=function getCueById(id){
var result=null;
for (var i=0, l=this.length; i < l; i++){
var cue=this[i];
if(cue.id===id){
result=cue;
break;
}}
return result;
};
return TextTrackCueList;
}();
var VideoTrackKind={
alternative: 'alternative',
captions: 'captions',
main: 'main',
sign: 'sign',
subtitles: 'subtitles',
commentary: 'commentary'
};
var AudioTrackKind={
'alternative': 'alternative',
'descriptions': 'descriptions',
'main': 'main',
'main-desc': 'main-desc',
'translation': 'translation',
'commentary': 'commentary'
};
var TextTrackKind={
subtitles: 'subtitles',
captions: 'captions',
descriptions: 'descriptions',
chapters: 'chapters',
metadata: 'metadata'
};
var TextTrackMode={
disabled: 'disabled',
hidden: 'hidden',
showing: 'showing'
};
var Track =
function (_EventTarget){
inheritsLoose(Track, _EventTarget);
function Track(options){
var _this;
if(options===void 0){
options={};}
_this=_EventTarget.call(this)||this;
var trackProps={
id: options.id||'vjs_track_' + newGUID(),
kind: options.kind||'',
label: options.label||'',
language: options.language||''
};
var _loop=function _loop(key){
Object.defineProperty(assertThisInitialized(_this), key, {
get: function get(){
return trackProps[key];
},
set: function set(){}});
};
for (var key in trackProps){
_loop(key);
}
return _this;
}
return Track;
}(EventTarget);
var parseUrl=function parseUrl(url){
var props=['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];
var a=document.createElement('a');
a.href=url;
var addToBody=a.host===''&&a.protocol!=='file:';
var div;
if(addToBody){
div=document.createElement('div');
div.innerHTML="<a href=\"" + url + "\"></a>";
a=div.firstChild;
div.setAttribute('style', 'display:none; position:absolute;');
document.body.appendChild(div);
}
var details={};
for (var i=0; i < props.length; i++){
details[props[i]]=a[props[i]];
}
if(details.protocol==='http:'){
details.host=details.host.replace(/:80$/, '');
}
if(details.protocol==='https:'){
details.host=details.host.replace(/:443$/, '');
}
if(!details.protocol){
details.protocol=window$1.location.protocol;
}
if(addToBody){
document.body.removeChild(div);
}
return details;
};
var getAbsoluteURL=function getAbsoluteURL(url){
if(!url.match(/^https?:\/\//)){
var div=document.createElement('div');
div.innerHTML="<a href=\"" + url + "\">x</a>";
url=div.firstChild.href;
}
return url;
};
var getFileExtension=function getFileExtension(path){
if(typeof path==='string'){
var splitPathRe=/^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/;
var pathParts=splitPathRe.exec(path);
if(pathParts){
return pathParts.pop().toLowerCase();
}}
return '';
};
var isCrossOrigin=function isCrossOrigin(url, winLoc){
if(winLoc===void 0){
winLoc=window$1.location;
}
var urlInfo=parseUrl(url);
var srcProtocol=urlInfo.protocol===':' ? winLoc.protocol:urlInfo.protocol;
var crossOrigin=srcProtocol + urlInfo.host!==winLoc.protocol + winLoc.host;
return crossOrigin;
};
var Url=Object.freeze({
parseUrl: parseUrl,
getAbsoluteURL: getAbsoluteURL,
getFileExtension: getFileExtension,
isCrossOrigin: isCrossOrigin
});
var isFunction_1=isFunction;
var toString$1=Object.prototype.toString;
function isFunction(fn){
var string=toString$1.call(fn);
return string==='[object Function]'||typeof fn==='function'&&string!=='[object RegExp]'||typeof window!=='undefined'&&(
fn===window.setTimeout||fn===window.alert||fn===window.confirm||fn===window.prompt);
}
var parseHeaders=function parseHeaders(headers){
var result={};
if(!headers){
return result;
}
headers.trim().split('\n').forEach(function (row){
var index=row.indexOf(':');
var key=row.slice(0, index).trim().toLowerCase();
var value=row.slice(index + 1).trim();
if(typeof result[key]==='undefined'){
result[key]=value;
}else if(Array.isArray(result[key])){
result[key].push(value);
}else{
result[key]=[result[key], value];
}});
return result;
};
var xhr=createXHR;
var default_1=createXHR;
createXHR.XMLHttpRequest=window$1.XMLHttpRequest||noop;
createXHR.XDomainRequest="withCredentials" in new createXHR.XMLHttpRequest() ? createXHR.XMLHttpRequest:window$1.XDomainRequest;
forEachArray(["get", "put", "post", "patch", "head", "delete"], function (method){
createXHR[method==="delete" ? "del":method]=function (uri, options, callback){
options=initParams(uri, options, callback);
options.method=method.toUpperCase();
return _createXHR(options);
};});
function forEachArray(array, iterator){
for (var i=0; i < array.length; i++){
iterator(array[i]);
}}
function isEmpty(obj){
for (var i in obj){
if(obj.hasOwnProperty(i)) return false;
}
return true;
}
function initParams(uri, options, callback){
var params=uri;
if(isFunction_1(options)){
callback=options;
if(typeof uri==="string"){
params={
uri: uri
};}}else{
params=_extends_1({}, options, {
uri: uri
});
}
params.callback=callback;
return params;
}
function createXHR(uri, options, callback){
options=initParams(uri, options, callback);
return _createXHR(options);
}
function _createXHR(options){
if(typeof options.callback==="undefined"){
throw new Error("callback argument missing");
}
var called=false;
var callback=function cbOnce(err, response, body){
if(!called){
called=true;
options.callback(err, response, body);
}};
function readystatechange(){
if(xhr.readyState===4){
setTimeout(loadFunc, 0);
}}
function getBody(){
var body=undefined;
if(xhr.response){
body=xhr.response;
}else{
body=xhr.responseText||getXml(xhr);
}
if(isJson){
try {
body=JSON.parse(body);
} catch (e){}}
return body;
}
function errorFunc(evt){
clearTimeout(timeoutTimer);
if(!(evt instanceof Error)){
evt=new Error("" + (evt||"Unknown XMLHttpRequest Error"));
}
evt.statusCode=0;
return callback(evt, failureResponse);
}
function loadFunc(){
if(aborted) return;
var status;
clearTimeout(timeoutTimer);
if(options.useXDR&&xhr.status===undefined){
status=200;
}else{
status=xhr.status===1223 ? 204:xhr.status;
}
var response=failureResponse;
var err=null;
if(status!==0){
response={
body: getBody(),
statusCode: status,
method: method,
headers: {},
url: uri,
rawRequest: xhr
};
if(xhr.getAllResponseHeaders){
response.headers=parseHeaders(xhr.getAllResponseHeaders());
}}else{
err=new Error("Internal XMLHttpRequest Error");
}
return callback(err, response, response.body);
}
var xhr=options.xhr||null;
if(!xhr){
if(options.cors||options.useXDR){
xhr=new createXHR.XDomainRequest();
}else{
xhr=new createXHR.XMLHttpRequest();
}}
var key;
var aborted;
var uri=xhr.url=options.uri||options.url;
var method=xhr.method=options.method||"GET";
var body=options.body||options.data;
var headers=xhr.headers=options.headers||{};
var sync = !!options.sync;
var isJson=false;
var timeoutTimer;
var failureResponse={
body: undefined,
headers: {},
statusCode: 0,
method: method,
url: uri,
rawRequest: xhr
};
if("json" in options&&options.json!==false){
isJson=true;
headers["accept"]||headers["Accept"]||(headers["Accept"]="application/json");
if(method!=="GET"&&method!=="HEAD"){
headers["content-type"]||headers["Content-Type"]||(headers["Content-Type"]="application/json");
body=JSON.stringify(options.json===true ? body:options.json);
}}
xhr.onreadystatechange=readystatechange;
xhr.onload=loadFunc;
xhr.onerror=errorFunc;
xhr.onprogress=function (){
};
xhr.onabort=function (){
aborted=true;
};
xhr.ontimeout=errorFunc;
xhr.open(method, uri, !sync, options.username, options.password);
if(!sync){
xhr.withCredentials = !!options.withCredentials;
}
if(!sync&&options.timeout > 0){
timeoutTimer=setTimeout(function (){
if(aborted) return;
aborted=true;
xhr.abort("timeout");
var e=new Error("XMLHttpRequest timeout");
e.code="ETIMEDOUT";
errorFunc(e);
}, options.timeout);
}
if(xhr.setRequestHeader){
for (key in headers){
if(headers.hasOwnProperty(key)){
xhr.setRequestHeader(key, headers[key]);
}}
}else if(options.headers&&!isEmpty(options.headers)){
throw new Error("Headers cannot be set on an XDomainRequest object");
}
if("responseType" in options){
xhr.responseType=options.responseType;
}
if("beforeSend" in options&&typeof options.beforeSend==="function"){
options.beforeSend(xhr);
}
xhr.send(body||null);
return xhr;
}
function getXml(xhr){
try {
if(xhr.responseType==="document"){
return xhr.responseXML;
}
var firefoxBugTakenEffect=xhr.responseXML&&xhr.responseXML.documentElement.nodeName==="parsererror";
if(xhr.responseType===""&&!firefoxBugTakenEffect){
return xhr.responseXML;
}} catch (e){}
return null;
}
function noop(){}
xhr["default"]=default_1;
var parseCues=function parseCues(srcContent, track){
var parser=new window$1.WebVTT.Parser(window$1, window$1.vttjs, window$1.WebVTT.StringDecoder());
var errors=[];
parser.oncue=function (cue){
track.addCue(cue);
};
parser.onparsingerror=function (error){
errors.push(error);
};
parser.onflush=function (){
track.trigger({
type: 'loadeddata',
target: track
});
};
parser.parse(srcContent);
if(errors.length > 0){
if(window$1.console&&window$1.console.groupCollapsed){
window$1.console.groupCollapsed("Text Track parsing errors for " + track.src);
}
errors.forEach(function (error){
return log.error(error);
});
if(window$1.console&&window$1.console.groupEnd){
window$1.console.groupEnd();
}}
parser.flush();
};
var loadTrack=function loadTrack(src, track){
var opts={
uri: src
};
var crossOrigin=isCrossOrigin(src);
if(crossOrigin){
opts.cors=crossOrigin;
}
xhr(opts, bind(this, function (err, response, responseBody){
if(err){
return log.error(err, response);
}
track.loaded_=true;
if(typeof window$1.WebVTT!=='function'){
if(track.tech_){
track.tech_.any(['vttjsloaded', 'vttjserror'], function (event){
if(event.type==='vttjserror'){
log.error("vttjs failed to load, stopping trying to process " + track.src);
return;
}
return parseCues(responseBody, track);
});
}}else{
parseCues(responseBody, track);
}}));
};
var TextTrack =
function (_Track){
inheritsLoose(TextTrack, _Track);
function TextTrack(options){
var _this;
if(options===void 0){
options={};}
if(!options.tech){
throw new Error('A tech was not provided.');
}
var settings=mergeOptions(options, {
kind: TextTrackKind[options.kind]||'subtitles',
language: options.language||options.srclang||''
});
var mode=TextTrackMode[settings.mode]||'disabled';
var default_=settings["default"];
if(settings.kind==='metadata'||settings.kind==='chapters'){
mode='hidden';
}
_this=_Track.call(this, settings)||this;
_this.tech_=settings.tech;
_this.cues_=[];
_this.activeCues_=[];
_this.preload_=_this.tech_.preloadTextTracks!==false;
var cues=new TextTrackCueList(_this.cues_);
var activeCues=new TextTrackCueList(_this.activeCues_);
var changed=false;
var timeupdateHandler=bind(assertThisInitialized(_this), function (){
this.activeCues=this.activeCues;
if(changed){
this.trigger('cuechange');
changed=false;
}});
if(mode!=='disabled'){
_this.tech_.ready(function (){
_this.tech_.on('timeupdate', timeupdateHandler);
}, true);
}
Object.defineProperties(assertThisInitialized(_this), {
"default": {
get: function get(){
return default_;
},
set: function set(){}},
mode: {
get: function get(){
return mode;
},
set: function set(newMode){
var _this2=this;
if(!TextTrackMode[newMode]){
return;
}
mode=newMode;
if(!this.preload_&&mode!=='disabled'&&this.cues.length===0){
loadTrack(this.src, this);
}
if(mode!=='disabled'){
this.tech_.ready(function (){
_this2.tech_.on('timeupdate', timeupdateHandler);
}, true);
}else{
this.tech_.off('timeupdate', timeupdateHandler);
}
this.trigger('modechange');
}},
cues: {
get: function get(){
if(!this.loaded_){
return null;
}
return cues;
},
set: function set(){}},
activeCues: {
get: function get(){
if(!this.loaded_){
return null;
}
if(this.cues.length===0){
return activeCues;
}
var ct=this.tech_.currentTime();
var active=[];
for (var i=0, l=this.cues.length; i < l; i++){
var cue=this.cues[i];
if(cue.startTime <=ct&&cue.endTime >=ct){
active.push(cue);
}else if(cue.startTime===cue.endTime&&cue.startTime <=ct&&cue.startTime + 0.5 >=ct){
active.push(cue);
}}
changed=false;
if(active.length!==this.activeCues_.length){
changed=true;
}else{
for (var _i=0; _i < active.length; _i++){
if(this.activeCues_.indexOf(active[_i])===-1){
changed=true;
}}
}
this.activeCues_=active;
activeCues.setCues_(this.activeCues_);
return activeCues;
},
set: function set(){}}
});
if(settings.src){
_this.src=settings.src;
if(!_this.preload_){
_this.loaded_=true;
}
if(_this.preload_||default_||settings.kind!=='subtitles'&&settings.kind!=='captions'){
loadTrack(_this.src, assertThisInitialized(_this));
}}else{
_this.loaded_=true;
}
return _this;
}
var _proto=TextTrack.prototype;
_proto.addCue=function addCue(originalCue){
var cue=originalCue;
if(window$1.vttjs&&!(originalCue instanceof window$1.vttjs.VTTCue)){
cue=new window$1.vttjs.VTTCue(originalCue.startTime, originalCue.endTime, originalCue.text);
for (var prop in originalCue){
if(!(prop in cue)){
cue[prop]=originalCue[prop];
}}
cue.id=originalCue.id;
cue.originalCue_=originalCue;
}
var tracks=this.tech_.textTracks();
for (var i=0; i < tracks.length; i++){
if(tracks[i]!==this){
tracks[i].removeCue(cue);
}}
this.cues_.push(cue);
this.cues.setCues_(this.cues_);
}
;
_proto.removeCue=function removeCue(_removeCue){
var i=this.cues_.length;
while (i--){
var cue=this.cues_[i];
if(cue===_removeCue||cue.originalCue_&&cue.originalCue_===_removeCue){
this.cues_.splice(i, 1);
this.cues.setCues_(this.cues_);
break;
}}
};
return TextTrack;
}(Track);
TextTrack.prototype.allowedEvents_={
cuechange: 'cuechange'
};
var AudioTrack =
function (_Track){
inheritsLoose(AudioTrack, _Track);
function AudioTrack(options){
var _this;
if(options===void 0){
options={};}
var settings=mergeOptions(options, {
kind: AudioTrackKind[options.kind]||''
});
_this=_Track.call(this, settings)||this;
var enabled=false;
Object.defineProperty(assertThisInitialized(_this), 'enabled', {
get: function get(){
return enabled;
},
set: function set(newEnabled){
if(typeof newEnabled!=='boolean'||newEnabled===enabled){
return;
}
enabled=newEnabled;
this.trigger('enabledchange');
}});
if(settings.enabled){
_this.enabled=settings.enabled;
}
_this.loaded_=true;
return _this;
}
return AudioTrack;
}(Track);
var VideoTrack =
function (_Track){
inheritsLoose(VideoTrack, _Track);
function VideoTrack(options){
var _this;
if(options===void 0){
options={};}
var settings=mergeOptions(options, {
kind: VideoTrackKind[options.kind]||''
});
_this=_Track.call(this, settings)||this;
var selected=false;
Object.defineProperty(assertThisInitialized(_this), 'selected', {
get: function get(){
return selected;
},
set: function set(newSelected){
if(typeof newSelected!=='boolean'||newSelected===selected){
return;
}
selected=newSelected;
this.trigger('selectedchange');
}});
if(settings.selected){
_this.selected=settings.selected;
}
return _this;
}
return VideoTrack;
}(Track);
var NONE=0;
var LOADING=1;
var LOADED=2;
var ERROR=3;
var HTMLTrackElement =
function (_EventTarget){
inheritsLoose(HTMLTrackElement, _EventTarget);
function HTMLTrackElement(options){
var _this;
if(options===void 0){
options={};}
_this=_EventTarget.call(this)||this;
var readyState;
var track=new TextTrack(options);
_this.kind=track.kind;
_this.src=track.src;
_this.srclang=track.language;
_this.label=track.label;
_this["default"]=track["default"];
Object.defineProperties(assertThisInitialized(_this), {
readyState: {
get: function get(){
return readyState;
}},
track: {
get: function get(){
return track;
}}
});
readyState=NONE;
track.addEventListener('loadeddata', function (){
readyState=LOADED;
_this.trigger({
type: 'load',
target: assertThisInitialized(_this)
});
});
return _this;
}
return HTMLTrackElement;
}(EventTarget);
HTMLTrackElement.prototype.allowedEvents_={
load: 'load'
};
HTMLTrackElement.NONE=NONE;
HTMLTrackElement.LOADING=LOADING;
HTMLTrackElement.LOADED=LOADED;
HTMLTrackElement.ERROR=ERROR;
var NORMAL={
audio: {
ListClass: AudioTrackList,
TrackClass: AudioTrack,
capitalName: 'Audio'
},
video: {
ListClass: VideoTrackList,
TrackClass: VideoTrack,
capitalName: 'Video'
},
text: {
ListClass: TextTrackList,
TrackClass: TextTrack,
capitalName: 'Text'
}};
Object.keys(NORMAL).forEach(function (type){
NORMAL[type].getterName=type + "Tracks";
NORMAL[type].privateName=type + "Tracks_";
});
var REMOTE={
remoteText: {
ListClass: TextTrackList,
TrackClass: TextTrack,
capitalName: 'RemoteText',
getterName: 'remoteTextTracks',
privateName: 'remoteTextTracks_'
},
remoteTextEl: {
ListClass: HtmlTrackElementList,
TrackClass: HTMLTrackElement,
capitalName: 'RemoteTextTrackEls',
getterName: 'remoteTextTrackEls',
privateName: 'remoteTextTrackEls_'
}};
var ALL=_extends_1({}, NORMAL, REMOTE);
REMOTE.names=Object.keys(REMOTE);
NORMAL.names=Object.keys(NORMAL);
ALL.names=[].concat(REMOTE.names).concat(NORMAL.names);
var _objCreate=Object.create||function (){
function F(){}
return function (o){
if(arguments.length!==1){
throw new Error('Object.create shim only accepts one parameter.');
}
F.prototype=o;
return new F();
};}();
function ParsingError(errorData, message){
this.name="ParsingError";
this.code=errorData.code;
this.message=message||errorData.message;
}
ParsingError.prototype=_objCreate(Error.prototype);
ParsingError.prototype.constructor=ParsingError;
ParsingError.Errors={
BadSignature: {
code: 0,
message: "Malformed WebVTT signature."
},
BadTimeStamp: {
code: 1,
message: "Malformed time stamp."
}};
function parseTimeStamp(input){
function computeSeconds(h, m, s, f){
return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + (f | 0) / 1000;
}
var m=input.match(/^(\d+):(\d{1,2})(:\d{1,2})?\.(\d{3})/);
if(!m){
return null;
}
if(m[3]){
return computeSeconds(m[1], m[2], m[3].replace(":", ""), m[4]);
}else if(m[1] > 59){
return computeSeconds(m[1], m[2], 0, m[4]);
}else{
return computeSeconds(0, m[1], m[2], m[4]);
}}
function Settings(){
this.values=_objCreate(null);
}
Settings.prototype={
set: function set(k, v){
if(!this.get(k)&&v!==""){
this.values[k]=v;
}},
get: function get(k, dflt, defaultKey){
if(defaultKey){
return this.has(k) ? this.values[k]:dflt[defaultKey];
}
return this.has(k) ? this.values[k]:dflt;
},
has: function has(k){
return k in this.values;
},
alt: function alt(k, v, a){
for (var n=0; n < a.length; ++n){
if(v===a[n]){
this.set(k, v);
break;
}}
},
integer: function integer(k, v){
if(/^-?\d+$/.test(v)){
this.set(k, parseInt(v, 10));
}},
percent: function percent(k, v){
var m;
if(m=v.match(/^([\d]{1,3})(\.[\d]*)?%$/)){
v=parseFloat(v);
if(v >=0&&v <=100){
this.set(k, v);
return true;
}}
return false;
}};
function parseOptions(input, callback, keyValueDelim, groupDelim){
var groups=groupDelim ? input.split(groupDelim):[input];
for (var i in groups){
if(typeof groups[i]!=="string"){
continue;
}
var kv=groups[i].split(keyValueDelim);
if(kv.length!==2){
continue;
}
var k=kv[0];
var v=kv[1];
callback(k, v);
}}
function parseCue(input, cue, regionList){
var oInput=input;
function consumeTimeStamp(){
var ts=parseTimeStamp(input);
if(ts===null){
throw new ParsingError(ParsingError.Errors.BadTimeStamp, "Malformed timestamp: " + oInput);
}
input=input.replace(/^[^\sa-zA-Z-]+/, "");
return ts;
}
function consumeCueSettings(input, cue){
var settings=new Settings();
parseOptions(input, function (k, v){
switch (k){
case "region":
for (var i=regionList.length - 1; i >=0; i--){
if(regionList[i].id===v){
settings.set(k, regionList[i].region);
break;
}}
break;
case "vertical":
settings.alt(k, v, ["rl", "lr"]);
break;
case "line":
var vals=v.split(","),
vals0=vals[0];
settings.integer(k, vals0);
settings.percent(k, vals0) ? settings.set("snapToLines", false):null;
settings.alt(k, vals0, ["auto"]);
if(vals.length===2){
settings.alt("lineAlign", vals[1], ["start", "center", "end"]);
}
break;
case "position":
vals=v.split(",");
settings.percent(k, vals[0]);
if(vals.length===2){
settings.alt("positionAlign", vals[1], ["start", "center", "end"]);
}
break;
case "size":
settings.percent(k, v);
break;
case "align":
settings.alt(k, v, ["start", "center", "end", "left", "right"]);
break;
}}, /:/, /\s/);
cue.region=settings.get("region", null);
cue.vertical=settings.get("vertical", "");
try {
cue.line=settings.get("line", "auto");
} catch (e){}
cue.lineAlign=settings.get("lineAlign", "start");
cue.snapToLines=settings.get("snapToLines", true);
cue.size=settings.get("size", 100);
try {
cue.align=settings.get("align", "center");
} catch (e){
cue.align=settings.get("align", "middle");
}
try {
cue.position=settings.get("position", "auto");
} catch (e){
cue.position=settings.get("position", {
start: 0,
left: 0,
center: 50,
middle: 50,
end: 100,
right: 100
}, cue.align);
}
cue.positionAlign=settings.get("positionAlign", {
start: "start",
left: "start",
center: "center",
middle: "center",
end: "end",
right: "end"
}, cue.align);
}
function skipWhitespace(){
input=input.replace(/^\s+/, "");
}
skipWhitespace();
cue.startTime=consumeTimeStamp();
skipWhitespace();
if(input.substr(0, 3)!=="-->"){
throw new ParsingError(ParsingError.Errors.BadTimeStamp, "Malformed time stamp (time stamps must be separated by '-->'): " + oInput);
}
input=input.substr(3);
skipWhitespace();
cue.endTime=consumeTimeStamp();
skipWhitespace();
consumeCueSettings(input, cue);
}
var TEXTAREA_ELEMENT=document.createElement("textarea");
var TAG_NAME={
c: "span",
i: "i",
b: "b",
u: "u",
ruby: "ruby",
rt: "rt",
v: "span",
lang: "span"
};
var DEFAULT_COLOR_CLASS={
white: 'rgba(255,255,255,1)',
lime: 'rgba(0,255,0,1)',
cyan: 'rgba(0,255,255,1)',
red: 'rgba(255,0,0,1)',
yellow: 'rgba(255,255,0,1)',
magenta: 'rgba(255,0,255,1)',
blue: 'rgba(0,0,255,1)',
black: 'rgba(0,0,0,1)'
};
var TAG_ANNOTATION={
v: "title",
lang: "lang"
};
var NEEDS_PARENT={
rt: "ruby"
};
function parseContent(window, input){
function nextToken(){
if(!input){
return null;
}
function consume(result){
input=input.substr(result.length);
return result;
}
var m=input.match(/^([^<]*)(<[^>]*>?)?/);
return consume(m[1] ? m[1]:m[2]);
}
function unescape(s){
TEXTAREA_ELEMENT.innerHTML=s;
s=TEXTAREA_ELEMENT.textContent;
TEXTAREA_ELEMENT.textContent="";
return s;
}
function shouldAdd(current, element){
return !NEEDS_PARENT[element.localName]||NEEDS_PARENT[element.localName]===current.localName;
}
function createElement(type, annotation){
var tagName=TAG_NAME[type];
if(!tagName){
return null;
}
var element=window.document.createElement(tagName);
var name=TAG_ANNOTATION[type];
if(name&&annotation){
element[name]=annotation.trim();
}
return element;
}
var rootDiv=window.document.createElement("div"),
current=rootDiv,
t,
tagStack=[];
while ((t=nextToken())!==null){
if(t[0]==='<'){
if(t[1]==="/"){
if(tagStack.length&&tagStack[tagStack.length - 1]===t.substr(2).replace(">", "")){
tagStack.pop();
current=current.parentNode;
}
continue;
}
var ts=parseTimeStamp(t.substr(1, t.length - 2));
var node;
if(ts){
node=window.document.createProcessingInstruction("timestamp", ts);
current.appendChild(node);
continue;
}
var m=t.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/);
if(!m){
continue;
}
node=createElement(m[1], m[3]);
if(!node){
continue;
}
if(!shouldAdd(current, node)){
continue;
}
if(m[2]){
var classes=m[2].split('.');
classes.forEach(function (cl){
var bgColor=/^bg_/.test(cl);
var colorName=bgColor ? cl.slice(3):cl;
if(DEFAULT_COLOR_CLASS.hasOwnProperty(colorName)){
var propName=bgColor ? 'background-color':'color';
var propValue=DEFAULT_COLOR_CLASS[colorName];
node.style[propName]=propValue;
}});
node.className=classes.join(' ');
}
tagStack.push(m[1]);
current.appendChild(node);
current=node;
continue;
}
current.appendChild(window.document.createTextNode(unescape(t)));
}
return rootDiv;
}
var strongRTLRanges=[[0x5be, 0x5be], [0x5c0, 0x5c0], [0x5c3, 0x5c3], [0x5c6, 0x5c6], [0x5d0, 0x5ea], [0x5f0, 0x5f4], [0x608, 0x608], [0x60b, 0x60b], [0x60d, 0x60d], [0x61b, 0x61b], [0x61e, 0x64a], [0x66d, 0x66f], [0x671, 0x6d5], [0x6e5, 0x6e6], [0x6ee, 0x6ef], [0x6fa, 0x70d], [0x70f, 0x710], [0x712, 0x72f], [0x74d, 0x7a5], [0x7b1, 0x7b1], [0x7c0, 0x7ea], [0x7f4, 0x7f5], [0x7fa, 0x7fa], [0x800, 0x815], [0x81a, 0x81a], [0x824, 0x824], [0x828, 0x828], [0x830, 0x83e], [0x840, 0x858], [0x85e, 0x85e], [0x8a0, 0x8a0], [0x8a2, 0x8ac], [0x200f, 0x200f], [0xfb1d, 0xfb1d], [0xfb1f, 0xfb28], [0xfb2a, 0xfb36], [0xfb38, 0xfb3c], [0xfb3e, 0xfb3e], [0xfb40, 0xfb41], [0xfb43, 0xfb44], [0xfb46, 0xfbc1], [0xfbd3, 0xfd3d], [0xfd50, 0xfd8f], [0xfd92, 0xfdc7], [0xfdf0, 0xfdfc], [0xfe70, 0xfe74], [0xfe76, 0xfefc], [0x10800, 0x10805], [0x10808, 0x10808], [0x1080a, 0x10835], [0x10837, 0x10838], [0x1083c, 0x1083c], [0x1083f, 0x10855], [0x10857, 0x1085f], [0x10900, 0x1091b], [0x10920, 0x10939], [0x1093f, 0x1093f], [0x10980, 0x109b7], [0x109be, 0x109bf], [0x10a00, 0x10a00], [0x10a10, 0x10a13], [0x10a15, 0x10a17], [0x10a19, 0x10a33], [0x10a40, 0x10a47], [0x10a50, 0x10a58], [0x10a60, 0x10a7f], [0x10b00, 0x10b35], [0x10b40, 0x10b55], [0x10b58, 0x10b72], [0x10b78, 0x10b7f], [0x10c00, 0x10c48], [0x1ee00, 0x1ee03], [0x1ee05, 0x1ee1f], [0x1ee21, 0x1ee22], [0x1ee24, 0x1ee24], [0x1ee27, 0x1ee27], [0x1ee29, 0x1ee32], [0x1ee34, 0x1ee37], [0x1ee39, 0x1ee39], [0x1ee3b, 0x1ee3b], [0x1ee42, 0x1ee42], [0x1ee47, 0x1ee47], [0x1ee49, 0x1ee49], [0x1ee4b, 0x1ee4b], [0x1ee4d, 0x1ee4f], [0x1ee51, 0x1ee52], [0x1ee54, 0x1ee54], [0x1ee57, 0x1ee57], [0x1ee59, 0x1ee59], [0x1ee5b, 0x1ee5b], [0x1ee5d, 0x1ee5d], [0x1ee5f, 0x1ee5f], [0x1ee61, 0x1ee62], [0x1ee64, 0x1ee64], [0x1ee67, 0x1ee6a], [0x1ee6c, 0x1ee72], [0x1ee74, 0x1ee77], [0x1ee79, 0x1ee7c], [0x1ee7e, 0x1ee7e], [0x1ee80, 0x1ee89], [0x1ee8b, 0x1ee9b], [0x1eea1, 0x1eea3], [0x1eea5, 0x1eea9], [0x1eeab, 0x1eebb], [0x10fffd, 0x10fffd]];
function isStrongRTLChar(charCode){
for (var i=0; i < strongRTLRanges.length; i++){
var currentRange=strongRTLRanges[i];
if(charCode >=currentRange[0]&&charCode <=currentRange[1]){
return true;
}}
return false;
}
function determineBidi(cueDiv){
var nodeStack=[],
text="",
charCode;
if(!cueDiv||!cueDiv.childNodes){
return "ltr";
}
function pushNodes(nodeStack, node){
for (var i=node.childNodes.length - 1; i >=0; i--){
nodeStack.push(node.childNodes[i]);
}}
function nextTextNode(nodeStack){
if(!nodeStack||!nodeStack.length){
return null;
}
var node=nodeStack.pop(),
text=node.textContent||node.innerText;
if(text){
var m=text.match(/^.*(\n|\r)/);
if(m){
nodeStack.length=0;
return m[0];
}
return text;
}
if(node.tagName==="ruby"){
return nextTextNode(nodeStack);
}
if(node.childNodes){
pushNodes(nodeStack, node);
return nextTextNode(nodeStack);
}}
pushNodes(nodeStack, cueDiv);
while (text=nextTextNode(nodeStack)){
for (var i=0; i < text.length; i++){
charCode=text.charCodeAt(i);
if(isStrongRTLChar(charCode)){
return "rtl";
}}
}
return "ltr";
}
function computeLinePos(cue){
if(typeof cue.line==="number"&&(cue.snapToLines||cue.line >=0&&cue.line <=100)){
return cue.line;
}
if(!cue.track||!cue.track.textTrackList||!cue.track.textTrackList.mediaElement){
return -1;
}
var track=cue.track,
trackList=track.textTrackList,
count=0;
for (var i=0; i < trackList.length&&trackList[i]!==track; i++){
if(trackList[i].mode==="showing"){
count++;
}}
return ++count * -1;
}
function StyleBox(){}
StyleBox.prototype.applyStyles=function (styles, div){
div=div||this.div;
for (var prop in styles){
if(styles.hasOwnProperty(prop)){
div.style[prop]=styles[prop];
}}
};
StyleBox.prototype.formatStyle=function (val, unit){
return val===0 ? 0:val + unit;
};
function CueStyleBox(window, cue, styleOptions){
StyleBox.call(this);
this.cue=cue;
this.cueDiv=parseContent(window, cue.text);
var styles={
color: "rgba(255, 255, 255, 1)",
backgroundColor: "rgba(0, 0, 0, 0.8)",
position: "relative",
left: 0,
right: 0,
top: 0,
bottom: 0,
display: "inline",
writingMode: cue.vertical==="" ? "horizontal-tb":cue.vertical==="lr" ? "vertical-lr":"vertical-rl",
unicodeBidi: "plaintext"
};
this.applyStyles(styles, this.cueDiv);
this.div=window.document.createElement("div");
styles={
direction: determineBidi(this.cueDiv),
writingMode: cue.vertical==="" ? "horizontal-tb":cue.vertical==="lr" ? "vertical-lr":"vertical-rl",
unicodeBidi: "plaintext",
textAlign: cue.align==="middle" ? "center":cue.align,
font: styleOptions.font,
whiteSpace: "pre-line",
position: "absolute"
};
this.applyStyles(styles);
this.div.appendChild(this.cueDiv);
var textPos=0;
switch (cue.positionAlign){
case "start":
textPos=cue.position;
break;
case "center":
textPos=cue.position - cue.size / 2;
break;
case "end":
textPos=cue.position - cue.size;
break;
}
if(cue.vertical===""){
this.applyStyles({
left: this.formatStyle(textPos, "%"),
width: this.formatStyle(cue.size, "%")
});
}else{
this.applyStyles({
top: this.formatStyle(textPos, "%"),
height: this.formatStyle(cue.size, "%")
});
}
this.move=function (box){
this.applyStyles({
top: this.formatStyle(box.top, "px"),
bottom: this.formatStyle(box.bottom, "px"),
left: this.formatStyle(box.left, "px"),
right: this.formatStyle(box.right, "px"),
height: this.formatStyle(box.height, "px"),
width: this.formatStyle(box.width, "px")
});
};}
CueStyleBox.prototype=_objCreate(StyleBox.prototype);
CueStyleBox.prototype.constructor=CueStyleBox;
function BoxPosition(obj){
var lh, height, width, top;
if(obj.div){
height=obj.div.offsetHeight;
width=obj.div.offsetWidth;
top=obj.div.offsetTop;
var rects=(rects=obj.div.childNodes)&&(rects=rects[0])&&rects.getClientRects&&rects.getClientRects();
obj=obj.div.getBoundingClientRect();
lh=rects ? Math.max(rects[0]&&rects[0].height||0, obj.height / rects.length):0;
}
this.left=obj.left;
this.right=obj.right;
this.top=obj.top||top;
this.height=obj.height||height;
this.bottom=obj.bottom||top + (obj.height||height);
this.width=obj.width||width;
this.lineHeight=lh!==undefined ? lh:obj.lineHeight;
}
BoxPosition.prototype.move=function (axis, toMove){
toMove=toMove!==undefined ? toMove:this.lineHeight;
switch (axis){
case "+x":
this.left +=toMove;
this.right +=toMove;
break;
case "-x":
this.left -=toMove;
this.right -=toMove;
break;
case "+y":
this.top +=toMove;
this.bottom +=toMove;
break;
case "-y":
this.top -=toMove;
this.bottom -=toMove;
break;
}};
BoxPosition.prototype.overlaps=function (b2){
return this.left < b2.right&&this.right > b2.left&&this.top < b2.bottom&&this.bottom > b2.top;
};
BoxPosition.prototype.overlapsAny=function (boxes){
for (var i=0; i < boxes.length; i++){
if(this.overlaps(boxes[i])){
return true;
}}
return false;
};
BoxPosition.prototype.within=function (container){
return this.top >=container.top&&this.bottom <=container.bottom&&this.left >=container.left&&this.right <=container.right;
};
BoxPosition.prototype.overlapsOppositeAxis=function (container, axis){
switch (axis){
case "+x":
return this.left < container.left;
case "-x":
return this.right > container.right;
case "+y":
return this.top < container.top;
case "-y":
return this.bottom > container.bottom;
}};
BoxPosition.prototype.intersectPercentage=function (b2){
var x=Math.max(0, Math.min(this.right, b2.right) - Math.max(this.left, b2.left)),
y=Math.max(0, Math.min(this.bottom, b2.bottom) - Math.max(this.top, b2.top)),
intersectArea=x * y;
return intersectArea / (this.height * this.width);
};
BoxPosition.prototype.toCSSCompatValues=function (reference){
return {
top: this.top - reference.top,
bottom: reference.bottom - this.bottom,
left: this.left - reference.left,
right: reference.right - this.right,
height: this.height,
width: this.width
};};
BoxPosition.getSimpleBoxPosition=function (obj){
var height=obj.div ? obj.div.offsetHeight:obj.tagName ? obj.offsetHeight:0;
var width=obj.div ? obj.div.offsetWidth:obj.tagName ? obj.offsetWidth:0;
var top=obj.div ? obj.div.offsetTop:obj.tagName ? obj.offsetTop:0;
obj=obj.div ? obj.div.getBoundingClientRect():obj.tagName ? obj.getBoundingClientRect():obj;
var ret={
left: obj.left,
right: obj.right,
top: obj.top||top,
height: obj.height||height,
bottom: obj.bottom||top + (obj.height||height),
width: obj.width||width
};
return ret;
};
function moveBoxToLinePosition(window, styleBox, containerBox, boxPositions){
function findBestPosition(b, axis){
var bestPosition,
specifiedPosition=new BoxPosition(b),
percentage=1;
for (var i=0; i < axis.length; i++){
while (b.overlapsOppositeAxis(containerBox, axis[i])||b.within(containerBox)&&b.overlapsAny(boxPositions)){
b.move(axis[i]);
}
if(b.within(containerBox)){
return b;
}
var p=b.intersectPercentage(containerBox);
if(percentage > p){
bestPosition=new BoxPosition(b);
percentage=p;
}
b=new BoxPosition(specifiedPosition);
}
return bestPosition||specifiedPosition;
}
var boxPosition=new BoxPosition(styleBox),
cue=styleBox.cue,
linePos=computeLinePos(cue),
axis=[];
if(cue.snapToLines){
var size;
switch (cue.vertical){
case "":
axis=["+y", "-y"];
size="height";
break;
case "rl":
axis=["+x", "-x"];
size="width";
break;
case "lr":
axis=["-x", "+x"];
size="width";
break;
}
var step=boxPosition.lineHeight,
position=step * Math.round(linePos),
maxPosition=containerBox[size] + step,
initialAxis=axis[0];
if(Math.abs(position) > maxPosition){
position=position < 0 ? -1:1;
position *=Math.ceil(maxPosition / step) * step;
}
if(linePos < 0){
position +=cue.vertical==="" ? containerBox.height:containerBox.width;
axis=axis.reverse();
}
boxPosition.move(initialAxis, position);
}else{
var calculatedPercentage=boxPosition.lineHeight / containerBox.height * 100;
switch (cue.lineAlign){
case "center":
linePos -=calculatedPercentage / 2;
break;
case "end":
linePos -=calculatedPercentage;
break;
}
switch (cue.vertical){
case "":
styleBox.applyStyles({
top: styleBox.formatStyle(linePos, "%")
});
break;
case "rl":
styleBox.applyStyles({
left: styleBox.formatStyle(linePos, "%")
});
break;
case "lr":
styleBox.applyStyles({
right: styleBox.formatStyle(linePos, "%")
});
break;
}
axis=["+y", "-x", "+x", "-y"];
boxPosition=new BoxPosition(styleBox);
}
var bestPosition=findBestPosition(boxPosition, axis);
styleBox.move(bestPosition.toCSSCompatValues(containerBox));
}
function WebVTT$1(){}
WebVTT$1.StringDecoder=function (){
return {
decode: function decode(data){
if(!data){
return "";
}
if(typeof data!=="string"){
throw new Error("Error - expected string data.");
}
return decodeURIComponent(encodeURIComponent(data));
}};};
WebVTT$1.convertCueToDOMTree=function (window, cuetext){
if(!window||!cuetext){
return null;
}
return parseContent(window, cuetext);
};
var FONT_SIZE_PERCENT=0.05;
var FONT_STYLE="sans-serif";
var CUE_BACKGROUND_PADDING="1.5%";
WebVTT$1.processCues=function (window, cues, overlay){
if(!window||!cues||!overlay){
return null;
}
while (overlay.firstChild){
overlay.removeChild(overlay.firstChild);
}
var paddedOverlay=window.document.createElement("div");
paddedOverlay.style.position="absolute";
paddedOverlay.style.left="0";
paddedOverlay.style.right="0";
paddedOverlay.style.top="0";
paddedOverlay.style.bottom="0";
paddedOverlay.style.margin=CUE_BACKGROUND_PADDING;
overlay.appendChild(paddedOverlay);
function shouldCompute(cues){
for (var i=0; i < cues.length; i++){
if(cues[i].hasBeenReset||!cues[i].displayState){
return true;
}}
return false;
}
if(!shouldCompute(cues)){
for (var i=0; i < cues.length; i++){
paddedOverlay.appendChild(cues[i].displayState);
}
return;
}
var boxPositions=[],
containerBox=BoxPosition.getSimpleBoxPosition(paddedOverlay),
fontSize=Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100;
var styleOptions={
font: fontSize + "px " + FONT_STYLE
};
(function (){
var styleBox, cue;
for (var i=0; i < cues.length; i++){
cue=cues[i];
styleBox=new CueStyleBox(window, cue, styleOptions);
paddedOverlay.appendChild(styleBox.div);
moveBoxToLinePosition(window, styleBox, containerBox, boxPositions);
cue.displayState=styleBox.div;
boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox));
}})();
};
WebVTT$1.Parser=function (window, vttjs, decoder){
if(!decoder){
decoder=vttjs;
vttjs={};}
if(!vttjs){
vttjs={};}
this.window=window;
this.vttjs=vttjs;
this.state="INITIAL";
this.buffer="";
this.decoder=decoder||new TextDecoder("utf8");
this.regionList=[];
};
WebVTT$1.Parser.prototype={
reportOrThrowError: function reportOrThrowError(e){
if(e instanceof ParsingError){
this.onparsingerror&&this.onparsingerror(e);
}else{
throw e;
}},
parse: function parse(data){
var self=this;
if(data){
self.buffer +=self.decoder.decode(data, {
stream: true
});
}
function collectNextLine(){
var buffer=self.buffer;
var pos=0;
while (pos < buffer.length&&buffer[pos]!=='\r'&&buffer[pos]!=='\n'){
++pos;
}
var line=buffer.substr(0, pos);
if(buffer[pos]==='\r'){
++pos;
}
if(buffer[pos]==='\n'){
++pos;
}
self.buffer=buffer.substr(pos);
return line;
}
function parseRegion(input){
var settings=new Settings();
parseOptions(input, function (k, v){
switch (k){
case "id":
settings.set(k, v);
break;
case "width":
settings.percent(k, v);
break;
case "lines":
settings.integer(k, v);
break;
case "regionanchor":
case "viewportanchor":
var xy=v.split(',');
if(xy.length!==2){
break;
}
var anchor=new Settings();
anchor.percent("x", xy[0]);
anchor.percent("y", xy[1]);
if(!anchor.has("x")||!anchor.has("y")){
break;
}
settings.set(k + "X", anchor.get("x"));
settings.set(k + "Y", anchor.get("y"));
break;
case "scroll":
settings.alt(k, v, ["up"]);
break;
}}, /=/, /\s/);
if(settings.has("id")){
var region=new (self.vttjs.VTTRegion||self.window.VTTRegion)();
region.width=settings.get("width", 100);
region.lines=settings.get("lines", 3);
region.regionAnchorX=settings.get("regionanchorX", 0);
region.regionAnchorY=settings.get("regionanchorY", 100);
region.viewportAnchorX=settings.get("viewportanchorX", 0);
region.viewportAnchorY=settings.get("viewportanchorY", 100);
region.scroll=settings.get("scroll", "");
self.onregion&&self.onregion(region);
self.regionList.push({
id: settings.get("id"),
region: region
});
}}
function parseTimestampMap(input){
var settings=new Settings();
parseOptions(input, function (k, v){
switch (k){
case "MPEGT":
settings.integer(k + 'S', v);
break;
case "LOCA":
settings.set(k + 'L', parseTimeStamp(v));
break;
}}, /[^\d]:/, /,/);
self.ontimestampmap&&self.ontimestampmap({
"MPEGTS": settings.get("MPEGTS"),
"LOCAL": settings.get("LOCAL")
});
}
function parseHeader(input){
if(input.match(/X-TIMESTAMP-MAP/)){
parseOptions(input, function (k, v){
switch (k){
case "X-TIMESTAMP-MAP":
parseTimestampMap(v);
break;
}}, /=/);
}else{
parseOptions(input, function (k, v){
switch (k){
case "Region":
parseRegion(v);
break;
}}, /:/);
}}
try {
var line;
if(self.state==="INITIAL"){
if(!/\r\n|\n/.test(self.buffer)){
return this;
}
line=collectNextLine();
var m=line.match(/^WEBVTT([ \t].*)?$/);
if(!m||!m[0]){
throw new ParsingError(ParsingError.Errors.BadSignature);
}
self.state="HEADER";
}
var alreadyCollectedLine=false;
while (self.buffer){
if(!/\r\n|\n/.test(self.buffer)){
return this;
}
if(!alreadyCollectedLine){
line=collectNextLine();
}else{
alreadyCollectedLine=false;
}
switch (self.state){
case "HEADER":
if(/:/.test(line)){
parseHeader(line);
}else if(!line){
self.state="ID";
}
continue;
case "NOTE":
if(!line){
self.state="ID";
}
continue;
case "ID":
if(/^NOTE($|[ \t])/.test(line)){
self.state="NOTE";
break;
}
if(!line){
continue;
}
self.cue=new (self.vttjs.VTTCue||self.window.VTTCue)(0, 0, "");
try {
self.cue.align="center";
} catch (e){
self.cue.align="middle";
}
self.state="CUE";
if(line.indexOf("-->")===-1){
self.cue.id=line;
continue;
}
case "CUE":
try {
parseCue(line, self.cue, self.regionList);
} catch (e){
self.reportOrThrowError(e);
self.cue=null;
self.state="BADCUE";
continue;
}
self.state="CUETEXT";
continue;
case "CUETEXT":
var hasSubstring=line.indexOf("-->")!==-1;
if(!line||hasSubstring&&(alreadyCollectedLine=true)){
self.oncue&&self.oncue(self.cue);
self.cue=null;
self.state="ID";
continue;
}
if(self.cue.text){
self.cue.text +="\n";
}
self.cue.text +=line.replace(/\u2028/g, '\n').replace(/u2029/g, '\n');
continue;
case "BADCUE":
if(!line){
self.state="ID";
}
continue;
}}
} catch (e){
self.reportOrThrowError(e);
if(self.state==="CUETEXT"&&self.cue&&self.oncue){
self.oncue(self.cue);
}
self.cue=null;
self.state=self.state==="INITIAL" ? "BADWEBVTT":"BADCUE";
}
return this;
},
flush: function flush(){
var self=this;
try {
self.buffer +=self.decoder.decode();
if(self.cue||self.state==="HEADER"){
self.buffer +="\n\n";
self.parse();
}
if(self.state==="INITIAL"){
throw new ParsingError(ParsingError.Errors.BadSignature);
}} catch (e){
self.reportOrThrowError(e);
}
self.onflush&&self.onflush();
return this;
}};
var vtt=WebVTT$1;
var autoKeyword="auto";
var directionSetting={
"": 1,
"lr": 1,
"rl": 1
};
var alignSetting={
"start": 1,
"center": 1,
"end": 1,
"left": 1,
"right": 1,
"auto": 1,
"line-left": 1,
"line-right": 1
};
function findDirectionSetting(value){
if(typeof value!=="string"){
return false;
}
var dir=directionSetting[value.toLowerCase()];
return dir ? value.toLowerCase():false;
}
function findAlignSetting(value){
if(typeof value!=="string"){
return false;
}
var align=alignSetting[value.toLowerCase()];
return align ? value.toLowerCase():false;
}
function VTTCue(startTime, endTime, text){
this.hasBeenReset=false;
var _id="";
var _pauseOnExit=false;
var _startTime=startTime;
var _endTime=endTime;
var _text=text;
var _region=null;
var _vertical="";
var _snapToLines=true;
var _line="auto";
var _lineAlign="start";
var _position="auto";
var _positionAlign="auto";
var _size=100;
var _align="center";
Object.defineProperties(this, {
"id": {
enumerable: true,
get: function get(){
return _id;
},
set: function set(value){
_id="" + value;
}},
"pauseOnExit": {
enumerable: true,
get: function get(){
return _pauseOnExit;
},
set: function set(value){
_pauseOnExit = !!value;
}},
"startTime": {
enumerable: true,
get: function get(){
return _startTime;
},
set: function set(value){
if(typeof value!=="number"){
throw new TypeError("Start time must be set to a number.");
}
_startTime=value;
this.hasBeenReset=true;
}},
"endTime": {
enumerable: true,
get: function get(){
return _endTime;
},
set: function set(value){
if(typeof value!=="number"){
throw new TypeError("End time must be set to a number.");
}
_endTime=value;
this.hasBeenReset=true;
}},
"text": {
enumerable: true,
get: function get(){
return _text;
},
set: function set(value){
_text="" + value;
this.hasBeenReset=true;
}},
"region": {
enumerable: true,
get: function get(){
return _region;
},
set: function set(value){
_region=value;
this.hasBeenReset=true;
}},
"vertical": {
enumerable: true,
get: function get(){
return _vertical;
},
set: function set(value){
var setting=findDirectionSetting(value);
if(setting===false){
throw new SyntaxError("Vertical: an invalid or illegal direction string was specified.");
}
_vertical=setting;
this.hasBeenReset=true;
}},
"snapToLines": {
enumerable: true,
get: function get(){
return _snapToLines;
},
set: function set(value){
_snapToLines = !!value;
this.hasBeenReset=true;
}},
"line": {
enumerable: true,
get: function get(){
return _line;
},
set: function set(value){
if(typeof value!=="number"&&value!==autoKeyword){
throw new SyntaxError("Line: an invalid number or illegal string was specified.");
}
_line=value;
this.hasBeenReset=true;
}},
"lineAlign": {
enumerable: true,
get: function get(){
return _lineAlign;
},
set: function set(value){
var setting=findAlignSetting(value);
if(!setting){
console.warn("lineAlign: an invalid or illegal string was specified.");
}else{
_lineAlign=setting;
this.hasBeenReset=true;
}}
},
"position": {
enumerable: true,
get: function get(){
return _position;
},
set: function set(value){
if(value < 0||value > 100){
throw new Error("Position must be between 0 and 100.");
}
_position=value;
this.hasBeenReset=true;
}},
"positionAlign": {
enumerable: true,
get: function get(){
return _positionAlign;
},
set: function set(value){
var setting=findAlignSetting(value);
if(!setting){
console.warn("positionAlign: an invalid or illegal string was specified.");
}else{
_positionAlign=setting;
this.hasBeenReset=true;
}}
},
"size": {
enumerable: true,
get: function get(){
return _size;
},
set: function set(value){
if(value < 0||value > 100){
throw new Error("Size must be between 0 and 100.");
}
_size=value;
this.hasBeenReset=true;
}},
"align": {
enumerable: true,
get: function get(){
return _align;
},
set: function set(value){
var setting=findAlignSetting(value);
if(!setting){
throw new SyntaxError("align: an invalid or illegal alignment string was specified.");
}
_align=setting;
this.hasBeenReset=true;
}}
});
this.displayState=undefined;
}
VTTCue.prototype.getCueAsHTML=function (){
return WebVTT.convertCueToDOMTree(window, this.text);
};
var vttcue=VTTCue;
var scrollSetting={
"": true,
"up": true
};
function findScrollSetting(value){
if(typeof value!=="string"){
return false;
}
var scroll=scrollSetting[value.toLowerCase()];
return scroll ? value.toLowerCase():false;
}
function isValidPercentValue(value){
return typeof value==="number"&&value >=0&&value <=100;
} // VTTRegion shim http://dev.w3.org/html5/webvtt/#vttregion-interface
function VTTRegion(){
var _width=100;
var _lines=3;
var _regionAnchorX=0;
var _regionAnchorY=100;
var _viewportAnchorX=0;
var _viewportAnchorY=100;
var _scroll="";
Object.defineProperties(this, {
"width": {
enumerable: true,
get: function get(){
return _width;
},
set: function set(value){
if(!isValidPercentValue(value)){
throw new Error("Width must be between 0 and 100.");
}
_width=value;
}},
"lines": {
enumerable: true,
get: function get(){
return _lines;
},
set: function set(value){
if(typeof value!=="number"){
throw new TypeError("Lines must be set to a number.");
}
_lines=value;
}},
"regionAnchorY": {
enumerable: true,
get: function get(){
return _regionAnchorY;
},
set: function set(value){
if(!isValidPercentValue(value)){
throw new Error("RegionAnchorX must be between 0 and 100.");
}
_regionAnchorY=value;
}},
"regionAnchorX": {
enumerable: true,
get: function get(){
return _regionAnchorX;
},
set: function set(value){
if(!isValidPercentValue(value)){
throw new Error("RegionAnchorY must be between 0 and 100.");
}
_regionAnchorX=value;
}},
"viewportAnchorY": {
enumerable: true,
get: function get(){
return _viewportAnchorY;
},
set: function set(value){
if(!isValidPercentValue(value)){
throw new Error("ViewportAnchorY must be between 0 and 100.");
}
_viewportAnchorY=value;
}},
"viewportAnchorX": {
enumerable: true,
get: function get(){
return _viewportAnchorX;
},
set: function set(value){
if(!isValidPercentValue(value)){
throw new Error("ViewportAnchorX must be between 0 and 100.");
}
_viewportAnchorX=value;
}},
"scroll": {
enumerable: true,
get: function get(){
return _scroll;
},
set: function set(value){
var setting=findScrollSetting(value);
if(setting===false){
console.warn("Scroll: an invalid or illegal string was specified.");
}else{
_scroll=setting;
}}
}});
}
var vttregion=VTTRegion;
var browserIndex=createCommonjsModule(function (module){
var vttjs=module.exports={
WebVTT: vtt,
VTTCue: vttcue,
VTTRegion: vttregion
};
window$1.vttjs=vttjs;
window$1.WebVTT=vttjs.WebVTT;
var cueShim=vttjs.VTTCue;
var regionShim=vttjs.VTTRegion;
var nativeVTTCue=window$1.VTTCue;
var nativeVTTRegion=window$1.VTTRegion;
vttjs.shim=function (){
window$1.VTTCue=cueShim;
window$1.VTTRegion=regionShim;
};
vttjs.restore=function (){
window$1.VTTCue=nativeVTTCue;
window$1.VTTRegion=nativeVTTRegion;
};
if(!window$1.VTTCue){
vttjs.shim();
}});
var browserIndex_1=browserIndex.WebVTT;
var browserIndex_2=browserIndex.VTTCue;
var browserIndex_3=browserIndex.VTTRegion;
function createTrackHelper(self, kind, label, language, options){
if(options===void 0){
options={};}
var tracks=self.textTracks();
options.kind=kind;
if(label){
options.label=label;
}
if(language){
options.language=language;
}
options.tech=self;
var track=new ALL.text.TrackClass(options);
tracks.addTrack(track);
return track;
}
var Tech =
function (_Component){
inheritsLoose(Tech, _Component);
function Tech(options, ready){
var _this;
if(options===void 0){
options={};}
if(ready===void 0){
ready=function ready(){};}
options.reportTouchActivity=false;
_this=_Component.call(this, null, options, ready)||this;
_this.hasStarted_=false;
_this.on('playing', function (){
this.hasStarted_=true;
});
_this.on('loadstart', function (){
this.hasStarted_=false;
});
ALL.names.forEach(function (name){
var props=ALL[name];
if(options&&options[props.getterName]){
_this[props.privateName]=options[props.getterName];
}});
if(!_this.featuresProgressEvents){
_this.manualProgressOn();
}
if(!_this.featuresTimeupdateEvents){
_this.manualTimeUpdatesOn();
}
['Text', 'Audio', 'Video'].forEach(function (track){
if(options["native" + track + "Tracks"]===false){
_this["featuresNative" + track + "Tracks"]=false;
}});
if(options.nativeCaptions===false||options.nativeTextTracks===false){
_this.featuresNativeTextTracks=false;
}else if(options.nativeCaptions===true||options.nativeTextTracks===true){
_this.featuresNativeTextTracks=true;
}
if(!_this.featuresNativeTextTracks){
_this.emulateTextTracks();
}
_this.preloadTextTracks=options.preloadTextTracks!==false;
_this.autoRemoteTextTracks_=new ALL.text.ListClass();
_this.initTrackListeners();
if(!options.nativeControlsForTouch){
_this.emitTapEvents();
}
if(_this.constructor){
_this.name_=_this.constructor.name||'Unknown Tech';
}
return _this;
}
var _proto=Tech.prototype;
_proto.triggerSourceset=function triggerSourceset(src){
var _this2=this;
if(!this.isReady_){
this.one('ready', function (){
return _this2.setTimeout(function (){
return _this2.triggerSourceset(src);
}, 1);
});
}
this.trigger({
src: src,
type: 'sourceset'
});
}
;
_proto.manualProgressOn=function manualProgressOn(){
this.on('durationchange', this.onDurationChange);
this.manualProgress=true;
this.one('ready', this.trackProgress);
}
;
_proto.manualProgressOff=function manualProgressOff(){
this.manualProgress=false;
this.stopTrackingProgress();
this.off('durationchange', this.onDurationChange);
}
;
_proto.trackProgress=function trackProgress(event){
this.stopTrackingProgress();
this.progressInterval=this.setInterval(bind(this, function (){
var numBufferedPercent=this.bufferedPercent();
if(this.bufferedPercent_!==numBufferedPercent){
this.trigger('progress');
}
this.bufferedPercent_=numBufferedPercent;
if(numBufferedPercent===1){
this.stopTrackingProgress();
}}), 500);
}
;
_proto.onDurationChange=function onDurationChange(event){
this.duration_=this.duration();
}
;
_proto.buffered=function buffered(){
return createTimeRanges(0, 0);
}
;
_proto.bufferedPercent=function bufferedPercent$1(){
return bufferedPercent(this.buffered(), this.duration_);
}
;
_proto.stopTrackingProgress=function stopTrackingProgress(){
this.clearInterval(this.progressInterval);
}
;
_proto.manualTimeUpdatesOn=function manualTimeUpdatesOn(){
this.manualTimeUpdates=true;
this.on('play', this.trackCurrentTime);
this.on('pause', this.stopTrackingCurrentTime);
}
;
_proto.manualTimeUpdatesOff=function manualTimeUpdatesOff(){
this.manualTimeUpdates=false;
this.stopTrackingCurrentTime();
this.off('play', this.trackCurrentTime);
this.off('pause', this.stopTrackingCurrentTime);
}
;
_proto.trackCurrentTime=function trackCurrentTime(){
if(this.currentTimeInterval){
this.stopTrackingCurrentTime();
}
this.currentTimeInterval=this.setInterval(function (){
this.trigger({
type: 'timeupdate',
target: this,
manuallyTriggered: true
});// 42=24 fps // 250 is what Webkit uses // FF uses 15
}, 250);
}
;
_proto.stopTrackingCurrentTime=function stopTrackingCurrentTime(){
this.clearInterval(this.currentTimeInterval);
this.trigger({
type: 'timeupdate',
target: this,
manuallyTriggered: true
});
}
;
_proto.dispose=function dispose(){
this.clearTracks(NORMAL.names);
if(this.manualProgress){
this.manualProgressOff();
}
if(this.manualTimeUpdates){
this.manualTimeUpdatesOff();
}
_Component.prototype.dispose.call(this);
}
;
_proto.clearTracks=function clearTracks(types){
var _this3=this;
types=[].concat(types);
types.forEach(function (type){
var list=_this3[type + "Tracks"]()||[];
var i=list.length;
while (i--){
var track=list[i];
if(type==='text'){
_this3.removeRemoteTextTrack(track);
}
list.removeTrack(track);
}});
}
;
_proto.cleanupAutoTextTracks=function cleanupAutoTextTracks(){
var list=this.autoRemoteTextTracks_||[];
var i=list.length;
while (i--){
var track=list[i];
this.removeRemoteTextTrack(track);
}}
;
_proto.reset=function reset(){}
;
_proto.error=function error(err){
if(err!==undefined){
this.error_=new MediaError(err);
this.trigger('error');
}
return this.error_;
}
;
_proto.played=function played(){
if(this.hasStarted_){
return createTimeRanges(0, 0);
}
return createTimeRanges();
}
;
_proto.setCurrentTime=function setCurrentTime(){
if(this.manualTimeUpdates){
this.trigger({
type: 'timeupdate',
target: this,
manuallyTriggered: true
});
}}
;
_proto.initTrackListeners=function initTrackListeners(){
var _this4=this;
NORMAL.names.forEach(function (name){
var props=NORMAL[name];
var trackListChanges=function trackListChanges(){
_this4.trigger(name + "trackchange");
};
var tracks=_this4[props.getterName]();
tracks.addEventListener('removetrack', trackListChanges);
tracks.addEventListener('addtrack', trackListChanges);
_this4.on('dispose', function (){
tracks.removeEventListener('removetrack', trackListChanges);
tracks.removeEventListener('addtrack', trackListChanges);
});
});
}
;
_proto.addWebVttScript_=function addWebVttScript_(){
var _this5=this;
if(window$1.WebVTT){
return;
}
if(document.body.contains(this.el())){
if(!this.options_['vtt.js']&&isPlain(browserIndex)&&Object.keys(browserIndex).length > 0){
this.trigger('vttjsloaded');
return;
}
var script=document.createElement('script');
script.src=this.options_['vtt.js']||'https://vjs.zencdn.net/vttjs/0.14.1/vtt.min.js';
script.onload=function (){
_this5.trigger('vttjsloaded');
};
script.onerror=function (){
_this5.trigger('vttjserror');
};
this.on('dispose', function (){
script.onload=null;
script.onerror=null;
});
window$1.WebVTT=true;
this.el().parentNode.appendChild(script);
}else{
this.ready(this.addWebVttScript_);
}}
;
_proto.emulateTextTracks=function emulateTextTracks(){
var _this6=this;
var tracks=this.textTracks();
var remoteTracks=this.remoteTextTracks();
var handleAddTrack=function handleAddTrack(e){
return tracks.addTrack(e.track);
};
var handleRemoveTrack=function handleRemoveTrack(e){
return tracks.removeTrack(e.track);
};
remoteTracks.on('addtrack', handleAddTrack);
remoteTracks.on('removetrack', handleRemoveTrack);
this.addWebVttScript_();
var updateDisplay=function updateDisplay(){
return _this6.trigger('texttrackchange');
};
var textTracksChanges=function textTracksChanges(){
updateDisplay();
for (var i=0; i < tracks.length; i++){
var track=tracks[i];
track.removeEventListener('cuechange', updateDisplay);
if(track.mode==='showing'){
track.addEventListener('cuechange', updateDisplay);
}}
};
textTracksChanges();
tracks.addEventListener('change', textTracksChanges);
tracks.addEventListener('addtrack', textTracksChanges);
tracks.addEventListener('removetrack', textTracksChanges);
this.on('dispose', function (){
remoteTracks.off('addtrack', handleAddTrack);
remoteTracks.off('removetrack', handleRemoveTrack);
tracks.removeEventListener('change', textTracksChanges);
tracks.removeEventListener('addtrack', textTracksChanges);
tracks.removeEventListener('removetrack', textTracksChanges);
for (var i=0; i < tracks.length; i++){
var track=tracks[i];
track.removeEventListener('cuechange', updateDisplay);
}});
}
;
_proto.addTextTrack=function addTextTrack(kind, label, language){
if(!kind){
throw new Error('TextTrack kind is required but was not provided');
}
return createTrackHelper(this, kind, label, language);
}
;
_proto.createRemoteTextTrack=function createRemoteTextTrack(options){
var track=mergeOptions(options, {
tech: this
});
return new REMOTE.remoteTextEl.TrackClass(track);
}
;
_proto.addRemoteTextTrack=function addRemoteTextTrack(options, manualCleanup){
var _this7=this;
if(options===void 0){
options={};}
var htmlTrackElement=this.createRemoteTextTrack(options);
if(manualCleanup!==true&&manualCleanup!==false){
log.warn('Calling addRemoteTextTrack without explicitly setting the "manualCleanup" parameter to `true` is deprecated and default to `false` in future version of video.js');
manualCleanup=true;
}
this.remoteTextTrackEls().addTrackElement_(htmlTrackElement);
this.remoteTextTracks().addTrack(htmlTrackElement.track);
if(manualCleanup!==true){
this.ready(function (){
return _this7.autoRemoteTextTracks_.addTrack(htmlTrackElement.track);
});
}
return htmlTrackElement;
}
;
_proto.removeRemoteTextTrack=function removeRemoteTextTrack(track){
var trackElement=this.remoteTextTrackEls().getTrackElementByTrack_(track);
this.remoteTextTrackEls().removeTrackElement_(trackElement);
this.remoteTextTracks().removeTrack(track);
this.autoRemoteTextTracks_.removeTrack(track);
}
;
_proto.getVideoPlaybackQuality=function getVideoPlaybackQuality(){
return {};}
;
_proto.requestPictureInPicture=function requestPictureInPicture(){
var PromiseClass=this.options_.Promise||window$1.Promise;
if(PromiseClass){
return PromiseClass.reject();
}}
;
_proto.setPoster=function setPoster(){}
;
_proto.playsinline=function playsinline(){}
;
_proto.setPlaysinline=function setPlaysinline(){}
;
_proto.overrideNativeAudioTracks=function overrideNativeAudioTracks(){}
;
_proto.overrideNativeVideoTracks=function overrideNativeVideoTracks(){}
;
_proto.canPlayType=function canPlayType(){
return '';
}
;
Tech.canPlayType=function canPlayType(){
return '';
}
;
Tech.canPlaySource=function canPlaySource(srcObj, options){
return Tech.canPlayType(srcObj.type);
}
;
Tech.isTech=function isTech(component){
return component.prototype instanceof Tech||component instanceof Tech||component===Tech;
}
;
Tech.registerTech=function registerTech(name, tech){
if(!Tech.techs_){
Tech.techs_={};}
if(!Tech.isTech(tech)){
throw new Error("Tech " + name + " must be a Tech");
}
if(!Tech.canPlayType){
throw new Error('Techs must have a static canPlayType method on them');
}
if(!Tech.canPlaySource){
throw new Error('Techs must have a static canPlaySource method on them');
}
name=toTitleCase(name);
Tech.techs_[name]=tech;
Tech.techs_[toLowerCase(name)]=tech;
if(name!=='Tech'){
Tech.defaultTechOrder_.push(name);
}
return tech;
}
;
Tech.getTech=function getTech(name){
if(!name){
return;
}
if(Tech.techs_&&Tech.techs_[name]){
return Tech.techs_[name];
}
name=toTitleCase(name);
if(window$1&&window$1.videojs&&window$1.videojs[name]){
log.warn("The " + name + " tech was added to the videojs object when it should be registered using videojs.registerTech(name, tech)");
return window$1.videojs[name];
}};
return Tech;
}(Component);
ALL.names.forEach(function (name){
var props=ALL[name];
Tech.prototype[props.getterName]=function (){
this[props.privateName]=this[props.privateName]||new props.ListClass();
return this[props.privateName];
};});
Tech.prototype.featuresVolumeControl=true;
Tech.prototype.featuresMuteControl=true;
Tech.prototype.featuresFullscreenResize=false;
Tech.prototype.featuresPlaybackRate=false;
Tech.prototype.featuresProgressEvents=false;
Tech.prototype.featuresSourceset=false;
Tech.prototype.featuresTimeupdateEvents=false;
Tech.prototype.featuresNativeTextTracks=false;
Tech.withSourceHandlers=function (_Tech){
_Tech.registerSourceHandler=function (handler, index){
var handlers=_Tech.sourceHandlers;
if(!handlers){
handlers=_Tech.sourceHandlers=[];
}
if(index===undefined){
index=handlers.length;
}
handlers.splice(index, 0, handler);
};
_Tech.canPlayType=function (type){
var handlers=_Tech.sourceHandlers||[];
var can;
for (var i=0; i < handlers.length; i++){
can=handlers[i].canPlayType(type);
if(can){
return can;
}}
return '';
};
_Tech.selectSourceHandler=function (source, options){
var handlers=_Tech.sourceHandlers||[];
var can;
for (var i=0; i < handlers.length; i++){
can=handlers[i].canHandleSource(source, options);
if(can){
return handlers[i];
}}
return null;
};
_Tech.canPlaySource=function (srcObj, options){
var sh=_Tech.selectSourceHandler(srcObj, options);
if(sh){
return sh.canHandleSource(srcObj, options);
}
return '';
};
var deferrable=['seekable', 'seeking', 'duration'];
deferrable.forEach(function (fnName){
var originalFn=this[fnName];
if(typeof originalFn!=='function'){
return;
}
this[fnName]=function (){
if(this.sourceHandler_&&this.sourceHandler_[fnName]){
return this.sourceHandler_[fnName].apply(this.sourceHandler_, arguments);
}
return originalFn.apply(this, arguments);
};}, _Tech.prototype);
_Tech.prototype.setSource=function (source){
var sh=_Tech.selectSourceHandler(source, this.options_);
if(!sh){
if(_Tech.nativeSourceHandler){
sh=_Tech.nativeSourceHandler;
}else{
log.error('No source handler found for the current source.');
}}
this.disposeSourceHandler();
this.off('dispose', this.disposeSourceHandler);
if(sh!==_Tech.nativeSourceHandler){
this.currentSource_=source;
}
this.sourceHandler_=sh.handleSource(source, this, this.options_);
this.one('dispose', this.disposeSourceHandler);
};
_Tech.prototype.disposeSourceHandler=function (){
if(this.currentSource_){
this.clearTracks(['audio', 'video']);
this.currentSource_=null;
}
this.cleanupAutoTextTracks();
if(this.sourceHandler_){
if(this.sourceHandler_.dispose){
this.sourceHandler_.dispose();
}
this.sourceHandler_=null;
}};};
Component.registerComponent('Tech', Tech);
Tech.registerTech('Tech', Tech);
Tech.defaultTechOrder_=[];
var middlewares={};
var middlewareInstances={};
var TERMINATOR={};
function use(type, middleware){
middlewares[type]=middlewares[type]||[];
middlewares[type].push(middleware);
}
function setSource(player, src, next){
player.setTimeout(function (){
return setSourceHelper(src, middlewares[src.type], next, player);
}, 1);
}
function setTech(middleware, tech){
middleware.forEach(function (mw){
return mw.setTech&&mw.setTech(tech);
});
}
function get(middleware, tech, method){
return middleware.reduceRight(middlewareIterator(method), tech[method]());
}
function set(middleware, tech, method, arg){
return tech[method](middleware.reduce(middlewareIterator(method), arg));
}
function mediate(middleware, tech, method, arg){
if(arg===void 0){
arg=null;
}
var callMethod='call' + toTitleCase(method);
var middlewareValue=middleware.reduce(middlewareIterator(callMethod), arg);
var terminated=middlewareValue===TERMINATOR;
var returnValue=terminated ? null:tech[method](middlewareValue);
executeRight(middleware, method, returnValue, terminated);
return returnValue;
}
var allowedGetters={
buffered: 1,
currentTime: 1,
duration: 1,
muted: 1,
played: 1,
paused: 1,
seekable: 1,
volume: 1
};
var allowedSetters={
setCurrentTime: 1,
setMuted: 1,
setVolume: 1
};
var allowedMediators={
play: 1,
pause: 1
};
function middlewareIterator(method){
return function (value, mw){
if(value===TERMINATOR){
return TERMINATOR;
}
if(mw[method]){
return mw[method](value);
}
return value;
};}
function executeRight(mws, method, value, terminated){
for (var i=mws.length - 1; i >=0; i--){
var mw=mws[i];
if(mw[method]){
mw[method](terminated, value);
}}
}
function clearCacheForPlayer(player){
middlewareInstances[player.id()]=null;
}
function getOrCreateFactory(player, mwFactory){
var mws=middlewareInstances[player.id()];
var mw=null;
if(mws===undefined||mws===null){
mw=mwFactory(player);
middlewareInstances[player.id()]=[[mwFactory, mw]];
return mw;
}
for (var i=0; i < mws.length; i++){
var _mws$i=mws[i],
mwf=_mws$i[0],
mwi=_mws$i[1];
if(mwf!==mwFactory){
continue;
}
mw=mwi;
}
if(mw===null){
mw=mwFactory(player);
mws.push([mwFactory, mw]);
}
return mw;
}
function setSourceHelper(src, middleware, next, player, acc, lastRun){
if(src===void 0){
src={};}
if(middleware===void 0){
middleware=[];
}
if(acc===void 0){
acc=[];
}
if(lastRun===void 0){
lastRun=false;
}
var _middleware=middleware,
mwFactory=_middleware[0],
mwrest=_middleware.slice(1);
if(typeof mwFactory==='string'){
setSourceHelper(src, middlewares[mwFactory], next, player, acc, lastRun);
}else if(mwFactory){
var mw=getOrCreateFactory(player, mwFactory);
if(!mw.setSource){
acc.push(mw);
return setSourceHelper(src, mwrest, next, player, acc, lastRun);
}
mw.setSource(assign({}, src), function (err, _src){
if(err){
return setSourceHelper(src, mwrest, next, player, acc, lastRun);
}
acc.push(mw);
setSourceHelper(_src, src.type===_src.type ? mwrest:middlewares[_src.type], next, player, acc, lastRun);
});
}else if(mwrest.length){
setSourceHelper(src, mwrest, next, player, acc, lastRun);
}else if(lastRun){
next(src, acc);
}else{
setSourceHelper(src, middlewares['*'], next, player, acc, true);
}}
var MimetypesKind={
opus: 'video/ogg',
ogv: 'video/ogg',
mp4: 'video/mp4',
mov: 'video/mp4',
m4v: 'video/mp4',
mkv: 'video/x-matroska',
m4a: 'audio/mp4',
mp3: 'audio/mpeg',
aac: 'audio/aac',
oga: 'audio/ogg',
m3u8: 'application/x-mpegURL',
jpg: 'image/jpeg',
jpeg: 'image/jpeg',
gif: 'image/gif',
png: 'image/png',
svg: 'image/svg+xml',
webp: 'image/webp'
};
var getMimetype=function getMimetype(src){
if(src===void 0){
src='';
}
var ext=getFileExtension(src);
var mimetype=MimetypesKind[ext.toLowerCase()];
return mimetype||'';
};
var findMimetype=function findMimetype(player, src){
if(!src){
return '';
}
if(player.cache_.source.src===src&&player.cache_.source.type){
return player.cache_.source.type;
}
var matchingSources=player.cache_.sources.filter(function (s){
return s.src===src;
});
if(matchingSources.length){
return matchingSources[0].type;
}
var sources=player.$$('source');
for (var i=0; i < sources.length; i++){
var s=sources[i];
if(s.type&&s.src&&s.src===src){
return s.type;
}}
return getMimetype(src);
};
var filterSource=function filterSource(src){
if(Array.isArray(src)){
var newsrc=[];
src.forEach(function (srcobj){
srcobj=filterSource(srcobj);
if(Array.isArray(srcobj)){
newsrc=newsrc.concat(srcobj);
}else if(isObject(srcobj)){
newsrc.push(srcobj);
}});
src=newsrc;
}else if(typeof src==='string'&&src.trim()){
src=[fixSource({
src: src
})];
}else if(isObject(src)&&typeof src.src==='string'&&src.src&&src.src.trim()){
src=[fixSource(src)];
}else{
src=[];
}
return src;
};
function fixSource(src){
if(!src.type){
var mimetype=getMimetype(src.src);
if(mimetype){
src.type=mimetype;
}}
return src;
}
var MediaLoader =
function (_Component){
inheritsLoose(MediaLoader, _Component);
function MediaLoader(player, options, ready){
var _this;
var options_=mergeOptions({
createEl: false
}, options);
_this=_Component.call(this, player, options_, ready)||this;
if(!options.playerOptions.sources||options.playerOptions.sources.length===0){
for (var i=0, j=options.playerOptions.techOrder; i < j.length; i++){
var techName=toTitleCase(j[i]);
var tech=Tech.getTech(techName);
if(!techName){
tech=Component.getComponent(techName);
}
if(tech&&tech.isSupported()){
player.loadTech_(techName);
break;
}}
}else{
player.src(options.playerOptions.sources);
}
return _this;
}
return MediaLoader;
}(Component);
Component.registerComponent('MediaLoader', MediaLoader);
var ClickableComponent =
function (_Component){
inheritsLoose(ClickableComponent, _Component);
function ClickableComponent(player, options){
var _this;
_this=_Component.call(this, player, options)||this;
_this.emitTapEvents();
_this.enable();
return _this;
}
var _proto=ClickableComponent.prototype;
_proto.createEl=function createEl(tag, props, attributes){
if(tag===void 0){
tag='div';
}
if(props===void 0){
props={};}
if(attributes===void 0){
attributes={};}
props=assign({
innerHTML: '<span aria-hidden="true" class="vjs-icon-placeholder"></span>',
className: this.buildCSSClass(),
tabIndex: 0
}, props);
if(tag==='button'){
log.error("Creating a ClickableComponent with an HTML element of " + tag + " is not supported; use a Button instead.");
}
attributes=assign({
role: 'button'
}, attributes);
this.tabIndex_=props.tabIndex;
var el=_Component.prototype.createEl.call(this, tag, props, attributes);
this.createControlTextEl(el);
return el;
};
_proto.dispose=function dispose(){
this.controlTextEl_=null;
_Component.prototype.dispose.call(this);
}
;
_proto.createControlTextEl=function createControlTextEl(el){
this.controlTextEl_=createEl('span', {
className: 'vjs-control-text'
}, {
'aria-live': 'polite'
});
if(el){
el.appendChild(this.controlTextEl_);
}
this.controlText(this.controlText_, el);
return this.controlTextEl_;
}
;
_proto.controlText=function controlText(text, el){
if(el===void 0){
el=this.el();
}
if(text===undefined){
return this.controlText_||'Need Text';
}
var localizedText=this.localize(text);
this.controlText_=text;
textContent(this.controlTextEl_, localizedText);
if(!this.nonIconControl){
el.setAttribute('title', localizedText);
}}
;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-control vjs-button " + _Component.prototype.buildCSSClass.call(this);
}
;
_proto.enable=function enable(){
if(!this.enabled_){
this.enabled_=true;
this.removeClass('vjs-disabled');
this.el_.setAttribute('aria-disabled', 'false');
if(typeof this.tabIndex_!=='undefined'){
this.el_.setAttribute('tabIndex', this.tabIndex_);
}
this.on(['tap', 'click'], this.handleClick);
this.on('keydown', this.handleKeyDown);
}}
;
_proto.disable=function disable(){
this.enabled_=false;
this.addClass('vjs-disabled');
this.el_.setAttribute('aria-disabled', 'true');
if(typeof this.tabIndex_!=='undefined'){
this.el_.removeAttribute('tabIndex');
}
this.off('mouseover', this.handleMouseOver);
this.off('mouseout', this.handleMouseOut);
this.off(['tap', 'click'], this.handleClick);
this.off('keydown', this.handleKeyDown);
}
;
_proto.handleClick=function handleClick(event){
if(this.options_.clickHandler){
this.options_.clickHandler.call(this, arguments);
}}
;
_proto.handleKeyDown=function handleKeyDown(event){
if(keycode.isEventKey(event, 'Space')||keycode.isEventKey(event, 'Enter')){
event.preventDefault();
event.stopPropagation();
this.trigger('click');
}else{
_Component.prototype.handleKeyDown.call(this, event);
}};
return ClickableComponent;
}(Component);
Component.registerComponent('ClickableComponent', ClickableComponent);
var PosterImage =
function (_ClickableComponent){
inheritsLoose(PosterImage, _ClickableComponent);
function PosterImage(player, options){
var _this;
_this=_ClickableComponent.call(this, player, options)||this;
_this.update();
player.on('posterchange', bind(assertThisInitialized(_this), _this.update));
return _this;
}
var _proto=PosterImage.prototype;
_proto.dispose=function dispose(){
this.player().off('posterchange', this.update);
_ClickableComponent.prototype.dispose.call(this);
}
;
_proto.createEl=function createEl$1(){
var el=createEl('div', {
className: 'vjs-poster',
tabIndex: -1
});
return el;
}
;
_proto.update=function update(event){
var url=this.player().poster();
this.setSrc(url);
if(url){
this.show();
}else{
this.hide();
}}
;
_proto.setSrc=function setSrc(url){
var backgroundImage='';
if(url){
backgroundImage="url(\"" + url + "\")";
}
this.el_.style.backgroundImage=backgroundImage;
}
;
_proto.handleClick=function handleClick(event){
if(!this.player_.controls()){
return;
}
if(this.player_.tech(true)){
this.player_.tech(true).focus();
}
if(this.player_.paused()){
silencePromise(this.player_.play());
}else{
this.player_.pause();
}};
return PosterImage;
}(ClickableComponent);
Component.registerComponent('PosterImage', PosterImage);
var darkGray='#222';
var lightGray='#ccc';
var fontMap={
monospace: 'monospace',
sansSerif: 'sans-serif',
serif: 'serif',
monospaceSansSerif: '"Andale Mono", "Lucida Console", monospace',
monospaceSerif: '"Courier New", monospace',
proportionalSansSerif: 'sans-serif',
proportionalSerif: 'serif',
casual: '"Comic Sans MS", Impact, fantasy',
script: '"Monotype Corsiva", cursive',
smallcaps: '"Andale Mono", "Lucida Console", monospace, sans-serif'
};
function constructColor(color, opacity){
var hex;
if(color.length===4){
hex=color[1] + color[1] + color[2] + color[2] + color[3] + color[3];
}else if(color.length===7){
hex=color.slice(1);
}else{
throw new Error('Invalid color code provided, ' + color + '; must be formatted as e.g. #f0e or #f604e2.');
}
return 'rgba(' + parseInt(hex.slice(0, 2), 16) + ',' + parseInt(hex.slice(2, 4), 16) + ',' + parseInt(hex.slice(4, 6), 16) + ',' + opacity + ')';
}
function tryUpdateStyle(el, style, rule){
try {
el.style[style]=rule;
} catch (e){
return;
}}
var TextTrackDisplay =
function (_Component){
inheritsLoose(TextTrackDisplay, _Component);
function TextTrackDisplay(player, options, ready){
var _this;
_this=_Component.call(this, player, options, ready)||this;
var updateDisplayHandler=bind(assertThisInitialized(_this), _this.updateDisplay);
player.on('loadstart', bind(assertThisInitialized(_this), _this.toggleDisplay));
player.on('texttrackchange', updateDisplayHandler);
player.on('loadedmetadata', bind(assertThisInitialized(_this), _this.preselectTrack));
player.ready(bind(assertThisInitialized(_this), function (){
if(player.tech_&&player.tech_.featuresNativeTextTracks){
this.hide();
return;
}
player.on('fullscreenchange', updateDisplayHandler);
player.on('playerresize', updateDisplayHandler);
window$1.addEventListener('orientationchange', updateDisplayHandler);
player.on('dispose', function (){
return window$1.removeEventListener('orientationchange', updateDisplayHandler);
});
var tracks=this.options_.playerOptions.tracks||[];
for (var i=0; i < tracks.length; i++){
this.player_.addRemoteTextTrack(tracks[i], true);
}
this.preselectTrack();
}));
return _this;
}
var _proto=TextTrackDisplay.prototype;
_proto.preselectTrack=function preselectTrack(){
var modes={
captions: 1,
subtitles: 1
};
var trackList=this.player_.textTracks();
var userPref=this.player_.cache_.selectedLanguage;
var firstDesc;
var firstCaptions;
var preferredTrack;
for (var i=0; i < trackList.length; i++){
var track=trackList[i];
if(userPref&&userPref.enabled&&userPref.language&&userPref.language===track.language&&track.kind in modes){
if(track.kind===userPref.kind){
preferredTrack=track;
}else if(!preferredTrack){
preferredTrack=track;
}}else if(userPref&&!userPref.enabled){
preferredTrack=null;
firstDesc=null;
firstCaptions=null;
}else if(track["default"]){
if(track.kind==='descriptions'&&!firstDesc){
firstDesc=track;
}else if(track.kind in modes&&!firstCaptions){
firstCaptions=track;
}}
}
if(preferredTrack){
preferredTrack.mode='showing';
}else if(firstCaptions){
firstCaptions.mode='showing';
}else if(firstDesc){
firstDesc.mode='showing';
}}
;
_proto.toggleDisplay=function toggleDisplay(){
if(this.player_.tech_&&this.player_.tech_.featuresNativeTextTracks){
this.hide();
}else{
this.show();
}}
;
_proto.createEl=function createEl(){
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-text-track-display'
}, {
'aria-live': 'off',
'aria-atomic': 'true'
});
}
;
_proto.clearDisplay=function clearDisplay(){
if(typeof window$1.WebVTT==='function'){
window$1.WebVTT.processCues(window$1, [], this.el_);
}}
;
_proto.updateDisplay=function updateDisplay(){
var tracks=this.player_.textTracks();
var allowMultipleShowingTracks=this.options_.allowMultipleShowingTracks;
this.clearDisplay();
if(allowMultipleShowingTracks){
var showingTracks=[];
for (var _i=0; _i < tracks.length; ++_i){
var track=tracks[_i];
if(track.mode!=='showing'){
continue;
}
showingTracks.push(track);
}
this.updateForTrack(showingTracks);
return;
}
var descriptionsTrack=null;
var captionsSubtitlesTrack=null;
var i=tracks.length;
while (i--){
var _track=tracks[i];
if(_track.mode==='showing'){
if(_track.kind==='descriptions'){
descriptionsTrack=_track;
}else{
captionsSubtitlesTrack=_track;
}}
}
if(captionsSubtitlesTrack){
if(this.getAttribute('aria-live')!=='off'){
this.setAttribute('aria-live', 'off');
}
this.updateForTrack(captionsSubtitlesTrack);
}else if(descriptionsTrack){
if(this.getAttribute('aria-live')!=='assertive'){
this.setAttribute('aria-live', 'assertive');
}
this.updateForTrack(descriptionsTrack);
}}
;
_proto.updateDisplayState=function updateDisplayState(track){
var overrides=this.player_.textTrackSettings.getValues();
var cues=track.activeCues;
var i=cues.length;
while (i--){
var cue=cues[i];
if(!cue){
continue;
}
var cueDiv=cue.displayState;
if(overrides.color){
cueDiv.firstChild.style.color=overrides.color;
}
if(overrides.textOpacity){
tryUpdateStyle(cueDiv.firstChild, 'color', constructColor(overrides.color||'#fff', overrides.textOpacity));
}
if(overrides.backgroundColor){
cueDiv.firstChild.style.backgroundColor=overrides.backgroundColor;
}
if(overrides.backgroundOpacity){
tryUpdateStyle(cueDiv.firstChild, 'backgroundColor', constructColor(overrides.backgroundColor||'#000', overrides.backgroundOpacity));
}
if(overrides.windowColor){
if(overrides.windowOpacity){
tryUpdateStyle(cueDiv, 'backgroundColor', constructColor(overrides.windowColor, overrides.windowOpacity));
}else{
cueDiv.style.backgroundColor=overrides.windowColor;
}}
if(overrides.edgeStyle){
if(overrides.edgeStyle==='dropshadow'){
cueDiv.firstChild.style.textShadow="2px 2px 3px " + darkGray + ", 2px 2px 4px " + darkGray + ", 2px 2px 5px " + darkGray;
}else if(overrides.edgeStyle==='raised'){
cueDiv.firstChild.style.textShadow="1px 1px " + darkGray + ", 2px 2px " + darkGray + ", 3px 3px " + darkGray;
}else if(overrides.edgeStyle==='depressed'){
cueDiv.firstChild.style.textShadow="1px 1px " + lightGray + ", 0 1px " + lightGray + ", -1px -1px " + darkGray + ", 0 -1px " + darkGray;
}else if(overrides.edgeStyle==='uniform'){
cueDiv.firstChild.style.textShadow="0 0 4px " + darkGray + ", 0 0 4px " + darkGray + ", 0 0 4px " + darkGray + ", 0 0 4px " + darkGray;
}}
if(overrides.fontPercent&&overrides.fontPercent!==1){
var fontSize=window$1.parseFloat(cueDiv.style.fontSize);
cueDiv.style.fontSize=fontSize * overrides.fontPercent + 'px';
cueDiv.style.height='auto';
cueDiv.style.top='auto';
cueDiv.style.bottom='2px';
}
if(overrides.fontFamily&&overrides.fontFamily!=='default'){
if(overrides.fontFamily==='small-caps'){
cueDiv.firstChild.style.fontVariant='small-caps';
}else{
cueDiv.firstChild.style.fontFamily=fontMap[overrides.fontFamily];
}}
}}
;
_proto.updateForTrack=function updateForTrack(tracks){
if(!Array.isArray(tracks)){
tracks=[tracks];
}
if(typeof window$1.WebVTT!=='function'||tracks.every(function (track){
return !track.activeCues;
})){
return;
}
var cues=[];
for (var i=0; i < tracks.length; ++i){
var track=tracks[i];
for (var j=0; j < track.activeCues.length; ++j){
cues.push(track.activeCues[j]);
}}
window$1.WebVTT.processCues(window$1, cues, this.el_);
for (var _i2=0; _i2 < tracks.length; ++_i2){
var _track2=tracks[_i2];
for (var _j=0; _j < _track2.activeCues.length; ++_j){
var cueEl=_track2.activeCues[_j].displayState;
addClass(cueEl, 'vjs-text-track-cue');
addClass(cueEl, 'vjs-text-track-cue-' + (_track2.language ? _track2.language:_i2));
}
if(this.player_.textTrackSettings){
this.updateDisplayState(_track2);
}}
};
return TextTrackDisplay;
}(Component);
Component.registerComponent('TextTrackDisplay', TextTrackDisplay);
var LoadingSpinner =
function (_Component){
inheritsLoose(LoadingSpinner, _Component);
function LoadingSpinner(){
return _Component.apply(this, arguments)||this;
}
var _proto=LoadingSpinner.prototype;
_proto.createEl=function createEl$1(){
var isAudio=this.player_.isAudio();
var playerType=this.localize(isAudio ? 'Audio Player':'Video Player');
var controlText=createEl('span', {
className: 'vjs-control-text',
innerHTML: this.localize('{1} is loading.', [playerType])
});
var el=_Component.prototype.createEl.call(this, 'div', {
className: 'vjs-loading-spinner',
dir: 'ltr'
});
el.appendChild(controlText);
return el;
};
return LoadingSpinner;
}(Component);
Component.registerComponent('LoadingSpinner', LoadingSpinner);
var Button =
function (_ClickableComponent){
inheritsLoose(Button, _ClickableComponent);
function Button(){
return _ClickableComponent.apply(this, arguments)||this;
}
var _proto=Button.prototype;
_proto.createEl=function createEl(tag, props, attributes){
if(props===void 0){
props={};}
if(attributes===void 0){
attributes={};}
tag='button';
props=assign({
innerHTML: '<span aria-hidden="true" class="vjs-icon-placeholder"></span>',
className: this.buildCSSClass()
}, props);
attributes=assign({
type: 'button'
}, attributes);
var el=Component.prototype.createEl.call(this, tag, props, attributes);
this.createControlTextEl(el);
return el;
}
;
_proto.addChild=function addChild(child, options){
if(options===void 0){
options={};}
var className=this.constructor.name;
log.warn("Adding an actionable (user controllable) child to a Button (" + className + ") is not supported; use a ClickableComponent instead.");
return Component.prototype.addChild.call(this, child, options);
}
;
_proto.enable=function enable(){
_ClickableComponent.prototype.enable.call(this);
this.el_.removeAttribute('disabled');
}
;
_proto.disable=function disable(){
_ClickableComponent.prototype.disable.call(this);
this.el_.setAttribute('disabled', 'disabled');
}
;
_proto.handleKeyDown=function handleKeyDown(event){
if(keycode.isEventKey(event, 'Space')||keycode.isEventKey(event, 'Enter')){
event.stopPropagation();
return;
}
_ClickableComponent.prototype.handleKeyDown.call(this, event);
};
return Button;
}(ClickableComponent);
Component.registerComponent('Button', Button);
var BigPlayButton =
function (_Button){
inheritsLoose(BigPlayButton, _Button);
function BigPlayButton(player, options){
var _this;
_this=_Button.call(this, player, options)||this;
_this.mouseused_=false;
_this.on('mousedown', _this.handleMouseDown);
return _this;
}
var _proto=BigPlayButton.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return 'vjs-big-play-button';
}
;
_proto.handleClick=function handleClick(event){
var playPromise=this.player_.play();
if(this.mouseused_&&event.clientX&&event.clientY){
var sourceIsEncrypted=this.player_.usingPlugin('eme')&&this.player_.eme.sessions&&this.player_.eme.sessions.length > 0;
silencePromise(playPromise);
if(this.player_.tech(true) &&
!((IE_VERSION||IS_EDGE)&&sourceIsEncrypted)){
this.player_.tech(true).focus();
}
return;
}
var cb=this.player_.getChild('controlBar');
var playToggle=cb&&cb.getChild('playToggle');
if(!playToggle){
this.player_.tech(true).focus();
return;
}
var playFocus=function playFocus(){
return playToggle.focus();
};
if(isPromise(playPromise)){
playPromise.then(playFocus, function (){});
}else{
this.setTimeout(playFocus, 1);
}};
_proto.handleKeyDown=function handleKeyDown(event){
this.mouseused_=false;
_Button.prototype.handleKeyDown.call(this, event);
};
_proto.handleMouseDown=function handleMouseDown(event){
this.mouseused_=true;
};
return BigPlayButton;
}(Button);
BigPlayButton.prototype.controlText_='Play Video';
Component.registerComponent('BigPlayButton', BigPlayButton);
var CloseButton =
function (_Button){
inheritsLoose(CloseButton, _Button);
function CloseButton(player, options){
var _this;
_this=_Button.call(this, player, options)||this;
_this.controlText(options&&options.controlText||_this.localize('Close'));
return _this;
}
var _proto=CloseButton.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-close-button " + _Button.prototype.buildCSSClass.call(this);
}
;
_proto.handleClick=function handleClick(event){
this.trigger({
type: 'close',
bubbles: false
});
}
;
_proto.handleKeyDown=function handleKeyDown(event){
if(keycode.isEventKey(event, 'Esc')){
event.preventDefault();
event.stopPropagation();
this.trigger('click');
}else{
_Button.prototype.handleKeyDown.call(this, event);
}};
return CloseButton;
}(Button);
Component.registerComponent('CloseButton', CloseButton);
var PlayToggle =
function (_Button){
inheritsLoose(PlayToggle, _Button);
function PlayToggle(player, options){
var _this;
if(options===void 0){
options={};}
_this=_Button.call(this, player, options)||this;
options.replay=options.replay===undefined||options.replay;
_this.on(player, 'play', _this.handlePlay);
_this.on(player, 'pause', _this.handlePause);
if(options.replay){
_this.on(player, 'ended', _this.handleEnded);
}
return _this;
}
var _proto=PlayToggle.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-play-control " + _Button.prototype.buildCSSClass.call(this);
}
;
_proto.handleClick=function handleClick(event){
if(this.player_.paused()){
this.player_.play();
}else{
this.player_.pause();
}}
;
_proto.handleSeeked=function handleSeeked(event){
this.removeClass('vjs-ended');
if(this.player_.paused()){
this.handlePause(event);
}else{
this.handlePlay(event);
}}
;
_proto.handlePlay=function handlePlay(event){
this.removeClass('vjs-ended');
this.removeClass('vjs-paused');
this.addClass('vjs-playing');
this.controlText('Pause');
}
;
_proto.handlePause=function handlePause(event){
this.removeClass('vjs-playing');
this.addClass('vjs-paused');
this.controlText('Play');
}
;
_proto.handleEnded=function handleEnded(event){
this.removeClass('vjs-playing');
this.addClass('vjs-ended');
this.controlText('Replay');
this.one(this.player_, 'seeked', this.handleSeeked);
};
return PlayToggle;
}(Button);
PlayToggle.prototype.controlText_='Play';
Component.registerComponent('PlayToggle', PlayToggle);
var defaultImplementation=function defaultImplementation(seconds, guide){
seconds=seconds < 0 ? 0:seconds;
var s=Math.floor(seconds % 60);
var m=Math.floor(seconds / 60 % 60);
var h=Math.floor(seconds / 3600);
var gm=Math.floor(guide / 60 % 60);
var gh=Math.floor(guide / 3600);
if(isNaN(seconds)||seconds===Infinity){
h=m = s='-';
}
h=h > 0||gh > 0 ? h + ':':'';
m=((h||gm >=10)&&m < 10 ? '0' + m:m) + ':';
s=s < 10 ? '0' + s:s;
return h + m + s;
};
var implementation=defaultImplementation;
function setFormatTime(customImplementation){
implementation=customImplementation;
}
function resetFormatTime(){
implementation=defaultImplementation;
}
function formatTime(seconds, guide){
if(guide===void 0){
guide=seconds;
}
return implementation(seconds, guide);
}
var TimeDisplay =
function (_Component){
inheritsLoose(TimeDisplay, _Component);
function TimeDisplay(player, options){
var _this;
_this=_Component.call(this, player, options)||this;
_this.on(player, ['timeupdate', 'ended'], _this.updateContent);
_this.updateTextNode_();
return _this;
}
var _proto=TimeDisplay.prototype;
_proto.createEl=function createEl$1(){
var className=this.buildCSSClass();
var el=_Component.prototype.createEl.call(this, 'div', {
className: className + " vjs-time-control vjs-control",
innerHTML: "<span class=\"vjs-control-text\" role=\"presentation\">" + this.localize(this.labelText_) + "\xA0</span>"
});
this.contentEl_=createEl('span', {
className: className + "-display"
}, {
'aria-live': 'off',
'role': 'presentation'
});
el.appendChild(this.contentEl_);
return el;
};
_proto.dispose=function dispose(){
this.contentEl_=null;
this.textNode_=null;
_Component.prototype.dispose.call(this);
}
;
_proto.updateTextNode_=function updateTextNode_(time){
var _this2=this;
if(time===void 0){
time=0;
}
time=formatTime(time);
if(this.formattedTime_===time){
return;
}
this.formattedTime_=time;
this.requestAnimationFrame(function (){
if(!_this2.contentEl_){
return;
}
var oldNode=_this2.textNode_;
_this2.textNode_=document.createTextNode(_this2.formattedTime_);
if(!_this2.textNode_){
return;
}
if(oldNode){
_this2.contentEl_.replaceChild(_this2.textNode_, oldNode);
}else{
_this2.contentEl_.appendChild(_this2.textNode_);
}});
}
;
_proto.updateContent=function updateContent(event){};
return TimeDisplay;
}(Component);
TimeDisplay.prototype.labelText_='Time';
TimeDisplay.prototype.controlText_='Time';
Component.registerComponent('TimeDisplay', TimeDisplay);
var CurrentTimeDisplay =
function (_TimeDisplay){
inheritsLoose(CurrentTimeDisplay, _TimeDisplay);
function CurrentTimeDisplay(){
return _TimeDisplay.apply(this, arguments)||this;
}
var _proto=CurrentTimeDisplay.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return 'vjs-current-time';
}
;
_proto.updateContent=function updateContent(event){
var time;
if(this.player_.ended()){
time=this.player_.duration();
}else{
time=this.player_.scrubbing() ? this.player_.getCache().currentTime:this.player_.currentTime();
}
this.updateTextNode_(time);
};
return CurrentTimeDisplay;
}(TimeDisplay);
CurrentTimeDisplay.prototype.labelText_='Current Time';
CurrentTimeDisplay.prototype.controlText_='Current Time';
Component.registerComponent('CurrentTimeDisplay', CurrentTimeDisplay);
var DurationDisplay =
function (_TimeDisplay){
inheritsLoose(DurationDisplay, _TimeDisplay);
function DurationDisplay(player, options){
var _this;
_this=_TimeDisplay.call(this, player, options)||this;
_this.on(player, 'durationchange', _this.updateContent);
_this.on(player, 'loadstart', _this.updateContent);
_this.on(player, 'loadedmetadata', _this.updateContent);
return _this;
}
var _proto=DurationDisplay.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return 'vjs-duration';
}
;
_proto.updateContent=function updateContent(event){
var duration=this.player_.duration();
this.updateTextNode_(duration);
};
return DurationDisplay;
}(TimeDisplay);
DurationDisplay.prototype.labelText_='Duration';
DurationDisplay.prototype.controlText_='Duration';
Component.registerComponent('DurationDisplay', DurationDisplay);
var TimeDivider =
function (_Component){
inheritsLoose(TimeDivider, _Component);
function TimeDivider(){
return _Component.apply(this, arguments)||this;
}
var _proto=TimeDivider.prototype;
_proto.createEl=function createEl(){
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-time-control vjs-time-divider',
innerHTML: '<div><span>/</span></div>'
}, {
'aria-hidden': true
});
};
return TimeDivider;
}(Component);
Component.registerComponent('TimeDivider', TimeDivider);
var RemainingTimeDisplay =
function (_TimeDisplay){
inheritsLoose(RemainingTimeDisplay, _TimeDisplay);
function RemainingTimeDisplay(player, options){
var _this;
_this=_TimeDisplay.call(this, player, options)||this;
_this.on(player, 'durationchange', _this.updateContent);
return _this;
}
var _proto=RemainingTimeDisplay.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return 'vjs-remaining-time';
}
;
_proto.createEl=function createEl$1(){
var el=_TimeDisplay.prototype.createEl.call(this);
el.insertBefore(createEl('span', {}, {
'aria-hidden': true
}, '-'), this.contentEl_);
return el;
}
;
_proto.updateContent=function updateContent(event){
if(typeof this.player_.duration()!=='number'){
return;
}
var time;
if(this.player_.ended()){
time=0;
}else if(this.player_.remainingTimeDisplay){
time=this.player_.remainingTimeDisplay();
}else{
time=this.player_.remainingTime();
}
this.updateTextNode_(time);
};
return RemainingTimeDisplay;
}(TimeDisplay);
RemainingTimeDisplay.prototype.labelText_='Remaining Time';
RemainingTimeDisplay.prototype.controlText_='Remaining Time';
Component.registerComponent('RemainingTimeDisplay', RemainingTimeDisplay);
var LiveDisplay =
function (_Component){
inheritsLoose(LiveDisplay, _Component);
function LiveDisplay(player, options){
var _this;
_this=_Component.call(this, player, options)||this;
_this.updateShowing();
_this.on(_this.player(), 'durationchange', _this.updateShowing);
return _this;
}
var _proto=LiveDisplay.prototype;
_proto.createEl=function createEl$1(){
var el=_Component.prototype.createEl.call(this, 'div', {
className: 'vjs-live-control vjs-control'
});
this.contentEl_=createEl('div', {
className: 'vjs-live-display',
innerHTML: "<span class=\"vjs-control-text\">" + this.localize('Stream Type') + "\xA0</span>" + this.localize('LIVE')
}, {
'aria-live': 'off'
});
el.appendChild(this.contentEl_);
return el;
};
_proto.dispose=function dispose(){
this.contentEl_=null;
_Component.prototype.dispose.call(this);
}
;
_proto.updateShowing=function updateShowing(event){
if(this.player().duration()===Infinity){
this.show();
}else{
this.hide();
}};
return LiveDisplay;
}(Component);
Component.registerComponent('LiveDisplay', LiveDisplay);
var SeekToLive =
function (_Button){
inheritsLoose(SeekToLive, _Button);
function SeekToLive(player, options){
var _this;
_this=_Button.call(this, player, options)||this;
_this.updateLiveEdgeStatus();
if(_this.player_.liveTracker){
_this.on(_this.player_.liveTracker, 'liveedgechange', _this.updateLiveEdgeStatus);
}
return _this;
}
var _proto=SeekToLive.prototype;
_proto.createEl=function createEl$1(){
var el=_Button.prototype.createEl.call(this, 'button', {
className: 'vjs-seek-to-live-control vjs-control'
});
this.textEl_=createEl('span', {
className: 'vjs-seek-to-live-text',
innerHTML: this.localize('LIVE')
}, {
'aria-hidden': 'true'
});
el.appendChild(this.textEl_);
return el;
}
;
_proto.updateLiveEdgeStatus=function updateLiveEdgeStatus(e){
if(!this.player_.liveTracker||this.player_.liveTracker.atLiveEdge()){
this.setAttribute('aria-disabled', true);
this.addClass('vjs-at-live-edge');
this.controlText('Seek to live, currently playing live');
}else{
this.setAttribute('aria-disabled', false);
this.removeClass('vjs-at-live-edge');
this.controlText('Seek to live, currently behind live');
}}
;
_proto.handleClick=function handleClick(){
this.player_.liveTracker.seekToLiveEdge();
}
;
_proto.dispose=function dispose(){
if(this.player_.liveTracker){
this.off(this.player_.liveTracker, 'liveedgechange', this.updateLiveEdgeStatus);
}
this.textEl_=null;
_Button.prototype.dispose.call(this);
};
return SeekToLive;
}(Button);
SeekToLive.prototype.controlText_='Seek to live, currently playing live';
Component.registerComponent('SeekToLive', SeekToLive);
var clamp=function clamp(number, min, max){
number=Number(number);
return Math.min(max, Math.max(min, isNaN(number) ? min:number));
};
var Slider =
function (_Component){
inheritsLoose(Slider, _Component);
function Slider(player, options){
var _this;
_this=_Component.call(this, player, options)||this;
_this.bar=_this.getChild(_this.options_.barName);
_this.vertical(!!_this.options_.vertical);
_this.enable();
return _this;
}
var _proto=Slider.prototype;
_proto.enabled=function enabled(){
return this.enabled_;
}
;
_proto.enable=function enable(){
if(this.enabled()){
return;
}
this.on('mousedown', this.handleMouseDown);
this.on('touchstart', this.handleMouseDown);
this.on('keydown', this.handleKeyDown);
this.on('click', this.handleClick);
this.on(this.player_, 'controlsvisible', this.update);
if(this.playerEvent){
this.on(this.player_, this.playerEvent, this.update);
}
this.removeClass('disabled');
this.setAttribute('tabindex', 0);
this.enabled_=true;
}
;
_proto.disable=function disable(){
if(!this.enabled()){
return;
}
var doc=this.bar.el_.ownerDocument;
this.off('mousedown', this.handleMouseDown);
this.off('touchstart', this.handleMouseDown);
this.off('keydown', this.handleKeyDown);
this.off('click', this.handleClick);
this.off(this.player_, 'controlsvisible', this.update);
this.off(doc, 'mousemove', this.handleMouseMove);
this.off(doc, 'mouseup', this.handleMouseUp);
this.off(doc, 'touchmove', this.handleMouseMove);
this.off(doc, 'touchend', this.handleMouseUp);
this.removeAttribute('tabindex');
this.addClass('disabled');
if(this.playerEvent){
this.off(this.player_, this.playerEvent, this.update);
}
this.enabled_=false;
}
;
_proto.createEl=function createEl(type, props, attributes){
if(props===void 0){
props={};}
if(attributes===void 0){
attributes={};}
props.className=props.className + ' vjs-slider';
props=assign({
tabIndex: 0
}, props);
attributes=assign({
'role': 'slider',
'aria-valuenow': 0,
'aria-valuemin': 0,
'aria-valuemax': 100,
'tabIndex': 0
}, attributes);
return _Component.prototype.createEl.call(this, type, props, attributes);
}
;
_proto.handleMouseDown=function handleMouseDown(event){
var doc=this.bar.el_.ownerDocument;
if(event.type==='mousedown'){
event.preventDefault();
}
if(event.type==='touchstart'&&!IS_CHROME){
event.preventDefault();
}
blockTextSelection();
this.addClass('vjs-sliding');
this.trigger('slideractive');
this.on(doc, 'mousemove', this.handleMouseMove);
this.on(doc, 'mouseup', this.handleMouseUp);
this.on(doc, 'touchmove', this.handleMouseMove);
this.on(doc, 'touchend', this.handleMouseUp);
this.handleMouseMove(event);
}
;
_proto.handleMouseMove=function handleMouseMove(event){}
;
_proto.handleMouseUp=function handleMouseUp(){
var doc=this.bar.el_.ownerDocument;
unblockTextSelection();
this.removeClass('vjs-sliding');
this.trigger('sliderinactive');
this.off(doc, 'mousemove', this.handleMouseMove);
this.off(doc, 'mouseup', this.handleMouseUp);
this.off(doc, 'touchmove', this.handleMouseMove);
this.off(doc, 'touchend', this.handleMouseUp);
this.update();
}
;
_proto.update=function update(){
var _this2=this;
if(!this.el_||!this.bar){
return;
}
var progress=this.getProgress();
if(progress===this.progress_){
return;
}
this.progress_=progress;
this.requestAnimationFrame(function (){
var sizeKey=_this2.vertical() ? 'height':'width';
_this2.bar.el().style[sizeKey]=(progress * 100).toFixed(2) + '%';
});
return progress;
}
;
_proto.getProgress=function getProgress(){
return clamp(this.getPercent(), 0, 1).toFixed(4);
}
;
_proto.calculateDistance=function calculateDistance(event){
var position=getPointerPosition(this.el_, event);
if(this.vertical()){
return position.y;
}
return position.x;
}
;
_proto.handleKeyDown=function handleKeyDown(event){
if(keycode.isEventKey(event, 'Left')||keycode.isEventKey(event, 'Down')){
event.preventDefault();
event.stopPropagation();
this.stepBack();
}else if(keycode.isEventKey(event, 'Right')||keycode.isEventKey(event, 'Up')){
event.preventDefault();
event.stopPropagation();
this.stepForward();
}else{
_Component.prototype.handleKeyDown.call(this, event);
}}
;
_proto.handleClick=function handleClick(event){
event.stopPropagation();
event.preventDefault();
}
;
_proto.vertical=function vertical(bool){
if(bool===undefined){
return this.vertical_||false;
}
this.vertical_ = !!bool;
if(this.vertical_){
this.addClass('vjs-slider-vertical');
}else{
this.addClass('vjs-slider-horizontal');
}};
return Slider;
}(Component);
Component.registerComponent('Slider', Slider);
var percentify=function percentify(time, end){
return clamp(time / end * 100, 0, 100).toFixed(2) + '%';
};
var LoadProgressBar =
function (_Component){
inheritsLoose(LoadProgressBar, _Component);
function LoadProgressBar(player, options){
var _this;
_this=_Component.call(this, player, options)||this;
_this.partEls_=[];
_this.on(player, 'progress', _this.update);
return _this;
}
var _proto=LoadProgressBar.prototype;
_proto.createEl=function createEl$1(){
var el=_Component.prototype.createEl.call(this, 'div', {
className: 'vjs-load-progress'
});
var wrapper=createEl('span', {
className: 'vjs-control-text'
});
var loadedText=createEl('span', {
textContent: this.localize('Loaded')
});
var separator=document.createTextNode(': ');
this.percentageEl_=createEl('span', {
className: 'vjs-control-text-loaded-percentage',
textContent: '0%'
});
el.appendChild(wrapper);
wrapper.appendChild(loadedText);
wrapper.appendChild(separator);
wrapper.appendChild(this.percentageEl_);
return el;
};
_proto.dispose=function dispose(){
this.partEls_=null;
this.percentageEl_=null;
_Component.prototype.dispose.call(this);
}
;
_proto.update=function update(event){
var _this2=this;
this.requestAnimationFrame(function (){
var liveTracker=_this2.player_.liveTracker;
var buffered=_this2.player_.buffered();
var duration=liveTracker&&liveTracker.isLive() ? liveTracker.seekableEnd():_this2.player_.duration();
var bufferedEnd=_this2.player_.bufferedEnd();
var children=_this2.partEls_;
var percent=percentify(bufferedEnd, duration);
if(_this2.percent_!==percent){
_this2.el_.style.width=percent;
textContent(_this2.percentageEl_, percent);
_this2.percent_=percent;
}
for (var i=0; i < buffered.length; i++){
var start=buffered.start(i);
var end=buffered.end(i);
var part=children[i];
if(!part){
part=_this2.el_.appendChild(createEl());
children[i]=part;
}
if(part.dataset.start===start&&part.dataset.end===end){
continue;
}
part.dataset.start=start;
part.dataset.end=end;
part.style.left=percentify(start, bufferedEnd);
part.style.width=percentify(end - start, bufferedEnd);
}
for (var _i=children.length; _i > buffered.length; _i--){
_this2.el_.removeChild(children[_i - 1]);
}
children.length=buffered.length;
});
};
return LoadProgressBar;
}(Component);
Component.registerComponent('LoadProgressBar', LoadProgressBar);
var TimeTooltip =
function (_Component){
inheritsLoose(TimeTooltip, _Component);
function TimeTooltip(player, options){
var _this;
_this=_Component.call(this, player, options)||this;
_this.update=throttle(bind(assertThisInitialized(_this), _this.update), UPDATE_REFRESH_INTERVAL);
return _this;
}
var _proto=TimeTooltip.prototype;
_proto.createEl=function createEl(){
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-time-tooltip'
}, {
'aria-hidden': 'true'
});
}
;
_proto.update=function update(seekBarRect, seekBarPoint, content){
var tooltipRect=getBoundingClientRect(this.el_);
var playerRect=getBoundingClientRect(this.player_.el());
var seekBarPointPx=seekBarRect.width * seekBarPoint;
if(!playerRect||!tooltipRect){
return;
}
var spaceLeftOfPoint=seekBarRect.left - playerRect.left + seekBarPointPx;
var spaceRightOfPoint=seekBarRect.width - seekBarPointPx + (playerRect.right - seekBarRect.right);
var pullTooltipBy=tooltipRect.width / 2;
if(spaceLeftOfPoint < pullTooltipBy){
pullTooltipBy +=pullTooltipBy - spaceLeftOfPoint;
}else if(spaceRightOfPoint < pullTooltipBy){
pullTooltipBy=spaceRightOfPoint;
}
if(pullTooltipBy < 0){
pullTooltipBy=0;
}else if(pullTooltipBy > tooltipRect.width){
pullTooltipBy=tooltipRect.width;
}
this.el_.style.right="-" + pullTooltipBy + "px";
this.write(content);
}
;
_proto.write=function write(content){
textContent(this.el_, content);
}
;
_proto.updateTime=function updateTime(seekBarRect, seekBarPoint, time, cb){
var _this2=this;
if(this.rafId_){
this.cancelAnimationFrame(this.rafId_);
}
this.rafId_=this.requestAnimationFrame(function (){
var content;
var duration=_this2.player_.duration();
if(_this2.player_.liveTracker&&_this2.player_.liveTracker.isLive()){
var liveWindow=_this2.player_.liveTracker.liveWindow();
var secondsBehind=liveWindow - seekBarPoint * liveWindow;
content=(secondsBehind < 1 ? '':'-') + formatTime(secondsBehind, liveWindow);
}else{
content=formatTime(time, duration);
}
_this2.update(seekBarRect, seekBarPoint, content);
if(cb){
cb();
}});
};
return TimeTooltip;
}(Component);
Component.registerComponent('TimeTooltip', TimeTooltip);
var PlayProgressBar =
function (_Component){
inheritsLoose(PlayProgressBar, _Component);
function PlayProgressBar(player, options){
var _this;
_this=_Component.call(this, player, options)||this;
_this.update=throttle(bind(assertThisInitialized(_this), _this.update), UPDATE_REFRESH_INTERVAL);
return _this;
}
var _proto=PlayProgressBar.prototype;
_proto.createEl=function createEl(){
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-play-progress vjs-slider-bar'
}, {
'aria-hidden': 'true'
});
}
;
_proto.update=function update(seekBarRect, seekBarPoint){
var timeTooltip=this.getChild('timeTooltip');
if(!timeTooltip){
return;
}
var time=this.player_.scrubbing() ? this.player_.getCache().currentTime:this.player_.currentTime();
timeTooltip.updateTime(seekBarRect, seekBarPoint, time);
};
return PlayProgressBar;
}(Component);
PlayProgressBar.prototype.options_={
children: []
};
if(!IS_IOS&&!IS_ANDROID){
PlayProgressBar.prototype.options_.children.push('timeTooltip');
}
Component.registerComponent('PlayProgressBar', PlayProgressBar);
var MouseTimeDisplay =
function (_Component){
inheritsLoose(MouseTimeDisplay, _Component);
function MouseTimeDisplay(player, options){
var _this;
_this=_Component.call(this, player, options)||this;
_this.update=throttle(bind(assertThisInitialized(_this), _this.update), UPDATE_REFRESH_INTERVAL);
return _this;
}
var _proto=MouseTimeDisplay.prototype;
_proto.createEl=function createEl(){
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-mouse-display'
});
}
;
_proto.update=function update(seekBarRect, seekBarPoint){
var _this2=this;
var time=seekBarPoint * this.player_.duration();
this.getChild('timeTooltip').updateTime(seekBarRect, seekBarPoint, time, function (){
_this2.el_.style.left=seekBarRect.width * seekBarPoint + "px";
});
};
return MouseTimeDisplay;
}(Component);
MouseTimeDisplay.prototype.options_={
children: ['timeTooltip']
};
Component.registerComponent('MouseTimeDisplay', MouseTimeDisplay);
var STEP_SECONDS=5;
var PAGE_KEY_MULTIPLIER=12;
var UPDATE_REFRESH_INTERVAL$1=30;
var SeekBar =
function (_Slider){
inheritsLoose(SeekBar, _Slider);
function SeekBar(player, options){
var _this;
_this=_Slider.call(this, player, options)||this;
_this.setEventHandlers_();
return _this;
}
var _proto=SeekBar.prototype;
_proto.setEventHandlers_=function setEventHandlers_(){
this.update_=bind(this, this.update);
this.update=throttle(this.update_, UPDATE_REFRESH_INTERVAL$1);
this.on(this.player_, ['ended', 'durationchange', 'timeupdate'], this.update);
if(this.player_.liveTracker){
this.on(this.player_.liveTracker, 'liveedgechange', this.update);
}
this.updateInterval=null;
this.on(this.player_, ['playing'], this.enableInterval_);
this.on(this.player_, ['ended', 'pause', 'waiting'], this.disableInterval_);
if('hidden' in document&&'visibilityState' in document){
this.on(document, 'visibilitychange', this.toggleVisibility_);
}};
_proto.toggleVisibility_=function toggleVisibility_(e){
if(document.hidden){
this.disableInterval_(e);
}else{
this.enableInterval_();
this.update();
}};
_proto.enableInterval_=function enableInterval_(){
if(this.updateInterval){
return;
}
this.updateInterval=this.setInterval(this.update, UPDATE_REFRESH_INTERVAL$1);
};
_proto.disableInterval_=function disableInterval_(e){
if(this.player_.liveTracker&&this.player_.liveTracker.isLive()&&e.type!=='ended'){
return;
}
if(!this.updateInterval){
return;
}
this.clearInterval(this.updateInterval);
this.updateInterval=null;
}
;
_proto.createEl=function createEl(){
return _Slider.prototype.createEl.call(this, 'div', {
className: 'vjs-progress-holder'
}, {
'aria-label': this.localize('Progress Bar')
});
}
;
_proto.update=function update(event){
var _this2=this;
var percent=_Slider.prototype.update.call(this);
this.requestAnimationFrame(function (){
var currentTime=_this2.player_.ended() ? _this2.player_.duration():_this2.getCurrentTime_();
var liveTracker=_this2.player_.liveTracker;
var duration=_this2.player_.duration();
if(liveTracker&&liveTracker.isLive()){
duration=_this2.player_.liveTracker.liveCurrentTime();
}
if(_this2.percent_!==percent){
_this2.el_.setAttribute('aria-valuenow', (percent * 100).toFixed(2));
_this2.percent_=percent;
}
if(_this2.currentTime_!==currentTime||_this2.duration_!==duration){
_this2.el_.setAttribute('aria-valuetext', _this2.localize('progress bar timing: currentTime={1} duration={2}', [formatTime(currentTime, duration), formatTime(duration, duration)], '{1} of {2}'));
_this2.currentTime_=currentTime;
_this2.duration_=duration;
}});
return percent;
}
;
_proto.getCurrentTime_=function getCurrentTime_(){
return this.player_.scrubbing() ? this.player_.getCache().currentTime:this.player_.currentTime();
}
;
_proto.getPercent=function getPercent(){
var currentTime=this.getCurrentTime_();
var percent;
var liveTracker=this.player_.liveTracker;
if(liveTracker&&liveTracker.isLive()){
percent=(currentTime - liveTracker.seekableStart()) / liveTracker.liveWindow();
if(liveTracker.atLiveEdge()){
percent=1;
}}else{
percent=currentTime / this.player_.duration();
}
return percent;
}
;
_proto.handleMouseDown=function handleMouseDown(event){
if(!isSingleLeftClick(event)){
return;
}
event.stopPropagation();
this.player_.scrubbing(true);
this.videoWasPlaying = !this.player_.paused();
this.player_.pause();
_Slider.prototype.handleMouseDown.call(this, event);
}
;
_proto.handleMouseMove=function handleMouseMove(event){
if(!isSingleLeftClick(event)){
return;
}
var newTime;
var distance=this.calculateDistance(event);
var liveTracker=this.player_.liveTracker;
if(!liveTracker||!liveTracker.isLive()){
newTime=distance * this.player_.duration();
if(newTime===this.player_.duration()){
newTime=newTime - 0.1;
}}else{
var seekableStart=liveTracker.seekableStart();
var seekableEnd=liveTracker.liveCurrentTime();
newTime=seekableStart + distance * liveTracker.liveWindow();
if(newTime >=seekableEnd){
newTime=seekableEnd;
}
if(newTime <=seekableStart){
newTime=seekableStart + 0.1;
}
if(newTime===Infinity){
return;
}}
this.player_.currentTime(newTime);
};
_proto.enable=function enable(){
_Slider.prototype.enable.call(this);
var mouseTimeDisplay=this.getChild('mouseTimeDisplay');
if(!mouseTimeDisplay){
return;
}
mouseTimeDisplay.show();
};
_proto.disable=function disable(){
_Slider.prototype.disable.call(this);
var mouseTimeDisplay=this.getChild('mouseTimeDisplay');
if(!mouseTimeDisplay){
return;
}
mouseTimeDisplay.hide();
}
;
_proto.handleMouseUp=function handleMouseUp(event){
_Slider.prototype.handleMouseUp.call(this, event);
if(event){
event.stopPropagation();
}
this.player_.scrubbing(false);
this.player_.trigger({
type: 'timeupdate',
target: this,
manuallyTriggered: true
});
if(this.videoWasPlaying){
silencePromise(this.player_.play());
}else{
this.update_();
}}
;
_proto.stepForward=function stepForward(){
this.player_.currentTime(this.player_.currentTime() + STEP_SECONDS);
}
;
_proto.stepBack=function stepBack(){
this.player_.currentTime(this.player_.currentTime() - STEP_SECONDS);
}
;
_proto.handleAction=function handleAction(event){
if(this.player_.paused()){
this.player_.play();
}else{
this.player_.pause();
}}
;
_proto.handleKeyDown=function handleKeyDown(event){
if(keycode.isEventKey(event, 'Space')||keycode.isEventKey(event, 'Enter')){
event.preventDefault();
event.stopPropagation();
this.handleAction(event);
}else if(keycode.isEventKey(event, 'Home')){
event.preventDefault();
event.stopPropagation();
this.player_.currentTime(0);
}else if(keycode.isEventKey(event, 'End')){
event.preventDefault();
event.stopPropagation();
this.player_.currentTime(this.player_.duration());
}else if(/^[0-9]$/.test(keycode(event))){
event.preventDefault();
event.stopPropagation();
var gotoFraction=(keycode.codes[keycode(event)] - keycode.codes['0']) * 10.0 / 100.0;
this.player_.currentTime(this.player_.duration() * gotoFraction);
}else if(keycode.isEventKey(event, 'PgDn')){
event.preventDefault();
event.stopPropagation();
this.player_.currentTime(this.player_.currentTime() - STEP_SECONDS * PAGE_KEY_MULTIPLIER);
}else if(keycode.isEventKey(event, 'PgUp')){
event.preventDefault();
event.stopPropagation();
this.player_.currentTime(this.player_.currentTime() + STEP_SECONDS * PAGE_KEY_MULTIPLIER);
}else{
_Slider.prototype.handleKeyDown.call(this, event);
}};
return SeekBar;
}(Slider);
SeekBar.prototype.options_={
children: ['loadProgressBar', 'playProgressBar'],
barName: 'playProgressBar'
};
if(!IS_IOS&&!IS_ANDROID){
SeekBar.prototype.options_.children.splice(1, 0, 'mouseTimeDisplay');
}
Component.registerComponent('SeekBar', SeekBar);
var ProgressControl =
function (_Component){
inheritsLoose(ProgressControl, _Component);
function ProgressControl(player, options){
var _this;
_this=_Component.call(this, player, options)||this;
_this.handleMouseMove=throttle(bind(assertThisInitialized(_this), _this.handleMouseMove), UPDATE_REFRESH_INTERVAL);
_this.throttledHandleMouseSeek=throttle(bind(assertThisInitialized(_this), _this.handleMouseSeek), UPDATE_REFRESH_INTERVAL);
_this.enable();
return _this;
}
var _proto=ProgressControl.prototype;
_proto.createEl=function createEl(){
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-progress-control vjs-control'
});
}
;
_proto.handleMouseMove=function handleMouseMove(event){
var seekBar=this.getChild('seekBar');
if(!seekBar){
return;
}
var playProgressBar=seekBar.getChild('playProgressBar');
var mouseTimeDisplay=seekBar.getChild('mouseTimeDisplay');
if(!playProgressBar&&!mouseTimeDisplay){
return;
}
var seekBarEl=seekBar.el();
var seekBarRect=getBoundingClientRect(seekBarEl);
var seekBarPoint=getPointerPosition(seekBarEl, event).x;
seekBarPoint=clamp(0, 1, seekBarPoint);
if(mouseTimeDisplay){
mouseTimeDisplay.update(seekBarRect, seekBarPoint);
}
if(playProgressBar){
playProgressBar.update(seekBarRect, seekBar.getProgress());
}}
;
_proto.handleMouseSeek=function handleMouseSeek(event){
var seekBar=this.getChild('seekBar');
if(seekBar){
seekBar.handleMouseMove(event);
}}
;
_proto.enabled=function enabled(){
return this.enabled_;
}
;
_proto.disable=function disable(){
this.children().forEach(function (child){
return child.disable&&child.disable();
});
if(!this.enabled()){
return;
}
this.off(['mousedown', 'touchstart'], this.handleMouseDown);
this.off(this.el_, 'mousemove', this.handleMouseMove);
this.handleMouseUp();
this.addClass('disabled');
this.enabled_=false;
}
;
_proto.enable=function enable(){
this.children().forEach(function (child){
return child.enable&&child.enable();
});
if(this.enabled()){
return;
}
this.on(['mousedown', 'touchstart'], this.handleMouseDown);
this.on(this.el_, 'mousemove', this.handleMouseMove);
this.removeClass('disabled');
this.enabled_=true;
}
;
_proto.handleMouseDown=function handleMouseDown(event){
var doc=this.el_.ownerDocument;
var seekBar=this.getChild('seekBar');
if(seekBar){
seekBar.handleMouseDown(event);
}
this.on(doc, 'mousemove', this.throttledHandleMouseSeek);
this.on(doc, 'touchmove', this.throttledHandleMouseSeek);
this.on(doc, 'mouseup', this.handleMouseUp);
this.on(doc, 'touchend', this.handleMouseUp);
}
;
_proto.handleMouseUp=function handleMouseUp(event){
var doc=this.el_.ownerDocument;
var seekBar=this.getChild('seekBar');
if(seekBar){
seekBar.handleMouseUp(event);
}
this.off(doc, 'mousemove', this.throttledHandleMouseSeek);
this.off(doc, 'touchmove', this.throttledHandleMouseSeek);
this.off(doc, 'mouseup', this.handleMouseUp);
this.off(doc, 'touchend', this.handleMouseUp);
};
return ProgressControl;
}(Component);
ProgressControl.prototype.options_={
children: ['seekBar']
};
Component.registerComponent('ProgressControl', ProgressControl);
var PictureInPictureToggle =
function (_Button){
inheritsLoose(PictureInPictureToggle, _Button);
function PictureInPictureToggle(player, options){
var _this;
_this=_Button.call(this, player, options)||this;
_this.on(player, ['enterpictureinpicture', 'leavepictureinpicture'], _this.handlePictureInPictureChange);
if(!document.pictureInPictureEnabled){
_this.disable();
}
return _this;
}
var _proto=PictureInPictureToggle.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-picture-in-picture-control " + _Button.prototype.buildCSSClass.call(this);
}
;
_proto.handlePictureInPictureChange=function handlePictureInPictureChange(event){
if(this.player_.isInPictureInPicture()){
this.controlText('Exit Picture-in-Picture');
}else{
this.controlText('Picture-in-Picture');
}}
;
_proto.handleClick=function handleClick(event){
if(!this.player_.isInPictureInPicture()){
this.player_.requestPictureInPicture();
}else{
this.player_.exitPictureInPicture();
}};
return PictureInPictureToggle;
}(Button);
PictureInPictureToggle.prototype.controlText_='Picture-in-Picture';
Component.registerComponent('PictureInPictureToggle', PictureInPictureToggle);
var FullscreenToggle =
function (_Button){
inheritsLoose(FullscreenToggle, _Button);
function FullscreenToggle(player, options){
var _this;
_this=_Button.call(this, player, options)||this;
_this.on(player, 'fullscreenchange', _this.handleFullscreenChange);
if(document[player.fsApi_.fullscreenEnabled]===false){
_this.disable();
}
return _this;
}
var _proto=FullscreenToggle.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-fullscreen-control " + _Button.prototype.buildCSSClass.call(this);
}
;
_proto.handleFullscreenChange=function handleFullscreenChange(event){
if(this.player_.isFullscreen()){
this.controlText('Non-Fullscreen');
}else{
this.controlText('Fullscreen');
}}
;
_proto.handleClick=function handleClick(event){
if(!this.player_.isFullscreen()){
this.player_.requestFullscreen();
}else{
this.player_.exitFullscreen();
}};
return FullscreenToggle;
}(Button);
FullscreenToggle.prototype.controlText_='Fullscreen';
Component.registerComponent('FullscreenToggle', FullscreenToggle);
var checkVolumeSupport=function checkVolumeSupport(self, player){
if(player.tech_&&!player.tech_.featuresVolumeControl){
self.addClass('vjs-hidden');
}
self.on(player, 'loadstart', function (){
if(!player.tech_.featuresVolumeControl){
self.addClass('vjs-hidden');
}else{
self.removeClass('vjs-hidden');
}});
};
var VolumeLevel =
function (_Component){
inheritsLoose(VolumeLevel, _Component);
function VolumeLevel(){
return _Component.apply(this, arguments)||this;
}
var _proto=VolumeLevel.prototype;
_proto.createEl=function createEl(){
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-volume-level',
innerHTML: '<span class="vjs-control-text"></span>'
});
};
return VolumeLevel;
}(Component);
Component.registerComponent('VolumeLevel', VolumeLevel);
var VolumeBar =
function (_Slider){
inheritsLoose(VolumeBar, _Slider);
function VolumeBar(player, options){
var _this;
_this=_Slider.call(this, player, options)||this;
_this.on('slideractive', _this.updateLastVolume_);
_this.on(player, 'volumechange', _this.updateARIAAttributes);
player.ready(function (){
return _this.updateARIAAttributes();
});
return _this;
}
var _proto=VolumeBar.prototype;
_proto.createEl=function createEl(){
return _Slider.prototype.createEl.call(this, 'div', {
className: 'vjs-volume-bar vjs-slider-bar'
}, {
'aria-label': this.localize('Volume Level'),
'aria-live': 'polite'
});
}
;
_proto.handleMouseDown=function handleMouseDown(event){
if(!isSingleLeftClick(event)){
return;
}
_Slider.prototype.handleMouseDown.call(this, event);
}
;
_proto.handleMouseMove=function handleMouseMove(event){
if(!isSingleLeftClick(event)){
return;
}
this.checkMuted();
this.player_.volume(this.calculateDistance(event));
}
;
_proto.checkMuted=function checkMuted(){
if(this.player_.muted()){
this.player_.muted(false);
}}
;
_proto.getPercent=function getPercent(){
if(this.player_.muted()){
return 0;
}
return this.player_.volume();
}
;
_proto.stepForward=function stepForward(){
this.checkMuted();
this.player_.volume(this.player_.volume() + 0.1);
}
;
_proto.stepBack=function stepBack(){
this.checkMuted();
this.player_.volume(this.player_.volume() - 0.1);
}
;
_proto.updateARIAAttributes=function updateARIAAttributes(event){
var ariaValue=this.player_.muted() ? 0:this.volumeAsPercentage_();
this.el_.setAttribute('aria-valuenow', ariaValue);
this.el_.setAttribute('aria-valuetext', ariaValue + '%');
}
;
_proto.volumeAsPercentage_=function volumeAsPercentage_(){
return Math.round(this.player_.volume() * 100);
}
;
_proto.updateLastVolume_=function updateLastVolume_(){
var _this2=this;
var volumeBeforeDrag=this.player_.volume();
this.one('sliderinactive', function (){
if(_this2.player_.volume()===0){
_this2.player_.lastVolume_(volumeBeforeDrag);
}});
};
return VolumeBar;
}(Slider);
VolumeBar.prototype.options_={
children: ['volumeLevel'],
barName: 'volumeLevel'
};
VolumeBar.prototype.playerEvent='volumechange';
Component.registerComponent('VolumeBar', VolumeBar);
var VolumeControl =
function (_Component){
inheritsLoose(VolumeControl, _Component);
function VolumeControl(player, options){
var _this;
if(options===void 0){
options={};}
options.vertical=options.vertical||false;
if(typeof options.volumeBar==='undefined'||isPlain(options.volumeBar)){
options.volumeBar=options.volumeBar||{};
options.volumeBar.vertical=options.vertical;
}
_this=_Component.call(this, player, options)||this;
checkVolumeSupport(assertThisInitialized(_this), player);
_this.throttledHandleMouseMove=throttle(bind(assertThisInitialized(_this), _this.handleMouseMove), UPDATE_REFRESH_INTERVAL);
_this.on('mousedown', _this.handleMouseDown);
_this.on('touchstart', _this.handleMouseDown);
_this.on(_this.volumeBar, ['focus', 'slideractive'], function (){
_this.volumeBar.addClass('vjs-slider-active');
_this.addClass('vjs-slider-active');
_this.trigger('slideractive');
});
_this.on(_this.volumeBar, ['blur', 'sliderinactive'], function (){
_this.volumeBar.removeClass('vjs-slider-active');
_this.removeClass('vjs-slider-active');
_this.trigger('sliderinactive');
});
return _this;
}
var _proto=VolumeControl.prototype;
_proto.createEl=function createEl(){
var orientationClass='vjs-volume-horizontal';
if(this.options_.vertical){
orientationClass='vjs-volume-vertical';
}
return _Component.prototype.createEl.call(this, 'div', {
className: "vjs-volume-control vjs-control " + orientationClass
});
}
;
_proto.handleMouseDown=function handleMouseDown(event){
var doc=this.el_.ownerDocument;
this.on(doc, 'mousemove', this.throttledHandleMouseMove);
this.on(doc, 'touchmove', this.throttledHandleMouseMove);
this.on(doc, 'mouseup', this.handleMouseUp);
this.on(doc, 'touchend', this.handleMouseUp);
}
;
_proto.handleMouseUp=function handleMouseUp(event){
var doc=this.el_.ownerDocument;
this.off(doc, 'mousemove', this.throttledHandleMouseMove);
this.off(doc, 'touchmove', this.throttledHandleMouseMove);
this.off(doc, 'mouseup', this.handleMouseUp);
this.off(doc, 'touchend', this.handleMouseUp);
}
;
_proto.handleMouseMove=function handleMouseMove(event){
this.volumeBar.handleMouseMove(event);
};
return VolumeControl;
}(Component);
VolumeControl.prototype.options_={
children: ['volumeBar']
};
Component.registerComponent('VolumeControl', VolumeControl);
var checkMuteSupport=function checkMuteSupport(self, player){
if(player.tech_&&!player.tech_.featuresMuteControl){
self.addClass('vjs-hidden');
}
self.on(player, 'loadstart', function (){
if(!player.tech_.featuresMuteControl){
self.addClass('vjs-hidden');
}else{
self.removeClass('vjs-hidden');
}});
};
var MuteToggle =
function (_Button){
inheritsLoose(MuteToggle, _Button);
function MuteToggle(player, options){
var _this;
_this=_Button.call(this, player, options)||this;
checkMuteSupport(assertThisInitialized(_this), player);
_this.on(player, ['loadstart', 'volumechange'], _this.update);
return _this;
}
var _proto=MuteToggle.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-mute-control " + _Button.prototype.buildCSSClass.call(this);
}
;
_proto.handleClick=function handleClick(event){
var vol=this.player_.volume();
var lastVolume=this.player_.lastVolume_();
if(vol===0){
var volumeToSet=lastVolume < 0.1 ? 0.1:lastVolume;
this.player_.volume(volumeToSet);
this.player_.muted(false);
}else{
this.player_.muted(this.player_.muted() ? false:true);
}}
;
_proto.update=function update(event){
this.updateIcon_();
this.updateControlText_();
}
;
_proto.updateIcon_=function updateIcon_(){
var vol=this.player_.volume();
var level=3;
if(IS_IOS&&this.player_.tech_&&this.player_.tech_.el_){
this.player_.muted(this.player_.tech_.el_.muted);
}
if(vol===0||this.player_.muted()){
level=0;
}else if(vol < 0.33){
level=1;
}else if(vol < 0.67){
level=2;
}
for (var i=0; i < 4; i++){
removeClass(this.el_, "vjs-vol-" + i);
}
addClass(this.el_, "vjs-vol-" + level);
}
;
_proto.updateControlText_=function updateControlText_(){
var soundOff=this.player_.muted()||this.player_.volume()===0;
var text=soundOff ? 'Unmute':'Mute';
if(this.controlText()!==text){
this.controlText(text);
}};
return MuteToggle;
}(Button);
MuteToggle.prototype.controlText_='Mute';
Component.registerComponent('MuteToggle', MuteToggle);
var VolumePanel =
function (_Component){
inheritsLoose(VolumePanel, _Component);
function VolumePanel(player, options){
var _this;
if(options===void 0){
options={};}
if(typeof options.inline!=='undefined'){
options.inline=options.inline;
}else{
options.inline=true;
}
if(typeof options.volumeControl==='undefined'||isPlain(options.volumeControl)){
options.volumeControl=options.volumeControl||{};
options.volumeControl.vertical = !options.inline;
}
_this=_Component.call(this, player, options)||this;
_this.on(player, ['loadstart'], _this.volumePanelState_);
_this.on(_this.muteToggle, 'keyup', _this.handleKeyPress);
_this.on(_this.volumeControl, 'keyup', _this.handleVolumeControlKeyUp);
_this.on('keydown', _this.handleKeyPress);
_this.on('mouseover', _this.handleMouseOver);
_this.on('mouseout', _this.handleMouseOut);
_this.on(_this.volumeControl, ['slideractive'], _this.sliderActive_);
_this.on(_this.volumeControl, ['sliderinactive'], _this.sliderInactive_);
return _this;
}
var _proto=VolumePanel.prototype;
_proto.sliderActive_=function sliderActive_(){
this.addClass('vjs-slider-active');
}
;
_proto.sliderInactive_=function sliderInactive_(){
this.removeClass('vjs-slider-active');
}
;
_proto.volumePanelState_=function volumePanelState_(){
if(this.volumeControl.hasClass('vjs-hidden')&&this.muteToggle.hasClass('vjs-hidden')){
this.addClass('vjs-hidden');
}
if(this.volumeControl.hasClass('vjs-hidden')&&!this.muteToggle.hasClass('vjs-hidden')){
this.addClass('vjs-mute-toggle-only');
}}
;
_proto.createEl=function createEl(){
var orientationClass='vjs-volume-panel-horizontal';
if(!this.options_.inline){
orientationClass='vjs-volume-panel-vertical';
}
return _Component.prototype.createEl.call(this, 'div', {
className: "vjs-volume-panel vjs-control " + orientationClass
});
}
;
_proto.dispose=function dispose(){
this.handleMouseOut();
_Component.prototype.dispose.call(this);
}
;
_proto.handleVolumeControlKeyUp=function handleVolumeControlKeyUp(event){
if(keycode.isEventKey(event, 'Esc')){
this.muteToggle.focus();
}}
;
_proto.handleMouseOver=function handleMouseOver(event){
this.addClass('vjs-hover');
on(document, 'keyup', bind(this, this.handleKeyPress));
}
;
_proto.handleMouseOut=function handleMouseOut(event){
this.removeClass('vjs-hover');
off(document, 'keyup', bind(this, this.handleKeyPress));
}
;
_proto.handleKeyPress=function handleKeyPress(event){
if(keycode.isEventKey(event, 'Esc')){
this.handleMouseOut();
}};
return VolumePanel;
}(Component);
VolumePanel.prototype.options_={
children: ['muteToggle', 'volumeControl']
};
Component.registerComponent('VolumePanel', VolumePanel);
var Menu =
function (_Component){
inheritsLoose(Menu, _Component);
function Menu(player, options){
var _this;
_this=_Component.call(this, player, options)||this;
if(options){
_this.menuButton_=options.menuButton;
}
_this.focusedChild_=-1;
_this.on('keydown', _this.handleKeyDown);
_this.boundHandleBlur_=bind(assertThisInitialized(_this), _this.handleBlur);
_this.boundHandleTapClick_=bind(assertThisInitialized(_this), _this.handleTapClick);
return _this;
}
var _proto=Menu.prototype;
_proto.addEventListenerForItem=function addEventListenerForItem(component){
if(!(component instanceof Component)){
return;
}
this.on(component, 'blur', this.boundHandleBlur_);
this.on(component, ['tap', 'click'], this.boundHandleTapClick_);
}
;
_proto.removeEventListenerForItem=function removeEventListenerForItem(component){
if(!(component instanceof Component)){
return;
}
this.off(component, 'blur', this.boundHandleBlur_);
this.off(component, ['tap', 'click'], this.boundHandleTapClick_);
}
;
_proto.removeChild=function removeChild(component){
if(typeof component==='string'){
component=this.getChild(component);
}
this.removeEventListenerForItem(component);
_Component.prototype.removeChild.call(this, component);
}
;
_proto.addItem=function addItem(component){
var childComponent=this.addChild(component);
if(childComponent){
this.addEventListenerForItem(childComponent);
}}
;
_proto.createEl=function createEl$1(){
var contentElType=this.options_.contentElType||'ul';
this.contentEl_=createEl(contentElType, {
className: 'vjs-menu-content'
});
this.contentEl_.setAttribute('role', 'menu');
var el=_Component.prototype.createEl.call(this, 'div', {
append: this.contentEl_,
className: 'vjs-menu'
});
el.appendChild(this.contentEl_);
on(el, 'click', function (event){
event.preventDefault();
event.stopImmediatePropagation();
});
return el;
};
_proto.dispose=function dispose(){
this.contentEl_=null;
this.boundHandleBlur_=null;
this.boundHandleTapClick_=null;
_Component.prototype.dispose.call(this);
}
;
_proto.handleBlur=function handleBlur(event){
var relatedTarget=event.relatedTarget||document.activeElement;
if(!this.children().some(function (element){
return element.el()===relatedTarget;
})){
var btn=this.menuButton_;
if(btn&&btn.buttonPressed_&&relatedTarget!==btn.el().firstChild){
btn.unpressButton();
}}
}
;
_proto.handleTapClick=function handleTapClick(event){
if(this.menuButton_){
this.menuButton_.unpressButton();
var childComponents=this.children();
if(!Array.isArray(childComponents)){
return;
}
var foundComponent=childComponents.filter(function (component){
return component.el()===event.target;
})[0];
if(!foundComponent){
return;
}
if(foundComponent.name()!=='CaptionSettingsMenuItem'){
this.menuButton_.focus();
}}
}
;
_proto.handleKeyDown=function handleKeyDown(event){
if(keycode.isEventKey(event, 'Left')||keycode.isEventKey(event, 'Down')){
event.preventDefault();
event.stopPropagation();
this.stepForward();
}else if(keycode.isEventKey(event, 'Right')||keycode.isEventKey(event, 'Up')){
event.preventDefault();
event.stopPropagation();
this.stepBack();
}}
;
_proto.stepForward=function stepForward(){
var stepChild=0;
if(this.focusedChild_!==undefined){
stepChild=this.focusedChild_ + 1;
}
this.focus(stepChild);
}
;
_proto.stepBack=function stepBack(){
var stepChild=0;
if(this.focusedChild_!==undefined){
stepChild=this.focusedChild_ - 1;
}
this.focus(stepChild);
}
;
_proto.focus=function focus(item){
if(item===void 0){
item=0;
}
var children=this.children().slice();
var haveTitle=children.length&&children[0].className&&/vjs-menu-title/.test(children[0].className);
if(haveTitle){
children.shift();
}
if(children.length > 0){
if(item < 0){
item=0;
}else if(item >=children.length){
item=children.length - 1;
}
this.focusedChild_=item;
children[item].el_.focus();
}};
return Menu;
}(Component);
Component.registerComponent('Menu', Menu);
var MenuButton =
function (_Component){
inheritsLoose(MenuButton, _Component);
function MenuButton(player, options){
var _this;
if(options===void 0){
options={};}
_this=_Component.call(this, player, options)||this;
_this.menuButton_=new Button(player, options);
_this.menuButton_.controlText(_this.controlText_);
_this.menuButton_.el_.setAttribute('aria-haspopup', 'true');
var buttonClass=Button.prototype.buildCSSClass();
_this.menuButton_.el_.className=_this.buildCSSClass() + ' ' + buttonClass;
_this.menuButton_.removeClass('vjs-control');
_this.addChild(_this.menuButton_);
_this.update();
_this.enabled_=true;
_this.on(_this.menuButton_, 'tap', _this.handleClick);
_this.on(_this.menuButton_, 'click', _this.handleClick);
_this.on(_this.menuButton_, 'keydown', _this.handleKeyDown);
_this.on(_this.menuButton_, 'mouseenter', function (){
_this.addClass('vjs-hover');
_this.menu.show();
on(document, 'keyup', bind(assertThisInitialized(_this), _this.handleMenuKeyUp));
});
_this.on('mouseleave', _this.handleMouseLeave);
_this.on('keydown', _this.handleSubmenuKeyDown);
return _this;
}
var _proto=MenuButton.prototype;
_proto.update=function update(){
var menu=this.createMenu();
if(this.menu){
this.menu.dispose();
this.removeChild(this.menu);
}
this.menu=menu;
this.addChild(menu);
this.buttonPressed_=false;
this.menuButton_.el_.setAttribute('aria-expanded', 'false');
if(this.items&&this.items.length <=this.hideThreshold_){
this.hide();
}else{
this.show();
}}
;
_proto.createMenu=function createMenu(){
var menu=new Menu(this.player_, {
menuButton: this
});
this.hideThreshold_=0;
if(this.options_.title){
var titleEl=createEl('li', {
className: 'vjs-menu-title',
innerHTML: toTitleCase(this.options_.title),
tabIndex: -1
});
this.hideThreshold_ +=1;
var titleComponent=new Component(this.player_, {
el: titleEl
});
menu.addItem(titleComponent);
}
this.items=this.createItems();
if(this.items){
for (var i=0; i < this.items.length; i++){
menu.addItem(this.items[i]);
}}
return menu;
}
;
_proto.createItems=function createItems(){}
;
_proto.createEl=function createEl(){
return _Component.prototype.createEl.call(this, 'div', {
className: this.buildWrapperCSSClass()
}, {});
}
;
_proto.buildWrapperCSSClass=function buildWrapperCSSClass(){
var menuButtonClass='vjs-menu-button';
if(this.options_.inline===true){
menuButtonClass +='-inline';
}else{
menuButtonClass +='-popup';
}
var buttonClass=Button.prototype.buildCSSClass();
return "vjs-menu-button " + menuButtonClass + " " + buttonClass + " " + _Component.prototype.buildCSSClass.call(this);
}
;
_proto.buildCSSClass=function buildCSSClass(){
var menuButtonClass='vjs-menu-button';
if(this.options_.inline===true){
menuButtonClass +='-inline';
}else{
menuButtonClass +='-popup';
}
return "vjs-menu-button " + menuButtonClass + " " + _Component.prototype.buildCSSClass.call(this);
}
;
_proto.controlText=function controlText(text, el){
if(el===void 0){
el=this.menuButton_.el();
}
return this.menuButton_.controlText(text, el);
}
;
_proto.dispose=function dispose(){
this.handleMouseLeave();
_Component.prototype.dispose.call(this);
}
;
_proto.handleClick=function handleClick(event){
if(this.buttonPressed_){
this.unpressButton();
}else{
this.pressButton();
}}
;
_proto.handleMouseLeave=function handleMouseLeave(event){
this.removeClass('vjs-hover');
off(document, 'keyup', bind(this, this.handleMenuKeyUp));
}
;
_proto.focus=function focus(){
this.menuButton_.focus();
}
;
_proto.blur=function blur(){
this.menuButton_.blur();
}
;
_proto.handleKeyDown=function handleKeyDown(event){
if(keycode.isEventKey(event, 'Esc')||keycode.isEventKey(event, 'Tab')){
if(this.buttonPressed_){
this.unpressButton();
}
if(!keycode.isEventKey(event, 'Tab')){
event.preventDefault();
this.menuButton_.focus();
}}else if(keycode.isEventKey(event, 'Up')||keycode.isEventKey(event, 'Down')){
if(!this.buttonPressed_){
event.preventDefault();
this.pressButton();
}}
}
;
_proto.handleMenuKeyUp=function handleMenuKeyUp(event){
if(keycode.isEventKey(event, 'Esc')||keycode.isEventKey(event, 'Tab')){
this.removeClass('vjs-hover');
}}
;
_proto.handleSubmenuKeyPress=function handleSubmenuKeyPress(event){
this.handleSubmenuKeyDown(event);
}
;
_proto.handleSubmenuKeyDown=function handleSubmenuKeyDown(event){
if(keycode.isEventKey(event, 'Esc')||keycode.isEventKey(event, 'Tab')){
if(this.buttonPressed_){
this.unpressButton();
}
if(!keycode.isEventKey(event, 'Tab')){
event.preventDefault();
this.menuButton_.focus();
}}
}
;
_proto.pressButton=function pressButton(){
if(this.enabled_){
this.buttonPressed_=true;
this.menu.show();
this.menu.lockShowing();
this.menuButton_.el_.setAttribute('aria-expanded', 'true');
if(IS_IOS&&isInFrame()){
return;
}
this.menu.focus();
}}
;
_proto.unpressButton=function unpressButton(){
if(this.enabled_){
this.buttonPressed_=false;
this.menu.unlockShowing();
this.menu.hide();
this.menuButton_.el_.setAttribute('aria-expanded', 'false');
}}
;
_proto.disable=function disable(){
this.unpressButton();
this.enabled_=false;
this.addClass('vjs-disabled');
this.menuButton_.disable();
}
;
_proto.enable=function enable(){
this.enabled_=true;
this.removeClass('vjs-disabled');
this.menuButton_.enable();
};
return MenuButton;
}(Component);
Component.registerComponent('MenuButton', MenuButton);
var TrackButton =
function (_MenuButton){
inheritsLoose(TrackButton, _MenuButton);
function TrackButton(player, options){
var _this;
var tracks=options.tracks;
_this=_MenuButton.call(this, player, options)||this;
if(_this.items.length <=1){
_this.hide();
}
if(!tracks){
return assertThisInitialized(_this);
}
var updateHandler=bind(assertThisInitialized(_this), _this.update);
tracks.addEventListener('removetrack', updateHandler);
tracks.addEventListener('addtrack', updateHandler);
_this.player_.on('ready', updateHandler);
_this.player_.on('dispose', function (){
tracks.removeEventListener('removetrack', updateHandler);
tracks.removeEventListener('addtrack', updateHandler);
});
return _this;
}
return TrackButton;
}(MenuButton);
Component.registerComponent('TrackButton', TrackButton);
var MenuKeys=['Tab', 'Esc', 'Up', 'Down', 'Right', 'Left'];
var MenuItem =
function (_ClickableComponent){
inheritsLoose(MenuItem, _ClickableComponent);
function MenuItem(player, options){
var _this;
_this=_ClickableComponent.call(this, player, options)||this;
_this.selectable=options.selectable;
_this.isSelected_=options.selected||false;
_this.multiSelectable=options.multiSelectable;
_this.selected(_this.isSelected_);
if(_this.selectable){
if(_this.multiSelectable){
_this.el_.setAttribute('role', 'menuitemcheckbox');
}else{
_this.el_.setAttribute('role', 'menuitemradio');
}}else{
_this.el_.setAttribute('role', 'menuitem');
}
return _this;
}
var _proto=MenuItem.prototype;
_proto.createEl=function createEl(type, props, attrs){
this.nonIconControl=true;
return _ClickableComponent.prototype.createEl.call(this, 'li', assign({
className: 'vjs-menu-item',
innerHTML: "<span class=\"vjs-menu-item-text\">" + this.localize(this.options_.label) + "</span>",
tabIndex: -1
}, props), attrs);
}
;
_proto.handleKeyDown=function handleKeyDown(event){
if(!MenuKeys.some(function (key){
return keycode.isEventKey(event, key);
})){
_ClickableComponent.prototype.handleKeyDown.call(this, event);
}}
;
_proto.handleClick=function handleClick(event){
this.selected(true);
}
;
_proto.selected=function selected(_selected){
if(this.selectable){
if(_selected){
this.addClass('vjs-selected');
this.el_.setAttribute('aria-checked', 'true');
this.controlText(', selected');
this.isSelected_=true;
}else{
this.removeClass('vjs-selected');
this.el_.setAttribute('aria-checked', 'false');
this.controlText('');
this.isSelected_=false;
}}
};
return MenuItem;
}(ClickableComponent);
Component.registerComponent('MenuItem', MenuItem);
var TextTrackMenuItem =
function (_MenuItem){
inheritsLoose(TextTrackMenuItem, _MenuItem);
function TextTrackMenuItem(player, options){
var _this;
var track=options.track;
var tracks=player.textTracks();
options.label=track.label||track.language||'Unknown';
options.selected=track.mode==='showing';
_this=_MenuItem.call(this, player, options)||this;
_this.track=track;
_this.kinds=(options.kinds||[options.kind||_this.track.kind]).filter(Boolean);
var changeHandler=function changeHandler(){
for (var _len=arguments.length, args=new Array(_len), _key=0; _key < _len; _key++){
args[_key]=arguments[_key];
}
_this.handleTracksChange.apply(assertThisInitialized(_this), args);
};
var selectedLanguageChangeHandler=function selectedLanguageChangeHandler(){
for (var _len2=arguments.length, args=new Array(_len2), _key2=0; _key2 < _len2; _key2++){
args[_key2]=arguments[_key2];
}
_this.handleSelectedLanguageChange.apply(assertThisInitialized(_this), args);
};
player.on(['loadstart', 'texttrackchange'], changeHandler);
tracks.addEventListener('change', changeHandler);
tracks.addEventListener('selectedlanguagechange', selectedLanguageChangeHandler);
_this.on('dispose', function (){
player.off(['loadstart', 'texttrackchange'], changeHandler);
tracks.removeEventListener('change', changeHandler);
tracks.removeEventListener('selectedlanguagechange', selectedLanguageChangeHandler);
});
if(tracks.onchange===undefined){
var event;
_this.on(['tap', 'click'], function (){
if(typeof window$1.Event!=='object'){
try {
event=new window$1.Event('change');
} catch (err){
}}
if(!event){
event=document.createEvent('Event');
event.initEvent('change', true, true);
}
tracks.dispatchEvent(event);
});
}
_this.handleTracksChange();
return _this;
}
var _proto=TextTrackMenuItem.prototype;
_proto.handleClick=function handleClick(event){
var referenceTrack=this.track;
var tracks=this.player_.textTracks();
_MenuItem.prototype.handleClick.call(this, event);
if(!tracks){
return;
}
for (var i=0; i < tracks.length; i++){
var track=tracks[i];
if(this.kinds.indexOf(track.kind)===-1){
continue;
}
if(track===referenceTrack){
if(track.mode!=='showing'){
track.mode='showing';
}}else if(track.mode!=='disabled'){
track.mode='disabled';
}}
}
;
_proto.handleTracksChange=function handleTracksChange(event){
var shouldBeSelected=this.track.mode==='showing';
if(shouldBeSelected!==this.isSelected_){
this.selected(shouldBeSelected);
}};
_proto.handleSelectedLanguageChange=function handleSelectedLanguageChange(event){
if(this.track.mode==='showing'){
var selectedLanguage=this.player_.cache_.selectedLanguage;
if(selectedLanguage&&selectedLanguage.enabled&&selectedLanguage.language===this.track.language&&selectedLanguage.kind!==this.track.kind){
return;
}
this.player_.cache_.selectedLanguage={
enabled: true,
language: this.track.language,
kind: this.track.kind
};}};
_proto.dispose=function dispose(){
this.track=null;
_MenuItem.prototype.dispose.call(this);
};
return TextTrackMenuItem;
}(MenuItem);
Component.registerComponent('TextTrackMenuItem', TextTrackMenuItem);
var OffTextTrackMenuItem =
function (_TextTrackMenuItem){
inheritsLoose(OffTextTrackMenuItem, _TextTrackMenuItem);
function OffTextTrackMenuItem(player, options){
options.track={
player: player,
kind: options.kind,
kinds: options.kinds,
"default": false,
mode: 'disabled'
};
if(!options.kinds){
options.kinds=[options.kind];
}
if(options.label){
options.track.label=options.label;
}else{
options.track.label=options.kinds.join(' and ') + ' off';
}
options.selectable=true;
options.multiSelectable=false;
return _TextTrackMenuItem.call(this, player, options)||this;
}
var _proto=OffTextTrackMenuItem.prototype;
_proto.handleTracksChange=function handleTracksChange(event){
var tracks=this.player().textTracks();
var shouldBeSelected=true;
for (var i=0, l=tracks.length; i < l; i++){
var track=tracks[i];
if(this.options_.kinds.indexOf(track.kind) > -1&&track.mode==='showing'){
shouldBeSelected=false;
break;
}}
if(shouldBeSelected!==this.isSelected_){
this.selected(shouldBeSelected);
}};
_proto.handleSelectedLanguageChange=function handleSelectedLanguageChange(event){
var tracks=this.player().textTracks();
var allHidden=true;
for (var i=0, l=tracks.length; i < l; i++){
var track=tracks[i];
if(['captions', 'descriptions', 'subtitles'].indexOf(track.kind) > -1&&track.mode==='showing'){
allHidden=false;
break;
}}
if(allHidden){
this.player_.cache_.selectedLanguage={
enabled: false
};}};
return OffTextTrackMenuItem;
}(TextTrackMenuItem);
Component.registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem);
var TextTrackButton =
function (_TrackButton){
inheritsLoose(TextTrackButton, _TrackButton);
function TextTrackButton(player, options){
if(options===void 0){
options={};}
options.tracks=player.textTracks();
return _TrackButton.call(this, player, options)||this;
}
var _proto=TextTrackButton.prototype;
_proto.createItems=function createItems(items, TrackMenuItem){
if(items===void 0){
items=[];
}
if(TrackMenuItem===void 0){
TrackMenuItem=TextTrackMenuItem;
}
var label;
if(this.label_){
label=this.label_ + " off";
}
items.push(new OffTextTrackMenuItem(this.player_, {
kinds: this.kinds_,
kind: this.kind_,
label: label
}));
this.hideThreshold_ +=1;
var tracks=this.player_.textTracks();
if(!Array.isArray(this.kinds_)){
this.kinds_=[this.kind_];
}
for (var i=0; i < tracks.length; i++){
var track=tracks[i];
if(this.kinds_.indexOf(track.kind) > -1){
var item=new TrackMenuItem(this.player_, {
track: track,
kinds: this.kinds_,
kind: this.kind_,
selectable: true,
multiSelectable: false
});
item.addClass("vjs-" + track.kind + "-menu-item");
items.push(item);
}}
return items;
};
return TextTrackButton;
}(TrackButton);
Component.registerComponent('TextTrackButton', TextTrackButton);
var ChaptersTrackMenuItem =
function (_MenuItem){
inheritsLoose(ChaptersTrackMenuItem, _MenuItem);
function ChaptersTrackMenuItem(player, options){
var _this;
var track=options.track;
var cue=options.cue;
var currentTime=player.currentTime();
options.selectable=true;
options.multiSelectable=false;
options.label=cue.text;
options.selected=cue.startTime <=currentTime&&currentTime < cue.endTime;
_this=_MenuItem.call(this, player, options)||this;
_this.track=track;
_this.cue=cue;
track.addEventListener('cuechange', bind(assertThisInitialized(_this), _this.update));
return _this;
}
var _proto=ChaptersTrackMenuItem.prototype;
_proto.handleClick=function handleClick(event){
_MenuItem.prototype.handleClick.call(this);
this.player_.currentTime(this.cue.startTime);
this.update(this.cue.startTime);
}
;
_proto.update=function update(event){
var cue=this.cue;
var currentTime=this.player_.currentTime();
this.selected(cue.startTime <=currentTime&&currentTime < cue.endTime);
};
return ChaptersTrackMenuItem;
}(MenuItem);
Component.registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem);
var ChaptersButton =
function (_TextTrackButton){
inheritsLoose(ChaptersButton, _TextTrackButton);
function ChaptersButton(player, options, ready){
return _TextTrackButton.call(this, player, options, ready)||this;
}
var _proto=ChaptersButton.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-chapters-button " + _TextTrackButton.prototype.buildCSSClass.call(this);
};
_proto.buildWrapperCSSClass=function buildWrapperCSSClass(){
return "vjs-chapters-button " + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);
}
;
_proto.update=function update(event){
if(!this.track_||event&&(event.type==='addtrack'||event.type==='removetrack')){
this.setTrack(this.findChaptersTrack());
}
_TextTrackButton.prototype.update.call(this);
}
;
_proto.setTrack=function setTrack(track){
if(this.track_===track){
return;
}
if(!this.updateHandler_){
this.updateHandler_=this.update.bind(this);
}
if(this.track_){
var remoteTextTrackEl=this.player_.remoteTextTrackEls().getTrackElementByTrack_(this.track_);
if(remoteTextTrackEl){
remoteTextTrackEl.removeEventListener('load', this.updateHandler_);
}
this.track_=null;
}
this.track_=track;
if(this.track_){
this.track_.mode='hidden';
var _remoteTextTrackEl=this.player_.remoteTextTrackEls().getTrackElementByTrack_(this.track_);
if(_remoteTextTrackEl){
_remoteTextTrackEl.addEventListener('load', this.updateHandler_);
}}
}
;
_proto.findChaptersTrack=function findChaptersTrack(){
var tracks=this.player_.textTracks()||[];
for (var i=tracks.length - 1; i >=0; i--){
var track=tracks[i];
if(track.kind===this.kind_){
return track;
}}
}
;
_proto.getMenuCaption=function getMenuCaption(){
if(this.track_&&this.track_.label){
return this.track_.label;
}
return this.localize(toTitleCase(this.kind_));
}
;
_proto.createMenu=function createMenu(){
this.options_.title=this.getMenuCaption();
return _TextTrackButton.prototype.createMenu.call(this);
}
;
_proto.createItems=function createItems(){
var items=[];
if(!this.track_){
return items;
}
var cues=this.track_.cues;
if(!cues){
return items;
}
for (var i=0, l=cues.length; i < l; i++){
var cue=cues[i];
var mi=new ChaptersTrackMenuItem(this.player_, {
track: this.track_,
cue: cue
});
items.push(mi);
}
return items;
};
return ChaptersButton;
}(TextTrackButton);
ChaptersButton.prototype.kind_='chapters';
ChaptersButton.prototype.controlText_='Chapters';
Component.registerComponent('ChaptersButton', ChaptersButton);
var DescriptionsButton =
function (_TextTrackButton){
inheritsLoose(DescriptionsButton, _TextTrackButton);
function DescriptionsButton(player, options, ready){
var _this;
_this=_TextTrackButton.call(this, player, options, ready)||this;
var tracks=player.textTracks();
var changeHandler=bind(assertThisInitialized(_this), _this.handleTracksChange);
tracks.addEventListener('change', changeHandler);
_this.on('dispose', function (){
tracks.removeEventListener('change', changeHandler);
});
return _this;
}
var _proto=DescriptionsButton.prototype;
_proto.handleTracksChange=function handleTracksChange(event){
var tracks=this.player().textTracks();
var disabled=false;
for (var i=0, l=tracks.length; i < l; i++){
var track=tracks[i];
if(track.kind!==this.kind_&&track.mode==='showing'){
disabled=true;
break;
}}
if(disabled){
this.disable();
}else{
this.enable();
}}
;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-descriptions-button " + _TextTrackButton.prototype.buildCSSClass.call(this);
};
_proto.buildWrapperCSSClass=function buildWrapperCSSClass(){
return "vjs-descriptions-button " + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);
};
return DescriptionsButton;
}(TextTrackButton);
DescriptionsButton.prototype.kind_='descriptions';
DescriptionsButton.prototype.controlText_='Descriptions';
Component.registerComponent('DescriptionsButton', DescriptionsButton);
var SubtitlesButton =
function (_TextTrackButton){
inheritsLoose(SubtitlesButton, _TextTrackButton);
function SubtitlesButton(player, options, ready){
return _TextTrackButton.call(this, player, options, ready)||this;
}
var _proto=SubtitlesButton.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-subtitles-button " + _TextTrackButton.prototype.buildCSSClass.call(this);
};
_proto.buildWrapperCSSClass=function buildWrapperCSSClass(){
return "vjs-subtitles-button " + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);
};
return SubtitlesButton;
}(TextTrackButton);
SubtitlesButton.prototype.kind_='subtitles';
SubtitlesButton.prototype.controlText_='Subtitles';
Component.registerComponent('SubtitlesButton', SubtitlesButton);
var CaptionSettingsMenuItem =
function (_TextTrackMenuItem){
inheritsLoose(CaptionSettingsMenuItem, _TextTrackMenuItem);
function CaptionSettingsMenuItem(player, options){
var _this;
options.track={
player: player,
kind: options.kind,
label: options.kind + ' settings',
selectable: false,
"default": false,
mode: 'disabled'
};
options.selectable=false;
options.name='CaptionSettingsMenuItem';
_this=_TextTrackMenuItem.call(this, player, options)||this;
_this.addClass('vjs-texttrack-settings');
_this.controlText(', opens ' + options.kind + ' settings dialog');
return _this;
}
var _proto=CaptionSettingsMenuItem.prototype;
_proto.handleClick=function handleClick(event){
this.player().getChild('textTrackSettings').open();
};
return CaptionSettingsMenuItem;
}(TextTrackMenuItem);
Component.registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem);
var CaptionsButton =
function (_TextTrackButton){
inheritsLoose(CaptionsButton, _TextTrackButton);
function CaptionsButton(player, options, ready){
return _TextTrackButton.call(this, player, options, ready)||this;
}
var _proto=CaptionsButton.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-captions-button " + _TextTrackButton.prototype.buildCSSClass.call(this);
};
_proto.buildWrapperCSSClass=function buildWrapperCSSClass(){
return "vjs-captions-button " + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);
}
;
_proto.createItems=function createItems(){
var items=[];
if(!(this.player().tech_&&this.player().tech_.featuresNativeTextTracks)&&this.player().getChild('textTrackSettings')){
items.push(new CaptionSettingsMenuItem(this.player_, {
kind: this.kind_
}));
this.hideThreshold_ +=1;
}
return _TextTrackButton.prototype.createItems.call(this, items);
};
return CaptionsButton;
}(TextTrackButton);
CaptionsButton.prototype.kind_='captions';
CaptionsButton.prototype.controlText_='Captions';
Component.registerComponent('CaptionsButton', CaptionsButton);
var SubsCapsMenuItem =
function (_TextTrackMenuItem){
inheritsLoose(SubsCapsMenuItem, _TextTrackMenuItem);
function SubsCapsMenuItem(){
return _TextTrackMenuItem.apply(this, arguments)||this;
}
var _proto=SubsCapsMenuItem.prototype;
_proto.createEl=function createEl(type, props, attrs){
var innerHTML="<span class=\"vjs-menu-item-text\">" + this.localize(this.options_.label);
if(this.options_.track.kind==='captions'){
innerHTML +="\n        <span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>\n        <span class=\"vjs-control-text\"> " + this.localize('Captions') + "</span>\n      ";
}
innerHTML +='</span>';
var el=_TextTrackMenuItem.prototype.createEl.call(this, type, assign({
innerHTML: innerHTML
}, props), attrs);
return el;
};
return SubsCapsMenuItem;
}(TextTrackMenuItem);
Component.registerComponent('SubsCapsMenuItem', SubsCapsMenuItem);
var SubsCapsButton =
function (_TextTrackButton){
inheritsLoose(SubsCapsButton, _TextTrackButton);
function SubsCapsButton(player, options){
var _this;
if(options===void 0){
options={};}
_this=_TextTrackButton.call(this, player, options)||this;
_this.label_='subtitles';
if(['en', 'en-us', 'en-ca', 'fr-ca'].indexOf(_this.player_.language_) > -1){
_this.label_='captions';
}
_this.menuButton_.controlText(toTitleCase(_this.label_));
return _this;
}
var _proto=SubsCapsButton.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-subs-caps-button " + _TextTrackButton.prototype.buildCSSClass.call(this);
};
_proto.buildWrapperCSSClass=function buildWrapperCSSClass(){
return "vjs-subs-caps-button " + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);
}
;
_proto.createItems=function createItems(){
var items=[];
if(!(this.player().tech_&&this.player().tech_.featuresNativeTextTracks)&&this.player().getChild('textTrackSettings')){
items.push(new CaptionSettingsMenuItem(this.player_, {
kind: this.label_
}));
this.hideThreshold_ +=1;
}
items=_TextTrackButton.prototype.createItems.call(this, items, SubsCapsMenuItem);
return items;
};
return SubsCapsButton;
}(TextTrackButton);
SubsCapsButton.prototype.kinds_=['captions', 'subtitles'];
SubsCapsButton.prototype.controlText_='Subtitles';
Component.registerComponent('SubsCapsButton', SubsCapsButton);
var AudioTrackMenuItem =
function (_MenuItem){
inheritsLoose(AudioTrackMenuItem, _MenuItem);
function AudioTrackMenuItem(player, options){
var _this;
var track=options.track;
var tracks=player.audioTracks();
options.label=track.label||track.language||'Unknown';
options.selected=track.enabled;
_this=_MenuItem.call(this, player, options)||this;
_this.track=track;
_this.addClass("vjs-" + track.kind + "-menu-item");
var changeHandler=function changeHandler(){
for (var _len=arguments.length, args=new Array(_len), _key=0; _key < _len; _key++){
args[_key]=arguments[_key];
}
_this.handleTracksChange.apply(assertThisInitialized(_this), args);
};
tracks.addEventListener('change', changeHandler);
_this.on('dispose', function (){
tracks.removeEventListener('change', changeHandler);
});
return _this;
}
var _proto=AudioTrackMenuItem.prototype;
_proto.createEl=function createEl(type, props, attrs){
var innerHTML="<span class=\"vjs-menu-item-text\">" + this.localize(this.options_.label);
if(this.options_.track.kind==='main-desc'){
innerHTML +="\n        <span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>\n        <span class=\"vjs-control-text\"> " + this.localize('Descriptions') + "</span>\n      ";
}
innerHTML +='</span>';
var el=_MenuItem.prototype.createEl.call(this, type, assign({
innerHTML: innerHTML
}, props), attrs);
return el;
}
;
_proto.handleClick=function handleClick(event){
var tracks=this.player_.audioTracks();
_MenuItem.prototype.handleClick.call(this, event);
for (var i=0; i < tracks.length; i++){
var track=tracks[i];
track.enabled=track===this.track;
}}
;
_proto.handleTracksChange=function handleTracksChange(event){
this.selected(this.track.enabled);
};
return AudioTrackMenuItem;
}(MenuItem);
Component.registerComponent('AudioTrackMenuItem', AudioTrackMenuItem);
var AudioTrackButton =
function (_TrackButton){
inheritsLoose(AudioTrackButton, _TrackButton);
function AudioTrackButton(player, options){
if(options===void 0){
options={};}
options.tracks=player.audioTracks();
return _TrackButton.call(this, player, options)||this;
}
var _proto=AudioTrackButton.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-audio-button " + _TrackButton.prototype.buildCSSClass.call(this);
};
_proto.buildWrapperCSSClass=function buildWrapperCSSClass(){
return "vjs-audio-button " + _TrackButton.prototype.buildWrapperCSSClass.call(this);
}
;
_proto.createItems=function createItems(items){
if(items===void 0){
items=[];
}
this.hideThreshold_=1;
var tracks=this.player_.audioTracks();
for (var i=0; i < tracks.length; i++){
var track=tracks[i];
items.push(new AudioTrackMenuItem(this.player_, {
track: track,
selectable: true,
multiSelectable: false
}));
}
return items;
};
return AudioTrackButton;
}(TrackButton);
AudioTrackButton.prototype.controlText_='Audio Track';
Component.registerComponent('AudioTrackButton', AudioTrackButton);
var PlaybackRateMenuItem =
function (_MenuItem){
inheritsLoose(PlaybackRateMenuItem, _MenuItem);
function PlaybackRateMenuItem(player, options){
var _this;
var label=options.rate;
var rate=parseFloat(label, 10);
options.label=label;
options.selected=rate===1;
options.selectable=true;
options.multiSelectable=false;
_this=_MenuItem.call(this, player, options)||this;
_this.label=label;
_this.rate=rate;
_this.on(player, 'ratechange', _this.update);
return _this;
}
var _proto=PlaybackRateMenuItem.prototype;
_proto.handleClick=function handleClick(event){
_MenuItem.prototype.handleClick.call(this);
this.player().playbackRate(this.rate);
}
;
_proto.update=function update(event){
this.selected(this.player().playbackRate()===this.rate);
};
return PlaybackRateMenuItem;
}(MenuItem);
PlaybackRateMenuItem.prototype.contentElType='button';
Component.registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem);
var PlaybackRateMenuButton =
function (_MenuButton){
inheritsLoose(PlaybackRateMenuButton, _MenuButton);
function PlaybackRateMenuButton(player, options){
var _this;
_this=_MenuButton.call(this, player, options)||this;
_this.updateVisibility();
_this.updateLabel();
_this.on(player, 'loadstart', _this.updateVisibility);
_this.on(player, 'ratechange', _this.updateLabel);
return _this;
}
var _proto=PlaybackRateMenuButton.prototype;
_proto.createEl=function createEl$1(){
var el=_MenuButton.prototype.createEl.call(this);
this.labelEl_=createEl('div', {
className: 'vjs-playback-rate-value',
innerHTML: '1x'
});
el.appendChild(this.labelEl_);
return el;
};
_proto.dispose=function dispose(){
this.labelEl_=null;
_MenuButton.prototype.dispose.call(this);
}
;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-playback-rate " + _MenuButton.prototype.buildCSSClass.call(this);
};
_proto.buildWrapperCSSClass=function buildWrapperCSSClass(){
return "vjs-playback-rate " + _MenuButton.prototype.buildWrapperCSSClass.call(this);
}
;
_proto.createMenu=function createMenu(){
var menu=new Menu(this.player());
var rates=this.playbackRates();
if(rates){
for (var i=rates.length - 1; i >=0; i--){
menu.addChild(new PlaybackRateMenuItem(this.player(), {
rate: rates[i] + 'x'
}));
}}
return menu;
}
;
_proto.updateARIAAttributes=function updateARIAAttributes(){
this.el().setAttribute('aria-valuenow', this.player().playbackRate());
}
;
_proto.handleClick=function handleClick(event){
var currentRate=this.player().playbackRate();
var rates=this.playbackRates();
var newRate=rates[0];
for (var i=0; i < rates.length; i++){
if(rates[i] > currentRate){
newRate=rates[i];
break;
}}
this.player().playbackRate(newRate);
}
;
_proto.playbackRates=function playbackRates(){
return this.options_.playbackRates||this.options_.playerOptions&&this.options_.playerOptions.playbackRates;
}
;
_proto.playbackRateSupported=function playbackRateSupported(){
return this.player().tech_&&this.player().tech_.featuresPlaybackRate&&this.playbackRates()&&this.playbackRates().length > 0;
}
;
_proto.updateVisibility=function updateVisibility(event){
if(this.playbackRateSupported()){
this.removeClass('vjs-hidden');
}else{
this.addClass('vjs-hidden');
}}
;
_proto.updateLabel=function updateLabel(event){
if(this.playbackRateSupported()){
this.labelEl_.innerHTML=this.player().playbackRate() + 'x';
}};
return PlaybackRateMenuButton;
}(MenuButton);
PlaybackRateMenuButton.prototype.controlText_='Playback Rate';
Component.registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton);
var Spacer =
function (_Component){
inheritsLoose(Spacer, _Component);
function Spacer(){
return _Component.apply(this, arguments)||this;
}
var _proto=Spacer.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-spacer " + _Component.prototype.buildCSSClass.call(this);
}
;
_proto.createEl=function createEl(){
return _Component.prototype.createEl.call(this, 'div', {
className: this.buildCSSClass()
});
};
return Spacer;
}(Component);
Component.registerComponent('Spacer', Spacer);
var CustomControlSpacer =
function (_Spacer){
inheritsLoose(CustomControlSpacer, _Spacer);
function CustomControlSpacer(){
return _Spacer.apply(this, arguments)||this;
}
var _proto=CustomControlSpacer.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-custom-control-spacer " + _Spacer.prototype.buildCSSClass.call(this);
}
;
_proto.createEl=function createEl(){
var el=_Spacer.prototype.createEl.call(this, {
className: this.buildCSSClass()
});
el.innerHTML="\xA0";
return el;
};
return CustomControlSpacer;
}(Spacer);
Component.registerComponent('CustomControlSpacer', CustomControlSpacer);
var ControlBar =
function (_Component){
inheritsLoose(ControlBar, _Component);
function ControlBar(){
return _Component.apply(this, arguments)||this;
}
var _proto=ControlBar.prototype;
_proto.createEl=function createEl(){
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-control-bar',
dir: 'ltr'
});
};
return ControlBar;
}(Component);
ControlBar.prototype.options_={
children: ['playToggle', 'volumePanel', 'currentTimeDisplay', 'timeDivider', 'durationDisplay', 'progressControl', 'liveDisplay', 'seekToLive', 'remainingTimeDisplay', 'customControlSpacer', 'playbackRateMenuButton', 'chaptersButton', 'descriptionsButton', 'subsCapsButton', 'audioTrackButton', 'fullscreenToggle']
};
if('exitPictureInPicture' in document){
ControlBar.prototype.options_.children.splice(ControlBar.prototype.options_.children.length - 1, 0, 'pictureInPictureToggle');
}
Component.registerComponent('ControlBar', ControlBar);
var ErrorDisplay =
function (_ModalDialog){
inheritsLoose(ErrorDisplay, _ModalDialog);
function ErrorDisplay(player, options){
var _this;
_this=_ModalDialog.call(this, player, options)||this;
_this.on(player, 'error', _this.open);
return _this;
}
var _proto=ErrorDisplay.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-error-display " + _ModalDialog.prototype.buildCSSClass.call(this);
}
;
_proto.content=function content(){
var error=this.player().error();
return error ? this.localize(error.message):'';
};
return ErrorDisplay;
}(ModalDialog);
ErrorDisplay.prototype.options_=_extends_1({}, ModalDialog.prototype.options_, {
pauseOnOpen: false,
fillAlways: true,
temporary: false,
uncloseable: true
});
Component.registerComponent('ErrorDisplay', ErrorDisplay);
var LOCAL_STORAGE_KEY='vjs-text-track-settings';
var COLOR_BLACK=['#000', 'Black'];
var COLOR_BLUE=['#00F', 'Blue'];
var COLOR_CYAN=['#0FF', 'Cyan'];
var COLOR_GREEN=['#0F0', 'Green'];
var COLOR_MAGENTA=['#F0F', 'Magenta'];
var COLOR_RED=['#F00', 'Red'];
var COLOR_WHITE=['#FFF', 'White'];
var COLOR_YELLOW=['#FF0', 'Yellow'];
var OPACITY_OPAQUE=['1', 'Opaque'];
var OPACITY_SEMI=['0.5', 'Semi-Transparent'];
var OPACITY_TRANS=['0', 'Transparent'];
var selectConfigs={
backgroundColor: {
selector: '.vjs-bg-color > select',
id: 'captions-background-color-%s',
label: 'Color',
options: [COLOR_BLACK, COLOR_WHITE, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN]
},
backgroundOpacity: {
selector: '.vjs-bg-opacity > select',
id: 'captions-background-opacity-%s',
label: 'Transparency',
options: [OPACITY_OPAQUE, OPACITY_SEMI, OPACITY_TRANS]
},
color: {
selector: '.vjs-fg-color > select',
id: 'captions-foreground-color-%s',
label: 'Color',
options: [COLOR_WHITE, COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN]
},
edgeStyle: {
selector: '.vjs-edge-style > select',
id: '%s',
label: 'Text Edge Style',
options: [['none', 'None'], ['raised', 'Raised'], ['depressed', 'Depressed'], ['uniform', 'Uniform'], ['dropshadow', 'Dropshadow']]
},
fontFamily: {
selector: '.vjs-font-family > select',
id: 'captions-font-family-%s',
label: 'Font Family',
options: [['proportionalSansSerif', 'Proportional Sans-Serif'], ['monospaceSansSerif', 'Monospace Sans-Serif'], ['proportionalSerif', 'Proportional Serif'], ['monospaceSerif', 'Monospace Serif'], ['casual', 'Casual'], ['script', 'Script'], ['small-caps', 'Small Caps']]
},
fontPercent: {
selector: '.vjs-font-percent > select',
id: 'captions-font-size-%s',
label: 'Font Size',
options: [['0.50', '50%'], ['0.75', '75%'], ['1.00', '100%'], ['1.25', '125%'], ['1.50', '150%'], ['1.75', '175%'], ['2.00', '200%'], ['3.00', '300%'], ['4.00', '400%']],
"default": 2,
parser: function parser(v){
return v==='1.00' ? null:Number(v);
}},
textOpacity: {
selector: '.vjs-text-opacity > select',
id: 'captions-foreground-opacity-%s',
label: 'Transparency',
options: [OPACITY_OPAQUE, OPACITY_SEMI]
},
windowColor: {
selector: '.vjs-window-color > select',
id: 'captions-window-color-%s',
label: 'Color'
},
windowOpacity: {
selector: '.vjs-window-opacity > select',
id: 'captions-window-opacity-%s',
label: 'Transparency',
options: [OPACITY_TRANS, OPACITY_SEMI, OPACITY_OPAQUE]
}};
selectConfigs.windowColor.options=selectConfigs.backgroundColor.options;
function parseOptionValue(value, parser){
if(parser){
value=parser(value);
}
if(value&&value!=='none'){
return value;
}}
function getSelectedOptionValue(el, parser){
var value=el.options[el.options.selectedIndex].value;
return parseOptionValue(value, parser);
}
function setSelectedOption(el, value, parser){
if(!value){
return;
}
for (var i=0; i < el.options.length; i++){
if(parseOptionValue(el.options[i].value, parser)===value){
el.selectedIndex=i;
break;
}}
}
var TextTrackSettings =
function (_ModalDialog){
inheritsLoose(TextTrackSettings, _ModalDialog);
function TextTrackSettings(player, options){
var _this;
options.temporary=false;
_this=_ModalDialog.call(this, player, options)||this;
_this.updateDisplay=bind(assertThisInitialized(_this), _this.updateDisplay);
_this.fill();
_this.hasBeenOpened_=_this.hasBeenFilled_=true;
_this.endDialog=createEl('p', {
className: 'vjs-control-text',
textContent: _this.localize('End of dialog window.')
});
_this.el().appendChild(_this.endDialog);
_this.setDefaults();
if(options.persistTextTrackSettings===undefined){
_this.options_.persistTextTrackSettings=_this.options_.playerOptions.persistTextTrackSettings;
}
_this.on(_this.$('.vjs-done-button'), 'click', function (){
_this.saveSettings();
_this.close();
});
_this.on(_this.$('.vjs-default-button'), 'click', function (){
_this.setDefaults();
_this.updateDisplay();
});
each(selectConfigs, function (config){
_this.on(_this.$(config.selector), 'change', _this.updateDisplay);
});
if(_this.options_.persistTextTrackSettings){
_this.restoreSettings();
}
return _this;
}
var _proto=TextTrackSettings.prototype;
_proto.dispose=function dispose(){
this.endDialog=null;
_ModalDialog.prototype.dispose.call(this);
}
;
_proto.createElSelect_=function createElSelect_(key, legendId, type){
var _this2=this;
if(legendId===void 0){
legendId='';
}
if(type===void 0){
type='label';
}
var config=selectConfigs[key];
var id=config.id.replace('%s', this.id_);
var selectLabelledbyIds=[legendId, id].join(' ').trim();
return ["<" + type + " id=\"" + id + "\" class=\"" + (type==='label' ? 'vjs-label':'') + "\">", this.localize(config.label), "</" + type + ">", "<select aria-labelledby=\"" + selectLabelledbyIds + "\">"].concat(config.options.map(function (o){
var optionId=id + '-' + o[1].replace(/\W+/g, '');
return ["<option id=\"" + optionId + "\" value=\"" + o[0] + "\" ", "aria-labelledby=\"" + selectLabelledbyIds + " " + optionId + "\">", _this2.localize(o[1]), '</option>'].join('');
})).concat('</select>').join('');
}
;
_proto.createElFgColor_=function createElFgColor_(){
var legendId="captions-text-legend-" + this.id_;
return ['<fieldset class="vjs-fg-color vjs-track-setting">', "<legend id=\"" + legendId + "\">", this.localize('Text'), '</legend>', this.createElSelect_('color', legendId), '<span class="vjs-text-opacity vjs-opacity">', this.createElSelect_('textOpacity', legendId), '</span>', '</fieldset>'].join('');
}
;
_proto.createElBgColor_=function createElBgColor_(){
var legendId="captions-background-" + this.id_;
return ['<fieldset class="vjs-bg-color vjs-track-setting">', "<legend id=\"" + legendId + "\">", this.localize('Background'), '</legend>', this.createElSelect_('backgroundColor', legendId), '<span class="vjs-bg-opacity vjs-opacity">', this.createElSelect_('backgroundOpacity', legendId), '</span>', '</fieldset>'].join('');
}
;
_proto.createElWinColor_=function createElWinColor_(){
var legendId="captions-window-" + this.id_;
return ['<fieldset class="vjs-window-color vjs-track-setting">', "<legend id=\"" + legendId + "\">", this.localize('Window'), '</legend>', this.createElSelect_('windowColor', legendId), '<span class="vjs-window-opacity vjs-opacity">', this.createElSelect_('windowOpacity', legendId), '</span>', '</fieldset>'].join('');
}
;
_proto.createElColors_=function createElColors_(){
return createEl('div', {
className: 'vjs-track-settings-colors',
innerHTML: [this.createElFgColor_(), this.createElBgColor_(), this.createElWinColor_()].join('')
});
}
;
_proto.createElFont_=function createElFont_(){
return createEl('div', {
className: 'vjs-track-settings-font',
innerHTML: ['<fieldset class="vjs-font-percent vjs-track-setting">', this.createElSelect_('fontPercent', '', 'legend'), '</fieldset>', '<fieldset class="vjs-edge-style vjs-track-setting">', this.createElSelect_('edgeStyle', '', 'legend'), '</fieldset>', '<fieldset class="vjs-font-family vjs-track-setting">', this.createElSelect_('fontFamily', '', 'legend'), '</fieldset>'].join('')
});
}
;
_proto.createElControls_=function createElControls_(){
var defaultsDescription=this.localize('restore all settings to the default values');
return createEl('div', {
className: 'vjs-track-settings-controls',
innerHTML: ["<button type=\"button\" class=\"vjs-default-button\" title=\"" + defaultsDescription + "\">", this.localize('Reset'), "<span class=\"vjs-control-text\"> " + defaultsDescription + "</span>", '</button>', "<button type=\"button\" class=\"vjs-done-button\">" + this.localize('Done') + "</button>"].join('')
});
};
_proto.content=function content(){
return [this.createElColors_(), this.createElFont_(), this.createElControls_()];
};
_proto.label=function label(){
return this.localize('Caption Settings Dialog');
};
_proto.description=function description(){
return this.localize('Beginning of dialog window. Escape will cancel and close the window.');
};
_proto.buildCSSClass=function buildCSSClass(){
return _ModalDialog.prototype.buildCSSClass.call(this) + ' vjs-text-track-settings';
}
;
_proto.getValues=function getValues(){
var _this3=this;
return reduce(selectConfigs, function (accum, config, key){
var value=getSelectedOptionValue(_this3.$(config.selector), config.parser);
if(value!==undefined){
accum[key]=value;
}
return accum;
}, {});
}
;
_proto.setValues=function setValues(values){
var _this4=this;
each(selectConfigs, function (config, key){
setSelectedOption(_this4.$(config.selector), values[key], config.parser);
});
}
;
_proto.setDefaults=function setDefaults(){
var _this5=this;
each(selectConfigs, function (config){
var index=config.hasOwnProperty('default') ? config["default"]:0;
_this5.$(config.selector).selectedIndex=index;
});
}
;
_proto.restoreSettings=function restoreSettings(){
var values;
try {
values=JSON.parse(window$1.localStorage.getItem(LOCAL_STORAGE_KEY));
} catch (err){
log.warn(err);
}
if(values){
this.setValues(values);
}}
;
_proto.saveSettings=function saveSettings(){
if(!this.options_.persistTextTrackSettings){
return;
}
var values=this.getValues();
try {
if(Object.keys(values).length){
window$1.localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(values));
}else{
window$1.localStorage.removeItem(LOCAL_STORAGE_KEY);
}} catch (err){
log.warn(err);
}}
;
_proto.updateDisplay=function updateDisplay(){
var ttDisplay=this.player_.getChild('textTrackDisplay');
if(ttDisplay){
ttDisplay.updateDisplay();
}}
;
_proto.conditionalBlur_=function conditionalBlur_(){
this.previouslyActiveEl_=null;
var cb=this.player_.controlBar;
var subsCapsBtn=cb&&cb.subsCapsButton;
var ccBtn=cb&&cb.captionsButton;
if(subsCapsBtn){
subsCapsBtn.focus();
}else if(ccBtn){
ccBtn.focus();
}};
return TextTrackSettings;
}(ModalDialog);
Component.registerComponent('TextTrackSettings', TextTrackSettings);
var ResizeManager =
function (_Component){
inheritsLoose(ResizeManager, _Component);
function ResizeManager(player, options){
var _this;
var RESIZE_OBSERVER_AVAILABLE=options.ResizeObserver||window$1.ResizeObserver;
if(options.ResizeObserver===null){
RESIZE_OBSERVER_AVAILABLE=false;
}
var options_=mergeOptions({
createEl: !RESIZE_OBSERVER_AVAILABLE,
reportTouchActivity: false
}, options);
_this=_Component.call(this, player, options_)||this;
_this.ResizeObserver=options.ResizeObserver||window$1.ResizeObserver;
_this.loadListener_=null;
_this.resizeObserver_=null;
_this.debouncedHandler_=debounce(function (){
_this.resizeHandler();
}, 100, false, assertThisInitialized(_this));
if(RESIZE_OBSERVER_AVAILABLE){
_this.resizeObserver_=new _this.ResizeObserver(_this.debouncedHandler_);
_this.resizeObserver_.observe(player.el());
}else{
_this.loadListener_=function (){
if(!_this.el_||!_this.el_.contentWindow){
return;
}
var debouncedHandler_=_this.debouncedHandler_;
var unloadListener_=_this.unloadListener_=function (){
off(this, 'resize', debouncedHandler_);
off(this, 'unload', unloadListener_);
unloadListener_=null;
};
on(_this.el_.contentWindow, 'unload', unloadListener_);
on(_this.el_.contentWindow, 'resize', debouncedHandler_);
};
_this.one('load', _this.loadListener_);
}
return _this;
}
var _proto=ResizeManager.prototype;
_proto.createEl=function createEl(){
return _Component.prototype.createEl.call(this, 'iframe', {
className: 'vjs-resize-manager',
tabIndex: -1
}, {
'aria-hidden': 'true'
});
}
;
_proto.resizeHandler=function resizeHandler(){
if(!this.player_||!this.player_.trigger){
return;
}
this.player_.trigger('playerresize');
};
_proto.dispose=function dispose(){
if(this.debouncedHandler_){
this.debouncedHandler_.cancel();
}
if(this.resizeObserver_){
if(this.player_.el()){
this.resizeObserver_.unobserve(this.player_.el());
}
this.resizeObserver_.disconnect();
}
if(this.loadListener_){
this.off('load', this.loadListener_);
}
if(this.el_&&this.el_.contentWindow&&this.unloadListener_){
this.unloadListener_.call(this.el_.contentWindow);
}
this.ResizeObserver=null;
this.resizeObserver=null;
this.debouncedHandler_=null;
this.loadListener_=null;
_Component.prototype.dispose.call(this);
};
return ResizeManager;
}(Component);
Component.registerComponent('ResizeManager', ResizeManager);
var median=function median(arr){
var mid=Math.floor(arr.length / 2);
var sortedList=[].concat(arr).sort(function (a, b){
return a - b;
});
return arr.length % 2!==0 ? sortedList[mid]:(sortedList[mid - 1] + sortedList[mid]) / 2;
};
var LiveTracker =
function (_Component){
inheritsLoose(LiveTracker, _Component);
function LiveTracker(player, options){
var _this;
var options_=mergeOptions({
createEl: false
}, options);
_this=_Component.call(this, player, options_)||this;
_this.reset_();
_this.on(_this.player_, 'durationchange', _this.handleDurationchange);
if(IE_VERSION&&'hidden' in document&&'visibilityState' in document){
_this.on(document, 'visibilitychange', _this.handleVisibilityChange);
}
return _this;
}
var _proto=LiveTracker.prototype;
_proto.handleVisibilityChange=function handleVisibilityChange(){
if(this.player_.duration()!==Infinity){
return;
}
if(document.hidden){
this.stopTracking();
}else{
this.startTracking();
}};
_proto.isBehind_=function isBehind_(){
if(!this.timeupdateSeen_){
return false;
}
var liveCurrentTime=this.liveCurrentTime();
var currentTime=this.player_.currentTime();
var liveEdgeWindow=this.seekableIncrement_ * 2 + 0.07;
return liveCurrentTime!==Infinity&&liveCurrentTime - liveEdgeWindow >=currentTime;
}
;
_proto.trackLive_=function trackLive_(){
this.pastSeekEnd_=this.pastSeekEnd_;
var seekable=this.player_.seekable();
if(!seekable||!seekable.length){
return;
}
var newSeekEnd=this.seekableEnd();
if(newSeekEnd!==this.lastSeekEnd_){
if(this.lastSeekEnd_){
this.seekableIncrementList_=this.seekableIncrementList_.slice(-11);
this.seekableIncrementList_.push(Math.abs(newSeekEnd - this.lastSeekEnd_));
if(this.seekableIncrementList_.length > 3){
this.seekableIncrement_=median(this.seekableIncrementList_);
}}
this.pastSeekEnd_=0;
this.lastSeekEnd_=newSeekEnd;
this.trigger('seekableendchange');
}
if(this.pastSeekEnd() > this.seekableIncrement_ * 1.5){
this.pastSeekEnd_=0;
}else{
this.pastSeekEnd_=this.pastSeekEnd() + 0.03;
}
if(this.isBehind_()!==this.behindLiveEdge()){
this.behindLiveEdge_=this.isBehind_();
this.trigger('liveedgechange');
}}
;
_proto.handleDurationchange=function handleDurationchange(){
if(this.player_.duration()===Infinity){
this.startTracking();
}else{
this.stopTracking();
}}
;
_proto.startTracking=function startTracking(){
var _this2=this;
if(this.isTracking()){
return;
}
if(!this.timeupdateSeen_){
this.timeupdateSeen_=this.player_.hasStarted();
}
this.trackingInterval_=this.setInterval(this.trackLive_, 30);
this.trackLive_();
this.on(this.player_, 'play', this.trackLive_);
this.on(this.player_, 'pause', this.trackLive_);
if(!this.timeupdateSeen_){
this.one(this.player_, 'play', this.handlePlay);
this.handleTimeupdate=function (){
_this2.timeupdateSeen_=true;
_this2.handleTimeupdate=null;
};
this.one(this.player_, 'timeupdate', this.handleTimeupdate);
}};
_proto.handlePlay=function handlePlay(){
this.one(this.player_, 'timeupdate', this.seekToLiveEdge);
}
;
_proto.reset_=function reset_(){
this.pastSeekEnd_=0;
this.lastSeekEnd_=null;
this.behindLiveEdge_=null;
this.timeupdateSeen_=false;
this.clearInterval(this.trackingInterval_);
this.trackingInterval_=null;
this.seekableIncrement_=12;
this.seekableIncrementList_=[];
this.off(this.player_, 'play', this.trackLive_);
this.off(this.player_, 'pause', this.trackLive_);
this.off(this.player_, 'play', this.handlePlay);
this.off(this.player_, 'timeupdate', this.seekToLiveEdge);
if(this.handleTimeupdate){
this.off(this.player_, 'timeupdate', this.handleTimeupdate);
this.handleTimeupdate=null;
}}
;
_proto.stopTracking=function stopTracking(){
if(!this.isTracking()){
return;
}
this.reset_();
}
;
_proto.seekableEnd=function seekableEnd(){
var seekable=this.player_.seekable();
var seekableEnds=[];
var i=seekable ? seekable.length:0;
while (i--){
seekableEnds.push(seekable.end(i));
}
return seekableEnds.length ? seekableEnds.sort()[seekableEnds.length - 1]:Infinity;
}
;
_proto.seekableStart=function seekableStart(){
var seekable=this.player_.seekable();
var seekableStarts=[];
var i=seekable ? seekable.length:0;
while (i--){
seekableStarts.push(seekable.start(i));
}
return seekableStarts.length ? seekableStarts.sort()[0]:0;
}
;
_proto.liveWindow=function liveWindow(){
var liveCurrentTime=this.liveCurrentTime();
if(liveCurrentTime===Infinity){
return Infinity;
}
return liveCurrentTime - this.seekableStart();
}
;
_proto.isLive=function isLive(){
return this.isTracking();
}
;
_proto.atLiveEdge=function atLiveEdge(){
return !this.behindLiveEdge();
}
;
_proto.liveCurrentTime=function liveCurrentTime(){
return this.pastSeekEnd() + this.seekableEnd();
}
;
_proto.pastSeekEnd=function pastSeekEnd(){
return this.pastSeekEnd_;
}
;
_proto.behindLiveEdge=function behindLiveEdge(){
return this.behindLiveEdge_;
};
_proto.isTracking=function isTracking(){
return typeof this.trackingInterval_==='number';
}
;
_proto.seekToLiveEdge=function seekToLiveEdge(){
if(this.atLiveEdge()){
return;
}
this.player_.currentTime(this.liveCurrentTime());
if(this.player_.paused()){
this.player_.play();
}};
_proto.dispose=function dispose(){
this.stopTracking();
_Component.prototype.dispose.call(this);
};
return LiveTracker;
}(Component);
Component.registerComponent('LiveTracker', LiveTracker);
var sourcesetLoad=function sourcesetLoad(tech){
var el=tech.el();
if(el.hasAttribute('src')){
tech.triggerSourceset(el.src);
return true;
}
var sources=tech.$$('source');
var srcUrls=[];
var src='';
if(!sources.length){
return false;
}
for (var i=0; i < sources.length; i++){
var url=sources[i].src;
if(url&&srcUrls.indexOf(url)===-1){
srcUrls.push(url);
}}
if(!srcUrls.length){
return false;
}
if(srcUrls.length===1){
src=srcUrls[0];
}
tech.triggerSourceset(src);
return true;
};
var innerHTMLDescriptorPolyfill=Object.defineProperty({}, 'innerHTML', {
get: function get(){
return this.cloneNode(true).innerHTML;
},
set: function set(v){
var dummy=document.createElement(this.nodeName.toLowerCase());
dummy.innerHTML=v;
var docFrag=document.createDocumentFragment();
while (dummy.childNodes.length){
docFrag.appendChild(dummy.childNodes[0]);
}
this.innerText='';
window$1.Element.prototype.appendChild.call(this, docFrag);
return this.innerHTML;
}});
var getDescriptor=function getDescriptor(priority, prop){
var descriptor={};
for (var i=0; i < priority.length; i++){
descriptor=Object.getOwnPropertyDescriptor(priority[i], prop);
if(descriptor&&descriptor.set&&descriptor.get){
break;
}}
descriptor.enumerable=true;
descriptor.configurable=true;
return descriptor;
};
var getInnerHTMLDescriptor=function getInnerHTMLDescriptor(tech){
return getDescriptor([tech.el(), window$1.HTMLMediaElement.prototype, window$1.Element.prototype, innerHTMLDescriptorPolyfill], 'innerHTML');
};
var firstSourceWatch=function firstSourceWatch(tech){
var el=tech.el();
if(el.resetSourceWatch_){
return;
}
var old={};
var innerDescriptor=getInnerHTMLDescriptor(tech);
var appendWrapper=function appendWrapper(appendFn){
return function (){
for (var _len=arguments.length, args=new Array(_len), _key=0; _key < _len; _key++){
args[_key]=arguments[_key];
}
var retval=appendFn.apply(el, args);
sourcesetLoad(tech);
return retval;
};};
['append', 'appendChild', 'insertAdjacentHTML'].forEach(function (k){
if(!el[k]){
return;
}
old[k]=el[k];
el[k]=appendWrapper(old[k]);
});
Object.defineProperty(el, 'innerHTML', mergeOptions(innerDescriptor, {
set: appendWrapper(innerDescriptor.set)
}));
el.resetSourceWatch_=function (){
el.resetSourceWatch_=null;
Object.keys(old).forEach(function (k){
el[k]=old[k];
});
Object.defineProperty(el, 'innerHTML', innerDescriptor);
};
tech.one('sourceset', el.resetSourceWatch_);
};
var srcDescriptorPolyfill=Object.defineProperty({}, 'src', {
get: function get(){
if(this.hasAttribute('src')){
return getAbsoluteURL(window$1.Element.prototype.getAttribute.call(this, 'src'));
}
return '';
},
set: function set(v){
window$1.Element.prototype.setAttribute.call(this, 'src', v);
return v;
}});
var getSrcDescriptor=function getSrcDescriptor(tech){
return getDescriptor([tech.el(), window$1.HTMLMediaElement.prototype, srcDescriptorPolyfill], 'src');
};
var setupSourceset=function setupSourceset(tech){
if(!tech.featuresSourceset){
return;
}
var el=tech.el();
if(el.resetSourceset_){
return;
}
var srcDescriptor=getSrcDescriptor(tech);
var oldSetAttribute=el.setAttribute;
var oldLoad=el.load;
Object.defineProperty(el, 'src', mergeOptions(srcDescriptor, {
set: function set(v){
var retval=srcDescriptor.set.call(el, v);
tech.triggerSourceset(el.src);
return retval;
}}));
el.setAttribute=function (n, v){
var retval=oldSetAttribute.call(el, n, v);
if(/src/i.test(n)){
tech.triggerSourceset(el.src);
}
return retval;
};
el.load=function (){
var retval=oldLoad.call(el);
if(!sourcesetLoad(tech)){
tech.triggerSourceset('');
firstSourceWatch(tech);
}
return retval;
};
if(el.currentSrc){
tech.triggerSourceset(el.currentSrc);
}else if(!sourcesetLoad(tech)){
firstSourceWatch(tech);
}
el.resetSourceset_=function (){
el.resetSourceset_=null;
el.load=oldLoad;
el.setAttribute=oldSetAttribute;
Object.defineProperty(el, 'src', srcDescriptor);
if(el.resetSourceWatch_){
el.resetSourceWatch_();
}};};
var defineLazyProperty=function defineLazyProperty(obj, key, getValue, setter){
if(setter===void 0){
setter=true;
}
var set=function set(value){
return Object.defineProperty(obj, key, {
value: value,
enumerable: true,
writable: true
});
};
var options={
configurable: true,
enumerable: true,
get: function get(){
var value=getValue();
set(value);
return value;
}};
if(setter){
options.set=set;
}
return Object.defineProperty(obj, key, options);
};
var Html5 =
function (_Tech){
inheritsLoose(Html5, _Tech);
function Html5(options, ready){
var _this;
_this=_Tech.call(this, options, ready)||this;
var source=options.source;
var crossoriginTracks=false;
if(source&&(_this.el_.currentSrc!==source.src||options.tag&&options.tag.initNetworkState_===3)){
_this.setSource(source);
}else{
_this.handleLateInit_(_this.el_);
}
if(options.enableSourceset){
_this.setupSourcesetHandling_();
}
if(_this.el_.hasChildNodes()){
var nodes=_this.el_.childNodes;
var nodesLength=nodes.length;
var removeNodes=[];
while (nodesLength--){
var node=nodes[nodesLength];
var nodeName=node.nodeName.toLowerCase();
if(nodeName==='track'){
if(!_this.featuresNativeTextTracks){
removeNodes.push(node);
}else{
_this.remoteTextTrackEls().addTrackElement_(node);
_this.remoteTextTracks().addTrack(node.track);
_this.textTracks().addTrack(node.track);
if(!crossoriginTracks&&!_this.el_.hasAttribute('crossorigin')&&isCrossOrigin(node.src)){
crossoriginTracks=true;
}}
}}
for (var i=0; i < removeNodes.length; i++){
_this.el_.removeChild(removeNodes[i]);
}}
_this.proxyNativeTracks_();
if(_this.featuresNativeTextTracks&&crossoriginTracks){
log.warn('Text Tracks are being loaded from another origin but the crossorigin attribute isn\'t used.\n' + 'This may prevent text tracks from loading.');
}
_this.restoreMetadataTracksInIOSNativePlayer_();
if((TOUCH_ENABLED||IS_IPHONE||IS_NATIVE_ANDROID)&&options.nativeControlsForTouch===true){
_this.setControls(true);
}
_this.proxyWebkitFullscreen_();
_this.triggerReady();
return _this;
}
var _proto=Html5.prototype;
_proto.dispose=function dispose(){
if(this.el_&&this.el_.resetSourceset_){
this.el_.resetSourceset_();
}
Html5.disposeMediaElement(this.el_);
this.options_=null;
_Tech.prototype.dispose.call(this);
}
;
_proto.setupSourcesetHandling_=function setupSourcesetHandling_(){
setupSourceset(this);
}
;
_proto.restoreMetadataTracksInIOSNativePlayer_=function restoreMetadataTracksInIOSNativePlayer_(){
var textTracks=this.textTracks();
var metadataTracksPreFullscreenState;
var takeMetadataTrackSnapshot=function takeMetadataTrackSnapshot(){
metadataTracksPreFullscreenState=[];
for (var i=0; i < textTracks.length; i++){
var track=textTracks[i];
if(track.kind==='metadata'){
metadataTracksPreFullscreenState.push({
track: track,
storedMode: track.mode
});
}}
};
takeMetadataTrackSnapshot();
textTracks.addEventListener('change', takeMetadataTrackSnapshot);
this.on('dispose', function (){
return textTracks.removeEventListener('change', takeMetadataTrackSnapshot);
});
var restoreTrackMode=function restoreTrackMode(){
for (var i=0; i < metadataTracksPreFullscreenState.length; i++){
var storedTrack=metadataTracksPreFullscreenState[i];
if(storedTrack.track.mode==='disabled'&&storedTrack.track.mode!==storedTrack.storedMode){
storedTrack.track.mode=storedTrack.storedMode;
}}
textTracks.removeEventListener('change', restoreTrackMode);
};
this.on('webkitbeginfullscreen', function (){
textTracks.removeEventListener('change', takeMetadataTrackSnapshot);
textTracks.removeEventListener('change', restoreTrackMode);
textTracks.addEventListener('change', restoreTrackMode);
});
this.on('webkitendfullscreen', function (){
textTracks.removeEventListener('change', takeMetadataTrackSnapshot);
textTracks.addEventListener('change', takeMetadataTrackSnapshot);
textTracks.removeEventListener('change', restoreTrackMode);
});
}
;
_proto.overrideNative_=function overrideNative_(type, override){
var _this2=this;
if(override!==this["featuresNative" + type + "Tracks"]){
return;
}
var lowerCaseType=type.toLowerCase();
if(this[lowerCaseType + "TracksListeners_"]){
Object.keys(this[lowerCaseType + "TracksListeners_"]).forEach(function (eventName){
var elTracks=_this2.el()[lowerCaseType + "Tracks"];
elTracks.removeEventListener(eventName, _this2[lowerCaseType + "TracksListeners_"][eventName]);
});
}
this["featuresNative" + type + "Tracks"] = !override;
this[lowerCaseType + "TracksListeners_"]=null;
this.proxyNativeTracksForType_(lowerCaseType);
}
;
_proto.overrideNativeAudioTracks=function overrideNativeAudioTracks(override){
this.overrideNative_('Audio', override);
}
;
_proto.overrideNativeVideoTracks=function overrideNativeVideoTracks(override){
this.overrideNative_('Video', override);
}
;
_proto.proxyNativeTracksForType_=function proxyNativeTracksForType_(name){
var _this3=this;
var props=NORMAL[name];
var elTracks=this.el()[props.getterName];
var techTracks=this[props.getterName]();
if(!this["featuresNative" + props.capitalName + "Tracks"]||!elTracks||!elTracks.addEventListener){
return;
}
var listeners={
change: function change(e){
techTracks.trigger({
type: 'change',
target: techTracks,
currentTarget: techTracks,
srcElement: techTracks
});
},
addtrack: function addtrack(e){
techTracks.addTrack(e.track);
},
removetrack: function removetrack(e){
techTracks.removeTrack(e.track);
}};
var removeOldTracks=function removeOldTracks(){
var removeTracks=[];
for (var i=0; i < techTracks.length; i++){
var found=false;
for (var j=0; j < elTracks.length; j++){
if(elTracks[j]===techTracks[i]){
found=true;
break;
}}
if(!found){
removeTracks.push(techTracks[i]);
}}
while (removeTracks.length){
techTracks.removeTrack(removeTracks.shift());
}};
this[props.getterName + 'Listeners_']=listeners;
Object.keys(listeners).forEach(function (eventName){
var listener=listeners[eventName];
elTracks.addEventListener(eventName, listener);
_this3.on('dispose', function (e){
return elTracks.removeEventListener(eventName, listener);
});
});
this.on('loadstart', removeOldTracks);
this.on('dispose', function (e){
return _this3.off('loadstart', removeOldTracks);
});
}
;
_proto.proxyNativeTracks_=function proxyNativeTracks_(){
var _this4=this;
NORMAL.names.forEach(function (name){
_this4.proxyNativeTracksForType_(name);
});
}
;
_proto.createEl=function createEl(){
var el=this.options_.tag;
if(!el||!(this.options_.playerElIngest||this.movingMediaElementInDOM)){
if(el){
var clone=el.cloneNode(true);
if(el.parentNode){
el.parentNode.insertBefore(clone, el);
}
Html5.disposeMediaElement(el);
el=clone;
}else{
el=document.createElement('video');
var tagAttributes=this.options_.tag&&getAttributes(this.options_.tag);
var attributes=mergeOptions({}, tagAttributes);
if(!TOUCH_ENABLED||this.options_.nativeControlsForTouch!==true){
delete attributes.controls;
}
setAttributes(el, assign(attributes, {
id: this.options_.techId,
"class": 'vjs-tech'
}));
}
el.playerId=this.options_.playerId;
}
if(typeof this.options_.preload!=='undefined'){
setAttribute(el, 'preload', this.options_.preload);
}
var settingsAttrs=['loop', 'muted', 'playsinline', 'autoplay'];
for (var i=0; i < settingsAttrs.length; i++){
var attr=settingsAttrs[i];
var value=this.options_[attr];
if(typeof value!=='undefined'){
if(value){
setAttribute(el, attr, attr);
}else{
removeAttribute(el, attr);
}
el[attr]=value;
}}
return el;
}
;
_proto.handleLateInit_=function handleLateInit_(el){
if(el.networkState===0||el.networkState===3){
return;
}
if(el.readyState===0){
var loadstartFired=false;
var setLoadstartFired=function setLoadstartFired(){
loadstartFired=true;
};
this.on('loadstart', setLoadstartFired);
var triggerLoadstart=function triggerLoadstart(){
if(!loadstartFired){
this.trigger('loadstart');
}};
this.on('loadedmetadata', triggerLoadstart);
this.ready(function (){
this.off('loadstart', setLoadstartFired);
this.off('loadedmetadata', triggerLoadstart);
if(!loadstartFired){
this.trigger('loadstart');
}});
return;
}
var eventsToTrigger=['loadstart'];
eventsToTrigger.push('loadedmetadata');
if(el.readyState >=2){
eventsToTrigger.push('loadeddata');
}
if(el.readyState >=3){
eventsToTrigger.push('canplay');
}
if(el.readyState >=4){
eventsToTrigger.push('canplaythrough');
}
this.ready(function (){
eventsToTrigger.forEach(function (type){
this.trigger(type);
}, this);
});
}
;
_proto.setCurrentTime=function setCurrentTime(seconds){
try {
this.el_.currentTime=seconds;
} catch (e){
log(e, 'Video is not ready. (Video.js)');
}}
;
_proto.duration=function duration(){
var _this5=this;
if(this.el_.duration===Infinity&&IS_ANDROID&&IS_CHROME&&this.el_.currentTime===0){
var checkProgress=function checkProgress(){
if(_this5.el_.currentTime > 0){
if(_this5.el_.duration===Infinity){
_this5.trigger('durationchange');
}
_this5.off('timeupdate', checkProgress);
}};
this.on('timeupdate', checkProgress);
return NaN;
}
return this.el_.duration||NaN;
}
;
_proto.width=function width(){
return this.el_.offsetWidth;
}
;
_proto.height=function height(){
return this.el_.offsetHeight;
}
;
_proto.proxyWebkitFullscreen_=function proxyWebkitFullscreen_(){
var _this6=this;
if(!('webkitDisplayingFullscreen' in this.el_)){
return;
}
var endFn=function endFn(){
this.trigger('fullscreenchange', {
isFullscreen: false
});
};
var beginFn=function beginFn(){
if('webkitPresentationMode' in this.el_&&this.el_.webkitPresentationMode!=='picture-in-picture'){
this.one('webkitendfullscreen', endFn);
this.trigger('fullscreenchange', {
isFullscreen: true
});
}};
this.on('webkitbeginfullscreen', beginFn);
this.on('dispose', function (){
_this6.off('webkitbeginfullscreen', beginFn);
_this6.off('webkitendfullscreen', endFn);
});
}
;
_proto.supportsFullScreen=function supportsFullScreen(){
if(typeof this.el_.webkitEnterFullScreen==='function'){
var userAgent=window$1.navigator&&window$1.navigator.userAgent||'';
if(/Android/.test(userAgent)||!/Chrome|Mac OS X 10.5/.test(userAgent)){
return true;
}}
return false;
}
;
_proto.enterFullScreen=function enterFullScreen(){
var video=this.el_;
if(video.paused&&video.networkState <=video.HAVE_METADATA){
this.el_.play();
this.setTimeout(function (){
video.pause();
video.webkitEnterFullScreen();
}, 0);
}else{
video.webkitEnterFullScreen();
}}
;
_proto.exitFullScreen=function exitFullScreen(){
this.el_.webkitExitFullScreen();
}
;
_proto.requestPictureInPicture=function requestPictureInPicture(){
return this.el_.requestPictureInPicture();
}
;
_proto.src=function src(_src){
if(_src===undefined){
return this.el_.src;
}
this.setSrc(_src);
}
;
_proto.reset=function reset(){
Html5.resetMediaElement(this.el_);
}
;
_proto.currentSrc=function currentSrc(){
if(this.currentSource_){
return this.currentSource_.src;
}
return this.el_.currentSrc;
}
;
_proto.setControls=function setControls(val){
this.el_.controls = !!val;
}
;
_proto.addTextTrack=function addTextTrack(kind, label, language){
if(!this.featuresNativeTextTracks){
return _Tech.prototype.addTextTrack.call(this, kind, label, language);
}
return this.el_.addTextTrack(kind, label, language);
}
;
_proto.createRemoteTextTrack=function createRemoteTextTrack(options){
if(!this.featuresNativeTextTracks){
return _Tech.prototype.createRemoteTextTrack.call(this, options);
}
var htmlTrackElement=document.createElement('track');
if(options.kind){
htmlTrackElement.kind=options.kind;
}
if(options.label){
htmlTrackElement.label=options.label;
}
if(options.language||options.srclang){
htmlTrackElement.srclang=options.language||options.srclang;
}
if(options["default"]){
htmlTrackElement["default"]=options["default"];
}
if(options.id){
htmlTrackElement.id=options.id;
}
if(options.src){
htmlTrackElement.src=options.src;
}
return htmlTrackElement;
}
;
_proto.addRemoteTextTrack=function addRemoteTextTrack(options, manualCleanup){
var htmlTrackElement=_Tech.prototype.addRemoteTextTrack.call(this, options, manualCleanup);
if(this.featuresNativeTextTracks){
this.el().appendChild(htmlTrackElement);
}
return htmlTrackElement;
}
;
_proto.removeRemoteTextTrack=function removeRemoteTextTrack(track){
_Tech.prototype.removeRemoteTextTrack.call(this, track);
if(this.featuresNativeTextTracks){
var tracks=this.$$('track');
var i=tracks.length;
while (i--){
if(track===tracks[i]||track===tracks[i].track){
this.el().removeChild(tracks[i]);
}}
}}
;
_proto.getVideoPlaybackQuality=function getVideoPlaybackQuality(){
if(typeof this.el().getVideoPlaybackQuality==='function'){
return this.el().getVideoPlaybackQuality();
}
var videoPlaybackQuality={};
if(typeof this.el().webkitDroppedFrameCount!=='undefined'&&typeof this.el().webkitDecodedFrameCount!=='undefined'){
videoPlaybackQuality.droppedVideoFrames=this.el().webkitDroppedFrameCount;
videoPlaybackQuality.totalVideoFrames=this.el().webkitDecodedFrameCount;
}
if(window$1.performance&&typeof window$1.performance.now==='function'){
videoPlaybackQuality.creationTime=window$1.performance.now();
}else if(window$1.performance&&window$1.performance.timing&&typeof window$1.performance.timing.navigationStart==='number'){
videoPlaybackQuality.creationTime=window$1.Date.now() - window$1.performance.timing.navigationStart;
}
return videoPlaybackQuality;
};
return Html5;
}(Tech);
defineLazyProperty(Html5, 'TEST_VID', function (){
if(!isReal()){
return;
}
var video=document.createElement('video');
var track=document.createElement('track');
track.kind='captions';
track.srclang='en';
track.label='English';
video.appendChild(track);
return video;
});
Html5.isSupported=function (){
try {
Html5.TEST_VID.volume=0.5;
} catch (e){
return false;
}
return !!(Html5.TEST_VID&&Html5.TEST_VID.canPlayType);
};
Html5.canPlayType=function (type){
return Html5.TEST_VID.canPlayType(type);
};
Html5.canPlaySource=function (srcObj, options){
return Html5.canPlayType(srcObj.type);
};
Html5.canControlVolume=function (){
try {
var volume=Html5.TEST_VID.volume;
Html5.TEST_VID.volume=volume / 2 + 0.1;
return volume!==Html5.TEST_VID.volume;
} catch (e){
return false;
}};
Html5.canMuteVolume=function (){
try {
var muted=Html5.TEST_VID.muted;
Html5.TEST_VID.muted = !muted;
if(Html5.TEST_VID.muted){
setAttribute(Html5.TEST_VID, 'muted', 'muted');
}else{
removeAttribute(Html5.TEST_VID, 'muted', 'muted');
}
return muted!==Html5.TEST_VID.muted;
} catch (e){
return false;
}};
Html5.canControlPlaybackRate=function (){
if(IS_ANDROID&&IS_CHROME&&CHROME_VERSION < 58){
return false;
}
try {
var playbackRate=Html5.TEST_VID.playbackRate;
Html5.TEST_VID.playbackRate=playbackRate / 2 + 0.1;
return playbackRate!==Html5.TEST_VID.playbackRate;
} catch (e){
return false;
}};
Html5.canOverrideAttributes=function (){
try {
var noop=function noop(){};
Object.defineProperty(document.createElement('video'), 'src', {
get: noop,
set: noop
});
Object.defineProperty(document.createElement('audio'), 'src', {
get: noop,
set: noop
});
Object.defineProperty(document.createElement('video'), 'innerHTML', {
get: noop,
set: noop
});
Object.defineProperty(document.createElement('audio'), 'innerHTML', {
get: noop,
set: noop
});
} catch (e){
return false;
}
return true;
};
Html5.supportsNativeTextTracks=function (){
return IS_ANY_SAFARI||IS_IOS&&IS_CHROME;
};
Html5.supportsNativeVideoTracks=function (){
return !!(Html5.TEST_VID&&Html5.TEST_VID.videoTracks);
};
Html5.supportsNativeAudioTracks=function (){
return !!(Html5.TEST_VID&&Html5.TEST_VID.audioTracks);
};
Html5.Events=['loadstart', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'loadedmetadata', 'loadeddata', 'canplay', 'canplaythrough', 'playing', 'waiting', 'seeking', 'seeked', 'ended', 'durationchange', 'timeupdate', 'progress', 'play', 'pause', 'ratechange', 'resize', 'volumechange'];
[['featuresVolumeControl', 'canControlVolume'], ['featuresMuteControl', 'canMuteVolume'], ['featuresPlaybackRate', 'canControlPlaybackRate'], ['featuresSourceset', 'canOverrideAttributes'], ['featuresNativeTextTracks', 'supportsNativeTextTracks'], ['featuresNativeVideoTracks', 'supportsNativeVideoTracks'], ['featuresNativeAudioTracks', 'supportsNativeAudioTracks']].forEach(function (_ref){
var key=_ref[0],
fn=_ref[1];
defineLazyProperty(Html5.prototype, key, function (){
return Html5[fn]();
}, true);
});
Html5.prototype.movingMediaElementInDOM = !IS_IOS;
Html5.prototype.featuresFullscreenResize=true;
Html5.prototype.featuresProgressEvents=true;
Html5.prototype.featuresTimeupdateEvents=true;
var canPlayType;
Html5.patchCanPlayType=function (){
if(ANDROID_VERSION >=4.0&&!IS_FIREFOX&&!IS_CHROME){
canPlayType=Html5.TEST_VID&&Html5.TEST_VID.constructor.prototype.canPlayType;
Html5.TEST_VID.constructor.prototype.canPlayType=function (type){
var mpegurlRE=/^application\/(?:x-|vnd\.apple\.)mpegurl/i;
if(type&&mpegurlRE.test(type)){
return 'maybe';
}
return canPlayType.call(this, type);
};}};
Html5.unpatchCanPlayType=function (){
var r=Html5.TEST_VID.constructor.prototype.canPlayType;
if(canPlayType){
Html5.TEST_VID.constructor.prototype.canPlayType=canPlayType;
}
return r;
};
Html5.patchCanPlayType();
Html5.disposeMediaElement=function (el){
if(!el){
return;
}
if(el.parentNode){
el.parentNode.removeChild(el);
}
while (el.hasChildNodes()){
el.removeChild(el.firstChild);
}
el.removeAttribute('src');
if(typeof el.load==='function'){
(function (){
try {
el.load();
} catch (e){
}})();
}};
Html5.resetMediaElement=function (el){
if(!el){
return;
}
var sources=el.querySelectorAll('source');
var i=sources.length;
while (i--){
el.removeChild(sources[i]);
}
el.removeAttribute('src');
if(typeof el.load==='function'){
(function (){
try {
el.load();
} catch (e){
}})();
}};
[
'muted',
'defaultMuted',
'autoplay',
'controls',
'loop',
'playsinline'].forEach(function (prop){
Html5.prototype[prop]=function (){
return this.el_[prop]||this.el_.hasAttribute(prop);
};});
[
'muted',
'defaultMuted',
'autoplay',
'loop',
'playsinline'].forEach(function (prop){
Html5.prototype['set' + toTitleCase(prop)]=function (v){
this.el_[prop]=v;
if(v){
this.el_.setAttribute(prop, prop);
}else{
this.el_.removeAttribute(prop);
}};});
[
'paused',
'currentTime',
'buffered',
'volume',
'poster',
'preload',
'error',
'seeking',
'seekable',
'ended',
'playbackRate',
'defaultPlaybackRate',
'played',
'networkState',
'readyState',
'videoWidth',
'videoHeight'].forEach(function (prop){
Html5.prototype[prop]=function (){
return this.el_[prop];
};});
[
'volume',
'src',
'poster',
'preload',
'playbackRate',
'defaultPlaybackRate'].forEach(function (prop){
Html5.prototype['set' + toTitleCase(prop)]=function (v){
this.el_[prop]=v;
};});
[
'pause',
'load',
'play'].forEach(function (prop){
Html5.prototype[prop]=function (){
return this.el_[prop]();
};});
Tech.withSourceHandlers(Html5);
Html5.nativeSourceHandler={};
Html5.nativeSourceHandler.canPlayType=function (type){
try {
return Html5.TEST_VID.canPlayType(type);
} catch (e){
return '';
}};
Html5.nativeSourceHandler.canHandleSource=function (source, options){
if(source.type){
return Html5.nativeSourceHandler.canPlayType(source.type);
}else if(source.src){
var ext=getFileExtension(source.src);
return Html5.nativeSourceHandler.canPlayType("video/" + ext);
}
return '';
};
Html5.nativeSourceHandler.handleSource=function (source, tech, options){
tech.setSrc(source.src);
};
Html5.nativeSourceHandler.dispose=function (){};
Html5.registerSourceHandler(Html5.nativeSourceHandler);
Tech.registerTech('Html5', Html5);
var TECH_EVENTS_RETRIGGER=[
'progress',
'abort',
'suspend',
'emptied',
'stalled',
'loadedmetadata',
'loadeddata',
'timeupdate',
'resize',
'volumechange',
'texttrackchange'];
var TECH_EVENTS_QUEUE={
canplay: 'CanPlay',
canplaythrough: 'CanPlayThrough',
playing: 'Playing',
seeked: 'Seeked'
};
var BREAKPOINT_ORDER=['tiny', 'xsmall', 'small', 'medium', 'large', 'xlarge', 'huge'];
var BREAKPOINT_CLASSES={};
BREAKPOINT_ORDER.forEach(function (k){
var v=k.charAt(0)==='x' ? "x-" + k.substring(1):k;
BREAKPOINT_CLASSES[k]="vjs-layout-" + v;
});
var DEFAULT_BREAKPOINTS={
tiny: 210,
xsmall: 320,
small: 425,
medium: 768,
large: 1440,
xlarge: 2560,
huge: Infinity
};
var Player =
function (_Component){
inheritsLoose(Player, _Component);
function Player(tag, options, ready){
var _this;
tag.id=tag.id||options.id||"vjs_video_" + newGUID();
options=assign(Player.getTagSettings(tag), options);
options.initChildren=false;
options.createEl=false;
options.evented=false;
options.reportTouchActivity=false;
if(!options.language){
if(typeof tag.closest==='function'){
var closest=tag.closest('[lang]');
if(closest&&closest.getAttribute){
options.language=closest.getAttribute('lang');
}}else{
var element=tag;
while (element&&element.nodeType===1){
if(getAttributes(element).hasOwnProperty('lang')){
options.language=element.getAttribute('lang');
break;
}
element=element.parentNode;
}}
}
_this=_Component.call(this, null, options, ready)||this;
_this.boundDocumentFullscreenChange_=bind(assertThisInitialized(_this), _this.documentFullscreenChange_);
_this.boundFullWindowOnEscKey_=bind(assertThisInitialized(_this), _this.fullWindowOnEscKey);
_this.log=createLogger$1(_this.id_);
_this.fsApi_=FullscreenApi;
_this.isPosterFromTech_=false;
_this.queuedCallbacks_=[];
_this.isReady_=false;
_this.hasStarted_=false;
_this.userActive_=false;
if(!_this.options_||!_this.options_.techOrder||!_this.options_.techOrder.length){
throw new Error('No techOrder specified. Did you overwrite ' + 'videojs.options instead of just changing the ' + 'properties you want to override?');
}
_this.tag=tag;
_this.tagAttributes=tag&&getAttributes(tag);
_this.language(_this.options_.language);
if(options.languages){
var languagesToLower={};
Object.getOwnPropertyNames(options.languages).forEach(function (name){
languagesToLower[name.toLowerCase()]=options.languages[name];
});
_this.languages_=languagesToLower;
}else{
_this.languages_=Player.prototype.options_.languages;
}
_this.resetCache_();
_this.poster_=options.poster||'';
_this.controls_ = !!options.controls;
tag.controls=false;
tag.removeAttribute('controls');
_this.changingSrc_=false;
_this.playCallbacks_=[];
_this.playTerminatedQueue_=[];
if(tag.hasAttribute('autoplay')){
_this.autoplay(true);
}else{
_this.autoplay(_this.options_.autoplay);
}
if(options.plugins){
Object.keys(options.plugins).forEach(function (name){
if(typeof _this[name]!=='function'){
throw new Error("plugin \"" + name + "\" does not exist");
}});
}
_this.scrubbing_=false;
_this.el_=_this.createEl();
evented(assertThisInitialized(_this), {
eventBusKey: 'el_'
});
if(_this.fluid_){
_this.on('playerreset', _this.updateStyleEl_);
}
var playerOptionsCopy=mergeOptions(_this.options_);
if(options.plugins){
Object.keys(options.plugins).forEach(function (name){
_this[name](options.plugins[name]);
});
}
_this.options_.playerOptions=playerOptionsCopy;
_this.middleware_=[];
_this.initChildren();
_this.isAudio(tag.nodeName.toLowerCase()==='audio');
if(_this.controls()){
_this.addClass('vjs-controls-enabled');
}else{
_this.addClass('vjs-controls-disabled');
}
_this.el_.setAttribute('role', 'region');
if(_this.isAudio()){
_this.el_.setAttribute('aria-label', _this.localize('Audio Player'));
}else{
_this.el_.setAttribute('aria-label', _this.localize('Video Player'));
}
if(_this.isAudio()){
_this.addClass('vjs-audio');
}
if(_this.flexNotSupported_()){
_this.addClass('vjs-no-flex');
}
if(TOUCH_ENABLED){
_this.addClass('vjs-touch-enabled');
}
if(!IS_IOS){
_this.addClass('vjs-workinghover');
}
Player.players[_this.id_]=assertThisInitialized(_this);
var majorVersion=version.split('.')[0];
_this.addClass("vjs-v" + majorVersion);
_this.userActive(true);
_this.reportUserActivity();
_this.one('play', _this.listenForUserActivity_);
_this.on('stageclick', _this.handleStageClick_);
_this.on('keydown', _this.handleKeyDown);
_this.breakpoints(_this.options_.breakpoints);
_this.responsive(_this.options_.responsive);
return _this;
}
var _proto=Player.prototype;
_proto.dispose=function dispose(){
var _this2=this;
this.trigger('dispose');
this.off('dispose');
off(document, this.fsApi_.fullscreenchange, this.boundDocumentFullscreenChange_);
off(document, 'keydown', this.boundFullWindowOnEscKey_);
if(this.styleEl_&&this.styleEl_.parentNode){
this.styleEl_.parentNode.removeChild(this.styleEl_);
this.styleEl_=null;
}
Player.players[this.id_]=null;
if(this.tag&&this.tag.player){
this.tag.player=null;
}
if(this.el_&&this.el_.player){
this.el_.player=null;
}
if(this.tech_){
this.tech_.dispose();
this.isPosterFromTech_=false;
this.poster_='';
}
if(this.playerElIngest_){
this.playerElIngest_=null;
}
if(this.tag){
this.tag=null;
}
clearCacheForPlayer(this);
ALL.names.forEach(function (name){
var props=ALL[name];
var list=_this2[props.getterName]();
if(list&&list.off){
list.off();
}});
_Component.prototype.dispose.call(this);
}
;
_proto.createEl=function createEl(){
var tag=this.tag;
var el;
var playerElIngest=this.playerElIngest_=tag.parentNode&&tag.parentNode.hasAttribute&&tag.parentNode.hasAttribute('data-vjs-player');
var divEmbed=this.tag.tagName.toLowerCase()==='video-js';
if(playerElIngest){
el=this.el_=tag.parentNode;
}else if(!divEmbed){
el=this.el_=_Component.prototype.createEl.call(this, 'div');
}
var attrs=getAttributes(tag);
if(divEmbed){
el=this.el_=tag;
tag=this.tag=document.createElement('video');
while (el.children.length){
tag.appendChild(el.firstChild);
}
if(!hasClass(el, 'video-js')){
addClass(el, 'video-js');
}
el.appendChild(tag);
playerElIngest=this.playerElIngest_=el;
Object.keys(el).forEach(function (k){
try {
tag[k]=el[k];
} catch (e){
}});
}
tag.setAttribute('tabindex', '-1');
attrs.tabindex='-1';
if(IE_VERSION||IS_CHROME&&IS_WINDOWS){
tag.setAttribute('role', 'application');
attrs.role='application';
}
tag.removeAttribute('width');
tag.removeAttribute('height');
if('width' in attrs){
delete attrs.width;
}
if('height' in attrs){
delete attrs.height;
}
Object.getOwnPropertyNames(attrs).forEach(function (attr){
if(!(divEmbed&&attr==='class')){
el.setAttribute(attr, attrs[attr]);
}
if(divEmbed){
tag.setAttribute(attr, attrs[attr]);
}});
tag.playerId=tag.id;
tag.id +='_html5_api';
tag.className='vjs-tech';
tag.player=el.player=this;
this.addClass('vjs-paused');
if(window$1.VIDEOJS_NO_DYNAMIC_STYLE!==true){
this.styleEl_=createStyleElement('vjs-styles-dimensions');
var defaultsStyleEl=$('.vjs-styles-defaults');
var head=$('head');
head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling:head.firstChild);
}
this.fill_=false;
this.fluid_=false;
this.width(this.options_.width);
this.height(this.options_.height);
this.fill(this.options_.fill);
this.fluid(this.options_.fluid);
this.aspectRatio(this.options_.aspectRatio);
var links=tag.getElementsByTagName('a');
for (var i=0; i < links.length; i++){
var linkEl=links.item(i);
addClass(linkEl, 'vjs-hidden');
linkEl.setAttribute('hidden', 'hidden');
}
tag.initNetworkState_=tag.networkState;
if(tag.parentNode&&!playerElIngest){
tag.parentNode.insertBefore(el, tag);
}
prependTo(tag, el);
this.children_.unshift(tag);
this.el_.setAttribute('lang', this.language_);
this.el_=el;
return el;
}
;
_proto.width=function width(value){
return this.dimension('width', value);
}
;
_proto.height=function height(value){
return this.dimension('height', value);
}
;
_proto.dimension=function dimension(_dimension, value){
var privDimension=_dimension + '_';
if(value===undefined){
return this[privDimension]||0;
}
if(value===''||value==='auto'){
this[privDimension]=undefined;
this.updateStyleEl_();
return;
}
var parsedVal=parseFloat(value);
if(isNaN(parsedVal)){
log.error("Improper value \"" + value + "\" supplied for for " + _dimension);
return;
}
this[privDimension]=parsedVal;
this.updateStyleEl_();
}
;
_proto.fluid=function fluid(bool){
if(bool===undefined){
return !!this.fluid_;
}
this.fluid_ = !!bool;
if(isEvented(this)){
this.off('playerreset', this.updateStyleEl_);
}
if(bool){
this.addClass('vjs-fluid');
this.fill(false);
addEventedCallback(function (){
this.on('playerreset', this.updateStyleEl_);
});
}else{
this.removeClass('vjs-fluid');
}
this.updateStyleEl_();
}
;
_proto.fill=function fill(bool){
if(bool===undefined){
return !!this.fill_;
}
this.fill_ = !!bool;
if(bool){
this.addClass('vjs-fill');
this.fluid(false);
}else{
this.removeClass('vjs-fill');
}}
;
_proto.aspectRatio=function aspectRatio(ratio){
if(ratio===undefined){
return this.aspectRatio_;
}
if(!/^\d+\:\d+$/.test(ratio)){
throw new Error('Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.');
}
this.aspectRatio_=ratio;
this.fluid(true);
this.updateStyleEl_();
}
;
_proto.updateStyleEl_=function updateStyleEl_(){
if(window$1.VIDEOJS_NO_DYNAMIC_STYLE===true){
var _width=typeof this.width_==='number' ? this.width_:this.options_.width;
var _height=typeof this.height_==='number' ? this.height_:this.options_.height;
var techEl=this.tech_&&this.tech_.el();
if(techEl){
if(_width >=0){
techEl.width=_width;
}
if(_height >=0){
techEl.height=_height;
}}
return;
}
var width;
var height;
var aspectRatio;
var idClass;
if(this.aspectRatio_!==undefined&&this.aspectRatio_!=='auto'){
aspectRatio=this.aspectRatio_;
}else if(this.videoWidth() > 0){
aspectRatio=this.videoWidth() + ':' + this.videoHeight();
}else{
aspectRatio='16:9';
}
var ratioParts=aspectRatio.split(':');
var ratioMultiplier=ratioParts[1] / ratioParts[0];
if(this.width_!==undefined){
width=this.width_;
}else if(this.height_!==undefined){
width=this.height_ / ratioMultiplier;
}else{
width=this.videoWidth()||300;
}
if(this.height_!==undefined){
height=this.height_;
}else{
height=width * ratioMultiplier;
}
if(/^[^a-zA-Z]/.test(this.id())){
idClass='dimensions-' + this.id();
}else{
idClass=this.id() + '-dimensions';
}
this.addClass(idClass);
setTextContent(this.styleEl_, "\n      ." + idClass + " {\n        width: " + width + "px;\n        height: " + height + "px;\n      }\n\n      ." + idClass + ".vjs-fluid {\n        padding-top: " + ratioMultiplier * 100 + "%;\n      }\n    ");
}
;
_proto.loadTech_=function loadTech_(techName, source){
var _this3=this;
if(this.tech_){
this.unloadTech_();
}
var titleTechName=toTitleCase(techName);
var camelTechName=techName.charAt(0).toLowerCase() + techName.slice(1);
if(titleTechName!=='Html5'&&this.tag){
Tech.getTech('Html5').disposeMediaElement(this.tag);
this.tag.player=null;
this.tag=null;
}
this.techName_=titleTechName;
this.isReady_=false;
var autoplay=typeof this.autoplay()==='string' ? false:this.autoplay();
var techOptions={
source: source,
autoplay: autoplay,
'nativeControlsForTouch': this.options_.nativeControlsForTouch,
'playerId': this.id(),
'techId': this.id() + "_" + camelTechName + "_api",
'playsinline': this.options_.playsinline,
'preload': this.options_.preload,
'loop': this.options_.loop,
'muted': this.options_.muted,
'poster': this.poster(),
'language': this.language(),
'playerElIngest': this.playerElIngest_||false,
'vtt.js': this.options_['vtt.js'],
'canOverridePoster': !!this.options_.techCanOverridePoster,
'enableSourceset': this.options_.enableSourceset,
'Promise': this.options_.Promise
};
ALL.names.forEach(function (name){
var props=ALL[name];
techOptions[props.getterName]=_this3[props.privateName];
});
assign(techOptions, this.options_[titleTechName]);
assign(techOptions, this.options_[camelTechName]);
assign(techOptions, this.options_[techName.toLowerCase()]);
if(this.tag){
techOptions.tag=this.tag;
}
if(source&&source.src===this.cache_.src&&this.cache_.currentTime > 0){
techOptions.startTime=this.cache_.currentTime;
}
var TechClass=Tech.getTech(techName);
if(!TechClass){
throw new Error("No Tech named '" + titleTechName + "' exists! '" + titleTechName + "' should be registered using videojs.registerTech()'");
}
this.tech_=new TechClass(techOptions);
this.tech_.ready(bind(this, this.handleTechReady_), true);
textTrackConverter.jsonToTextTracks(this.textTracksJson_||[], this.tech_);
TECH_EVENTS_RETRIGGER.forEach(function (event){
_this3.on(_this3.tech_, event, _this3["handleTech" + toTitleCase(event) + "_"]);
});
Object.keys(TECH_EVENTS_QUEUE).forEach(function (event){
_this3.on(_this3.tech_, event, function (eventObj){
if(_this3.tech_.playbackRate()===0&&_this3.tech_.seeking()){
_this3.queuedCallbacks_.push({
callback: _this3["handleTech" + TECH_EVENTS_QUEUE[event] + "_"].bind(_this3),
event: eventObj
});
return;
}
_this3["handleTech" + TECH_EVENTS_QUEUE[event] + "_"](eventObj);
});
});
this.on(this.tech_, 'loadstart', this.handleTechLoadStart_);
this.on(this.tech_, 'sourceset', this.handleTechSourceset_);
this.on(this.tech_, 'waiting', this.handleTechWaiting_);
this.on(this.tech_, 'ended', this.handleTechEnded_);
this.on(this.tech_, 'seeking', this.handleTechSeeking_);
this.on(this.tech_, 'play', this.handleTechPlay_);
this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_);
this.on(this.tech_, 'pause', this.handleTechPause_);
this.on(this.tech_, 'durationchange', this.handleTechDurationChange_);
this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_);
this.on(this.tech_, 'enterpictureinpicture', this.handleTechEnterPictureInPicture_);
this.on(this.tech_, 'leavepictureinpicture', this.handleTechLeavePictureInPicture_);
this.on(this.tech_, 'error', this.handleTechError_);
this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_);
this.on(this.tech_, 'posterchange', this.handleTechPosterChange_);
this.on(this.tech_, 'textdata', this.handleTechTextData_);
this.on(this.tech_, 'ratechange', this.handleTechRateChange_);
this.usingNativeControls(this.techGet_('controls'));
if(this.controls()&&!this.usingNativeControls()){
this.addTechControlsListeners_();
}
if(this.tech_.el().parentNode!==this.el()&&(titleTechName!=='Html5'||!this.tag)){
prependTo(this.tech_.el(), this.el());
}
if(this.tag){
this.tag.player=null;
this.tag=null;
}}
;
_proto.unloadTech_=function unloadTech_(){
var _this4=this;
ALL.names.forEach(function (name){
var props=ALL[name];
_this4[props.privateName]=_this4[props.getterName]();
});
this.textTracksJson_=textTrackConverter.textTracksToJson(this.tech_);
this.isReady_=false;
this.tech_.dispose();
this.tech_=false;
if(this.isPosterFromTech_){
this.poster_='';
this.trigger('posterchange');
}
this.isPosterFromTech_=false;
}
;
_proto.tech=function tech(safety){
if(safety===undefined){
log.warn('Using the tech directly can be dangerous. I hope you know what you\'re doing.\n' + 'See https://github.com/videojs/video.js/issues/2617 for more info.\n');
}
return this.tech_;
}
;
_proto.addTechControlsListeners_=function addTechControlsListeners_(){
this.removeTechControlsListeners_();
this.on(this.tech_, 'mouseup', this.handleTechClick_);
this.on(this.tech_, 'dblclick', this.handleTechDoubleClick_);
this.on(this.tech_, 'touchstart', this.handleTechTouchStart_);
this.on(this.tech_, 'touchmove', this.handleTechTouchMove_);
this.on(this.tech_, 'touchend', this.handleTechTouchEnd_);
this.on(this.tech_, 'tap', this.handleTechTap_);
}
;
_proto.removeTechControlsListeners_=function removeTechControlsListeners_(){
this.off(this.tech_, 'tap', this.handleTechTap_);
this.off(this.tech_, 'touchstart', this.handleTechTouchStart_);
this.off(this.tech_, 'touchmove', this.handleTechTouchMove_);
this.off(this.tech_, 'touchend', this.handleTechTouchEnd_);
this.off(this.tech_, 'mouseup', this.handleTechClick_);
this.off(this.tech_, 'dblclick', this.handleTechDoubleClick_);
}
;
_proto.handleTechReady_=function handleTechReady_(){
this.triggerReady();
if(this.cache_.volume){
this.techCall_('setVolume', this.cache_.volume);
}
this.handleTechPosterChange_();
this.handleTechDurationChange_();
}
;
_proto.handleTechLoadStart_=function handleTechLoadStart_(){
this.removeClass('vjs-ended');
this.removeClass('vjs-seeking');
this.error(null);
this.handleTechDurationChange_();
if(!this.paused()){
this.trigger('loadstart');
this.trigger('firstplay');
}else{
this.hasStarted(false);
this.trigger('loadstart');
}
this.manualAutoplay_(this.autoplay());
}
;
_proto.manualAutoplay_=function manualAutoplay_(type){
var _this5=this;
if(!this.tech_||typeof type!=='string'){
return;
}
var muted=function muted(){
var previouslyMuted=_this5.muted();
_this5.muted(true);
var restoreMuted=function restoreMuted(){
_this5.muted(previouslyMuted);
};
_this5.playTerminatedQueue_.push(restoreMuted);
var mutedPromise=_this5.play();
if(!isPromise(mutedPromise)){
return;
}
return mutedPromise["catch"](restoreMuted);
};
var promise;
if(type==='any'&&this.muted()!==true){
promise=this.play();
if(isPromise(promise)){
promise=promise["catch"](muted);
}}else if(type==='muted'&&this.muted()!==true){
promise=muted();
}else{
promise=this.play();
}
if(!isPromise(promise)){
return;
}
return promise.then(function (){
_this5.trigger({
type: 'autoplay-success',
autoplay: type
});
})["catch"](function (e){
_this5.trigger({
type: 'autoplay-failure',
autoplay: type
});
});
}
;
_proto.updateSourceCaches_=function updateSourceCaches_(srcObj){
if(srcObj===void 0){
srcObj='';
}
var src=srcObj;
var type='';
if(typeof src!=='string'){
src=srcObj.src;
type=srcObj.type;
}
this.cache_.source=this.cache_.source||{};
this.cache_.sources=this.cache_.sources||[];
if(src&&!type){
type=findMimetype(this, src);
}
this.cache_.source=mergeOptions({}, srcObj, {
src: src,
type: type
});
var matchingSources=this.cache_.sources.filter(function (s){
return s.src&&s.src===src;
});
var sourceElSources=[];
var sourceEls=this.$$('source');
var matchingSourceEls=[];
for (var i=0; i < sourceEls.length; i++){
var sourceObj=getAttributes(sourceEls[i]);
sourceElSources.push(sourceObj);
if(sourceObj.src&&sourceObj.src===src){
matchingSourceEls.push(sourceObj.src);
}}
if(matchingSourceEls.length&&!matchingSources.length){
this.cache_.sources=sourceElSources;
}else if(!matchingSources.length){
this.cache_.sources=[this.cache_.source];
}
this.cache_.src=src;
}
;
_proto.handleTechSourceset_=function handleTechSourceset_(event){
var _this6=this;
if(!this.changingSrc_){
var updateSourceCaches=function updateSourceCaches(src){
return _this6.updateSourceCaches_(src);
};
var playerSrc=this.currentSource().src;
var eventSrc=event.src;
if(playerSrc&&!/^blob:/.test(playerSrc)&&/^blob:/.test(eventSrc)){
if(!this.lastSource_||this.lastSource_.tech!==eventSrc&&this.lastSource_.player!==playerSrc){
updateSourceCaches=function updateSourceCaches(){};}}
updateSourceCaches(eventSrc);
if(!event.src){
this.tech_.any(['sourceset', 'loadstart'], function (e){
if(e.type==='sourceset'){
return;
}
var techSrc=_this6.techGet('currentSrc');
_this6.lastSource_.tech=techSrc;
_this6.updateSourceCaches_(techSrc);
});
}}
this.lastSource_={
player: this.currentSource().src,
tech: event.src
};
this.trigger({
src: event.src,
type: 'sourceset'
});
}
;
_proto.hasStarted=function hasStarted(request){
if(request===undefined){
return this.hasStarted_;
}
if(request===this.hasStarted_){
return;
}
this.hasStarted_=request;
if(this.hasStarted_){
this.addClass('vjs-has-started');
this.trigger('firstplay');
}else{
this.removeClass('vjs-has-started');
}}
;
_proto.handleTechPlay_=function handleTechPlay_(){
this.removeClass('vjs-ended');
this.removeClass('vjs-paused');
this.addClass('vjs-playing');
this.hasStarted(true);
this.trigger('play');
}
;
_proto.handleTechRateChange_=function handleTechRateChange_(){
if(this.tech_.playbackRate() > 0&&this.cache_.lastPlaybackRate===0){
this.queuedCallbacks_.forEach(function (queued){
return queued.callback(queued.event);
});
this.queuedCallbacks_=[];
}
this.cache_.lastPlaybackRate=this.tech_.playbackRate();
this.trigger('ratechange');
}
;
_proto.handleTechWaiting_=function handleTechWaiting_(){
var _this7=this;
this.addClass('vjs-waiting');
this.trigger('waiting');
var timeWhenWaiting=this.currentTime();
var timeUpdateListener=function timeUpdateListener(){
if(timeWhenWaiting!==_this7.currentTime()){
_this7.removeClass('vjs-waiting');
_this7.off('timeupdate', timeUpdateListener);
}};
this.on('timeupdate', timeUpdateListener);
}
;
_proto.handleTechCanPlay_=function handleTechCanPlay_(){
this.removeClass('vjs-waiting');
this.trigger('canplay');
}
;
_proto.handleTechCanPlayThrough_=function handleTechCanPlayThrough_(){
this.removeClass('vjs-waiting');
this.trigger('canplaythrough');
}
;
_proto.handleTechPlaying_=function handleTechPlaying_(){
this.removeClass('vjs-waiting');
this.trigger('playing');
}
;
_proto.handleTechSeeking_=function handleTechSeeking_(){
this.addClass('vjs-seeking');
this.trigger('seeking');
}
;
_proto.handleTechSeeked_=function handleTechSeeked_(){
this.removeClass('vjs-seeking');
this.removeClass('vjs-ended');
this.trigger('seeked');
}
;
_proto.handleTechFirstPlay_=function handleTechFirstPlay_(){
if(this.options_.starttime){
log.warn('Passing the `starttime` option to the player will be deprecated in 6.0');
this.currentTime(this.options_.starttime);
}
this.addClass('vjs-has-started');
this.trigger('firstplay');
}
;
_proto.handleTechPause_=function handleTechPause_(){
this.removeClass('vjs-playing');
this.addClass('vjs-paused');
this.trigger('pause');
}
;
_proto.handleTechEnded_=function handleTechEnded_(){
this.addClass('vjs-ended');
if(this.options_.loop){
this.currentTime(0);
this.play();
}else if(!this.paused()){
this.pause();
}
this.trigger('ended');
}
;
_proto.handleTechDurationChange_=function handleTechDurationChange_(){
this.duration(this.techGet_('duration'));
}
;
_proto.handleTechClick_=function handleTechClick_(event){
if(!isSingleLeftClick(event)){
return;
}
if(!this.controls_){
return;
}
if(this.paused()){
silencePromise(this.play());
}else{
this.pause();
}}
;
_proto.handleTechDoubleClick_=function handleTechDoubleClick_(event){
if(!this.controls_){
return;
}
var inAllowedEls=Array.prototype.some.call(this.$$('.vjs-control-bar, .vjs-modal-dialog'), function (el){
return el.contains(event.target);
});
if(!inAllowedEls){
if(this.options_===undefined||this.options_.userActions===undefined||this.options_.userActions.doubleClick===undefined||this.options_.userActions.doubleClick!==false){
if(this.options_!==undefined&&this.options_.userActions!==undefined&&typeof this.options_.userActions.doubleClick==='function'){
this.options_.userActions.doubleClick.call(this, event);
}else if(this.isFullscreen()){
this.exitFullscreen();
}else{
this.requestFullscreen();
}}
}}
;
_proto.handleTechTap_=function handleTechTap_(){
this.userActive(!this.userActive());
}
;
_proto.handleTechTouchStart_=function handleTechTouchStart_(){
this.userWasActive=this.userActive();
}
;
_proto.handleTechTouchMove_=function handleTechTouchMove_(){
if(this.userWasActive){
this.reportUserActivity();
}}
;
_proto.handleTechTouchEnd_=function handleTechTouchEnd_(event){
event.preventDefault();
}
;
_proto.handleStageClick_=function handleStageClick_(){
this.reportUserActivity();
}
;
_proto.toggleFullscreenClass_=function toggleFullscreenClass_(){
if(this.isFullscreen()){
this.addClass('vjs-fullscreen');
}else{
this.removeClass('vjs-fullscreen');
}}
;
_proto.documentFullscreenChange_=function documentFullscreenChange_(e){
var el=this.el();
var isFs=document[this.fsApi_.fullscreenElement]===el;
if(!isFs&&el.matches){
isFs=el.matches(':' + this.fsApi_.fullscreen);
}else if(!isFs&&el.msMatchesSelector){
isFs=el.msMatchesSelector(':' + this.fsApi_.fullscreen);
}
this.isFullscreen(isFs);
if(this.isFullscreen()===false){
off(document, this.fsApi_.fullscreenchange, this.boundDocumentFullscreenChange_);
}
if(this.fsApi_.prefixed){
this.trigger('fullscreenchange');
}}
;
_proto.handleTechFullscreenChange_=function handleTechFullscreenChange_(event, data){
if(data){
this.isFullscreen(data.isFullscreen);
}
this.trigger('fullscreenchange');
}
;
_proto.togglePictureInPictureClass_=function togglePictureInPictureClass_(){
if(this.isInPictureInPicture()){
this.addClass('vjs-picture-in-picture');
}else{
this.removeClass('vjs-picture-in-picture');
}}
;
_proto.handleTechEnterPictureInPicture_=function handleTechEnterPictureInPicture_(event){
this.isInPictureInPicture(true);
}
;
_proto.handleTechLeavePictureInPicture_=function handleTechLeavePictureInPicture_(event){
this.isInPictureInPicture(false);
}
;
_proto.handleTechError_=function handleTechError_(){
var error=this.tech_.error();
this.error(error);
}
;
_proto.handleTechTextData_=function handleTechTextData_(){
var data=null;
if(arguments.length > 1){
data=arguments[1];
}
this.trigger('textdata', data);
}
;
_proto.getCache=function getCache(){
return this.cache_;
}
;
_proto.resetCache_=function resetCache_(){
this.cache_={
currentTime: 0,
inactivityTimeout: this.options_.inactivityTimeout,
duration: NaN,
lastVolume: 1,
lastPlaybackRate: this.defaultPlaybackRate(),
media: null,
src: '',
source: {},
sources: [],
volume: 1
};}
;
_proto.techCall_=function techCall_(method, arg){
this.ready(function (){
if(method in allowedSetters){
return set(this.middleware_, this.tech_, method, arg);
}else if(method in allowedMediators){
return mediate(this.middleware_, this.tech_, method, arg);
}
try {
if(this.tech_){
this.tech_[method](arg);
}} catch (e){
log(e);
throw e;
}}, true);
}
;
_proto.techGet_=function techGet_(method){
if(!this.tech_||!this.tech_.isReady_){
return;
}
if(method in allowedGetters){
return get(this.middleware_, this.tech_, method);
}else if(method in allowedMediators){
return mediate(this.middleware_, this.tech_, method);
}
try {
return this.tech_[method]();
} catch (e){
if(this.tech_[method]===undefined){
log("Video.js: " + method + " method not defined for " + this.techName_ + " playback technology.", e);
throw e;
}
if(e.name==='TypeError'){
log("Video.js: " + method + " unavailable on " + this.techName_ + " playback technology element.", e);
this.tech_.isReady_=false;
throw e;
}
log(e);
throw e;
}}
;
_proto.play=function play(){
var _this8=this;
var PromiseClass=this.options_.Promise||window$1.Promise;
if(PromiseClass){
return new PromiseClass(function (resolve){
_this8.play_(resolve);
});
}
return this.play_();
}
;
_proto.play_=function play_(callback){
var _this9=this;
if(callback===void 0){
callback=silencePromise;
}
this.playCallbacks_.push(callback);
var isSrcReady=Boolean(!this.changingSrc_&&(this.src()||this.currentSrc()));
if(this.waitToPlay_){
this.off(['ready', 'loadstart'], this.waitToPlay_);
this.waitToPlay_=null;
}
if(!this.isReady_||!isSrcReady){
this.waitToPlay_=function (e){
_this9.play_();
};
this.one(['ready', 'loadstart'], this.waitToPlay_);
if(!isSrcReady&&(IS_ANY_SAFARI||IS_IOS)){
this.load();
}
return;
}
var val=this.techGet_('play');
if(val===null){
this.runPlayTerminatedQueue_();
}else{
this.runPlayCallbacks_(val);
}}
;
_proto.runPlayTerminatedQueue_=function runPlayTerminatedQueue_(){
var queue=this.playTerminatedQueue_.slice(0);
this.playTerminatedQueue_=[];
queue.forEach(function (q){
q();
});
}
;
_proto.runPlayCallbacks_=function runPlayCallbacks_(val){
var callbacks=this.playCallbacks_.slice(0);
this.playCallbacks_=[];
this.playTerminatedQueue_=[];
callbacks.forEach(function (cb){
cb(val);
});
}
;
_proto.pause=function pause(){
this.techCall_('pause');
}
;
_proto.paused=function paused(){
return this.techGet_('paused')===false ? false:true;
}
;
_proto.played=function played(){
return this.techGet_('played')||createTimeRanges(0, 0);
}
;
_proto.scrubbing=function scrubbing(isScrubbing){
if(typeof isScrubbing==='undefined'){
return this.scrubbing_;
}
this.scrubbing_ = !!isScrubbing;
if(isScrubbing){
this.addClass('vjs-scrubbing');
}else{
this.removeClass('vjs-scrubbing');
}}
;
_proto.currentTime=function currentTime(seconds){
if(typeof seconds!=='undefined'){
if(seconds < 0){
seconds=0;
}
this.techCall_('setCurrentTime', seconds);
return;
}
this.cache_.currentTime=this.techGet_('currentTime')||0;
return this.cache_.currentTime;
}
;
_proto.duration=function duration(seconds){
if(seconds===undefined){
return this.cache_.duration!==undefined ? this.cache_.duration:NaN;
}
seconds=parseFloat(seconds);
if(seconds < 0){
seconds=Infinity;
}
if(seconds!==this.cache_.duration){
this.cache_.duration=seconds;
if(seconds===Infinity){
this.addClass('vjs-live');
if(this.options_.liveui&&this.player_.liveTracker){
this.addClass('vjs-liveui');
}}else{
this.removeClass('vjs-live');
this.removeClass('vjs-liveui');
}
if(!isNaN(seconds)){
this.trigger('durationchange');
}}
}
;
_proto.remainingTime=function remainingTime(){
return this.duration() - this.currentTime();
}
;
_proto.remainingTimeDisplay=function remainingTimeDisplay(){
return Math.floor(this.duration()) - Math.floor(this.currentTime());
}
;
_proto.buffered=function buffered(){
var buffered=this.techGet_('buffered');
if(!buffered||!buffered.length){
buffered=createTimeRanges(0, 0);
}
return buffered;
}
;
_proto.bufferedPercent=function bufferedPercent$1(){
return bufferedPercent(this.buffered(), this.duration());
}
;
_proto.bufferedEnd=function bufferedEnd(){
var buffered=this.buffered();
var duration=this.duration();
var end=buffered.end(buffered.length - 1);
if(end > duration){
end=duration;
}
return end;
}
;
_proto.volume=function volume(percentAsDecimal){
var vol;
if(percentAsDecimal!==undefined){
vol=Math.max(0, Math.min(1, parseFloat(percentAsDecimal)));
this.cache_.volume=vol;
this.techCall_('setVolume', vol);
if(vol > 0){
this.lastVolume_(vol);
}
return;
}
vol=parseFloat(this.techGet_('volume'));
return isNaN(vol) ? 1:vol;
}
;
_proto.muted=function muted(_muted){
if(_muted!==undefined){
this.techCall_('setMuted', _muted);
return;
}
return this.techGet_('muted')||false;
}
;
_proto.defaultMuted=function defaultMuted(_defaultMuted){
if(_defaultMuted!==undefined){
return this.techCall_('setDefaultMuted', _defaultMuted);
}
return this.techGet_('defaultMuted')||false;
}
;
_proto.lastVolume_=function lastVolume_(percentAsDecimal){
if(percentAsDecimal!==undefined&&percentAsDecimal!==0){
this.cache_.lastVolume=percentAsDecimal;
return;
}
return this.cache_.lastVolume;
}
;
_proto.supportsFullScreen=function supportsFullScreen(){
return this.techGet_('supportsFullScreen')||false;
}
;
_proto.isFullscreen=function isFullscreen(isFS){
if(isFS!==undefined){
this.isFullscreen_ = !!isFS;
this.toggleFullscreenClass_();
return;
}
return !!this.isFullscreen_;
}
;
_proto.requestFullscreen=function requestFullscreen(fullscreenOptions){
var fsOptions;
this.isFullscreen(true);
if(this.fsApi_.requestFullscreen){
on(document, this.fsApi_.fullscreenchange, this.boundDocumentFullscreenChange_);
if(!this.fsApi_.prefixed){
fsOptions=this.options_.fullscreen&&this.options_.fullscreen.options||{};
if(fullscreenOptions!==undefined){
fsOptions=fullscreenOptions;
}}
silencePromise(this.el_[this.fsApi_.requestFullscreen](fsOptions));
}else if(this.tech_.supportsFullScreen()){
this.techCall_('enterFullScreen');
}else{
this.enterFullWindow();
this.trigger('fullscreenchange');
}}
;
_proto.exitFullscreen=function exitFullscreen(){
this.isFullscreen(false);
if(this.fsApi_.requestFullscreen){
silencePromise(document[this.fsApi_.exitFullscreen]());
}else if(this.tech_.supportsFullScreen()){
this.techCall_('exitFullScreen');
}else{
this.exitFullWindow();
this.trigger('fullscreenchange');
}}
;
_proto.enterFullWindow=function enterFullWindow(){
this.isFullWindow=true;
this.docOrigOverflow=document.documentElement.style.overflow;
on(document, 'keydown', this.boundFullWindowOnEscKey_);
document.documentElement.style.overflow='hidden';
addClass(document.body, 'vjs-full-window');
this.trigger('enterFullWindow');
}
;
_proto.fullWindowOnEscKey=function fullWindowOnEscKey(event){
if(keycode.isEventKey(event, 'Esc')){
if(this.isFullscreen()===true){
this.exitFullscreen();
}else{
this.exitFullWindow();
}}
}
;
_proto.exitFullWindow=function exitFullWindow(){
this.isFullWindow=false;
off(document, 'keydown', this.boundFullWindowOnEscKey_);
document.documentElement.style.overflow=this.docOrigOverflow;
removeClass(document.body, 'vjs-full-window');
this.trigger('exitFullWindow');
}
;
_proto.isInPictureInPicture=function isInPictureInPicture(isPiP){
if(isPiP!==undefined){
this.isInPictureInPicture_ = !!isPiP;
this.togglePictureInPictureClass_();
return;
}
return !!this.isInPictureInPicture_;
}
;
_proto.requestPictureInPicture=function requestPictureInPicture(){
if('pictureInPictureEnabled' in document){
return this.techGet_('requestPictureInPicture');
}}
;
_proto.exitPictureInPicture=function exitPictureInPicture(){
if('pictureInPictureEnabled' in document){
return document.exitPictureInPicture();
}}
;
_proto.handleKeyDown=function handleKeyDown(event){
var userActions=this.options_.userActions;
if(!userActions||!userActions.hotkeys){
return;
}
var excludeElement=function excludeElement(el){
var tagName=el.tagName.toLowerCase();
if(el.isContentEditable){
return true;
}
var allowedInputTypes=['button', 'checkbox', 'hidden', 'radio', 'reset', 'submit'];
if(tagName==='input'){
return allowedInputTypes.indexOf(el.type)===-1;
}
var excludedTags=['textarea'];
return excludedTags.indexOf(tagName)!==-1;
};
if(excludeElement(this.el_.ownerDocument.activeElement)){
return;
}
if(typeof userActions.hotkeys==='function'){
userActions.hotkeys.call(this, event);
}else{
this.handleHotkeys(event);
}}
;
_proto.handleHotkeys=function handleHotkeys(event){
var hotkeys=this.options_.userActions ? this.options_.userActions.hotkeys:{};
var _hotkeys$fullscreenKe=hotkeys.fullscreenKey,
fullscreenKey=_hotkeys$fullscreenKe===void 0 ? function (keydownEvent){
return keycode.isEventKey(keydownEvent, 'f');
}:_hotkeys$fullscreenKe,
_hotkeys$muteKey=hotkeys.muteKey,
muteKey=_hotkeys$muteKey===void 0 ? function (keydownEvent){
return keycode.isEventKey(keydownEvent, 'm');
}:_hotkeys$muteKey,
_hotkeys$playPauseKey=hotkeys.playPauseKey,
playPauseKey=_hotkeys$playPauseKey===void 0 ? function (keydownEvent){
return keycode.isEventKey(keydownEvent, 'k')||keycode.isEventKey(keydownEvent, 'Space');
}:_hotkeys$playPauseKey;
if(fullscreenKey.call(this, event)){
event.preventDefault();
event.stopPropagation();
var FSToggle=Component.getComponent('FullscreenToggle');
if(document[this.fsApi_.fullscreenEnabled]!==false){
FSToggle.prototype.handleClick.call(this, event);
}}else if(muteKey.call(this, event)){
event.preventDefault();
event.stopPropagation();
var MuteToggle=Component.getComponent('MuteToggle');
MuteToggle.prototype.handleClick.call(this, event);
}else if(playPauseKey.call(this, event)){
event.preventDefault();
event.stopPropagation();
var PlayToggle=Component.getComponent('PlayToggle');
PlayToggle.prototype.handleClick.call(this, event);
}}
;
_proto.canPlayType=function canPlayType(type){
var can;
for (var i=0, j=this.options_.techOrder; i < j.length; i++){
var techName=j[i];
var tech=Tech.getTech(techName);
if(!tech){
tech=Component.getComponent(techName);
}
if(!tech){
log.error("The \"" + techName + "\" tech is undefined. Skipped browser support check for that tech.");
continue;
}
if(tech.isSupported()){
can=tech.canPlayType(type);
if(can){
return can;
}}
}
return '';
}
;
_proto.selectSource=function selectSource(sources){
var _this10=this;
var techs=this.options_.techOrder.map(function (techName){
return [techName, Tech.getTech(techName)];
}).filter(function (_ref){
var techName=_ref[0],
tech=_ref[1];
if(tech){
return tech.isSupported();
}
log.error("The \"" + techName + "\" tech is undefined. Skipped browser support check for that tech.");
return false;
});
var findFirstPassingTechSourcePair=function findFirstPassingTechSourcePair(outerArray, innerArray, tester){
var found;
outerArray.some(function (outerChoice){
return innerArray.some(function (innerChoice){
found=tester(outerChoice, innerChoice);
if(found){
return true;
}});
});
return found;
};
var foundSourceAndTech;
var flip=function flip(fn){
return function (a, b){
return fn(b, a);
};};
var finder=function finder(_ref2, source){
var techName=_ref2[0],
tech=_ref2[1];
if(tech.canPlaySource(source, _this10.options_[techName.toLowerCase()])){
return {
source: source,
tech: techName
};}};
if(this.options_.sourceOrder){
foundSourceAndTech=findFirstPassingTechSourcePair(sources, techs, flip(finder));
}else{
foundSourceAndTech=findFirstPassingTechSourcePair(techs, sources, finder);
}
return foundSourceAndTech||false;
}
;
_proto.src=function src(source){
var _this11=this;
if(typeof source==='undefined'){
return this.cache_.src||'';
}
var sources=filterSource(source);
if(!sources.length){
this.setTimeout(function (){
this.error({
code: 4,
message: this.localize(this.options_.notSupportedMessage)
});
}, 0);
return;
}
this.changingSrc_=true;
this.cache_.sources=sources;
this.updateSourceCaches_(sources[0]);
setSource(this, sources[0], function (middlewareSource, mws){
_this11.middleware_=mws;
_this11.cache_.sources=sources;
_this11.updateSourceCaches_(middlewareSource);
var err=_this11.src_(middlewareSource);
if(err){
if(sources.length > 1){
return _this11.src(sources.slice(1));
}
_this11.changingSrc_=false;
_this11.setTimeout(function (){
this.error({
code: 4,
message: this.localize(this.options_.notSupportedMessage)
});
}, 0);
_this11.triggerReady();
return;
}
setTech(mws, _this11.tech_);
});
}
;
_proto.src_=function src_(source){
var _this12=this;
var sourceTech=this.selectSource([source]);
if(!sourceTech){
return true;
}
if(!titleCaseEquals(sourceTech.tech, this.techName_)){
this.changingSrc_=true;
this.loadTech_(sourceTech.tech, sourceTech.source);
this.tech_.ready(function (){
_this12.changingSrc_=false;
});
return false;
}
this.ready(function (){
if(this.tech_.constructor.prototype.hasOwnProperty('setSource')){
this.techCall_('setSource', source);
}else{
this.techCall_('src', source.src);
}
this.changingSrc_=false;
}, true);
return false;
}
;
_proto.load=function load(){
this.techCall_('load');
}
;
_proto.reset=function reset(){
var _this13=this;
var PromiseClass=this.options_.Promise||window$1.Promise;
if(this.paused()||!PromiseClass){
this.doReset_();
}else{
var playPromise=this.play();
silencePromise(playPromise.then(function (){
return _this13.doReset_();
}));
}};
_proto.doReset_=function doReset_(){
if(this.tech_){
this.tech_.clearTracks('text');
}
this.resetCache_();
this.poster('');
this.loadTech_(this.options_.techOrder[0], null);
this.techCall_('reset');
this.resetControlBarUI_();
if(isEvented(this)){
this.trigger('playerreset');
}}
;
_proto.resetControlBarUI_=function resetControlBarUI_(){
this.resetProgressBar_();
this.resetPlaybackRate_();
this.resetVolumeBar_();
}
;
_proto.resetProgressBar_=function resetProgressBar_(){
this.currentTime(0);
var _this$controlBar=this.controlBar,
durationDisplay=_this$controlBar.durationDisplay,
remainingTimeDisplay=_this$controlBar.remainingTimeDisplay;
if(durationDisplay){
durationDisplay.updateContent();
}
if(remainingTimeDisplay){
remainingTimeDisplay.updateContent();
}}
;
_proto.resetPlaybackRate_=function resetPlaybackRate_(){
this.playbackRate(this.defaultPlaybackRate());
this.handleTechRateChange_();
}
;
_proto.resetVolumeBar_=function resetVolumeBar_(){
this.volume(1.0);
this.trigger('volumechange');
}
;
_proto.currentSources=function currentSources(){
var source=this.currentSource();
var sources=[];
if(Object.keys(source).length!==0){
sources.push(source);
}
return this.cache_.sources||sources;
}
;
_proto.currentSource=function currentSource(){
return this.cache_.source||{};}
;
_proto.currentSrc=function currentSrc(){
return this.currentSource()&&this.currentSource().src||'';
}
;
_proto.currentType=function currentType(){
return this.currentSource()&&this.currentSource().type||'';
}
;
_proto.preload=function preload(value){
if(value!==undefined){
this.techCall_('setPreload', value);
this.options_.preload=value;
return;
}
return this.techGet_('preload');
}
;
_proto.autoplay=function autoplay(value){
if(value===undefined){
return this.options_.autoplay||false;
}
var techAutoplay;
if(typeof value==='string'&&/(any|play|muted)/.test(value)){
this.options_.autoplay=value;
this.manualAutoplay_(value);
techAutoplay=false;
}else if(!value){
this.options_.autoplay=false;
}else{
this.options_.autoplay=true;
}
techAutoplay=typeof techAutoplay==='undefined' ? this.options_.autoplay:techAutoplay;
if(this.tech_){
this.techCall_('setAutoplay', techAutoplay);
}}
;
_proto.playsinline=function playsinline(value){
if(value!==undefined){
this.techCall_('setPlaysinline', value);
this.options_.playsinline=value;
return this;
}
return this.techGet_('playsinline');
}
;
_proto.loop=function loop(value){
if(value!==undefined){
this.techCall_('setLoop', value);
this.options_.loop=value;
return;
}
return this.techGet_('loop');
}
;
_proto.poster=function poster(src){
if(src===undefined){
return this.poster_;
}
if(!src){
src='';
}
if(src===this.poster_){
return;
}
this.poster_=src;
this.techCall_('setPoster', src);
this.isPosterFromTech_=false;
this.trigger('posterchange');
}
;
_proto.handleTechPosterChange_=function handleTechPosterChange_(){
if((!this.poster_||this.options_.techCanOverridePoster)&&this.tech_&&this.tech_.poster){
var newPoster=this.tech_.poster()||'';
if(newPoster!==this.poster_){
this.poster_=newPoster;
this.isPosterFromTech_=true;
this.trigger('posterchange');
}}
}
;
_proto.controls=function controls(bool){
if(bool===undefined){
return !!this.controls_;
}
bool = !!bool;
if(this.controls_===bool){
return;
}
this.controls_=bool;
if(this.usingNativeControls()){
this.techCall_('setControls', bool);
}
if(this.controls_){
this.removeClass('vjs-controls-disabled');
this.addClass('vjs-controls-enabled');
this.trigger('controlsenabled');
if(!this.usingNativeControls()){
this.addTechControlsListeners_();
}}else{
this.removeClass('vjs-controls-enabled');
this.addClass('vjs-controls-disabled');
this.trigger('controlsdisabled');
if(!this.usingNativeControls()){
this.removeTechControlsListeners_();
}}
}
;
_proto.usingNativeControls=function usingNativeControls(bool){
if(bool===undefined){
return !!this.usingNativeControls_;
}
bool = !!bool;
if(this.usingNativeControls_===bool){
return;
}
this.usingNativeControls_=bool;
if(this.usingNativeControls_){
this.addClass('vjs-using-native-controls');
this.trigger('usingnativecontrols');
}else{
this.removeClass('vjs-using-native-controls');
this.trigger('usingcustomcontrols');
}}
;
_proto.error=function error(err){
if(err===undefined){
return this.error_||null;
}
if(this.options_.suppressNotSupportedError&&err&&err.code===4){
var triggerSuppressedError=function triggerSuppressedError(){
this.error(err);
};
this.options_.suppressNotSupportedError=false;
this.any(['click', 'touchstart'], triggerSuppressedError);
this.one('loadstart', function (){
this.off(['click', 'touchstart'], triggerSuppressedError);
});
return;
}
if(err===null){
this.error_=err;
this.removeClass('vjs-error');
if(this.errorDisplay){
this.errorDisplay.close();
}
return;
}
this.error_=new MediaError(err);
this.addClass('vjs-error');
log.error("(CODE:" + this.error_.code + " " + MediaError.errorTypes[this.error_.code] + ")", this.error_.message, this.error_);
this.trigger('error');
return;
}
;
_proto.reportUserActivity=function reportUserActivity(event){
this.userActivity_=true;
}
;
_proto.userActive=function userActive(bool){
if(bool===undefined){
return this.userActive_;
}
bool = !!bool;
if(bool===this.userActive_){
return;
}
this.userActive_=bool;
if(this.userActive_){
this.userActivity_=true;
this.removeClass('vjs-user-inactive');
this.addClass('vjs-user-active');
this.trigger('useractive');
return;
}
if(this.tech_){
this.tech_.one('mousemove', function (e){
e.stopPropagation();
e.preventDefault();
});
}
this.userActivity_=false;
this.removeClass('vjs-user-active');
this.addClass('vjs-user-inactive');
this.trigger('userinactive');
}
;
_proto.listenForUserActivity_=function listenForUserActivity_(){
var mouseInProgress;
var lastMoveX;
var lastMoveY;
var handleActivity=bind(this, this.reportUserActivity);
var handleMouseMove=function handleMouseMove(e){
if(e.screenX!==lastMoveX||e.screenY!==lastMoveY){
lastMoveX=e.screenX;
lastMoveY=e.screenY;
handleActivity();
}};
var handleMouseDown=function handleMouseDown(){
handleActivity();
this.clearInterval(mouseInProgress);
mouseInProgress=this.setInterval(handleActivity, 250);
};
var handleMouseUp=function handleMouseUp(event){
handleActivity();
this.clearInterval(mouseInProgress);
};
this.on('mousedown', handleMouseDown);
this.on('mousemove', handleMouseMove);
this.on('mouseup', handleMouseUp);
var controlBar=this.getChild('controlBar');
if(controlBar&&!IS_IOS&&!IS_ANDROID){
controlBar.on('mouseenter', function (event){
this.player().cache_.inactivityTimeout=this.player().options_.inactivityTimeout;
this.player().options_.inactivityTimeout=0;
});
controlBar.on('mouseleave', function (event){
this.player().options_.inactivityTimeout=this.player().cache_.inactivityTimeout;
});
}
this.on('keydown', handleActivity);
this.on('keyup', handleActivity);
var inactivityTimeout;
this.setInterval(function (){
if(!this.userActivity_){
return;
}
this.userActivity_=false;
this.userActive(true);
this.clearTimeout(inactivityTimeout);
var timeout=this.options_.inactivityTimeout;
if(timeout <=0){
return;
}
inactivityTimeout=this.setTimeout(function (){
if(!this.userActivity_){
this.userActive(false);
}}, timeout);
}, 250);
}
;
_proto.playbackRate=function playbackRate(rate){
if(rate!==undefined){
this.techCall_('setPlaybackRate', rate);
return;
}
if(this.tech_&&this.tech_.featuresPlaybackRate){
return this.cache_.lastPlaybackRate||this.techGet_('playbackRate');
}
return 1.0;
}
;
_proto.defaultPlaybackRate=function defaultPlaybackRate(rate){
if(rate!==undefined){
return this.techCall_('setDefaultPlaybackRate', rate);
}
if(this.tech_&&this.tech_.featuresPlaybackRate){
return this.techGet_('defaultPlaybackRate');
}
return 1.0;
}
;
_proto.isAudio=function isAudio(bool){
if(bool!==undefined){
this.isAudio_ = !!bool;
return;
}
return !!this.isAudio_;
}
;
_proto.addTextTrack=function addTextTrack(kind, label, language){
if(this.tech_){
return this.tech_.addTextTrack(kind, label, language);
}}
;
_proto.addRemoteTextTrack=function addRemoteTextTrack(options, manualCleanup){
if(this.tech_){
return this.tech_.addRemoteTextTrack(options, manualCleanup);
}}
;
_proto.removeRemoteTextTrack=function removeRemoteTextTrack(obj){
if(obj===void 0){
obj={};}
var _obj=obj,
track=_obj.track;
if(!track){
track=obj;
}
if(this.tech_){
return this.tech_.removeRemoteTextTrack(track);
}}
;
_proto.getVideoPlaybackQuality=function getVideoPlaybackQuality(){
return this.techGet_('getVideoPlaybackQuality');
}
;
_proto.videoWidth=function videoWidth(){
return this.tech_&&this.tech_.videoWidth&&this.tech_.videoWidth()||0;
}
;
_proto.videoHeight=function videoHeight(){
return this.tech_&&this.tech_.videoHeight&&this.tech_.videoHeight()||0;
}
;
_proto.language=function language(code){
if(code===undefined){
return this.language_;
}
this.language_=String(code).toLowerCase();
}
;
_proto.languages=function languages(){
return mergeOptions(Player.prototype.options_.languages, this.languages_);
}
;
_proto.toJSON=function toJSON(){
var options=mergeOptions(this.options_);
var tracks=options.tracks;
options.tracks=[];
for (var i=0; i < tracks.length; i++){
var track=tracks[i];
track=mergeOptions(track);
track.player=undefined;
options.tracks[i]=track;
}
return options;
}
;
_proto.createModal=function createModal(content, options){
var _this14=this;
options=options||{};
options.content=content||'';
var modal=new ModalDialog(this, options);
this.addChild(modal);
modal.on('dispose', function (){
_this14.removeChild(modal);
});
modal.open();
return modal;
}
;
_proto.updateCurrentBreakpoint_=function updateCurrentBreakpoint_(){
if(!this.responsive()){
return;
}
var currentBreakpoint=this.currentBreakpoint();
var currentWidth=this.currentWidth();
for (var i=0; i < BREAKPOINT_ORDER.length; i++){
var candidateBreakpoint=BREAKPOINT_ORDER[i];
var maxWidth=this.breakpoints_[candidateBreakpoint];
if(currentWidth <=maxWidth){
if(currentBreakpoint===candidateBreakpoint){
return;
}
if(currentBreakpoint){
this.removeClass(BREAKPOINT_CLASSES[currentBreakpoint]);
}
this.addClass(BREAKPOINT_CLASSES[candidateBreakpoint]);
this.breakpoint_=candidateBreakpoint;
break;
}}
}
;
_proto.removeCurrentBreakpoint_=function removeCurrentBreakpoint_(){
var className=this.currentBreakpointClass();
this.breakpoint_='';
if(className){
this.removeClass(className);
}}
;
_proto.breakpoints=function breakpoints(_breakpoints){
if(_breakpoints===undefined){
return assign(this.breakpoints_);
}
this.breakpoint_='';
this.breakpoints_=assign({}, DEFAULT_BREAKPOINTS, _breakpoints);
this.updateCurrentBreakpoint_();
return assign(this.breakpoints_);
}
;
_proto.responsive=function responsive(value){
if(value===undefined){
return this.responsive_;
}
value=Boolean(value);
var current=this.responsive_;
if(value===current){
return;
}
this.responsive_=value;
if(value){
this.on('playerresize', this.updateCurrentBreakpoint_);
this.updateCurrentBreakpoint_();
}else{
this.off('playerresize', this.updateCurrentBreakpoint_);
this.removeCurrentBreakpoint_();
}
return value;
}
;
_proto.currentBreakpoint=function currentBreakpoint(){
return this.breakpoint_;
}
;
_proto.currentBreakpointClass=function currentBreakpointClass(){
return BREAKPOINT_CLASSES[this.breakpoint_]||'';
}
;
_proto.loadMedia=function loadMedia(media, ready){
var _this15=this;
if(!media||typeof media!=='object'){
return;
}
this.reset();
this.cache_.media=mergeOptions(media);
var _this$cache_$media=this.cache_.media,
artwork=_this$cache_$media.artwork,
poster=_this$cache_$media.poster,
src=_this$cache_$media.src,
textTracks=_this$cache_$media.textTracks;
if(!artwork&&poster){
this.cache_.media.artwork=[{
src: poster,
type: getMimetype(poster)
}];
}
if(src){
this.src(src);
}
if(poster){
this.poster(poster);
}
if(Array.isArray(textTracks)){
textTracks.forEach(function (tt){
return _this15.addRemoteTextTrack(tt, false);
});
}
this.ready(ready);
}
;
_proto.getMedia=function getMedia(){
if(!this.cache_.media){
var poster=this.poster();
var src=this.currentSources();
var textTracks=Array.prototype.map.call(this.remoteTextTracks(), function (tt){
return {
kind: tt.kind,
label: tt.label,
language: tt.language,
src: tt.src
};});
var media={
src: src,
textTracks: textTracks
};
if(poster){
media.poster=poster;
media.artwork=[{
src: media.poster,
type: getMimetype(media.poster)
}];
}
return media;
}
return mergeOptions(this.cache_.media);
}
;
Player.getTagSettings=function getTagSettings(tag){
var baseOptions={
sources: [],
tracks: []
};
var tagOptions=getAttributes(tag);
var dataSetup=tagOptions['data-setup'];
if(hasClass(tag, 'vjs-fill')){
tagOptions.fill=true;
}
if(hasClass(tag, 'vjs-fluid')){
tagOptions.fluid=true;
}
if(dataSetup!==null){
var _safeParseTuple=tuple(dataSetup||'{}'),
err=_safeParseTuple[0],
data=_safeParseTuple[1];
if(err){
log.error(err);
}
assign(tagOptions, data);
}
assign(baseOptions, tagOptions);
if(tag.hasChildNodes()){
var children=tag.childNodes;
for (var i=0, j=children.length; i < j; i++){
var child=children[i]; // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/
var childName=child.nodeName.toLowerCase();
if(childName==='source'){
baseOptions.sources.push(getAttributes(child));
}else if(childName==='track'){
baseOptions.tracks.push(getAttributes(child));
}}
}
return baseOptions;
}
;
_proto.flexNotSupported_=function flexNotSupported_(){
var elem=document.createElement('i');
return !('flexBasis' in elem.style||'webkitFlexBasis' in elem.style||'mozFlexBasis' in elem.style||'msFlexBasis' in elem.style ||
'msFlexOrder' in elem.style);
};
return Player;
}(Component);
ALL.names.forEach(function (name){
var props=ALL[name];
Player.prototype[props.getterName]=function (){
if(this.tech_){
return this.tech_[props.getterName]();
}
this[props.privateName]=this[props.privateName]||new props.ListClass();
return this[props.privateName];
};});
Player.players={};
var navigator=window$1.navigator;
Player.prototype.options_={
techOrder: Tech.defaultTechOrder_,
html5: {},
flash: {},
inactivityTimeout: 2000,
playbackRates: [],
liveui: false,
children: ['mediaLoader', 'posterImage', 'textTrackDisplay', 'loadingSpinner', 'bigPlayButton', 'liveTracker', 'controlBar', 'errorDisplay', 'textTrackSettings', 'resizeManager'],
language: navigator&&(navigator.languages&&navigator.languages[0]||navigator.userLanguage||navigator.language)||'en',
languages: {},
notSupportedMessage: 'No compatible source was found for this media.',
fullscreen: {
options: {
navigationUI: 'hide'
}},
breakpoints: {},
responsive: false
};
[
'ended',
'seeking',
'seekable',
'networkState',
'readyState'].forEach(function (fn){
Player.prototype[fn]=function (){
return this.techGet_(fn);
};});
TECH_EVENTS_RETRIGGER.forEach(function (event){
Player.prototype["handleTech" + toTitleCase(event) + "_"]=function (){
return this.trigger(event);
};});
Component.registerComponent('Player', Player);
var setPrototypeOf=createCommonjsModule(function (module){
function _setPrototypeOf(o, p){
module.exports=_setPrototypeOf=Object.setPrototypeOf||function _setPrototypeOf(o, p){
o.__proto__=p;
return o;
};
return _setPrototypeOf(o, p);
}
module.exports=_setPrototypeOf;
});
var construct=createCommonjsModule(function (module){
function isNativeReflectConstruct(){
if(typeof Reflect==="undefined"||!Reflect.construct) return false;
if(Reflect.construct.sham) return false;
if(typeof Proxy==="function") return true;
try {
Date.prototype.toString.call(Reflect.construct(Date, [], function (){}));
return true;
} catch (e){
return false;
}}
function _construct(Parent, args, Class){
if(isNativeReflectConstruct()){
module.exports=_construct=Reflect.construct;
}else{
module.exports=_construct=function _construct(Parent, args, Class){
var a=[null];
a.push.apply(a, args);
var Constructor=Function.bind.apply(Parent, a);
var instance=new Constructor();
if(Class) setPrototypeOf(instance, Class.prototype);
return instance;
};}
return _construct.apply(null, arguments);
}
module.exports=_construct;
});
var BASE_PLUGIN_NAME='plugin';
var PLUGIN_CACHE_KEY='activePlugins_';
var pluginStorage={};
var pluginExists=function pluginExists(name){
return pluginStorage.hasOwnProperty(name);
};
var getPlugin=function getPlugin(name){
return pluginExists(name) ? pluginStorage[name]:undefined;
};
var markPluginAsActive=function markPluginAsActive(player, name){
player[PLUGIN_CACHE_KEY]=player[PLUGIN_CACHE_KEY]||{};
player[PLUGIN_CACHE_KEY][name]=true;
};
var triggerSetupEvent=function triggerSetupEvent(player, hash, before){
var eventName=(before ? 'before':'') + 'pluginsetup';
player.trigger(eventName, hash);
player.trigger(eventName + ':' + hash.name, hash);
};
var createBasicPlugin=function createBasicPlugin(name, plugin){
var basicPluginWrapper=function basicPluginWrapper(){
triggerSetupEvent(this, {
name: name,
plugin: plugin,
instance: null
}, true);
var instance=plugin.apply(this, arguments);
markPluginAsActive(this, name);
triggerSetupEvent(this, {
name: name,
plugin: plugin,
instance: instance
});
return instance;
};
Object.keys(plugin).forEach(function (prop){
basicPluginWrapper[prop]=plugin[prop];
});
return basicPluginWrapper;
};
var createPluginFactory=function createPluginFactory(name, PluginSubClass){
PluginSubClass.prototype.name=name;
return function (){
triggerSetupEvent(this, {
name: name,
plugin: PluginSubClass,
instance: null
}, true);
for (var _len=arguments.length, args=new Array(_len), _key=0; _key < _len; _key++){
args[_key]=arguments[_key];
}
var instance=construct(PluginSubClass, [this].concat(args));
this[name]=function (){
return instance;
};
triggerSetupEvent(this, instance.getEventHash());
return instance;
};};
var Plugin =
function (){
function Plugin(player){
if(this.constructor===Plugin){
throw new Error('Plugin must be sub-classed; not directly instantiated.');
}
this.player=player;
evented(this);
delete this.trigger;
stateful(this, this.constructor.defaultState);
markPluginAsActive(player, this.name);
this.dispose=bind(this, this.dispose);
player.on('dispose', this.dispose);
}
var _proto=Plugin.prototype;
_proto.version=function version(){
return this.constructor.VERSION;
}
;
_proto.getEventHash=function getEventHash(hash){
if(hash===void 0){
hash={};}
hash.name=this.name;
hash.plugin=this.constructor;
hash.instance=this;
return hash;
}
;
_proto.trigger=function trigger$1(event, hash){
if(hash===void 0){
hash={};}
return trigger(this.eventBusEl_, event, this.getEventHash(hash));
}
;
_proto.handleStateChanged=function handleStateChanged(e){}
;
_proto.dispose=function dispose(){
var name=this.name,
player=this.player;
this.trigger('dispose');
this.off();
player.off('dispose', this.dispose);
player[PLUGIN_CACHE_KEY][name]=false;
this.player=this.state=null;
player[name]=createPluginFactory(name, pluginStorage[name]);
}
;
Plugin.isBasic=function isBasic(plugin){
var p=typeof plugin==='string' ? getPlugin(plugin):plugin;
return typeof p==='function'&&!Plugin.prototype.isPrototypeOf(p.prototype);
}
;
Plugin.registerPlugin=function registerPlugin(name, plugin){
if(typeof name!=='string'){
throw new Error("Illegal plugin name, \"" + name + "\", must be a string, was " + typeof name + ".");
}
if(pluginExists(name)){
log.warn("A plugin named \"" + name + "\" already exists. You may want to avoid re-registering plugins!");
}else if(Player.prototype.hasOwnProperty(name)){
throw new Error("Illegal plugin name, \"" + name + "\", cannot share a name with an existing player method!");
}
if(typeof plugin!=='function'){
throw new Error("Illegal plugin for \"" + name + "\", must be a function, was " + typeof plugin + ".");
}
pluginStorage[name]=plugin;
if(name!==BASE_PLUGIN_NAME){
if(Plugin.isBasic(plugin)){
Player.prototype[name]=createBasicPlugin(name, plugin);
}else{
Player.prototype[name]=createPluginFactory(name, plugin);
}}
return plugin;
}
;
Plugin.deregisterPlugin=function deregisterPlugin(name){
if(name===BASE_PLUGIN_NAME){
throw new Error('Cannot de-register base plugin.');
}
if(pluginExists(name)){
delete pluginStorage[name];
delete Player.prototype[name];
}}
;
Plugin.getPlugins=function getPlugins(names){
if(names===void 0){
names=Object.keys(pluginStorage);
}
var result;
names.forEach(function (name){
var plugin=getPlugin(name);
if(plugin){
result=result||{};
result[name]=plugin;
}});
return result;
}
;
Plugin.getPluginVersion=function getPluginVersion(name){
var plugin=getPlugin(name);
return plugin&&plugin.VERSION||'';
};
return Plugin;
}();
Plugin.getPlugin=getPlugin;
Plugin.BASE_PLUGIN_NAME=BASE_PLUGIN_NAME;
Plugin.registerPlugin(BASE_PLUGIN_NAME, Plugin);
Player.prototype.usingPlugin=function (name){
return !!this[PLUGIN_CACHE_KEY]&&this[PLUGIN_CACHE_KEY][name]===true;
};
Player.prototype.hasPlugin=function (name){
return !!pluginExists(name);
};
function _inherits(subClass, superClass){
if(typeof superClass!=="function"&&superClass!==null){
throw new TypeError("Super expression must either be null or a function");
}
subClass.prototype=Object.create(superClass&&superClass.prototype, {
constructor: {
value: subClass,
writable: true,
configurable: true
}});
if(superClass) setPrototypeOf(subClass, superClass);
}
var inherits=_inherits;
/**
* Used to subclass an existing class by emulating ES subclassing using the
* `extends` keyword.
*
* @function
* @example
* var MyComponent=videojs.extend(videojs.getComponent('Component'), {
*   myCustomMethod: function(){
*
*   }
* });
*
* @param    {Function} superClass
*           The class to inherit from
*
* @param    {Object}   [subClassMethods={}]
*           Methods of the new class
*
* @return   {Function}
*           The new class with subClassMethods that inherited superClass.
*/
var extend=function extend(superClass, subClassMethods){
if(subClassMethods===void 0){
subClassMethods={};}
var subClass=function subClass(){
superClass.apply(this, arguments);
};
var methods={};
if(typeof subClassMethods==='object'){
if(subClassMethods.constructor!==Object.prototype.constructor){
subClass=subClassMethods.constructor;
}
methods=subClassMethods;
}else if(typeof subClassMethods==='function'){
subClass=subClassMethods;
}
inherits(subClass, superClass);
if(superClass){
subClass.super_=superClass;
}
for (var name in methods){
if(methods.hasOwnProperty(name)){
subClass.prototype[name]=methods[name];
}}
return subClass;
};
var normalizeId=function normalizeId(id){
return id.indexOf('#')===0 ? id.slice(1):id;
};
function videojs$1(id, options, ready){
var player=videojs$1.getPlayer(id);
if(player){
if(options){
log.warn("Player \"" + id + "\" is already initialised. Options will not be applied.");
}
if(ready){
player.ready(ready);
}
return player;
}
var el=typeof id==='string' ? $('#' + normalizeId(id)):id;
if(!isEl(el)){
throw new TypeError('The element or ID supplied is not valid. (videojs)');
}
if(!el.ownerDocument.defaultView||!el.ownerDocument.body.contains(el)){
log.warn('The element supplied is not included in the DOM');
}
options=options||{};
videojs$1.hooks('beforesetup').forEach(function (hookFunction){
var opts=hookFunction(el, mergeOptions(options));
if(!isObject(opts)||Array.isArray(opts)){
log.error('please return an object in beforesetup hooks');
return;
}
options=mergeOptions(options, opts);
});
var PlayerComponent=Component.getComponent('Player');
player=new PlayerComponent(el, options, ready);
videojs$1.hooks('setup').forEach(function (hookFunction){
return hookFunction(player);
});
return player;
}
videojs$1.hooks_={};
videojs$1.hooks=function (type, fn){
videojs$1.hooks_[type]=videojs$1.hooks_[type]||[];
if(fn){
videojs$1.hooks_[type]=videojs$1.hooks_[type].concat(fn);
}
return videojs$1.hooks_[type];
};
videojs$1.hook=function (type, fn){
videojs$1.hooks(type, fn);
};
videojs$1.hookOnce=function (type, fn){
videojs$1.hooks(type, [].concat(fn).map(function (original){
var wrapper=function wrapper(){
videojs$1.removeHook(type, wrapper);
return original.apply(void 0, arguments);
};
return wrapper;
}));
};
videojs$1.removeHook=function (type, fn){
var index=videojs$1.hooks(type).indexOf(fn);
if(index <=-1){
return false;
}
videojs$1.hooks_[type]=videojs$1.hooks_[type].slice();
videojs$1.hooks_[type].splice(index, 1);
return true;
};
if(window$1.VIDEOJS_NO_DYNAMIC_STYLE!==true&&isReal()){
var style=$('.vjs-styles-defaults');
if(!style){
style=createStyleElement('vjs-styles-defaults');
var head=$('head');
if(head){
head.insertBefore(style, head.firstChild);
}
setTextContent(style, "\n      .video-js {\n        width: 300px;\n        height: 150px;\n      }\n\n      .vjs-fluid {\n        padding-top: 56.25%\n      }\n    ");
}}
autoSetupTimeout(1, videojs$1);
videojs$1.VERSION=version;
videojs$1.options=Player.prototype.options_;
videojs$1.getPlayers=function (){
return Player.players;
};
videojs$1.getPlayer=function (id){
var players=Player.players;
var tag;
if(typeof id==='string'){
var nId=normalizeId(id);
var player=players[nId];
if(player){
return player;
}
tag=$('#' + nId);
}else{
tag=id;
}
if(isEl(tag)){
var _tag=tag,
_player=_tag.player,
playerId=_tag.playerId;
if(_player||players[playerId]){
return _player||players[playerId];
}}
};
videojs$1.getAllPlayers=function (){
return (
Object.keys(Player.players).map(function (k){
return Player.players[k];
}).filter(Boolean)
);
};
videojs$1.players=Player.players;
videojs$1.getComponent=Component.getComponent;
videojs$1.registerComponent=function (name, comp){
if(Tech.isTech(comp)){
log.warn("The " + name + " tech was registered as a component. It should instead be registered using videojs.registerTech(name, tech)");
}
Component.registerComponent.call(Component, name, comp);
};
videojs$1.getTech=Tech.getTech;
videojs$1.registerTech=Tech.registerTech;
videojs$1.use=use;
Object.defineProperty(videojs$1, 'middleware', {
value: {},
writeable: false,
enumerable: true
});
Object.defineProperty(videojs$1.middleware, 'TERMINATOR', {
value: TERMINATOR,
writeable: false,
enumerable: true
});
videojs$1.browser=browser;
videojs$1.TOUCH_ENABLED=TOUCH_ENABLED;
videojs$1.extend=extend;
videojs$1.mergeOptions=mergeOptions;
videojs$1.bind=bind;
videojs$1.registerPlugin=Plugin.registerPlugin;
videojs$1.deregisterPlugin=Plugin.deregisterPlugin;
videojs$1.plugin=function (name, plugin){
log.warn('videojs.plugin() is deprecated; use videojs.registerPlugin() instead');
return Plugin.registerPlugin(name, plugin);
};
videojs$1.getPlugins=Plugin.getPlugins;
videojs$1.getPlugin=Plugin.getPlugin;
videojs$1.getPluginVersion=Plugin.getPluginVersion;
videojs$1.addLanguage=function (code, data){
var _mergeOptions;
code=('' + code).toLowerCase();
videojs$1.options.languages=mergeOptions(videojs$1.options.languages, (_mergeOptions={}, _mergeOptions[code]=data, _mergeOptions));
return videojs$1.options.languages[code];
};
videojs$1.log=log;
videojs$1.createLogger=createLogger$1;
videojs$1.createTimeRange=videojs$1.createTimeRanges=createTimeRanges;
videojs$1.formatTime=formatTime;
videojs$1.setFormatTime=setFormatTime;
videojs$1.resetFormatTime=resetFormatTime;
videojs$1.parseUrl=parseUrl;
videojs$1.isCrossOrigin=isCrossOrigin;
videojs$1.EventTarget=EventTarget;
videojs$1.on=on;
videojs$1.one=one;
videojs$1.off=off;
videojs$1.trigger=trigger;
videojs$1.xhr=xhr;
videojs$1.TextTrack=TextTrack;
videojs$1.AudioTrack=AudioTrack;
videojs$1.VideoTrack=VideoTrack;
['isEl', 'isTextNode', 'createEl', 'hasClass', 'addClass', 'removeClass', 'toggleClass', 'setAttributes', 'getAttributes', 'emptyEl', 'appendContent', 'insertContent'].forEach(function (k){
videojs$1[k]=function (){
log.warn("videojs." + k + "() is deprecated; use videojs.dom." + k + "() instead");
return Dom[k].apply(null, arguments);
};});
videojs$1.computedStyle=computedStyle;
videojs$1.dom=Dom;
videojs$1.url=Url;
videojs$1.defineLazyProperty=defineLazyProperty;
var urlToolkit=createCommonjsModule(function (module, exports){
(function (root){
var URL_REGEX=/^((?:[a-zA-Z0-9+\-.]+:)?)(\/\/[^\/?#]*)?((?:[^\/\?#]*\/)*.*?)??(;.*?)?(\?.*?)?(#.*?)?$/;
var FIRST_SEGMENT_REGEX=/^([^\/?#]*)(.*)$/;
var SLASH_DOT_REGEX=/(?:\/|^)\.(?=\/)/g;
var SLASH_DOT_DOT_REGEX=/(?:\/|^)\.\.\/(?!\.\.\/).*?(?=\/)/g;
var URLToolkit={
buildAbsoluteURL: function buildAbsoluteURL(baseURL, relativeURL, opts){
opts=opts||{};
baseURL=baseURL.trim();
relativeURL=relativeURL.trim();
if(!relativeURL){
if(!opts.alwaysNormalize){
return baseURL;
}
var basePartsForNormalise=URLToolkit.parseURL(baseURL);
if(!basePartsForNormalise){
throw new Error('Error trying to parse base URL.');
}
basePartsForNormalise.path=URLToolkit.normalizePath(basePartsForNormalise.path);
return URLToolkit.buildURLFromParts(basePartsForNormalise);
}
var relativeParts=URLToolkit.parseURL(relativeURL);
if(!relativeParts){
throw new Error('Error trying to parse relative URL.');
}
if(relativeParts.scheme){
if(!opts.alwaysNormalize){
return relativeURL;
}
relativeParts.path=URLToolkit.normalizePath(relativeParts.path);
return URLToolkit.buildURLFromParts(relativeParts);
}
var baseParts=URLToolkit.parseURL(baseURL);
if(!baseParts){
throw new Error('Error trying to parse base URL.');
}
if(!baseParts.netLoc&&baseParts.path&&baseParts.path[0]!=='/'){
var pathParts=FIRST_SEGMENT_REGEX.exec(baseParts.path);
baseParts.netLoc=pathParts[1];
baseParts.path=pathParts[2];
}
if(baseParts.netLoc&&!baseParts.path){
baseParts.path='/';
}
var builtParts={
scheme: baseParts.scheme,
netLoc: relativeParts.netLoc,
path: null,
params: relativeParts.params,
query: relativeParts.query,
fragment: relativeParts.fragment
};
if(!relativeParts.netLoc){
builtParts.netLoc=baseParts.netLoc;
if(relativeParts.path[0]!=='/'){
if(!relativeParts.path){
builtParts.path=baseParts.path;
if(!relativeParts.params){
builtParts.params=baseParts.params;
if(!relativeParts.query){
builtParts.query=baseParts.query;
}}
}else{
var baseURLPath=baseParts.path;
var newPath=baseURLPath.substring(0, baseURLPath.lastIndexOf('/') + 1) + relativeParts.path;
builtParts.path=URLToolkit.normalizePath(newPath);
}}
}
if(builtParts.path===null){
builtParts.path=opts.alwaysNormalize ? URLToolkit.normalizePath(relativeParts.path):relativeParts.path;
}
return URLToolkit.buildURLFromParts(builtParts);
},
parseURL: function parseURL(url){
var parts=URL_REGEX.exec(url);
if(!parts){
return null;
}
return {
scheme: parts[1]||'',
netLoc: parts[2]||'',
path: parts[3]||'',
params: parts[4]||'',
query: parts[5]||'',
fragment: parts[6]||''
};},
normalizePath: function normalizePath(path){
path=path.split('').reverse().join('').replace(SLASH_DOT_REGEX, '');
while (path.length!==(path=path.replace(SLASH_DOT_DOT_REGEX, '')).length){}
return path.split('').reverse().join('');
},
buildURLFromParts: function buildURLFromParts(parts){
return parts.scheme + parts.netLoc + parts.path + parts.params + parts.query + parts.fragment;
}};
module.exports=URLToolkit;
})();
});
function _extends(){
_extends=Object.assign||function (target){
for (var i=1; i < arguments.length; i++){
var source=arguments[i];
for (var key in source){
if(Object.prototype.hasOwnProperty.call(source, key)){
target[key]=source[key];
}}
}
return target;
};
return _extends.apply(this, arguments);
}
function _inheritsLoose$1(subClass, superClass){
subClass.prototype=Object.create(superClass.prototype);
subClass.prototype.constructor=subClass;
subClass.__proto__=superClass;
}
function _assertThisInitialized$1(self){
if(self===void 0){
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self;
}
var Stream =
function (){
function Stream(){
this.listeners={};}
var _proto=Stream.prototype;
_proto.on=function on(type, listener){
if(!this.listeners[type]){
this.listeners[type]=[];
}
this.listeners[type].push(listener);
}
;
_proto.off=function off(type, listener){
if(!this.listeners[type]){
return false;
}
var index=this.listeners[type].indexOf(listener);
this.listeners[type].splice(index, 1);
return index > -1;
}
;
_proto.trigger=function trigger(type){
var callbacks=this.listeners[type];
var i;
var length;
var args;
if(!callbacks){
return;
}
if(arguments.length===2){
length=callbacks.length;
for (i=0; i < length; ++i){
callbacks[i].call(this, arguments[1]);
}}else{
args=Array.prototype.slice.call(arguments, 1);
length=callbacks.length;
for (i=0; i < length; ++i){
callbacks[i].apply(this, args);
}}
}
;
_proto.dispose=function dispose(){
this.listeners={};}
;
_proto.pipe=function pipe(destination){
this.on('data', function (data){
destination.push(data);
});
};
return Stream;
}();
var LineStream =
function (_Stream){
_inheritsLoose$1(LineStream, _Stream);
function LineStream(){
var _this;
_this=_Stream.call(this)||this;
_this.buffer='';
return _this;
}
var _proto=LineStream.prototype;
_proto.push=function push(data){
var nextNewline;
this.buffer +=data;
nextNewline=this.buffer.indexOf('\n');
for (; nextNewline > -1; nextNewline=this.buffer.indexOf('\n')){
this.trigger('data', this.buffer.substring(0, nextNewline));
this.buffer=this.buffer.substring(nextNewline + 1);
}};
return LineStream;
}(Stream);
var attributeSeparator=function attributeSeparator(){
var key='[^=]*';
var value='"[^"]*"|[^,]*';
var keyvalue='(?:' + key + ')=(?:' + value + ')';
return new RegExp('(?:^|,)(' + keyvalue + ')');
};
var parseAttributes=function parseAttributes(attributes){
var attrs=attributes.split(attributeSeparator());
var result={};
var i=attrs.length;
var attr;
while (i--){
if(attrs[i]===''){
continue;
}
attr=/([^=]*)=(.*)/.exec(attrs[i]).slice(1);
attr[0]=attr[0].replace(/^\s+|\s+$/g, '');
attr[1]=attr[1].replace(/^\s+|\s+$/g, '');
attr[1]=attr[1].replace(/^['"](.*)['"]$/g, '$1');
result[attr[0]]=attr[1];
}
return result;
};
var ParseStream =
function (_Stream){
_inheritsLoose$1(ParseStream, _Stream);
function ParseStream(){
var _this;
_this=_Stream.call(this)||this;
_this.customParsers=[];
_this.tagMappers=[];
return _this;
}
var _proto=ParseStream.prototype;
_proto.push=function push(line){
var _this2=this;
var match;
var event;
line=line.trim();
if(line.length===0){
return;
}
if(line[0]!=='#'){
this.trigger('data', {
type: 'uri',
uri: line
});
return;
}
var newLines=this.tagMappers.reduce(function (acc, mapper){
var mappedLine=mapper(line);
if(mappedLine===line){
return acc;
}
return acc.concat([mappedLine]);
}, [line]);
newLines.forEach(function (newLine){
for (var i=0; i < _this2.customParsers.length; i++){
if(_this2.customParsers[i].call(_this2, newLine)){
return;
}}
if(newLine.indexOf('#EXT')!==0){
_this2.trigger('data', {
type: 'comment',
text: newLine.slice(1)
});
return;
}
newLine=newLine.replace('\r', '');
match=/^#EXTM3U/.exec(newLine);
if(match){
_this2.trigger('data', {
type: 'tag',
tagType: 'm3u'
});
return;
}
match=/^#EXTINF:?([0-9\.]*)?,?(.*)?$/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'inf'
};
if(match[1]){
event.duration=parseFloat(match[1]);
}
if(match[2]){
event.title=match[2];
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-TARGETDURATION:?([0-9.]*)?/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'targetduration'
};
if(match[1]){
event.duration=parseInt(match[1], 10);
}
_this2.trigger('data', event);
return;
}
match=/^#ZEN-TOTAL-DURATION:?([0-9.]*)?/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'totalduration'
};
if(match[1]){
event.duration=parseInt(match[1], 10);
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-VERSION:?([0-9.]*)?/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'version'
};
if(match[1]){
event.version=parseInt(match[1], 10);
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'media-sequence'
};
if(match[1]){
event.number=parseInt(match[1], 10);
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-DISCONTINUITY-SEQUENCE:?(\-?[0-9.]*)?/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'discontinuity-sequence'
};
if(match[1]){
event.number=parseInt(match[1], 10);
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-PLAYLIST-TYPE:?(.*)?$/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'playlist-type'
};
if(match[1]){
event.playlistType=match[1];
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-BYTERANGE:?([0-9.]*)?@?([0-9.]*)?/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'byterange'
};
if(match[1]){
event.length=parseInt(match[1], 10);
}
if(match[2]){
event.offset=parseInt(match[2], 10);
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-ALLOW-CACHE:?(YES|NO)?/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'allow-cache'
};
if(match[1]){
event.allowed = !/NO/.test(match[1]);
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-MAP:?(.*)$/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'map'
};
if(match[1]){
var attributes=parseAttributes(match[1]);
if(attributes.URI){
event.uri=attributes.URI;
}
if(attributes.BYTERANGE){
var _attributes$BYTERANGE=attributes.BYTERANGE.split('@'),
length=_attributes$BYTERANGE[0],
offset=_attributes$BYTERANGE[1];
event.byterange={};
if(length){
event.byterange.length=parseInt(length, 10);
}
if(offset){
event.byterange.offset=parseInt(offset, 10);
}}
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-STREAM-INF:?(.*)$/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'stream-inf'
};
if(match[1]){
event.attributes=parseAttributes(match[1]);
if(event.attributes.RESOLUTION){
var split=event.attributes.RESOLUTION.split('x');
var resolution={};
if(split[0]){
resolution.width=parseInt(split[0], 10);
}
if(split[1]){
resolution.height=parseInt(split[1], 10);
}
event.attributes.RESOLUTION=resolution;
}
if(event.attributes.BANDWIDTH){
event.attributes.BANDWIDTH=parseInt(event.attributes.BANDWIDTH, 10);
}
if(event.attributes['PROGRAM-ID']){
event.attributes['PROGRAM-ID']=parseInt(event.attributes['PROGRAM-ID'], 10);
}}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-MEDIA:?(.*)$/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'media'
};
if(match[1]){
event.attributes=parseAttributes(match[1]);
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-ENDLIST/.exec(newLine);
if(match){
_this2.trigger('data', {
type: 'tag',
tagType: 'endlist'
});
return;
}
match=/^#EXT-X-DISCONTINUITY/.exec(newLine);
if(match){
_this2.trigger('data', {
type: 'tag',
tagType: 'discontinuity'
});
return;
}
match=/^#EXT-X-PROGRAM-DATE-TIME:?(.*)$/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'program-date-time'
};
if(match[1]){
event.dateTimeString=match[1];
event.dateTimeObject=new Date(match[1]);
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-KEY:?(.*)$/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'key'
};
if(match[1]){
event.attributes=parseAttributes(match[1]);
if(event.attributes.IV){
if(event.attributes.IV.substring(0, 2).toLowerCase()==='0x'){
event.attributes.IV=event.attributes.IV.substring(2);
}
event.attributes.IV=event.attributes.IV.match(/.{8}/g);
event.attributes.IV[0]=parseInt(event.attributes.IV[0], 16);
event.attributes.IV[1]=parseInt(event.attributes.IV[1], 16);
event.attributes.IV[2]=parseInt(event.attributes.IV[2], 16);
event.attributes.IV[3]=parseInt(event.attributes.IV[3], 16);
event.attributes.IV=new Uint32Array(event.attributes.IV);
}}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-START:?(.*)$/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'start'
};
if(match[1]){
event.attributes=parseAttributes(match[1]);
event.attributes['TIME-OFFSET']=parseFloat(event.attributes['TIME-OFFSET']);
event.attributes.PRECISE=/YES/.test(event.attributes.PRECISE);
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-CUE-OUT-CONT:?(.*)?$/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'cue-out-cont'
};
if(match[1]){
event.data=match[1];
}else{
event.data='';
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-CUE-OUT:?(.*)?$/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'cue-out'
};
if(match[1]){
event.data=match[1];
}else{
event.data='';
}
_this2.trigger('data', event);
return;
}
match=/^#EXT-X-CUE-IN:?(.*)?$/.exec(newLine);
if(match){
event={
type: 'tag',
tagType: 'cue-in'
};
if(match[1]){
event.data=match[1];
}else{
event.data='';
}
_this2.trigger('data', event);
return;
}
_this2.trigger('data', {
type: 'tag',
data: newLine.slice(4)
});
});
}
;
_proto.addParser=function addParser(_ref){
var _this3=this;
var expression=_ref.expression,
customType=_ref.customType,
dataParser=_ref.dataParser,
segment=_ref.segment;
if(typeof dataParser!=='function'){
dataParser=function dataParser(line){
return line;
};}
this.customParsers.push(function (line){
var match=expression.exec(line);
if(match){
_this3.trigger('data', {
type: 'custom',
data: dataParser(line),
customType: customType,
segment: segment
});
return true;
}});
}
;
_proto.addTagMapper=function addTagMapper(_ref2){
var expression=_ref2.expression,
map=_ref2.map;
var mapFn=function mapFn(line){
if(expression.test(line)){
return map(line);
}
return line;
};
this.tagMappers.push(mapFn);
};
return ParseStream;
}(Stream);
function decodeB64ToUint8Array(b64Text){
var decodedString=window$1.atob(b64Text||'');
var array=new Uint8Array(decodedString.length);
for (var i=0; i < decodedString.length; i++){
array[i]=decodedString.charCodeAt(i);
}
return array;
}
var Parser =
function (_Stream){
_inheritsLoose$1(Parser, _Stream);
function Parser(){
var _this;
_this=_Stream.call(this)||this;
_this.lineStream=new LineStream();
_this.parseStream=new ParseStream();
_this.lineStream.pipe(_this.parseStream);
var self=_assertThisInitialized$1(_this);
var uris=[];
var currentUri={};
var currentMap;
var _key;
var noop=function noop(){};
var defaultMediaGroups={
'AUDIO': {},
'VIDEO': {},
'CLOSED-CAPTIONS': {},
'SUBTITLES': {}};
var widevineUuid='urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed';
var currentTimeline=0;
_this.manifest={
allowCache: true,
discontinuityStarts: [],
segments: []
};
_this.parseStream.on('data', function (entry){
var mediaGroup;
var rendition;
({
tag: function tag(){
(({
'allow-cache': function allowCache(){
this.manifest.allowCache=entry.allowed;
if(!('allowed' in entry)){
this.trigger('info', {
message: 'defaulting allowCache to YES'
});
this.manifest.allowCache=true;
}},
byterange: function byterange(){
var byterange={};
if('length' in entry){
currentUri.byterange=byterange;
byterange.length=entry.length;
if(!('offset' in entry)){
this.trigger('info', {
message: 'defaulting offset to zero'
});
entry.offset=0;
}}
if('offset' in entry){
currentUri.byterange=byterange;
byterange.offset=entry.offset;
}},
endlist: function endlist(){
this.manifest.endList=true;
},
inf: function inf(){
if(!('mediaSequence' in this.manifest)){
this.manifest.mediaSequence=0;
this.trigger('info', {
message: 'defaulting media sequence to zero'
});
}
if(!('discontinuitySequence' in this.manifest)){
this.manifest.discontinuitySequence=0;
this.trigger('info', {
message: 'defaulting discontinuity sequence to zero'
});
}
if(entry.duration > 0){
currentUri.duration=entry.duration;
}
if(entry.duration===0){
currentUri.duration=0.01;
this.trigger('info', {
message: 'updating zero segment duration to a small value'
});
}
this.manifest.segments=uris;
},
key: function key(){
if(!entry.attributes){
this.trigger('warn', {
message: 'ignoring key declaration without attribute list'
});
return;
}
if(entry.attributes.METHOD==='NONE'){
_key=null;
return;
}
if(!entry.attributes.URI){
this.trigger('warn', {
message: 'ignoring key declaration without URI'
});
return;
}
if(entry.attributes.KEYFORMAT===widevineUuid){
var VALID_METHODS=['SAMPLE-AES', 'SAMPLE-AES-CTR', 'SAMPLE-AES-CENC'];
if(VALID_METHODS.indexOf(entry.attributes.METHOD)===-1){
this.trigger('warn', {
message: 'invalid key method provided for Widevine'
});
return;
}
if(entry.attributes.METHOD==='SAMPLE-AES-CENC'){
this.trigger('warn', {
message: 'SAMPLE-AES-CENC is deprecated, please use SAMPLE-AES-CTR instead'
});
}
if(entry.attributes.URI.substring(0, 23)!=='data:text/plain;base64,'){
this.trigger('warn', {
message: 'invalid key URI provided for Widevine'
});
return;
}
if(!(entry.attributes.KEYID&&entry.attributes.KEYID.substring(0, 2)==='0x')){
this.trigger('warn', {
message: 'invalid key ID provided for Widevine'
});
return;
}
this.manifest.contentProtection={
'com.widevine.alpha': {
attributes: {
schemeIdUri: entry.attributes.KEYFORMAT,
keyId: entry.attributes.KEYID.substring(2)
},
pssh: decodeB64ToUint8Array(entry.attributes.URI.split(',')[1])
}};
return;
}
if(!entry.attributes.METHOD){
this.trigger('warn', {
message: 'defaulting key method to AES-128'
});
}
_key={
method: entry.attributes.METHOD||'AES-128',
uri: entry.attributes.URI
};
if(typeof entry.attributes.IV!=='undefined'){
_key.iv=entry.attributes.IV;
}},
'media-sequence': function mediaSequence(){
if(!isFinite(entry.number)){
this.trigger('warn', {
message: 'ignoring invalid media sequence: ' + entry.number
});
return;
}
this.manifest.mediaSequence=entry.number;
},
'discontinuity-sequence': function discontinuitySequence(){
if(!isFinite(entry.number)){
this.trigger('warn', {
message: 'ignoring invalid discontinuity sequence: ' + entry.number
});
return;
}
this.manifest.discontinuitySequence=entry.number;
currentTimeline=entry.number;
},
'playlist-type': function playlistType(){
if(!/VOD|EVENT/.test(entry.playlistType)){
this.trigger('warn', {
message: 'ignoring unknown playlist type: ' + entry.playlist
});
return;
}
this.manifest.playlistType=entry.playlistType;
},
map: function map(){
currentMap={};
if(entry.uri){
currentMap.uri=entry.uri;
}
if(entry.byterange){
currentMap.byterange=entry.byterange;
}},
'stream-inf': function streamInf(){
this.manifest.playlists=uris;
this.manifest.mediaGroups=this.manifest.mediaGroups||defaultMediaGroups;
if(!entry.attributes){
this.trigger('warn', {
message: 'ignoring empty stream-inf attributes'
});
return;
}
if(!currentUri.attributes){
currentUri.attributes={};}
_extends(currentUri.attributes, entry.attributes);
},
media: function media(){
this.manifest.mediaGroups=this.manifest.mediaGroups||defaultMediaGroups;
if(!(entry.attributes&&entry.attributes.TYPE&&entry.attributes['GROUP-ID']&&entry.attributes.NAME)){
this.trigger('warn', {
message: 'ignoring incomplete or missing media group'
});
return;
}
var mediaGroupType=this.manifest.mediaGroups[entry.attributes.TYPE];
mediaGroupType[entry.attributes['GROUP-ID']]=mediaGroupType[entry.attributes['GROUP-ID']]||{};
mediaGroup=mediaGroupType[entry.attributes['GROUP-ID']];
rendition={
"default": /yes/i.test(entry.attributes.DEFAULT)
};
if(rendition["default"]){
rendition.autoselect=true;
}else{
rendition.autoselect=/yes/i.test(entry.attributes.AUTOSELECT);
}
if(entry.attributes.LANGUAGE){
rendition.language=entry.attributes.LANGUAGE;
}
if(entry.attributes.URI){
rendition.uri=entry.attributes.URI;
}
if(entry.attributes['INSTREAM-ID']){
rendition.instreamId=entry.attributes['INSTREAM-ID'];
}
if(entry.attributes.CHARACTERISTICS){
rendition.characteristics=entry.attributes.CHARACTERISTICS;
}
if(entry.attributes.FORCED){
rendition.forced=/yes/i.test(entry.attributes.FORCED);
}
mediaGroup[entry.attributes.NAME]=rendition;
},
discontinuity: function discontinuity(){
currentTimeline +=1;
currentUri.discontinuity=true;
this.manifest.discontinuityStarts.push(uris.length);
},
'program-date-time': function programDateTime(){
if(typeof this.manifest.dateTimeString==='undefined'){
this.manifest.dateTimeString=entry.dateTimeString;
this.manifest.dateTimeObject=entry.dateTimeObject;
}
currentUri.dateTimeString=entry.dateTimeString;
currentUri.dateTimeObject=entry.dateTimeObject;
},
targetduration: function targetduration(){
if(!isFinite(entry.duration)||entry.duration < 0){
this.trigger('warn', {
message: 'ignoring invalid target duration: ' + entry.duration
});
return;
}
this.manifest.targetDuration=entry.duration;
},
totalduration: function totalduration(){
if(!isFinite(entry.duration)||entry.duration < 0){
this.trigger('warn', {
message: 'ignoring invalid total duration: ' + entry.duration
});
return;
}
this.manifest.totalDuration=entry.duration;
},
start: function start(){
if(!entry.attributes||isNaN(entry.attributes['TIME-OFFSET'])){
this.trigger('warn', {
message: 'ignoring start declaration without appropriate attribute list'
});
return;
}
this.manifest.start={
timeOffset: entry.attributes['TIME-OFFSET'],
precise: entry.attributes.PRECISE
};},
'cue-out': function cueOut(){
currentUri.cueOut=entry.data;
},
'cue-out-cont': function cueOutCont(){
currentUri.cueOutCont=entry.data;
},
'cue-in': function cueIn(){
currentUri.cueIn=entry.data;
}})[entry.tagType]||noop).call(self);
},
uri: function uri(){
currentUri.uri=entry.uri;
uris.push(currentUri);
if(this.manifest.targetDuration&&!('duration' in currentUri)){
this.trigger('warn', {
message: 'defaulting segment duration to the target duration'
});
currentUri.duration=this.manifest.targetDuration;
}
if(_key){
currentUri.key=_key;
}
currentUri.timeline=currentTimeline;
if(currentMap){
currentUri.map=currentMap;
}
currentUri={};},
comment: function comment(){
},
custom: function custom(){
if(entry.segment){
currentUri.custom=currentUri.custom||{};
currentUri.custom[entry.customType]=entry.data;
}else{
this.manifest.custom=this.manifest.custom||{};
this.manifest.custom[entry.customType]=entry.data;
}}
})[entry.type].call(self);
});
return _this;
}
var _proto=Parser.prototype;
_proto.push=function push(chunk){
this.lineStream.push(chunk);
}
;
_proto.end=function end(){
this.lineStream.push('\n');
}
;
_proto.addParser=function addParser(options){
this.parseStream.addParser(options);
}
;
_proto.addTagMapper=function addTagMapper(options){
this.parseStream.addTagMapper(options);
};
return Parser;
}(Stream);
var isObject$1=function isObject(obj){
return !!obj&&typeof obj==='object';
};
var merge=function merge(){
for (var _len=arguments.length, objects=new Array(_len), _key=0; _key < _len; _key++){
objects[_key]=arguments[_key];
}
return objects.reduce(function (result, source){
Object.keys(source).forEach(function (key){
if(Array.isArray(result[key])&&Array.isArray(source[key])){
result[key]=result[key].concat(source[key]);
}else if(isObject$1(result[key])&&isObject$1(source[key])){
result[key]=merge(result[key], source[key]);
}else{
result[key]=source[key];
}});
return result;
}, {});
};
var values=function values(o){
return Object.keys(o).map(function (k){
return o[k];
});
};
var range=function range(start, end){
var result=[];
for (var i=start; i < end; i++){
result.push(i);
}
return result;
};
var flatten=function flatten(lists){
return lists.reduce(function (x, y){
return x.concat(y);
}, []);
};
var from=function from(list){
if(!list.length){
return [];
}
var result=[];
for (var i=0; i < list.length; i++){
result.push(list[i]);
}
return result;
};
var findIndexes=function findIndexes(l, key){
return l.reduce(function (a, e, i){
if(e[key]){
a.push(i);
}
return a;
}, []);
};
var errors={
INVALID_NUMBER_OF_PERIOD: 'INVALID_NUMBER_OF_PERIOD',
DASH_EMPTY_MANIFEST: 'DASH_EMPTY_MANIFEST',
DASH_INVALID_XML: 'DASH_INVALID_XML',
NO_BASE_URL: 'NO_BASE_URL',
MISSING_SEGMENT_INFORMATION: 'MISSING_SEGMENT_INFORMATION',
SEGMENT_TIME_UNSPECIFIED: 'SEGMENT_TIME_UNSPECIFIED',
UNSUPPORTED_UTC_TIMING_SCHEME: 'UNSUPPORTED_UTC_TIMING_SCHEME'
};
function createCommonjsModule$1(fn, module){
return module={
exports: {}}, fn(module, module.exports), module.exports;
}
var urlToolkit$1=createCommonjsModule$1(function (module, exports){
(function (root){
var URL_REGEX=/^((?:[a-zA-Z0-9+\-.]+:)?)(\/\/[^\/?#]*)?((?:[^\/\?#]*\/)*.*?)??(;.*?)?(\?.*?)?(#.*?)?$/;
var FIRST_SEGMENT_REGEX=/^([^\/?#]*)(.*)$/;
var SLASH_DOT_REGEX=/(?:\/|^)\.(?=\/)/g;
var SLASH_DOT_DOT_REGEX=/(?:\/|^)\.\.\/(?!\.\.\/).*?(?=\/)/g;
var URLToolkit={
buildAbsoluteURL: function buildAbsoluteURL(baseURL, relativeURL, opts){
opts=opts||{};
baseURL=baseURL.trim();
relativeURL=relativeURL.trim();
if(!relativeURL){
if(!opts.alwaysNormalize){
return baseURL;
}
var basePartsForNormalise=URLToolkit.parseURL(baseURL);
if(!basePartsForNormalise){
throw new Error('Error trying to parse base URL.');
}
basePartsForNormalise.path=URLToolkit.normalizePath(basePartsForNormalise.path);
return URLToolkit.buildURLFromParts(basePartsForNormalise);
}
var relativeParts=URLToolkit.parseURL(relativeURL);
if(!relativeParts){
throw new Error('Error trying to parse relative URL.');
}
if(relativeParts.scheme){
if(!opts.alwaysNormalize){
return relativeURL;
}
relativeParts.path=URLToolkit.normalizePath(relativeParts.path);
return URLToolkit.buildURLFromParts(relativeParts);
}
var baseParts=URLToolkit.parseURL(baseURL);
if(!baseParts){
throw new Error('Error trying to parse base URL.');
}
if(!baseParts.netLoc&&baseParts.path&&baseParts.path[0]!=='/'){
var pathParts=FIRST_SEGMENT_REGEX.exec(baseParts.path);
baseParts.netLoc=pathParts[1];
baseParts.path=pathParts[2];
}
if(baseParts.netLoc&&!baseParts.path){
baseParts.path='/';
}
var builtParts={
scheme: baseParts.scheme,
netLoc: relativeParts.netLoc,
path: null,
params: relativeParts.params,
query: relativeParts.query,
fragment: relativeParts.fragment
};
if(!relativeParts.netLoc){
builtParts.netLoc=baseParts.netLoc;
if(relativeParts.path[0]!=='/'){
if(!relativeParts.path){
builtParts.path=baseParts.path;
if(!relativeParts.params){
builtParts.params=baseParts.params;
if(!relativeParts.query){
builtParts.query=baseParts.query;
}}
}else{
var baseURLPath=baseParts.path;
var newPath=baseURLPath.substring(0, baseURLPath.lastIndexOf('/') + 1) + relativeParts.path;
builtParts.path=URLToolkit.normalizePath(newPath);
}}
}
if(builtParts.path===null){
builtParts.path=opts.alwaysNormalize ? URLToolkit.normalizePath(relativeParts.path):relativeParts.path;
}
return URLToolkit.buildURLFromParts(builtParts);
},
parseURL: function parseURL(url){
var parts=URL_REGEX.exec(url);
if(!parts){
return null;
}
return {
scheme: parts[1]||'',
netLoc: parts[2]||'',
path: parts[3]||'',
params: parts[4]||'',
query: parts[5]||'',
fragment: parts[6]||''
};},
normalizePath: function normalizePath(path){
path=path.split('').reverse().join('').replace(SLASH_DOT_REGEX, '');
while (path.length!==(path=path.replace(SLASH_DOT_DOT_REGEX, '')).length){}
return path.split('').reverse().join('');
},
buildURLFromParts: function buildURLFromParts(parts){
return parts.scheme + parts.netLoc + parts.path + parts.params + parts.query + parts.fragment;
}};
module.exports=URLToolkit;
})();
});
var resolveUrl=function resolveUrl(baseUrl, relativeUrl){
if(/^[a-z]+:/i.test(relativeUrl)){
return relativeUrl;
}
if(!/\/\//i.test(baseUrl)){
baseUrl=urlToolkit$1.buildAbsoluteURL(window$1.location.href, baseUrl);
}
return urlToolkit$1.buildAbsoluteURL(baseUrl, relativeUrl);
};
var urlTypeToSegment=function urlTypeToSegment(_ref){
var _ref$baseUrl=_ref.baseUrl,
baseUrl=_ref$baseUrl===void 0 ? '':_ref$baseUrl,
_ref$source=_ref.source,
source=_ref$source===void 0 ? '':_ref$source,
_ref$range=_ref.range,
range=_ref$range===void 0 ? '':_ref$range,
_ref$indexRange=_ref.indexRange,
indexRange=_ref$indexRange===void 0 ? '':_ref$indexRange;
var segment={
uri: source,
resolvedUri: resolveUrl(baseUrl||'', source)
};
if(range||indexRange){
var rangeStr=range ? range:indexRange;
var ranges=rangeStr.split('-');
var startRange=parseInt(ranges[0], 10);
var endRange=parseInt(ranges[1], 10);
segment.byterange={
length: endRange - startRange + 1,
offset: startRange
};}
return segment;
};
var byteRangeToString=function byteRangeToString(byterange){
var endRange=byterange.offset + byterange.length - 1;
return byterange.offset + "-" + endRange;
};
var segmentRange={
"static": function _static(attributes){
var duration=attributes.duration,
_attributes$timescale=attributes.timescale,
timescale=_attributes$timescale===void 0 ? 1:_attributes$timescale,
sourceDuration=attributes.sourceDuration;
return {
start: 0,
end: Math.ceil(sourceDuration / (duration / timescale))
};},
dynamic: function dynamic(attributes){
var NOW=attributes.NOW,
clientOffset=attributes.clientOffset,
availabilityStartTime=attributes.availabilityStartTime,
_attributes$timescale2=attributes.timescale,
timescale=_attributes$timescale2===void 0 ? 1:_attributes$timescale2,
duration=attributes.duration,
_attributes$start=attributes.start,
start=_attributes$start===void 0 ? 0:_attributes$start,
_attributes$minimumUp=attributes.minimumUpdatePeriod,
minimumUpdatePeriod=_attributes$minimumUp===void 0 ? 0:_attributes$minimumUp,
_attributes$timeShift=attributes.timeShiftBufferDepth,
timeShiftBufferDepth=_attributes$timeShift===void 0 ? Infinity:_attributes$timeShift;
var now=(NOW + clientOffset) / 1000;
var periodStartWC=availabilityStartTime + start;
var periodEndWC=now + minimumUpdatePeriod;
var periodDuration=periodEndWC - periodStartWC;
var segmentCount=Math.ceil(periodDuration * timescale / duration);
var availableStart=Math.floor((now - periodStartWC - timeShiftBufferDepth) * timescale / duration);
var availableEnd=Math.floor((now - periodStartWC) * timescale / duration);
return {
start: Math.max(0, availableStart),
end: Math.min(segmentCount, availableEnd)
};}};
var toSegments=function toSegments(attributes){
return function (number, index){
var duration=attributes.duration,
_attributes$timescale3=attributes.timescale,
timescale=_attributes$timescale3===void 0 ? 1:_attributes$timescale3,
periodIndex=attributes.periodIndex,
_attributes$startNumb=attributes.startNumber,
startNumber=_attributes$startNumb===void 0 ? 1:_attributes$startNumb;
return {
number: startNumber + number,
duration: duration / timescale,
timeline: periodIndex,
time: index * duration
};};
};
var parseByDuration=function parseByDuration(attributes){
var _attributes$type=attributes.type,
type=_attributes$type===void 0 ? 'static':_attributes$type,
duration=attributes.duration,
_attributes$timescale4=attributes.timescale,
timescale=_attributes$timescale4===void 0 ? 1:_attributes$timescale4,
sourceDuration=attributes.sourceDuration;
var _segmentRange$type=segmentRange[type](attributes),
start=_segmentRange$type.start,
end=_segmentRange$type.end;
var segments=range(start, end).map(toSegments(attributes));
if(type==='static'){
var index=segments.length - 1;
segments[index].duration=sourceDuration - duration / timescale * index;
}
return segments;
};
var segmentsFromBase=function segmentsFromBase(attributes){
var baseUrl=attributes.baseUrl,
_attributes$initializ=attributes.initialization,
initialization=_attributes$initializ===void 0 ? {}:_attributes$initializ,
sourceDuration=attributes.sourceDuration,
_attributes$timescale=attributes.timescale,
timescale=_attributes$timescale===void 0 ? 1:_attributes$timescale,
_attributes$indexRang=attributes.indexRange,
indexRange=_attributes$indexRang===void 0 ? '':_attributes$indexRang,
duration=attributes.duration;
if(!baseUrl){
throw new Error(errors.NO_BASE_URL);
}
var initSegment=urlTypeToSegment({
baseUrl: baseUrl,
source: initialization.sourceURL,
range: initialization.range
});
var segment=urlTypeToSegment({
baseUrl: baseUrl,
source: baseUrl,
indexRange: indexRange
});
segment.map=initSegment;
if(duration){
var segmentTimeInfo=parseByDuration(attributes);
if(segmentTimeInfo.length){
segment.duration=segmentTimeInfo[0].duration;
segment.timeline=segmentTimeInfo[0].timeline;
}}else if(sourceDuration){
segment.duration=sourceDuration / timescale;
segment.timeline=0;
}
segment.number=0;
return [segment];
};
var addSegmentsToPlaylist=function addSegmentsToPlaylist(playlist, sidx, baseUrl){
var initSegment=playlist.sidx.map ? playlist.sidx.map:null;
var sourceDuration=playlist.sidx.duration;
var timeline=playlist.timeline||0;
var sidxByteRange=playlist.sidx.byterange;
var sidxEnd=sidxByteRange.offset + sidxByteRange.length;
var timescale=sidx.timescale;
var mediaReferences=sidx.references.filter(function (r){
return r.referenceType!==1;
});
var segments=[];
var startIndex=sidxEnd + sidx.firstOffset;
for (var i=0; i < mediaReferences.length; i++){
var reference=sidx.references[i];
var size=reference.referencedSize;
var duration=reference.subsegmentDuration;
var endIndex=startIndex + size - 1;
var indexRange=startIndex + "-" + endIndex;
var attributes={
baseUrl: baseUrl,
timescale: timescale,
timeline: timeline,
periodIndex: timeline,
duration: duration,
sourceDuration: sourceDuration,
indexRange: indexRange
};
var segment=segmentsFromBase(attributes)[0];
if(initSegment){
segment.map=initSegment;
}
segments.push(segment);
startIndex +=size;
}
playlist.segments=segments;
return playlist;
};
var mergeDiscontiguousPlaylists=function mergeDiscontiguousPlaylists(playlists){
var mergedPlaylists=values(playlists.reduce(function (acc, playlist){
var name=playlist.attributes.id + (playlist.attributes.lang||'');
if(acc[name]){
var _acc$name$segments;
if(playlist.segments[0]){
playlist.segments[0].discontinuity=true;
}
(_acc$name$segments=acc[name].segments).push.apply(_acc$name$segments, playlist.segments);
if(playlist.attributes.contentProtection){
acc[name].attributes.contentProtection=playlist.attributes.contentProtection;
}}else{
acc[name]=playlist;
}
return acc;
}, {}));
return mergedPlaylists.map(function (playlist){
playlist.discontinuityStarts=findIndexes(playlist.segments, 'discontinuity');
return playlist;
});
};
var addSegmentInfoFromSidx=function addSegmentInfoFromSidx(playlists, sidxMapping){
if(sidxMapping===void 0){
sidxMapping={};}
if(!Object.keys(sidxMapping).length){
return playlists;
}
for (var i in playlists){
var playlist=playlists[i];
if(!playlist.sidx){
continue;
}
var sidxKey=playlist.sidx.uri + '-' + byteRangeToString(playlist.sidx.byterange);
var sidxMatch=sidxMapping[sidxKey]&&sidxMapping[sidxKey].sidx;
if(playlist.sidx&&sidxMatch){
addSegmentsToPlaylist(playlist, sidxMatch, playlist.sidx.resolvedUri);
}}
return playlists;
};
var formatAudioPlaylist=function formatAudioPlaylist(_ref){
var _attributes;
var attributes=_ref.attributes,
segments=_ref.segments,
sidx=_ref.sidx;
var playlist={
attributes: (_attributes={
NAME: attributes.id,
BANDWIDTH: attributes.bandwidth,
CODECS: attributes.codecs
}, _attributes['PROGRAM-ID']=1, _attributes),
uri: '',
endList: (attributes.type||'static')==='static',
timeline: attributes.periodIndex,
resolvedUri: '',
targetDuration: attributes.duration,
segments: segments,
mediaSequence: segments.length ? segments[0].number:1
};
if(attributes.contentProtection){
playlist.contentProtection=attributes.contentProtection;
}
if(sidx){
playlist.sidx=sidx;
}
return playlist;
};
var formatVttPlaylist=function formatVttPlaylist(_ref2){
var _attributes2;
var attributes=_ref2.attributes,
segments=_ref2.segments;
if(typeof segments==='undefined'){
segments=[{
uri: attributes.baseUrl,
timeline: attributes.periodIndex,
resolvedUri: attributes.baseUrl||'',
duration: attributes.sourceDuration,
number: 0
}];
attributes.duration=attributes.sourceDuration;
}
return {
attributes: (_attributes2={
NAME: attributes.id,
BANDWIDTH: attributes.bandwidth
}, _attributes2['PROGRAM-ID']=1, _attributes2),
uri: '',
endList: (attributes.type||'static')==='static',
timeline: attributes.periodIndex,
resolvedUri: attributes.baseUrl||'',
targetDuration: attributes.duration,
segments: segments,
mediaSequence: segments.length ? segments[0].number:1
};};
var organizeAudioPlaylists=function organizeAudioPlaylists(playlists, sidxMapping){
if(sidxMapping===void 0){
sidxMapping={};}
var mainPlaylist;
var formattedPlaylists=playlists.reduce(function (a, playlist){
var role=playlist.attributes.role&&playlist.attributes.role.value||'';
var language=playlist.attributes.lang||'';
var label='main';
if(language){
var roleLabel=role ? " (" + role + ")":'';
label="" + playlist.attributes.lang + roleLabel;
}
if(a[label]&&a[label].playlists[0].attributes.BANDWIDTH > playlist.attributes.bandwidth){
return a;
}
a[label]={
language: language,
autoselect: true,
"default": role==='main',
playlists: addSegmentInfoFromSidx([formatAudioPlaylist(playlist)], sidxMapping),
uri: ''
};
if(typeof mainPlaylist==='undefined'&&role==='main'){
mainPlaylist=playlist;
mainPlaylist["default"]=true;
}
return a;
}, {});
if(!mainPlaylist){
var firstLabel=Object.keys(formattedPlaylists)[0];
formattedPlaylists[firstLabel]["default"]=true;
}
return formattedPlaylists;
};
var organizeVttPlaylists=function organizeVttPlaylists(playlists, sidxMapping){
if(sidxMapping===void 0){
sidxMapping={};}
return playlists.reduce(function (a, playlist){
var label=playlist.attributes.lang||'text';
if(a[label]){
return a;
}
a[label]={
language: label,
"default": false,
autoselect: false,
playlists: addSegmentInfoFromSidx([formatVttPlaylist(playlist)], sidxMapping),
uri: ''
};
return a;
}, {});
};
var formatVideoPlaylist=function formatVideoPlaylist(_ref3){
var _attributes3;
var attributes=_ref3.attributes,
segments=_ref3.segments,
sidx=_ref3.sidx;
var playlist={
attributes: (_attributes3={
NAME: attributes.id,
AUDIO: 'audio',
SUBTITLES: 'subs',
RESOLUTION: {
width: attributes.width,
height: attributes.height
},
CODECS: attributes.codecs,
BANDWIDTH: attributes.bandwidth
}, _attributes3['PROGRAM-ID']=1, _attributes3),
uri: '',
endList: (attributes.type||'static')==='static',
timeline: attributes.periodIndex,
resolvedUri: '',
targetDuration: attributes.duration,
segments: segments,
mediaSequence: segments.length ? segments[0].number:1
};
if(attributes.contentProtection){
playlist.contentProtection=attributes.contentProtection;
}
if(sidx){
playlist.sidx=sidx;
}
return playlist;
};
var toM3u8=function toM3u8(dashPlaylists, sidxMapping){
var _mediaGroups;
if(sidxMapping===void 0){
sidxMapping={};}
if(!dashPlaylists.length){
return {};}
var _dashPlaylists$0$attr=dashPlaylists[0].attributes,
duration=_dashPlaylists$0$attr.sourceDuration,
_dashPlaylists$0$attr2=_dashPlaylists$0$attr.minimumUpdatePeriod,
minimumUpdatePeriod=_dashPlaylists$0$attr2===void 0 ? 0:_dashPlaylists$0$attr2;
var videoOnly=function videoOnly(_ref4){
var attributes=_ref4.attributes;
return attributes.mimeType==='video/mp4'||attributes.contentType==='video';
};
var audioOnly=function audioOnly(_ref5){
var attributes=_ref5.attributes;
return attributes.mimeType==='audio/mp4'||attributes.contentType==='audio';
};
var vttOnly=function vttOnly(_ref6){
var attributes=_ref6.attributes;
return attributes.mimeType==='text/vtt'||attributes.contentType==='text';
};
var videoPlaylists=mergeDiscontiguousPlaylists(dashPlaylists.filter(videoOnly)).map(formatVideoPlaylist);
var audioPlaylists=mergeDiscontiguousPlaylists(dashPlaylists.filter(audioOnly));
var vttPlaylists=dashPlaylists.filter(vttOnly);
var master={
allowCache: true,
discontinuityStarts: [],
segments: [],
endList: true,
mediaGroups: (_mediaGroups={
AUDIO: {},
VIDEO: {}}, _mediaGroups['CLOSED-CAPTIONS']={}, _mediaGroups.SUBTITLES={}, _mediaGroups),
uri: '',
duration: duration,
playlists: addSegmentInfoFromSidx(videoPlaylists, sidxMapping),
minimumUpdatePeriod: minimumUpdatePeriod * 1000
};
if(audioPlaylists.length){
master.mediaGroups.AUDIO.audio=organizeAudioPlaylists(audioPlaylists, sidxMapping);
}
if(vttPlaylists.length){
master.mediaGroups.SUBTITLES.subs=organizeVttPlaylists(vttPlaylists, sidxMapping);
}
return master;
};
var getLiveRValue=function getLiveRValue(attributes, time, duration){
var NOW=attributes.NOW,
clientOffset=attributes.clientOffset,
availabilityStartTime=attributes.availabilityStartTime,
_attributes$timescale=attributes.timescale,
timescale=_attributes$timescale===void 0 ? 1:_attributes$timescale,
_attributes$start=attributes.start,
start=_attributes$start===void 0 ? 0:_attributes$start,
_attributes$minimumUp=attributes.minimumUpdatePeriod,
minimumUpdatePeriod=_attributes$minimumUp===void 0 ? 0:_attributes$minimumUp;
var now=(NOW + clientOffset) / 1000;
var periodStartWC=availabilityStartTime + start;
var periodEndWC=now + minimumUpdatePeriod;
var periodDuration=periodEndWC - periodStartWC;
return Math.ceil((periodDuration * timescale - time) / duration);
};
var parseByTimeline=function parseByTimeline(attributes, segmentTimeline){
var _attributes$type=attributes.type,
type=_attributes$type===void 0 ? 'static':_attributes$type,
_attributes$minimumUp2=attributes.minimumUpdatePeriod,
minimumUpdatePeriod=_attributes$minimumUp2===void 0 ? 0:_attributes$minimumUp2,
_attributes$media=attributes.media,
media=_attributes$media===void 0 ? '':_attributes$media,
sourceDuration=attributes.sourceDuration,
_attributes$timescale2=attributes.timescale,
timescale=_attributes$timescale2===void 0 ? 1:_attributes$timescale2,
_attributes$startNumb=attributes.startNumber,
startNumber=_attributes$startNumb===void 0 ? 1:_attributes$startNumb,
timeline=attributes.periodIndex;
var segments=[];
var time=-1;
for (var sIndex=0; sIndex < segmentTimeline.length; sIndex++){
var S=segmentTimeline[sIndex];
var duration=S.d;
var repeat=S.r||0;
var segmentTime=S.t||0;
if(time < 0){
time=segmentTime;
}
if(segmentTime&&segmentTime > time){
time=segmentTime;
}
var count=void 0;
if(repeat < 0){
var nextS=sIndex + 1;
if(nextS===segmentTimeline.length){
if(type==='dynamic'&&minimumUpdatePeriod > 0&&media.indexOf('$Number$') > 0){
count=getLiveRValue(attributes, time, duration);
}else{
count=(sourceDuration * timescale - time) / duration;
}}else{
count=(segmentTimeline[nextS].t - time) / duration;
}}else{
count=repeat + 1;
}
var end=startNumber + segments.length + count;
var number=startNumber + segments.length;
while (number < end){
segments.push({
number: number,
duration: duration / timescale,
time: time,
timeline: timeline
});
time +=duration;
number++;
}}
return segments;
};
var identifierPattern=/\$([A-z]*)(?:(%0)([0-9]+)d)?\$/g;
var identifierReplacement=function identifierReplacement(values){
return function (match, identifier, format, width){
if(match==='$$'){
return '$';
}
if(typeof values[identifier]==='undefined'){
return match;
}
var value='' + values[identifier];
if(identifier==='RepresentationID'){
return value;
}
if(!format){
width=1;
}else{
width=parseInt(width, 10);
}
if(value.length >=width){
return value;
}
return "" + new Array(width - value.length + 1).join('0') + value;
};};
var constructTemplateUrl=function constructTemplateUrl(url, values){
return url.replace(identifierPattern, identifierReplacement(values));
};
var parseTemplateInfo=function parseTemplateInfo(attributes, segmentTimeline){
if(!attributes.duration&&!segmentTimeline){
return [{
number: attributes.startNumber||1,
duration: attributes.sourceDuration,
time: 0,
timeline: attributes.periodIndex
}];
}
if(attributes.duration){
return parseByDuration(attributes);
}
return parseByTimeline(attributes, segmentTimeline);
};
var segmentsFromTemplate=function segmentsFromTemplate(attributes, segmentTimeline){
var templateValues={
RepresentationID: attributes.id,
Bandwidth: attributes.bandwidth||0
};
var _attributes$initializ=attributes.initialization,
initialization=_attributes$initializ===void 0 ? {
sourceURL: '',
range: ''
}:_attributes$initializ;
var mapSegment=urlTypeToSegment({
baseUrl: attributes.baseUrl,
source: constructTemplateUrl(initialization.sourceURL, templateValues),
range: initialization.range
});
var segments=parseTemplateInfo(attributes, segmentTimeline);
return segments.map(function (segment){
templateValues.Number=segment.number;
templateValues.Time=segment.time;
var uri=constructTemplateUrl(attributes.media||'', templateValues);
return {
uri: uri,
timeline: segment.timeline,
duration: segment.duration,
resolvedUri: resolveUrl(attributes.baseUrl||'', uri),
map: mapSegment,
number: segment.number
};});
};
var SegmentURLToSegmentObject=function SegmentURLToSegmentObject(attributes, segmentUrl){
var baseUrl=attributes.baseUrl,
_attributes$initializ=attributes.initialization,
initialization=_attributes$initializ===void 0 ? {}:_attributes$initializ;
var initSegment=urlTypeToSegment({
baseUrl: baseUrl,
source: initialization.sourceURL,
range: initialization.range
});
var segment=urlTypeToSegment({
baseUrl: baseUrl,
source: segmentUrl.media,
range: segmentUrl.mediaRange
});
segment.map=initSegment;
return segment;
};
var segmentsFromList=function segmentsFromList(attributes, segmentTimeline){
var duration=attributes.duration,
_attributes$segmentUr=attributes.segmentUrls,
segmentUrls=_attributes$segmentUr===void 0 ? []:_attributes$segmentUr;
if(!duration&&!segmentTimeline||duration&&segmentTimeline){
throw new Error(errors.SEGMENT_TIME_UNSPECIFIED);
}
var segmentUrlMap=segmentUrls.map(function (segmentUrlObject){
return SegmentURLToSegmentObject(attributes, segmentUrlObject);
});
var segmentTimeInfo;
if(duration){
segmentTimeInfo=parseByDuration(attributes);
}
if(segmentTimeline){
segmentTimeInfo=parseByTimeline(attributes, segmentTimeline);
}
var segments=segmentTimeInfo.map(function (segmentTime, index){
if(segmentUrlMap[index]){
var segment=segmentUrlMap[index];
segment.timeline=segmentTime.timeline;
segment.duration=segmentTime.duration;
segment.number=segmentTime.number;
return segment;
}}).filter(function (segment){
return segment;
});
return segments;
};
var generateSegments=function generateSegments(_ref){
var attributes=_ref.attributes,
segmentInfo=_ref.segmentInfo;
var segmentAttributes;
var segmentsFn;
if(segmentInfo.template){
segmentsFn=segmentsFromTemplate;
segmentAttributes=merge(attributes, segmentInfo.template);
}else if(segmentInfo.base){
segmentsFn=segmentsFromBase;
segmentAttributes=merge(attributes, segmentInfo.base);
}else if(segmentInfo.list){
segmentsFn=segmentsFromList;
segmentAttributes=merge(attributes, segmentInfo.list);
}
var segmentsInfo={
attributes: attributes
};
if(!segmentsFn){
return segmentsInfo;
}
var segments=segmentsFn(segmentAttributes, segmentInfo.timeline);
if(segmentAttributes.duration){
var _segmentAttributes=segmentAttributes,
duration=_segmentAttributes.duration,
_segmentAttributes$ti=_segmentAttributes.timescale,
timescale=_segmentAttributes$ti===void 0 ? 1:_segmentAttributes$ti;
segmentAttributes.duration=duration / timescale;
}else if(segments.length){
segmentAttributes.duration=segments.reduce(function (max, segment){
return Math.max(max, Math.ceil(segment.duration));
}, 0);
}else{
segmentAttributes.duration=0;
}
segmentsInfo.attributes=segmentAttributes;
segmentsInfo.segments=segments;
if(segmentInfo.base&&segmentAttributes.indexRange){
segmentsInfo.sidx=segments[0];
segmentsInfo.segments=[];
}
return segmentsInfo;
};
var toPlaylists=function toPlaylists(representations){
return representations.map(generateSegments);
};
var findChildren=function findChildren(element, name){
return from(element.childNodes).filter(function (_ref){
var tagName=_ref.tagName;
return tagName===name;
});
};
var getContent=function getContent(element){
return element.textContent.trim();
};
var parseDuration=function parseDuration(str){
var SECONDS_IN_YEAR=365 * 24 * 60 * 60;
var SECONDS_IN_MONTH=30 * 24 * 60 * 60;
var SECONDS_IN_DAY=24 * 60 * 60;
var SECONDS_IN_HOUR=60 * 60;
var SECONDS_IN_MIN=60;
var durationRegex=/P(?:(\d*)Y)?(?:(\d*)M)?(?:(\d*)D)?(?:T(?:(\d*)H)?(?:(\d*)M)?(?:([\d.]*)S)?)?/;
var match=durationRegex.exec(str);
if(!match){
return 0;
}
var _match$slice=match.slice(1),
year=_match$slice[0],
month=_match$slice[1],
day=_match$slice[2],
hour=_match$slice[3],
minute=_match$slice[4],
second=_match$slice[5];
return parseFloat(year||0) * SECONDS_IN_YEAR + parseFloat(month||0) * SECONDS_IN_MONTH + parseFloat(day||0) * SECONDS_IN_DAY + parseFloat(hour||0) * SECONDS_IN_HOUR + parseFloat(minute||0) * SECONDS_IN_MIN + parseFloat(second||0);
};
var parseDate=function parseDate(str){
var dateRegex=/^\d+-\d+-\d+T\d+:\d+:\d+(\.\d+)?$/;
if(dateRegex.test(str)){
str +='Z';
}
return Date.parse(str);
};
var parsers={
mediaPresentationDuration: function mediaPresentationDuration(value){
return parseDuration(value);
},
availabilityStartTime: function availabilityStartTime(value){
return parseDate(value) / 1000;
},
minimumUpdatePeriod: function minimumUpdatePeriod(value){
return parseDuration(value);
},
timeShiftBufferDepth: function timeShiftBufferDepth(value){
return parseDuration(value);
},
start: function start(value){
return parseDuration(value);
},
width: function width(value){
return parseInt(value, 10);
},
height: function height(value){
return parseInt(value, 10);
},
bandwidth: function bandwidth(value){
return parseInt(value, 10);
},
startNumber: function startNumber(value){
return parseInt(value, 10);
},
timescale: function timescale(value){
return parseInt(value, 10);
},
duration: function duration(value){
var parsedValue=parseInt(value, 10);
if(isNaN(parsedValue)){
return parseDuration(value);
}
return parsedValue;
},
d: function d(value){
return parseInt(value, 10);
},
t: function t(value){
return parseInt(value, 10);
},
r: function r(value){
return parseInt(value, 10);
},
DEFAULT: function DEFAULT(value){
return value;
}};
var parseAttributes$1=function parseAttributes(el){
if(!(el&&el.attributes)){
return {};}
return from(el.attributes).reduce(function (a, e){
var parseFn=parsers[e.name]||parsers.DEFAULT;
a[e.name]=parseFn(e.value);
return a;
}, {});
};
function decodeB64ToUint8Array$1(b64Text){
var decodedString=window$1.atob(b64Text);
var array=new Uint8Array(decodedString.length);
for (var i=0; i < decodedString.length; i++){
array[i]=decodedString.charCodeAt(i);
}
return array;
}
var keySystemsMap={
'urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b': 'org.w3.clearkey',
'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed': 'com.widevine.alpha',
'urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95': 'com.microsoft.playready',
'urn:uuid:f239e769-efa3-4850-9c16-a903c6932efb': 'com.adobe.primetime'
};
var buildBaseUrls=function buildBaseUrls(referenceUrls, baseUrlElements){
if(!baseUrlElements.length){
return referenceUrls;
}
return flatten(referenceUrls.map(function (reference){
return baseUrlElements.map(function (baseUrlElement){
return resolveUrl(reference, getContent(baseUrlElement));
});
}));
};
var getSegmentInformation=function getSegmentInformation(adaptationSet){
var segmentTemplate=findChildren(adaptationSet, 'SegmentTemplate')[0];
var segmentList=findChildren(adaptationSet, 'SegmentList')[0];
var segmentUrls=segmentList&&findChildren(segmentList, 'SegmentURL').map(function (s){
return merge({
tag: 'SegmentURL'
}, parseAttributes$1(s));
});
var segmentBase=findChildren(adaptationSet, 'SegmentBase')[0];
var segmentTimelineParentNode=segmentList||segmentTemplate;
var segmentTimeline=segmentTimelineParentNode&&findChildren(segmentTimelineParentNode, 'SegmentTimeline')[0];
var segmentInitializationParentNode=segmentList||segmentBase||segmentTemplate;
var segmentInitialization=segmentInitializationParentNode&&findChildren(segmentInitializationParentNode, 'Initialization')[0];
var template=segmentTemplate&&parseAttributes$1(segmentTemplate);
if(template&&segmentInitialization){
template.initialization=segmentInitialization&&parseAttributes$1(segmentInitialization);
}else if(template&&template.initialization){
template.initialization={
sourceURL: template.initialization
};}
var segmentInfo={
template: template,
timeline: segmentTimeline&&findChildren(segmentTimeline, 'S').map(function (s){
return parseAttributes$1(s);
}),
list: segmentList&&merge(parseAttributes$1(segmentList), {
segmentUrls: segmentUrls,
initialization: parseAttributes$1(segmentInitialization)
}),
base: segmentBase&&merge(parseAttributes$1(segmentBase), {
initialization: parseAttributes$1(segmentInitialization)
})
};
Object.keys(segmentInfo).forEach(function (key){
if(!segmentInfo[key]){
delete segmentInfo[key];
}});
return segmentInfo;
};
var inheritBaseUrls=function inheritBaseUrls(adaptationSetAttributes, adaptationSetBaseUrls, adaptationSetSegmentInfo){
return function (representation){
var repBaseUrlElements=findChildren(representation, 'BaseURL');
var repBaseUrls=buildBaseUrls(adaptationSetBaseUrls, repBaseUrlElements);
var attributes=merge(adaptationSetAttributes, parseAttributes$1(representation));
var representationSegmentInfo=getSegmentInformation(representation);
return repBaseUrls.map(function (baseUrl){
return {
segmentInfo: merge(adaptationSetSegmentInfo, representationSegmentInfo),
attributes: merge(attributes, {
baseUrl: baseUrl
})
};});
};};
var generateKeySystemInformation=function generateKeySystemInformation(contentProtectionNodes){
return contentProtectionNodes.reduce(function (acc, node){
var attributes=parseAttributes$1(node);
var keySystem=keySystemsMap[attributes.schemeIdUri];
if(keySystem){
acc[keySystem]={
attributes: attributes
};
var psshNode=findChildren(node, 'cenc:pssh')[0];
if(psshNode){
var pssh=getContent(psshNode);
var psshBuffer=pssh&&decodeB64ToUint8Array$1(pssh);
acc[keySystem].pssh=psshBuffer;
}}
return acc;
}, {});
};
var toRepresentations=function toRepresentations(periodAttributes, periodBaseUrls, periodSegmentInfo){
return function (adaptationSet){
var adaptationSetAttributes=parseAttributes$1(adaptationSet);
var adaptationSetBaseUrls=buildBaseUrls(periodBaseUrls, findChildren(adaptationSet, 'BaseURL'));
var role=findChildren(adaptationSet, 'Role')[0];
var roleAttributes={
role: parseAttributes$1(role)
};
var attrs=merge(periodAttributes, adaptationSetAttributes, roleAttributes);
var contentProtection=generateKeySystemInformation(findChildren(adaptationSet, 'ContentProtection'));
if(Object.keys(contentProtection).length){
attrs=merge(attrs, {
contentProtection: contentProtection
});
}
var segmentInfo=getSegmentInformation(adaptationSet);
var representations=findChildren(adaptationSet, 'Representation');
var adaptationSetSegmentInfo=merge(periodSegmentInfo, segmentInfo);
return flatten(representations.map(inheritBaseUrls(attrs, adaptationSetBaseUrls, adaptationSetSegmentInfo)));
};};
var toAdaptationSets=function toAdaptationSets(mpdAttributes, mpdBaseUrls){
return function (period, index){
var periodBaseUrls=buildBaseUrls(mpdBaseUrls, findChildren(period, 'BaseURL'));
var periodAtt=parseAttributes$1(period);
var parsedPeriodId=parseInt(periodAtt.id, 10);
var periodIndex=window$1.isNaN(parsedPeriodId) ? index:parsedPeriodId;
var periodAttributes=merge(mpdAttributes, {
periodIndex: periodIndex
});
var adaptationSets=findChildren(period, 'AdaptationSet');
var periodSegmentInfo=getSegmentInformation(period);
return flatten(adaptationSets.map(toRepresentations(periodAttributes, periodBaseUrls, periodSegmentInfo)));
};};
var inheritAttributes=function inheritAttributes(mpd, options){
if(options===void 0){
options={};}
var _options=options,
_options$manifestUri=_options.manifestUri,
manifestUri=_options$manifestUri===void 0 ? '':_options$manifestUri,
_options$NOW=_options.NOW,
NOW=_options$NOW===void 0 ? Date.now():_options$NOW,
_options$clientOffset=_options.clientOffset,
clientOffset=_options$clientOffset===void 0 ? 0:_options$clientOffset;
var periods=findChildren(mpd, 'Period');
if(!periods.length){
throw new Error(errors.INVALID_NUMBER_OF_PERIOD);
}
var mpdAttributes=parseAttributes$1(mpd);
var mpdBaseUrls=buildBaseUrls([manifestUri], findChildren(mpd, 'BaseURL'));
mpdAttributes.sourceDuration=mpdAttributes.mediaPresentationDuration||0;
mpdAttributes.NOW=NOW;
mpdAttributes.clientOffset=clientOffset;
return flatten(periods.map(toAdaptationSets(mpdAttributes, mpdBaseUrls)));
};
var stringToMpdXml=function stringToMpdXml(manifestString){
if(manifestString===''){
throw new Error(errors.DASH_EMPTY_MANIFEST);
}
var parser=new window$1.DOMParser();
var xml=parser.parseFromString(manifestString, 'application/xml');
var mpd=xml&&xml.documentElement.tagName==='MPD' ? xml.documentElement:null;
if(!mpd||mpd&&mpd.getElementsByTagName('parsererror').length > 0){
throw new Error(errors.DASH_INVALID_XML);
}
return mpd;
};
var parseUTCTimingScheme=function parseUTCTimingScheme(mpd){
var UTCTimingNode=findChildren(mpd, 'UTCTiming')[0];
if(!UTCTimingNode){
return null;
}
var attributes=parseAttributes$1(UTCTimingNode);
switch (attributes.schemeIdUri){
case 'urn:mpeg:dash:utc:http-head:2014':
case 'urn:mpeg:dash:utc:http-head:2012':
attributes.method='HEAD';
break;
case 'urn:mpeg:dash:utc:http-xsdate:2014':
case 'urn:mpeg:dash:utc:http-iso:2014':
case 'urn:mpeg:dash:utc:http-xsdate:2012':
case 'urn:mpeg:dash:utc:http-iso:2012':
attributes.method='GET';
break;
case 'urn:mpeg:dash:utc:direct:2014':
case 'urn:mpeg:dash:utc:direct:2012':
attributes.method='DIRECT';
attributes.value=Date.parse(attributes.value);
break;
case 'urn:mpeg:dash:utc:http-ntp:2014':
case 'urn:mpeg:dash:utc:ntp:2014':
case 'urn:mpeg:dash:utc:sntp:2014':
default:
throw new Error(errors.UNSUPPORTED_UTC_TIMING_SCHEME);
}
return attributes;
};
var parse=function parse(manifestString, options){
if(options===void 0){
options={};}
return toM3u8(toPlaylists(inheritAttributes(stringToMpdXml(manifestString), options)), options.sidxMapping);
};
var parseUTCTiming=function parseUTCTiming(manifestString){
return parseUTCTimingScheme(stringToMpdXml(manifestString));
};
var toUnsigned=function toUnsigned(value){
return value >>> 0;
};
var toHexString=function toHexString(value){
return ('00' + value.toString(16)).slice(-2);
};
var bin={
toUnsigned: toUnsigned,
toHexString: toHexString
};
var inspectMp4,
_textifyMp,
toUnsigned$1=bin.toUnsigned,
parseMp4Date=function parseMp4Date(seconds){
return new Date(seconds * 1000 - 2082844800000);
},
parseSampleFlags=function parseSampleFlags(flags){
return {
isLeading: (flags[0] & 0x0c) >>> 2,
dependsOn: flags[0] & 0x03,
isDependedOn: (flags[1] & 0xc0) >>> 6,
hasRedundancy: (flags[1] & 0x30) >>> 4,
paddingValue: (flags[1] & 0x0e) >>> 1,
isNonSyncSample: flags[1] & 0x01,
degradationPriority: flags[2] << 8 | flags[3]
};},
parseType=function parseType(buffer){
var result='';
result +=String.fromCharCode(buffer[0]);
result +=String.fromCharCode(buffer[1]);
result +=String.fromCharCode(buffer[2]);
result +=String.fromCharCode(buffer[3]);
return result;
},
findBox=function findBox(data, path){
var results=[],
i,
size,
type,
end,
subresults;
if(!path.length){
return null;
}
for (i=0; i < data.byteLength;){
size=toUnsigned$1(data[i] << 24 | data[i + 1] << 16 | data[i + 2] << 8 | data[i + 3]);
type=parseType(data.subarray(i + 4, i + 8));
end=size > 1 ? i + size:data.byteLength;
if(type===path[0]){
if(path.length===1){
results.push(data.subarray(i + 8, end));
}else{
subresults=findBox(data.subarray(i + 8, end), path.slice(1));
if(subresults.length){
results=results.concat(subresults);
}}
}
i=end;
}
return results;
},
nalParse=function nalParse(avcStream){
var avcView=new DataView(avcStream.buffer, avcStream.byteOffset, avcStream.byteLength),
result=[],
i,
length;
for (i=0; i + 4 < avcStream.length; i +=length){
length=avcView.getUint32(i);
i +=4;
if(length <=0){
result.push('<span style=\'color:red;\'>MALFORMED DATA</span>');
continue;
}
switch (avcStream[i] & 0x1F){
case 0x01:
result.push('slice_layer_without_partitioning_rbsp');
break;
case 0x05:
result.push('slice_layer_without_partitioning_rbsp_idr');
break;
case 0x06:
result.push('sei_rbsp');
break;
case 0x07:
result.push('seq_parameter_set_rbsp');
break;
case 0x08:
result.push('pic_parameter_set_rbsp');
break;
case 0x09:
result.push('access_unit_delimiter_rbsp');
break;
default:
result.push('UNKNOWN NAL - ' + avcStream[i] & 0x1F);
break;
}}
return result;
},
parse$1={
avc1: function avc1(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength);
return {
dataReferenceIndex: view.getUint16(6),
width: view.getUint16(24),
height: view.getUint16(26),
horizresolution: view.getUint16(28) + view.getUint16(30) / 16,
vertresolution: view.getUint16(32) + view.getUint16(34) / 16,
frameCount: view.getUint16(40),
depth: view.getUint16(74),
config: inspectMp4(data.subarray(78, data.byteLength))
};},
avcC: function avcC(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
result={
configurationVersion: data[0],
avcProfileIndication: data[1],
profileCompatibility: data[2],
avcLevelIndication: data[3],
lengthSizeMinusOne: data[4] & 0x03,
sps: [],
pps: []
},
numOfSequenceParameterSets=data[5] & 0x1f,
numOfPictureParameterSets,
nalSize,
offset,
i;
offset=6;
for (i=0; i < numOfSequenceParameterSets; i++){
nalSize=view.getUint16(offset);
offset +=2;
result.sps.push(new Uint8Array(data.subarray(offset, offset + nalSize)));
offset +=nalSize;
}
numOfPictureParameterSets=data[offset];
offset++;
for (i=0; i < numOfPictureParameterSets; i++){
nalSize=view.getUint16(offset);
offset +=2;
result.pps.push(new Uint8Array(data.subarray(offset, offset + nalSize)));
offset +=nalSize;
}
return result;
},
btrt: function btrt(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength);
return {
bufferSizeDB: view.getUint32(0),
maxBitrate: view.getUint32(4),
avgBitrate: view.getUint32(8)
};},
esds: function esds(data){
return {
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
esId: data[6] << 8 | data[7],
streamPriority: data[8] & 0x1f,
decoderConfig: {
objectProfileIndication: data[11],
streamType: data[12] >>> 2 & 0x3f,
bufferSize: data[13] << 16 | data[14] << 8 | data[15],
maxBitrate: data[16] << 24 | data[17] << 16 | data[18] << 8 | data[19],
avgBitrate: data[20] << 24 | data[21] << 16 | data[22] << 8 | data[23],
decoderConfigDescriptor: {
tag: data[24],
length: data[25],
audioObjectType: data[26] >>> 3 & 0x1f,
samplingFrequencyIndex: (data[26] & 0x07) << 1 | data[27] >>> 7 & 0x01,
channelConfiguration: data[27] >>> 3 & 0x0f
}}
};},
ftyp: function ftyp(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
result={
majorBrand: parseType(data.subarray(0, 4)),
minorVersion: view.getUint32(4),
compatibleBrands: []
},
i=8;
while (i < data.byteLength){
result.compatibleBrands.push(parseType(data.subarray(i, i + 4)));
i +=4;
}
return result;
},
dinf: function dinf(data){
return {
boxes: inspectMp4(data)
};},
dref: function dref(data){
return {
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
dataReferences: inspectMp4(data.subarray(8))
};},
hdlr: function hdlr(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
result={
version: view.getUint8(0),
flags: new Uint8Array(data.subarray(1, 4)),
handlerType: parseType(data.subarray(8, 12)),
name: ''
},
i=8;
for (i=24; i < data.byteLength; i++){
if(data[i]===0x00){
i++;
break;
}
result.name +=String.fromCharCode(data[i]);
}
result.name=decodeURIComponent(escape(result.name));
return result;
},
mdat: function mdat(data){
return {
byteLength: data.byteLength,
nals: nalParse(data)
};},
mdhd: function mdhd(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
i=4,
language,
result={
version: view.getUint8(0),
flags: new Uint8Array(data.subarray(1, 4)),
language: ''
};
if(result.version===1){
i +=4;
result.creationTime=parseMp4Date(view.getUint32(i));
i +=8;
result.modificationTime=parseMp4Date(view.getUint32(i));
i +=4;
result.timescale=view.getUint32(i);
i +=8;
result.duration=view.getUint32(i);
}else{
result.creationTime=parseMp4Date(view.getUint32(i));
i +=4;
result.modificationTime=parseMp4Date(view.getUint32(i));
i +=4;
result.timescale=view.getUint32(i);
i +=4;
result.duration=view.getUint32(i);
}
i +=4;
language=view.getUint16(i);
result.language +=String.fromCharCode((language >> 10) + 0x60);
result.language +=String.fromCharCode(((language & 0x03e0) >> 5) + 0x60);
result.language +=String.fromCharCode((language & 0x1f) + 0x60);
return result;
},
mdia: function mdia(data){
return {
boxes: inspectMp4(data)
};},
mfhd: function mfhd(data){
return {
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
sequenceNumber: data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]
};},
minf: function minf(data){
return {
boxes: inspectMp4(data)
};},
mp4a: function mp4a(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
result={
dataReferenceIndex: view.getUint16(6),
channelcount: view.getUint16(16),
samplesize: view.getUint16(18),
samplerate: view.getUint16(24) + view.getUint16(26) / 65536
};
if(data.byteLength > 28){
result.streamDescriptor=inspectMp4(data.subarray(28))[0];
}
return result;
},
moof: function moof(data){
return {
boxes: inspectMp4(data)
};},
moov: function moov(data){
return {
boxes: inspectMp4(data)
};},
mvex: function mvex(data){
return {
boxes: inspectMp4(data)
};},
mvhd: function mvhd(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
i=4,
result={
version: view.getUint8(0),
flags: new Uint8Array(data.subarray(1, 4))
};
if(result.version===1){
i +=4;
result.creationTime=parseMp4Date(view.getUint32(i));
i +=8;
result.modificationTime=parseMp4Date(view.getUint32(i));
i +=4;
result.timescale=view.getUint32(i);
i +=8;
result.duration=view.getUint32(i);
}else{
result.creationTime=parseMp4Date(view.getUint32(i));
i +=4;
result.modificationTime=parseMp4Date(view.getUint32(i));
i +=4;
result.timescale=view.getUint32(i);
i +=4;
result.duration=view.getUint32(i);
}
i +=4;
result.rate=view.getUint16(i) + view.getUint16(i + 2) / 16;
i +=4;
result.volume=view.getUint8(i) + view.getUint8(i + 1) / 8;
i +=2;
i +=2;
i +=2 * 4;
result.matrix=new Uint32Array(data.subarray(i, i + 9 * 4));
i +=9 * 4;
i +=6 * 4;
result.nextTrackId=view.getUint32(i);
return result;
},
pdin: function pdin(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength);
return {
version: view.getUint8(0),
flags: new Uint8Array(data.subarray(1, 4)),
rate: view.getUint32(4),
initialDelay: view.getUint32(8)
};},
sdtp: function sdtp(data){
var result={
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
samples: []
},
i;
for (i=4; i < data.byteLength; i++){
result.samples.push({
dependsOn: (data[i] & 0x30) >> 4,
isDependedOn: (data[i] & 0x0c) >> 2,
hasRedundancy: data[i] & 0x03
});
}
return result;
},
sidx: function sidx(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
result={
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
references: [],
referenceId: view.getUint32(4),
timescale: view.getUint32(8),
earliestPresentationTime: view.getUint32(12),
firstOffset: view.getUint32(16)
},
referenceCount=view.getUint16(22),
i;
for (i=24; referenceCount; i +=12, referenceCount--){
result.references.push({
referenceType: (data[i] & 0x80) >>> 7,
referencedSize: view.getUint32(i) & 0x7FFFFFFF,
subsegmentDuration: view.getUint32(i + 4),
startsWithSap: !!(data[i + 8] & 0x80),
sapType: (data[i + 8] & 0x70) >>> 4,
sapDeltaTime: view.getUint32(i + 8) & 0x0FFFFFFF
});
}
return result;
},
smhd: function smhd(data){
return {
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
balance: data[4] + data[5] / 256
};},
stbl: function stbl(data){
return {
boxes: inspectMp4(data)
};},
stco: function stco(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
result={
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
chunkOffsets: []
},
entryCount=view.getUint32(4),
i;
for (i=8; entryCount; i +=4, entryCount--){
result.chunkOffsets.push(view.getUint32(i));
}
return result;
},
stsc: function stsc(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
entryCount=view.getUint32(4),
result={
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
sampleToChunks: []
},
i;
for (i=8; entryCount; i +=12, entryCount--){
result.sampleToChunks.push({
firstChunk: view.getUint32(i),
samplesPerChunk: view.getUint32(i + 4),
sampleDescriptionIndex: view.getUint32(i + 8)
});
}
return result;
},
stsd: function stsd(data){
return {
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
sampleDescriptions: inspectMp4(data.subarray(8))
};},
stsz: function stsz(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
result={
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
sampleSize: view.getUint32(4),
entries: []
},
i;
for (i=12; i < data.byteLength; i +=4){
result.entries.push(view.getUint32(i));
}
return result;
},
stts: function stts(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
result={
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
timeToSamples: []
},
entryCount=view.getUint32(4),
i;
for (i=8; entryCount; i +=8, entryCount--){
result.timeToSamples.push({
sampleCount: view.getUint32(i),
sampleDelta: view.getUint32(i + 4)
});
}
return result;
},
styp: function styp(data){
return parse$1.ftyp(data);
},
tfdt: function tfdt(data){
var result={
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
baseMediaDecodeTime: toUnsigned$1(data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7])
};
if(result.version===1){
result.baseMediaDecodeTime *=Math.pow(2, 32);
result.baseMediaDecodeTime +=toUnsigned$1(data[8] << 24 | data[9] << 16 | data[10] << 8 | data[11]);
}
return result;
},
tfhd: function tfhd(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
result={
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
trackId: view.getUint32(4)
},
baseDataOffsetPresent=result.flags[2] & 0x01,
sampleDescriptionIndexPresent=result.flags[2] & 0x02,
defaultSampleDurationPresent=result.flags[2] & 0x08,
defaultSampleSizePresent=result.flags[2] & 0x10,
defaultSampleFlagsPresent=result.flags[2] & 0x20,
durationIsEmpty=result.flags[0] & 0x010000,
defaultBaseIsMoof=result.flags[0] & 0x020000,
i;
i=8;
if(baseDataOffsetPresent){
i +=4;
result.baseDataOffset=view.getUint32(12);
i +=4;
}
if(sampleDescriptionIndexPresent){
result.sampleDescriptionIndex=view.getUint32(i);
i +=4;
}
if(defaultSampleDurationPresent){
result.defaultSampleDuration=view.getUint32(i);
i +=4;
}
if(defaultSampleSizePresent){
result.defaultSampleSize=view.getUint32(i);
i +=4;
}
if(defaultSampleFlagsPresent){
result.defaultSampleFlags=view.getUint32(i);
}
if(durationIsEmpty){
result.durationIsEmpty=true;
}
if(!baseDataOffsetPresent&&defaultBaseIsMoof){
result.baseDataOffsetIsMoof=true;
}
return result;
},
tkhd: function tkhd(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength),
i=4,
result={
version: view.getUint8(0),
flags: new Uint8Array(data.subarray(1, 4))
};
if(result.version===1){
i +=4;
result.creationTime=parseMp4Date(view.getUint32(i));
i +=8;
result.modificationTime=parseMp4Date(view.getUint32(i));
i +=4;
result.trackId=view.getUint32(i);
i +=4;
i +=8;
result.duration=view.getUint32(i);
}else{
result.creationTime=parseMp4Date(view.getUint32(i));
i +=4;
result.modificationTime=parseMp4Date(view.getUint32(i));
i +=4;
result.trackId=view.getUint32(i);
i +=4;
i +=4;
result.duration=view.getUint32(i);
}
i +=4;
i +=2 * 4;
result.layer=view.getUint16(i);
i +=2;
result.alternateGroup=view.getUint16(i);
i +=2;
result.volume=view.getUint8(i) + view.getUint8(i + 1) / 8;
i +=2;
i +=2;
result.matrix=new Uint32Array(data.subarray(i, i + 9 * 4));
i +=9 * 4;
result.width=view.getUint16(i) + view.getUint16(i + 2) / 16;
i +=4;
result.height=view.getUint16(i) + view.getUint16(i + 2) / 16;
return result;
},
traf: function traf(data){
return {
boxes: inspectMp4(data)
};},
trak: function trak(data){
return {
boxes: inspectMp4(data)
};},
trex: function trex(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength);
return {
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
trackId: view.getUint32(4),
defaultSampleDescriptionIndex: view.getUint32(8),
defaultSampleDuration: view.getUint32(12),
defaultSampleSize: view.getUint32(16),
sampleDependsOn: data[20] & 0x03,
sampleIsDependedOn: (data[21] & 0xc0) >> 6,
sampleHasRedundancy: (data[21] & 0x30) >> 4,
samplePaddingValue: (data[21] & 0x0e) >> 1,
sampleIsDifferenceSample: !!(data[21] & 0x01),
sampleDegradationPriority: view.getUint16(22)
};},
trun: function trun(data){
var result={
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
samples: []
},
view=new DataView(data.buffer, data.byteOffset, data.byteLength),
dataOffsetPresent=result.flags[2] & 0x01,
firstSampleFlagsPresent=result.flags[2] & 0x04,
sampleDurationPresent=result.flags[1] & 0x01,
sampleSizePresent=result.flags[1] & 0x02,
sampleFlagsPresent=result.flags[1] & 0x04,
sampleCompositionTimeOffsetPresent=result.flags[1] & 0x08,
sampleCount=view.getUint32(4),
offset=8,
sample;
if(dataOffsetPresent){
result.dataOffset=view.getInt32(offset);
offset +=4;
}
if(firstSampleFlagsPresent&&sampleCount){
sample={
flags: parseSampleFlags(data.subarray(offset, offset + 4))
};
offset +=4;
if(sampleDurationPresent){
sample.duration=view.getUint32(offset);
offset +=4;
}
if(sampleSizePresent){
sample.size=view.getUint32(offset);
offset +=4;
}
if(sampleCompositionTimeOffsetPresent){
sample.compositionTimeOffset=view.getUint32(offset);
offset +=4;
}
result.samples.push(sample);
sampleCount--;
}
while (sampleCount--){
sample={};
if(sampleDurationPresent){
sample.duration=view.getUint32(offset);
offset +=4;
}
if(sampleSizePresent){
sample.size=view.getUint32(offset);
offset +=4;
}
if(sampleFlagsPresent){
sample.flags=parseSampleFlags(data.subarray(offset, offset + 4));
offset +=4;
}
if(sampleCompositionTimeOffsetPresent){
sample.compositionTimeOffset=view.getUint32(offset);
offset +=4;
}
result.samples.push(sample);
}
return result;
},
'url ': function url(data){
return {
version: data[0],
flags: new Uint8Array(data.subarray(1, 4))
};},
vmhd: function vmhd(data){
var view=new DataView(data.buffer, data.byteOffset, data.byteLength);
return {
version: data[0],
flags: new Uint8Array(data.subarray(1, 4)),
graphicsmode: view.getUint16(4),
opcolor: new Uint16Array([view.getUint16(6), view.getUint16(8), view.getUint16(10)])
};}};
inspectMp4=function inspectMp4(data){
var i=0,
result=[],
view,
size,
type,
end,
box;
var ab=new ArrayBuffer(data.length);
var v=new Uint8Array(ab);
for (var z=0; z < data.length; ++z){
v[z]=data[z];
}
view=new DataView(ab);
while (i < data.byteLength){
size=view.getUint32(i);
type=parseType(data.subarray(i + 4, i + 8));
end=size > 1 ? i + size:data.byteLength;
box=(parse$1[type]||function (data){
return {
data: data
};})(data.subarray(i + 8, end));
box.size=size;
box.type=type;
result.push(box);
i=end;
}
return result;
};
_textifyMp=function textifyMp4(inspectedMp4, depth){
var indent;
depth=depth||0;
indent=new Array(depth * 2 + 1).join(' ');
return inspectedMp4.map(function (box, index){
return indent + box.type + '\n' +
Object.keys(box).filter(function (key){
return key!=='type'&&key!=='boxes';
}).map(function (key){
var prefix=indent + '  ' + key + ': ',
value=box[key];
if(value instanceof Uint8Array||value instanceof Uint32Array){
var bytes=Array.prototype.slice.call(new Uint8Array(value.buffer, value.byteOffset, value.byteLength)).map(function (_byte){
return ' ' + ('00' + _byte.toString(16)).slice(-2);
}).join('').match(/.{1,24}/g);
if(!bytes){
return prefix + '<>';
}
if(bytes.length===1){
return prefix + '<' + bytes.join('').slice(1) + '>';
}
return prefix + '<\n' + bytes.map(function (line){
return indent + '  ' + line;
}).join('\n') + '\n' + indent + '  >';
}
return prefix + JSON.stringify(value, null, 2).split('\n').map(function (line, index){
if(index===0){
return line;
}
return indent + '  ' + line;
}).join('\n');
}).join('\n') + (
box.boxes ? '\n' + _textifyMp(box.boxes, depth + 1):'');
}).join('\n');
};
var mp4Inspector={
inspect: inspectMp4,
textify: _textifyMp,
parseType: parseType,
findBox: findBox,
parseTraf: parse$1.traf,
parseTfdt: parse$1.tfdt,
parseHdlr: parse$1.hdlr,
parseTfhd: parse$1.tfhd,
parseTrun: parse$1.trun,
parseSidx: parse$1.sidx
};
var toUnsigned$2=bin.toUnsigned;
var toHexString$1=bin.toHexString;
var timescale, startTime, compositionStartTime, getVideoTrackIds, getTracks;
timescale=function timescale(init){
var result={},
traks=mp4Inspector.findBox(init, ['moov', 'trak']);
return traks.reduce(function (result, trak){
var tkhd, version, index, id, mdhd;
tkhd=mp4Inspector.findBox(trak, ['tkhd'])[0];
if(!tkhd){
return null;
}
version=tkhd[0];
index=version===0 ? 12:20;
id=toUnsigned$2(tkhd[index] << 24 | tkhd[index + 1] << 16 | tkhd[index + 2] << 8 | tkhd[index + 3]);
mdhd=mp4Inspector.findBox(trak, ['mdia', 'mdhd'])[0];
if(!mdhd){
return null;
}
version=mdhd[0];
index=version===0 ? 12:20;
result[id]=toUnsigned$2(mdhd[index] << 24 | mdhd[index + 1] << 16 | mdhd[index + 2] << 8 | mdhd[index + 3]);
return result;
}, result);
};
startTime=function startTime(timescale, fragment){
var trafs, baseTimes, result;
trafs=mp4Inspector.findBox(fragment, ['moof', 'traf']);
baseTimes=[].concat.apply([], trafs.map(function (traf){
return mp4Inspector.findBox(traf, ['tfhd']).map(function (tfhd){
var id, scale, baseTime;
id=toUnsigned$2(tfhd[4] << 24 | tfhd[5] << 16 | tfhd[6] << 8 | tfhd[7]);
scale=timescale[id]||90e3;
baseTime=mp4Inspector.findBox(traf, ['tfdt']).map(function (tfdt){
var version, result;
version=tfdt[0];
result=toUnsigned$2(tfdt[4] << 24 | tfdt[5] << 16 | tfdt[6] << 8 | tfdt[7]);
if(version===1){
result *=Math.pow(2, 32);
result +=toUnsigned$2(tfdt[8] << 24 | tfdt[9] << 16 | tfdt[10] << 8 | tfdt[11]);
}
return result;
})[0];
baseTime=baseTime||Infinity;
return baseTime / scale;
});
}));
result=Math.min.apply(null, baseTimes);
return isFinite(result) ? result:0;
};
compositionStartTime=function compositionStartTime(timescales, fragment){
var trafBoxes=mp4Inspector.findBox(fragment, ['moof', 'traf']);
var baseMediaDecodeTime=0;
var compositionTimeOffset=0;
var trackId;
if(trafBoxes&&trafBoxes.length){
var parsedTraf=mp4Inspector.parseTraf(trafBoxes[0]);
for (var i=0; i < parsedTraf.boxes.length; i++){
if(parsedTraf.boxes[i].type==='tfhd'){
trackId=parsedTraf.boxes[i].trackId;
}else if(parsedTraf.boxes[i].type==='tfdt'){
baseMediaDecodeTime=parsedTraf.boxes[i].baseMediaDecodeTime;
}else if(parsedTraf.boxes[i].type==='trun'&&parsedTraf.boxes[i].samples.length){
compositionTimeOffset=parsedTraf.boxes[i].samples[0].compositionTimeOffset||0;
}}
}
var timescale=timescales[trackId]||90e3;
return (baseMediaDecodeTime + compositionTimeOffset) / timescale;
};
getVideoTrackIds=function getVideoTrackIds(init){
var traks=mp4Inspector.findBox(init, ['moov', 'trak']);
var videoTrackIds=[];
traks.forEach(function (trak){
var hdlrs=mp4Inspector.findBox(trak, ['mdia', 'hdlr']);
var tkhds=mp4Inspector.findBox(trak, ['tkhd']);
hdlrs.forEach(function (hdlr, index){
var handlerType=mp4Inspector.parseType(hdlr.subarray(8, 12));
var tkhd=tkhds[index];
var view;
var version;
var trackId;
if(handlerType==='vide'){
view=new DataView(tkhd.buffer, tkhd.byteOffset, tkhd.byteLength);
version=view.getUint8(0);
trackId=version===0 ? view.getUint32(12):view.getUint32(20);
videoTrackIds.push(trackId);
}});
});
return videoTrackIds;
};
getTracks=function getTracks(init){
var traks=mp4Inspector.findBox(init, ['moov', 'trak']);
var tracks=[];
traks.forEach(function (trak){
var track={};
var tkhd=mp4Inspector.findBox(trak, ['tkhd'])[0];
var view, version;
if(tkhd){
view=new DataView(tkhd.buffer, tkhd.byteOffset, tkhd.byteLength);
version=view.getUint8(0);
track.id=version===0 ? view.getUint32(12):view.getUint32(20);
}
var hdlr=mp4Inspector.findBox(trak, ['mdia', 'hdlr'])[0];
if(hdlr){
var type=mp4Inspector.parseType(hdlr.subarray(8, 12));
if(type==='vide'){
track.type='video';
}else if(type==='soun'){
track.type='audio';
}else{
track.type=type;
}}
var stsd=mp4Inspector.findBox(trak, ['mdia', 'minf', 'stbl', 'stsd'])[0];
if(stsd){
var sampleDescriptions=stsd.subarray(8);
track.codec=mp4Inspector.parseType(sampleDescriptions.subarray(4, 8));
var codecBox=mp4Inspector.findBox(sampleDescriptions, [track.codec])[0];
var codecConfig, codecConfigType;
if(codecBox){
if(/^[a-z]vc[1-9]$/i.test(track.codec)){
codecConfig=codecBox.subarray(78);
codecConfigType=mp4Inspector.parseType(codecConfig.subarray(4, 8));
if(codecConfigType==='avcC'&&codecConfig.length > 11){
track.codec +='.';
track.codec +=toHexString$1(codecConfig[9]);
track.codec +=toHexString$1(codecConfig[10]);
track.codec +=toHexString$1(codecConfig[11]);
}else{
track.codec='avc1.4d400d';
}}else if(/^mp4[a,v]$/i.test(track.codec)){
codecConfig=codecBox.subarray(28);
codecConfigType=mp4Inspector.parseType(codecConfig.subarray(4, 8));
if(codecConfigType==='esds'&&codecConfig.length > 20&&codecConfig[19]!==0){
track.codec +='.' + toHexString$1(codecConfig[19]);
track.codec +='.' + toHexString$1(codecConfig[20] >>> 2 & 0x3f).replace(/^0/, '');
}else{
track.codec='mp4a.40.2';
}}
}}
var mdhd=mp4Inspector.findBox(trak, ['mdia', 'mdhd'])[0];
if(mdhd&&tkhd){
var index=version===0 ? 12:20;
track.timescale=toUnsigned$2(mdhd[index] << 24 | mdhd[index + 1] << 16 | mdhd[index + 2] << 8 | mdhd[index + 3]);
}
tracks.push(track);
});
return tracks;
};
var probe={
findBox: mp4Inspector.findBox,
parseType: mp4Inspector.parseType,
timescale: timescale,
startTime: startTime,
compositionStartTime: compositionStartTime,
videoTrackIds: getVideoTrackIds,
tracks: getTracks
};
var USER_DATA_REGISTERED_ITU_T_T35=4,
RBSP_TRAILING_BITS=128;
var parseSei=function parseSei(bytes){
var i=0,
result={
payloadType: -1,
payloadSize: 0
},
payloadType=0,
payloadSize=0;
while (i < bytes.byteLength){
if(bytes[i]===RBSP_TRAILING_BITS){
break;
}
while (bytes[i]===0xFF){
payloadType +=255;
i++;
}
payloadType +=bytes[i++];
while (bytes[i]===0xFF){
payloadSize +=255;
i++;
}
payloadSize +=bytes[i++];
if(!result.payload&&payloadType===USER_DATA_REGISTERED_ITU_T_T35){
result.payloadType=payloadType;
result.payloadSize=payloadSize;
result.payload=bytes.subarray(i, i + payloadSize);
break;
}
i +=payloadSize;
payloadType=0;
payloadSize=0;
}
return result;
};
var parseUserData=function parseUserData(sei){
if(sei.payload[0]!==181){
return null;
}
if((sei.payload[1] << 8 | sei.payload[2])!==49){
return null;
}
if(String.fromCharCode(sei.payload[3], sei.payload[4], sei.payload[5], sei.payload[6])!=='GA94'){
return null;
}
if(sei.payload[7]!==0x03){
return null;
}
return sei.payload.subarray(8, sei.payload.length - 1);
};
var parseCaptionPackets=function parseCaptionPackets(pts, userData){
var results=[],
i,
count,
offset,
data;
if(!(userData[0] & 0x40)){
return results;
}
count=userData[0] & 0x1f;
for (i=0; i < count; i++){
offset=i * 3;
data={
type: userData[offset + 2] & 0x03,
pts: pts
};
if(userData[offset + 2] & 0x04){
data.ccData=userData[offset + 3] << 8 | userData[offset + 4];
results.push(data);
}}
return results;
};
var discardEmulationPreventionBytes=function discardEmulationPreventionBytes(data){
var length=data.byteLength,
emulationPreventionBytesPositions=[],
i=1,
newLength,
newData;
while (i < length - 2){
if(data[i]===0&&data[i + 1]===0&&data[i + 2]===0x03){
emulationPreventionBytesPositions.push(i + 2);
i +=2;
}else{
i++;
}}
if(emulationPreventionBytesPositions.length===0){
return data;
}
newLength=length - emulationPreventionBytesPositions.length;
newData=new Uint8Array(newLength);
var sourceIndex=0;
for (i=0; i < newLength; sourceIndex++, i++){
if(sourceIndex===emulationPreventionBytesPositions[0]){
sourceIndex++;
emulationPreventionBytesPositions.shift();
}
newData[i]=data[sourceIndex];
}
return newData;
};
var captionPacketParser={
parseSei: parseSei,
parseUserData: parseUserData,
parseCaptionPackets: parseCaptionPackets,
discardEmulationPreventionBytes: discardEmulationPreventionBytes,
USER_DATA_REGISTERED_ITU_T_T35: USER_DATA_REGISTERED_ITU_T_T35
};
var Stream$1=function Stream(){
this.init=function (){
var listeners={};
this.on=function (type, listener){
if(!listeners[type]){
listeners[type]=[];
}
listeners[type]=listeners[type].concat(listener);
};
this.off=function (type, listener){
var index;
if(!listeners[type]){
return false;
}
index=listeners[type].indexOf(listener);
listeners[type]=listeners[type].slice();
listeners[type].splice(index, 1);
return index > -1;
};
this.trigger=function (type){
var callbacks, i, length, args;
callbacks=listeners[type];
if(!callbacks){
return;
}
if(arguments.length===2){
length=callbacks.length;
for (i=0; i < length; ++i){
callbacks[i].call(this, arguments[1]);
}}else{
args=[];
i=arguments.length;
for (i=1; i < arguments.length; ++i){
args.push(arguments[i]);
}
length=callbacks.length;
for (i=0; i < length; ++i){
callbacks[i].apply(this, args);
}}
};
this.dispose=function (){
listeners={};};
};};
Stream$1.prototype.pipe=function (destination){
this.on('data', function (data){
destination.push(data);
});
this.on('done', function (flushSource){
destination.flush(flushSource);
});
this.on('partialdone', function (flushSource){
destination.partialFlush(flushSource);
});
this.on('endedtimeline', function (flushSource){
destination.endTimeline(flushSource);
});
this.on('reset', function (flushSource){
destination.reset(flushSource);
});
return destination;
};
Stream$1.prototype.push=function (data){
this.trigger('data', data);
};
Stream$1.prototype.flush=function (flushSource){
this.trigger('done', flushSource);
};
Stream$1.prototype.partialFlush=function (flushSource){
this.trigger('partialdone', flushSource);
};
Stream$1.prototype.endTimeline=function (flushSource){
this.trigger('endedtimeline', flushSource);
};
Stream$1.prototype.reset=function (flushSource){
this.trigger('reset', flushSource);
};
var stream=Stream$1;
var CaptionStream=function CaptionStream(){
CaptionStream.prototype.init.call(this);
this.captionPackets_=[];
this.ccStreams_=[new Cea608Stream(0, 0),
new Cea608Stream(0, 1),
new Cea608Stream(1, 0),
new Cea608Stream(1, 1)
];
this.reset();
this.ccStreams_.forEach(function (cc){
cc.on('data', this.trigger.bind(this, 'data'));
cc.on('partialdone', this.trigger.bind(this, 'partialdone'));
cc.on('done', this.trigger.bind(this, 'done'));
}, this);
};
CaptionStream.prototype=new stream();
CaptionStream.prototype.push=function (event){
var sei, userData, newCaptionPackets;
if(event.nalUnitType!=='sei_rbsp'){
return;
}
sei=captionPacketParser.parseSei(event.escapedRBSP);
if(sei.payloadType!==captionPacketParser.USER_DATA_REGISTERED_ITU_T_T35){
return;
}
userData=captionPacketParser.parseUserData(sei);
if(!userData){
return;
}
if(event.dts < this.latestDts_){
this.ignoreNextEqualDts_=true;
return;
}else if(event.dts===this.latestDts_&&this.ignoreNextEqualDts_){
this.numSameDts_--;
if(!this.numSameDts_){
this.ignoreNextEqualDts_=false;
}
return;
}
newCaptionPackets=captionPacketParser.parseCaptionPackets(event.pts, userData);
this.captionPackets_=this.captionPackets_.concat(newCaptionPackets);
if(this.latestDts_!==event.dts){
this.numSameDts_=0;
}
this.numSameDts_++;
this.latestDts_=event.dts;
};
CaptionStream.prototype.flushCCStreams=function (flushType){
this.ccStreams_.forEach(function (cc){
return flushType==='flush' ? cc.flush():cc.partialFlush();
}, this);
};
CaptionStream.prototype.flushStream=function (flushType){
if(!this.captionPackets_.length){
this.flushCCStreams(flushType);
return;
}
this.captionPackets_.forEach(function (elem, idx){
elem.presortIndex=idx;
});
this.captionPackets_.sort(function (a, b){
if(a.pts===b.pts){
return a.presortIndex - b.presortIndex;
}
return a.pts - b.pts;
});
this.captionPackets_.forEach(function (packet){
if(packet.type < 2){
this.dispatchCea608Packet(packet);
}}, this);
this.captionPackets_.length=0;
this.flushCCStreams(flushType);
};
CaptionStream.prototype.flush=function (){
return this.flushStream('flush');
};
CaptionStream.prototype.partialFlush=function (){
return this.flushStream('partialFlush');
};
CaptionStream.prototype.reset=function (){
this.latestDts_=null;
this.ignoreNextEqualDts_=false;
this.numSameDts_=0;
this.activeCea608Channel_=[null, null];
this.ccStreams_.forEach(function (ccStream){
ccStream.reset();
});
};
CaptionStream.prototype.dispatchCea608Packet=function (packet){
if(this.setsTextOrXDSActive(packet)){
this.activeCea608Channel_[packet.type]=null;
}else if(this.setsChannel1Active(packet)){
this.activeCea608Channel_[packet.type]=0;
}else if(this.setsChannel2Active(packet)){
this.activeCea608Channel_[packet.type]=1;
}
if(this.activeCea608Channel_[packet.type]===null){
return;
}
this.ccStreams_[(packet.type << 1) + this.activeCea608Channel_[packet.type]].push(packet);
};
CaptionStream.prototype.setsChannel1Active=function (packet){
return (packet.ccData & 0x7800)===0x1000;
};
CaptionStream.prototype.setsChannel2Active=function (packet){
return (packet.ccData & 0x7800)===0x1800;
};
CaptionStream.prototype.setsTextOrXDSActive=function (packet){
return (packet.ccData & 0x7100)===0x0100||(packet.ccData & 0x78fe)===0x102a||(packet.ccData & 0x78fe)===0x182a;
};
var CHARACTER_TRANSLATION={
0x2a: 0xe1,
0x5c: 0xe9,
0x5e: 0xed,
0x5f: 0xf3,
0x60: 0xfa,
0x7b: 0xe7,
0x7c: 0xf7,
0x7d: 0xd1,
0x7e: 0xf1,
0x7f: 0x2588,
0x0130: 0xae,
0x0131: 0xb0,
0x0132: 0xbd,
0x0133: 0xbf,
0x0134: 0x2122,
0x0135: 0xa2,
0x0136: 0xa3,
0x0137: 0x266a,
0x0138: 0xe0,
0x0139: 0xa0,
0x013a: 0xe8,
0x013b: 0xe2,
0x013c: 0xea,
0x013d: 0xee,
0x013e: 0xf4,
0x013f: 0xfb,
0x0220: 0xc1,
0x0221: 0xc9,
0x0222: 0xd3,
0x0223: 0xda,
0x0224: 0xdc,
0x0225: 0xfc,
0x0226: 0x2018,
0x0227: 0xa1,
0x0228: 0x2a,
0x0229: 0x27,
0x022a: 0x2014,
0x022b: 0xa9,
0x022c: 0x2120,
0x022d: 0x2022,
0x022e: 0x201c,
0x022f: 0x201d,
0x0230: 0xc0,
0x0231: 0xc2,
0x0232: 0xc7,
0x0233: 0xc8,
0x0234: 0xca,
0x0235: 0xcb,
0x0236: 0xeb,
0x0237: 0xce,
0x0238: 0xcf,
0x0239: 0xef,
0x023a: 0xd4,
0x023b: 0xd9,
0x023c: 0xf9,
0x023d: 0xdb,
0x023e: 0xab,
0x023f: 0xbb,
0x0320: 0xc3,
0x0321: 0xe3,
0x0322: 0xcd,
0x0323: 0xcc,
0x0324: 0xec,
0x0325: 0xd2,
0x0326: 0xf2,
0x0327: 0xd5,
0x0328: 0xf5,
0x0329: 0x7b,
0x032a: 0x7d,
0x032b: 0x5c,
0x032c: 0x5e,
0x032d: 0x5f,
0x032e: 0x7c,
0x032f: 0x7e,
0x0330: 0xc4,
0x0331: 0xe4,
0x0332: 0xd6,
0x0333: 0xf6,
0x0334: 0xdf,
0x0335: 0xa5,
0x0336: 0xa4,
0x0337: 0x2502,
0x0338: 0xc5,
0x0339: 0xe5,
0x033a: 0xd8,
0x033b: 0xf8,
0x033c: 0x250c,
0x033d: 0x2510,
0x033e: 0x2514,
0x033f: 0x2518 
};
var getCharFromCode=function getCharFromCode(code){
if(code===null){
return '';
}
code=CHARACTER_TRANSLATION[code]||code;
return String.fromCharCode(code);
};
var BOTTOM_ROW=14;
var ROWS=[0x1100, 0x1120, 0x1200, 0x1220, 0x1500, 0x1520, 0x1600, 0x1620, 0x1700, 0x1720, 0x1000, 0x1300, 0x1320, 0x1400, 0x1420];
var createDisplayBuffer=function createDisplayBuffer(){
var result=[],
i=BOTTOM_ROW + 1;
while (i--){
result.push('');
}
return result;
};
var Cea608Stream=function Cea608Stream(field, dataChannel){
Cea608Stream.prototype.init.call(this);
this.field_=field||0;
this.dataChannel_=dataChannel||0;
this.name_='CC' + ((this.field_ << 1 | this.dataChannel_) + 1);
this.setConstants();
this.reset();
this.push=function (packet){
var data, swap, char0, char1, text;
data=packet.ccData & 0x7f7f;
if(data===this.lastControlCode_){
this.lastControlCode_=null;
return;
}
if((data & 0xf000)===0x1000){
this.lastControlCode_=data;
}else if(data!==this.PADDING_){
this.lastControlCode_=null;
}
char0=data >>> 8;
char1=data & 0xff;
if(data===this.PADDING_){
return;
}else if(data===this.RESUME_CAPTION_LOADING_){
this.mode_='popOn';
}else if(data===this.END_OF_CAPTION_){
this.mode_='popOn';
this.clearFormatting(packet.pts);
this.flushDisplayed(packet.pts);
swap=this.displayed_;
this.displayed_=this.nonDisplayed_;
this.nonDisplayed_=swap;
this.startPts_=packet.pts;
}else if(data===this.ROLL_UP_2_ROWS_){
this.rollUpRows_=2;
this.setRollUp(packet.pts);
}else if(data===this.ROLL_UP_3_ROWS_){
this.rollUpRows_=3;
this.setRollUp(packet.pts);
}else if(data===this.ROLL_UP_4_ROWS_){
this.rollUpRows_=4;
this.setRollUp(packet.pts);
}else if(data===this.CARRIAGE_RETURN_){
this.clearFormatting(packet.pts);
this.flushDisplayed(packet.pts);
this.shiftRowsUp_();
this.startPts_=packet.pts;
}else if(data===this.BACKSPACE_){
if(this.mode_==='popOn'){
this.nonDisplayed_[this.row_]=this.nonDisplayed_[this.row_].slice(0, -1);
}else{
this.displayed_[this.row_]=this.displayed_[this.row_].slice(0, -1);
}}else if(data===this.ERASE_DISPLAYED_MEMORY_){
this.flushDisplayed(packet.pts);
this.displayed_=createDisplayBuffer();
}else if(data===this.ERASE_NON_DISPLAYED_MEMORY_){
this.nonDisplayed_=createDisplayBuffer();
}else if(data===this.RESUME_DIRECT_CAPTIONING_){
if(this.mode_!=='paintOn'){
this.flushDisplayed(packet.pts);
this.displayed_=createDisplayBuffer();
}
this.mode_='paintOn';
this.startPts_=packet.pts;
}else if(this.isSpecialCharacter(char0, char1)){
char0=(char0 & 0x03) << 8;
text=getCharFromCode(char0 | char1);
this[this.mode_](packet.pts, text);
this.column_++;
}else if(this.isExtCharacter(char0, char1)){
if(this.mode_==='popOn'){
this.nonDisplayed_[this.row_]=this.nonDisplayed_[this.row_].slice(0, -1);
}else{
this.displayed_[this.row_]=this.displayed_[this.row_].slice(0, -1);
}
char0=(char0 & 0x03) << 8;
text=getCharFromCode(char0 | char1);
this[this.mode_](packet.pts, text);
this.column_++;
}else if(this.isMidRowCode(char0, char1)){
this.clearFormatting(packet.pts);
this[this.mode_](packet.pts, ' ');
this.column_++;
if((char1 & 0xe)===0xe){
this.addFormatting(packet.pts, ['i']);
}
if((char1 & 0x1)===0x1){
this.addFormatting(packet.pts, ['u']);
}}else if(this.isOffsetControlCode(char0, char1)){
this.column_ +=char1 & 0x03;
}else if(this.isPAC(char0, char1)){
var row=ROWS.indexOf(data & 0x1f20);
if(this.mode_==='rollUp'){
if(row - this.rollUpRows_ + 1 < 0){
row=this.rollUpRows_ - 1;
}
this.setRollUp(packet.pts, row);
}
if(row!==this.row_){
this.clearFormatting(packet.pts);
this.row_=row;
}
if(char1 & 0x1&&this.formatting_.indexOf('u')===-1){
this.addFormatting(packet.pts, ['u']);
}
if((data & 0x10)===0x10){
this.column_=((data & 0xe) >> 1) * 4;
}
if(this.isColorPAC(char1)){
if((char1 & 0xe)===0xe){
this.addFormatting(packet.pts, ['i']);
}}
}else if(this.isNormalChar(char0)){
if(char1===0x00){
char1=null;
}
text=getCharFromCode(char0);
text +=getCharFromCode(char1);
this[this.mode_](packet.pts, text);
this.column_ +=text.length;
}};};
Cea608Stream.prototype=new stream();
Cea608Stream.prototype.flushDisplayed=function (pts){
var content=this.displayed_
.map(function (row){
try {
return row.trim();
} catch (e){
console.error('Skipping malformed caption.');
return '';
}})
.join('\n')
.replace(/^\n+|\n+$/g, '');
if(content.length){
this.trigger('data', {
startPts: this.startPts_,
endPts: pts,
text: content,
stream: this.name_
});
}};
Cea608Stream.prototype.reset=function (){
this.mode_='popOn';
this.topRow_=0;
this.startPts_=0;
this.displayed_=createDisplayBuffer();
this.nonDisplayed_=createDisplayBuffer();
this.lastControlCode_=null;
this.column_=0;
this.row_=BOTTOM_ROW;
this.rollUpRows_=2;
this.formatting_=[];
};
Cea608Stream.prototype.setConstants=function (){
if(this.dataChannel_===0){
this.BASE_=0x10;
this.EXT_=0x11;
this.CONTROL_=(0x14 | this.field_) << 8;
this.OFFSET_=0x17;
}else if(this.dataChannel_===1){
this.BASE_=0x18;
this.EXT_=0x19;
this.CONTROL_=(0x1c | this.field_) << 8;
this.OFFSET_=0x1f;
}
this.PADDING_=0x0000;
this.RESUME_CAPTION_LOADING_=this.CONTROL_ | 0x20;
this.END_OF_CAPTION_=this.CONTROL_ | 0x2f;
this.ROLL_UP_2_ROWS_=this.CONTROL_ | 0x25;
this.ROLL_UP_3_ROWS_=this.CONTROL_ | 0x26;
this.ROLL_UP_4_ROWS_=this.CONTROL_ | 0x27;
this.CARRIAGE_RETURN_=this.CONTROL_ | 0x2d;
this.RESUME_DIRECT_CAPTIONING_=this.CONTROL_ | 0x29;
this.BACKSPACE_=this.CONTROL_ | 0x21;
this.ERASE_DISPLAYED_MEMORY_=this.CONTROL_ | 0x2c;
this.ERASE_NON_DISPLAYED_MEMORY_=this.CONTROL_ | 0x2e;
};
Cea608Stream.prototype.isSpecialCharacter=function (char0, char1){
return char0===this.EXT_&&char1 >=0x30&&char1 <=0x3f;
};
Cea608Stream.prototype.isExtCharacter=function (char0, char1){
return (char0===this.EXT_ + 1||char0===this.EXT_ + 2)&&char1 >=0x20&&char1 <=0x3f;
};
Cea608Stream.prototype.isMidRowCode=function (char0, char1){
return char0===this.EXT_&&char1 >=0x20&&char1 <=0x2f;
};
Cea608Stream.prototype.isOffsetControlCode=function (char0, char1){
return char0===this.OFFSET_&&char1 >=0x21&&char1 <=0x23;
};
Cea608Stream.prototype.isPAC=function (char0, char1){
return char0 >=this.BASE_&&char0 < this.BASE_ + 8&&char1 >=0x40&&char1 <=0x7f;
};
Cea608Stream.prototype.isColorPAC=function (char1){
return char1 >=0x40&&char1 <=0x4f||char1 >=0x60&&char1 <=0x7f;
};
Cea608Stream.prototype.isNormalChar=function (_char){
return _char >=0x20&&_char <=0x7f;
};
Cea608Stream.prototype.setRollUp=function (pts, newBaseRow){
if(this.mode_!=='rollUp'){
this.row_=BOTTOM_ROW;
this.mode_='rollUp';
this.flushDisplayed(pts);
this.nonDisplayed_=createDisplayBuffer();
this.displayed_=createDisplayBuffer();
}
if(newBaseRow!==undefined&&newBaseRow!==this.row_){
for (var i=0; i < this.rollUpRows_; i++){
this.displayed_[newBaseRow - i]=this.displayed_[this.row_ - i];
this.displayed_[this.row_ - i]='';
}}
if(newBaseRow===undefined){
newBaseRow=this.row_;
}
this.topRow_=newBaseRow - this.rollUpRows_ + 1;
};
Cea608Stream.prototype.addFormatting=function (pts, format){
this.formatting_=this.formatting_.concat(format);
var text=format.reduce(function (text, format){
return text + '<' + format + '>';
}, '');
this[this.mode_](pts, text);
};
Cea608Stream.prototype.clearFormatting=function (pts){
if(!this.formatting_.length){
return;
}
var text=this.formatting_.reverse().reduce(function (text, format){
return text + '</' + format + '>';
}, '');
this.formatting_=[];
this[this.mode_](pts, text);
};
Cea608Stream.prototype.popOn=function (pts, text){
var baseRow=this.nonDisplayed_[this.row_];
baseRow +=text;
this.nonDisplayed_[this.row_]=baseRow;
};
Cea608Stream.prototype.rollUp=function (pts, text){
var baseRow=this.displayed_[this.row_];
baseRow +=text;
this.displayed_[this.row_]=baseRow;
};
Cea608Stream.prototype.shiftRowsUp_=function (){
var i;
for (i=0; i < this.topRow_; i++){
this.displayed_[i]='';
}
for (i=this.row_ + 1; i < BOTTOM_ROW + 1; i++){
this.displayed_[i]='';
}
for (i=this.topRow_; i < this.row_; i++){
this.displayed_[i]=this.displayed_[i + 1];
}
this.displayed_[this.row_]='';
};
Cea608Stream.prototype.paintOn=function (pts, text){
var baseRow=this.displayed_[this.row_];
baseRow +=text;
this.displayed_[this.row_]=baseRow;
};
var captionStream={
CaptionStream: CaptionStream,
Cea608Stream: Cea608Stream
};
var discardEmulationPreventionBytes$1=captionPacketParser.discardEmulationPreventionBytes;
var CaptionStream$1=captionStream.CaptionStream;
var mapToSample=function mapToSample(offset, samples){
var approximateOffset=offset;
for (var i=0; i < samples.length; i++){
var sample=samples[i];
if(approximateOffset < sample.size){
return sample;
}
approximateOffset -=sample.size;
}
return null;
};
var findSeiNals=function findSeiNals(avcStream, samples, trackId){
var avcView=new DataView(avcStream.buffer, avcStream.byteOffset, avcStream.byteLength),
result=[],
seiNal,
i,
length,
lastMatchedSample;
for (i=0; i + 4 < avcStream.length; i +=length){
length=avcView.getUint32(i);
i +=4;
if(length <=0){
continue;
}
switch (avcStream[i] & 0x1F){
case 0x06:
var data=avcStream.subarray(i + 1, i + 1 + length);
var matchingSample=mapToSample(i, samples);
seiNal={
nalUnitType: 'sei_rbsp',
size: length,
data: data,
escapedRBSP: discardEmulationPreventionBytes$1(data),
trackId: trackId
};
if(matchingSample){
seiNal.pts=matchingSample.pts;
seiNal.dts=matchingSample.dts;
lastMatchedSample=matchingSample;
}else{
seiNal.pts=lastMatchedSample.pts;
seiNal.dts=lastMatchedSample.dts;
}
result.push(seiNal);
break;
default:
break;
}}
return result;
};
var parseSamples=function parseSamples(truns, baseMediaDecodeTime, tfhd){
var currentDts=baseMediaDecodeTime;
var defaultSampleDuration=tfhd.defaultSampleDuration||0;
var defaultSampleSize=tfhd.defaultSampleSize||0;
var trackId=tfhd.trackId;
var allSamples=[];
truns.forEach(function (trun){
var trackRun=mp4Inspector.parseTrun(trun);
var samples=trackRun.samples;
samples.forEach(function (sample){
if(sample.duration===undefined){
sample.duration=defaultSampleDuration;
}
if(sample.size===undefined){
sample.size=defaultSampleSize;
}
sample.trackId=trackId;
sample.dts=currentDts;
if(sample.compositionTimeOffset===undefined){
sample.compositionTimeOffset=0;
}
sample.pts=currentDts + sample.compositionTimeOffset;
currentDts +=sample.duration;
});
allSamples=allSamples.concat(samples);
});
return allSamples;
};
var parseCaptionNals=function parseCaptionNals(segment, videoTrackId){
var trafs=probe.findBox(segment, ['moof', 'traf']);
var mdats=probe.findBox(segment, ['mdat']);
var captionNals={};
var mdatTrafPairs=[];
mdats.forEach(function (mdat, index){
var matchingTraf=trafs[index];
mdatTrafPairs.push({
mdat: mdat,
traf: matchingTraf
});
});
mdatTrafPairs.forEach(function (pair){
var mdat=pair.mdat;
var traf=pair.traf;
var tfhd=probe.findBox(traf, ['tfhd']);
var headerInfo=mp4Inspector.parseTfhd(tfhd[0]);
var trackId=headerInfo.trackId;
var tfdt=probe.findBox(traf, ['tfdt']);
var baseMediaDecodeTime=tfdt.length > 0 ? mp4Inspector.parseTfdt(tfdt[0]).baseMediaDecodeTime:0;
var truns=probe.findBox(traf, ['trun']);
var samples;
var seiNals;
if(videoTrackId===trackId&&truns.length > 0){
samples=parseSamples(truns, baseMediaDecodeTime, headerInfo);
seiNals=findSeiNals(mdat, samples, trackId);
if(!captionNals[trackId]){
captionNals[trackId]=[];
}
captionNals[trackId]=captionNals[trackId].concat(seiNals);
}});
return captionNals;
};
var parseEmbeddedCaptions=function parseEmbeddedCaptions(segment, trackId, timescale){
var seiNals;
if(trackId===null){
return null;
}
seiNals=parseCaptionNals(segment, trackId);
return {
seiNals: seiNals[trackId],
timescale: timescale
};};
var CaptionParser=function CaptionParser(){
var isInitialized=false;
var captionStream;
var segmentCache;
var trackId;
var timescale;
var parsedCaptions;
var parsingPartial;
this.isInitialized=function (){
return isInitialized;
};
this.init=function (options){
captionStream=new CaptionStream$1();
isInitialized=true;
parsingPartial=options ? options.isPartial:false;
captionStream.on('data', function (event){
event.startTime=event.startPts / timescale;
event.endTime=event.endPts / timescale;
parsedCaptions.captions.push(event);
parsedCaptions.captionStreams[event.stream]=true;
});
};
this.isNewInit=function (videoTrackIds, timescales){
if(videoTrackIds&&videoTrackIds.length===0||timescales&&typeof timescales==='object'&&Object.keys(timescales).length===0){
return false;
}
return trackId!==videoTrackIds[0]||timescale!==timescales[trackId];
};
this.parse=function (segment, videoTrackIds, timescales){
var parsedData;
if(!this.isInitialized()){
return null;
}else if(!videoTrackIds||!timescales){
return null;
}else if(this.isNewInit(videoTrackIds, timescales)){
trackId=videoTrackIds[0];
timescale=timescales[trackId];
}else if(trackId===null||!timescale){
segmentCache.push(segment);
return null;
}
while (segmentCache.length > 0){
var cachedSegment=segmentCache.shift();
this.parse(cachedSegment, videoTrackIds, timescales);
}
parsedData=parseEmbeddedCaptions(segment, trackId, timescale);
if(parsedData===null||!parsedData.seiNals){
return null;
}
this.pushNals(parsedData.seiNals);
this.flushStream();
return parsedCaptions;
};
this.pushNals=function (nals){
if(!this.isInitialized()||!nals||nals.length===0){
return null;
}
nals.forEach(function (nal){
captionStream.push(nal);
});
};
this.flushStream=function (){
if(!this.isInitialized()){
return null;
}
if(!parsingPartial){
captionStream.flush();
}else{
captionStream.partialFlush();
}};
this.clearParsedCaptions=function (){
parsedCaptions.captions=[];
parsedCaptions.captionStreams={};};
this.resetCaptionStream=function (){
if(!this.isInitialized()){
return null;
}
captionStream.reset();
};
this.clearAllCaptions=function (){
this.clearParsedCaptions();
this.resetCaptionStream();
};
this.reset=function (){
segmentCache=[];
trackId=null;
timescale=null;
if(!parsedCaptions){
parsedCaptions={
captions: [],
captionStreams: {}};}else{
this.clearParsedCaptions();
}
this.resetCaptionStream();
};
this.reset();
};
var captionParser=CaptionParser;
var streamTypes={
H264_STREAM_TYPE: 0x1B,
ADTS_STREAM_TYPE: 0x0F,
METADATA_STREAM_TYPE: 0x15
};
var MAX_TS=8589934592;
var RO_THRESH=4294967296;
var TYPE_SHARED='shared';
var handleRollover=function handleRollover(value, reference){
var direction=1;
if(value > reference){
direction=-1;
}
while (Math.abs(reference - value) > RO_THRESH){
value +=direction * MAX_TS;
}
return value;
};
var TimestampRolloverStream=function TimestampRolloverStream(type){
var lastDTS, referenceDTS;
TimestampRolloverStream.prototype.init.call(this);
this.type_=type||TYPE_SHARED;
this.push=function (data){
if(this.type_!==TYPE_SHARED&&data.type!==this.type_){
return;
}
if(referenceDTS===undefined){
referenceDTS=data.dts;
}
data.dts=handleRollover(data.dts, referenceDTS);
data.pts=handleRollover(data.pts, referenceDTS);
lastDTS=data.dts;
this.trigger('data', data);
};
this.flush=function (){
referenceDTS=lastDTS;
this.trigger('done');
};
this.endTimeline=function (){
this.flush();
this.trigger('endedtimeline');
};
this.discontinuity=function (){
referenceDTS=void 0;
lastDTS=void 0;
};
this.reset=function (){
this.discontinuity();
this.trigger('reset');
};};
TimestampRolloverStream.prototype=new stream();
var timestampRolloverStream={
TimestampRolloverStream: TimestampRolloverStream,
handleRollover: handleRollover
};
var parsePid=function parsePid(packet){
var pid=packet[1] & 0x1f;
pid <<=8;
pid |=packet[2];
return pid;
};
var parsePayloadUnitStartIndicator=function parsePayloadUnitStartIndicator(packet){
return !!(packet[1] & 0x40);
};
var parseAdaptionField=function parseAdaptionField(packet){
var offset=0;
if((packet[3] & 0x30) >>> 4 > 0x01){
offset +=packet[4] + 1;
}
return offset;
};
var parseType$1=function parseType(packet, pmtPid){
var pid=parsePid(packet);
if(pid===0){
return 'pat';
}else if(pid===pmtPid){
return 'pmt';
}else if(pmtPid){
return 'pes';
}
return null;
};
var parsePat=function parsePat(packet){
var pusi=parsePayloadUnitStartIndicator(packet);
var offset=4 + parseAdaptionField(packet);
if(pusi){
offset +=packet[offset] + 1;
}
return (packet[offset + 10] & 0x1f) << 8 | packet[offset + 11];
};
var parsePmt=function parsePmt(packet){
var programMapTable={};
var pusi=parsePayloadUnitStartIndicator(packet);
var payloadOffset=4 + parseAdaptionField(packet);
if(pusi){
payloadOffset +=packet[payloadOffset] + 1;
}
if(!(packet[payloadOffset + 5] & 0x01)){
return;
}
var sectionLength, tableEnd, programInfoLength;
sectionLength=(packet[payloadOffset + 1] & 0x0f) << 8 | packet[payloadOffset + 2];
tableEnd=3 + sectionLength - 4;
programInfoLength=(packet[payloadOffset + 10] & 0x0f) << 8 | packet[payloadOffset + 11];
var offset=12 + programInfoLength;
while (offset < tableEnd){
var i=payloadOffset + offset;
programMapTable[(packet[i + 1] & 0x1F) << 8 | packet[i + 2]]=packet[i];
offset +=((packet[i + 3] & 0x0F) << 8 | packet[i + 4]) + 5;
}
return programMapTable;
};
var parsePesType=function parsePesType(packet, programMapTable){
var pid=parsePid(packet);
var type=programMapTable[pid];
switch (type){
case streamTypes.H264_STREAM_TYPE:
return 'video';
case streamTypes.ADTS_STREAM_TYPE:
return 'audio';
case streamTypes.METADATA_STREAM_TYPE:
return 'timed-metadata';
default:
return null;
}};
var parsePesTime=function parsePesTime(packet){
var pusi=parsePayloadUnitStartIndicator(packet);
if(!pusi){
return null;
}
var offset=4 + parseAdaptionField(packet);
if(offset >=packet.byteLength){
return null;
}
var pes=null;
var ptsDtsFlags;
ptsDtsFlags=packet[offset + 7];
if(ptsDtsFlags & 0xC0){
pes={};
pes.pts=(packet[offset + 9] & 0x0E) << 27 | (packet[offset + 10] & 0xFF) << 20 | (packet[offset + 11] & 0xFE) << 12 | (packet[offset + 12] & 0xFF) << 5 | (packet[offset + 13] & 0xFE) >>> 3;
pes.pts *=4;
pes.pts +=(packet[offset + 13] & 0x06) >>> 1;
pes.dts=pes.pts;
if(ptsDtsFlags & 0x40){
pes.dts=(packet[offset + 14] & 0x0E) << 27 | (packet[offset + 15] & 0xFF) << 20 | (packet[offset + 16] & 0xFE) << 12 | (packet[offset + 17] & 0xFF) << 5 | (packet[offset + 18] & 0xFE) >>> 3;
pes.dts *=4;
pes.dts +=(packet[offset + 18] & 0x06) >>> 1;
}}
return pes;
};
var parseNalUnitType=function parseNalUnitType(type){
switch (type){
case 0x05:
return 'slice_layer_without_partitioning_rbsp_idr';
case 0x06:
return 'sei_rbsp';
case 0x07:
return 'seq_parameter_set_rbsp';
case 0x08:
return 'pic_parameter_set_rbsp';
case 0x09:
return 'access_unit_delimiter_rbsp';
default:
return null;
}};
var videoPacketContainsKeyFrame=function videoPacketContainsKeyFrame(packet){
var offset=4 + parseAdaptionField(packet);
var frameBuffer=packet.subarray(offset);
var frameI=0;
var frameSyncPoint=0;
var foundKeyFrame=false;
var nalType;
for (; frameSyncPoint < frameBuffer.byteLength - 3; frameSyncPoint++){
if(frameBuffer[frameSyncPoint + 2]===1){
frameI=frameSyncPoint + 5;
break;
}}
while (frameI < frameBuffer.byteLength){
switch (frameBuffer[frameI]){
case 0:
if(frameBuffer[frameI - 1]!==0){
frameI +=2;
break;
}else if(frameBuffer[frameI - 2]!==0){
frameI++;
break;
}
if(frameSyncPoint + 3!==frameI - 2){
nalType=parseNalUnitType(frameBuffer[frameSyncPoint + 3] & 0x1f);
if(nalType==='slice_layer_without_partitioning_rbsp_idr'){
foundKeyFrame=true;
}}
do {
frameI++;
} while (frameBuffer[frameI]!==1&&frameI < frameBuffer.length);
frameSyncPoint=frameI - 2;
frameI +=3;
break;
case 1:
if(frameBuffer[frameI - 1]!==0||frameBuffer[frameI - 2]!==0){
frameI +=3;
break;
}
nalType=parseNalUnitType(frameBuffer[frameSyncPoint + 3] & 0x1f);
if(nalType==='slice_layer_without_partitioning_rbsp_idr'){
foundKeyFrame=true;
}
frameSyncPoint=frameI - 2;
frameI +=3;
break;
default:
frameI +=3;
break;
}}
frameBuffer=frameBuffer.subarray(frameSyncPoint);
frameI -=frameSyncPoint;
frameSyncPoint=0;
if(frameBuffer&&frameBuffer.byteLength > 3){
nalType=parseNalUnitType(frameBuffer[frameSyncPoint + 3] & 0x1f);
if(nalType==='slice_layer_without_partitioning_rbsp_idr'){
foundKeyFrame=true;
}}
return foundKeyFrame;
};
var probe$1={
parseType: parseType$1,
parsePat: parsePat,
parsePmt: parsePmt,
parsePayloadUnitStartIndicator: parsePayloadUnitStartIndicator,
parsePesType: parsePesType,
parsePesTime: parsePesTime,
videoPacketContainsKeyFrame: videoPacketContainsKeyFrame
};
var ADTS_SAMPLING_FREQUENCIES=[96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350];
var isLikelyAacData=function isLikelyAacData(data){
if(data[0]==='I'.charCodeAt(0)&&data[1]==='D'.charCodeAt(0)&&data[2]==='3'.charCodeAt(0)){
return true;
}
return false;
};
var parseSyncSafeInteger=function parseSyncSafeInteger(data){
return data[0] << 21 | data[1] << 14 | data[2] << 7 | data[3];
};
var percentEncode=function percentEncode(bytes, start, end){
var i,
result='';
for (i=start; i < end; i++){
result +='%' + ('00' + bytes[i].toString(16)).slice(-2);
}
return result;
};
var parseIso88591=function parseIso88591(bytes, start, end){
return unescape(percentEncode(bytes, start, end));
};
var parseId3TagSize=function parseId3TagSize(header, byteIndex){
var returnSize=header[byteIndex + 6] << 21 | header[byteIndex + 7] << 14 | header[byteIndex + 8] << 7 | header[byteIndex + 9],
flags=header[byteIndex + 5],
footerPresent=(flags & 16) >> 4;
if(footerPresent){
return returnSize + 20;
}
return returnSize + 10;
};
var parseAdtsSize=function parseAdtsSize(header, byteIndex){
var lowThree=(header[byteIndex + 5] & 0xE0) >> 5,
middle=header[byteIndex + 4] << 3,
highTwo=header[byteIndex + 3] & 0x3 << 11;
return highTwo | middle | lowThree;
};
var parseType$2=function parseType(header, byteIndex){
if(header[byteIndex]==='I'.charCodeAt(0)&&header[byteIndex + 1]==='D'.charCodeAt(0)&&header[byteIndex + 2]==='3'.charCodeAt(0)){
return 'timed-metadata';
}else if(header[byteIndex] & 0xff===0xff&&(header[byteIndex + 1] & 0xf0)===0xf0){
return 'audio';
}
return null;
};
var parseSampleRate=function parseSampleRate(packet){
var i=0;
while (i + 5 < packet.length){
if(packet[i]!==0xFF||(packet[i + 1] & 0xF6)!==0xF0){
i++;
continue;
}
return ADTS_SAMPLING_FREQUENCIES[(packet[i + 2] & 0x3c) >>> 2];
}
return null;
};
var parseAacTimestamp=function parseAacTimestamp(packet){
var frameStart, frameSize, frame, frameHeader;
frameStart=10;
if(packet[5] & 0x40){
frameStart +=4;
frameStart +=parseSyncSafeInteger(packet.subarray(10, 14));
}
do {
frameSize=parseSyncSafeInteger(packet.subarray(frameStart + 4, frameStart + 8));
if(frameSize < 1){
return null;
}
frameHeader=String.fromCharCode(packet[frameStart], packet[frameStart + 1], packet[frameStart + 2], packet[frameStart + 3]);
if(frameHeader==='PRIV'){
frame=packet.subarray(frameStart + 10, frameStart + frameSize + 10);
for (var i=0; i < frame.byteLength; i++){
if(frame[i]===0){
var owner=parseIso88591(frame, 0, i);
if(owner==='com.apple.streaming.transportStreamTimestamp'){
var d=frame.subarray(i + 1);
var size=(d[3] & 0x01) << 30 | d[4] << 22 | d[5] << 14 | d[6] << 6 | d[7] >>> 2;
size *=4;
size +=d[7] & 0x03;
return size;
}
break;
}}
}
frameStart +=10;
frameStart +=frameSize;
} while (frameStart < packet.byteLength);
return null;
};
var utils={
isLikelyAacData: isLikelyAacData,
parseId3TagSize: parseId3TagSize,
parseAdtsSize: parseAdtsSize,
parseType: parseType$2,
parseSampleRate: parseSampleRate,
parseAacTimestamp: parseAacTimestamp
};
var ONE_SECOND_IN_TS=90000,
secondsToVideoTs,
secondsToAudioTs,
videoTsToSeconds,
audioTsToSeconds,
audioTsToVideoTs,
videoTsToAudioTs,
metadataTsToSeconds;
secondsToVideoTs=function secondsToVideoTs(seconds){
return seconds * ONE_SECOND_IN_TS;
};
secondsToAudioTs=function secondsToAudioTs(seconds, sampleRate){
return seconds * sampleRate;
};
videoTsToSeconds=function videoTsToSeconds(timestamp){
return timestamp / ONE_SECOND_IN_TS;
};
audioTsToSeconds=function audioTsToSeconds(timestamp, sampleRate){
return timestamp / sampleRate;
};
audioTsToVideoTs=function audioTsToVideoTs(timestamp, sampleRate){
return secondsToVideoTs(audioTsToSeconds(timestamp, sampleRate));
};
videoTsToAudioTs=function videoTsToAudioTs(timestamp, sampleRate){
return secondsToAudioTs(videoTsToSeconds(timestamp), sampleRate);
};
metadataTsToSeconds=function metadataTsToSeconds(timestamp, timelineStartPts, keepOriginalTimestamps){
return videoTsToSeconds(keepOriginalTimestamps ? timestamp:timestamp - timelineStartPts);
};
var clock={
ONE_SECOND_IN_TS: ONE_SECOND_IN_TS,
secondsToVideoTs: secondsToVideoTs,
secondsToAudioTs: secondsToAudioTs,
videoTsToSeconds: videoTsToSeconds,
audioTsToSeconds: audioTsToSeconds,
audioTsToVideoTs: audioTsToVideoTs,
videoTsToAudioTs: videoTsToAudioTs,
metadataTsToSeconds: metadataTsToSeconds
};
var handleRollover$1=timestampRolloverStream.handleRollover;
var probe$2={};
probe$2.ts=probe$1;
probe$2.aac=utils;
var ONE_SECOND_IN_TS$1=clock.ONE_SECOND_IN_TS;
var MP2T_PACKET_LENGTH=188,
SYNC_BYTE=0x47;
var parsePsi_=function parsePsi_(bytes, pmt){
var startIndex=0,
endIndex=MP2T_PACKET_LENGTH,
packet,
type;
while (endIndex < bytes.byteLength){
if(bytes[startIndex]===SYNC_BYTE&&bytes[endIndex]===SYNC_BYTE){
packet=bytes.subarray(startIndex, endIndex);
type=probe$2.ts.parseType(packet, pmt.pid);
switch (type){
case 'pat':
if(!pmt.pid){
pmt.pid=probe$2.ts.parsePat(packet);
}
break;
case 'pmt':
if(!pmt.table){
pmt.table=probe$2.ts.parsePmt(packet);
}
break;
default:
break;
}
if(pmt.pid&&pmt.table){
return;
}
startIndex +=MP2T_PACKET_LENGTH;
endIndex +=MP2T_PACKET_LENGTH;
continue;
}
startIndex++;
endIndex++;
}};
var parseAudioPes_=function parseAudioPes_(bytes, pmt, result){
var startIndex=0,
endIndex=MP2T_PACKET_LENGTH,
packet,
type,
pesType,
pusi,
parsed;
var endLoop=false;
while (endIndex <=bytes.byteLength){
if(bytes[startIndex]===SYNC_BYTE&&(bytes[endIndex]===SYNC_BYTE||endIndex===bytes.byteLength)){
packet=bytes.subarray(startIndex, endIndex);
type=probe$2.ts.parseType(packet, pmt.pid);
switch (type){
case 'pes':
pesType=probe$2.ts.parsePesType(packet, pmt.table);
pusi=probe$2.ts.parsePayloadUnitStartIndicator(packet);
if(pesType==='audio'&&pusi){
parsed=probe$2.ts.parsePesTime(packet);
if(parsed){
parsed.type='audio';
result.audio.push(parsed);
endLoop=true;
}}
break;
default:
break;
}
if(endLoop){
break;
}
startIndex +=MP2T_PACKET_LENGTH;
endIndex +=MP2T_PACKET_LENGTH;
continue;
}
startIndex++;
endIndex++;
}
endIndex=bytes.byteLength;
startIndex=endIndex - MP2T_PACKET_LENGTH;
endLoop=false;
while (startIndex >=0){
if(bytes[startIndex]===SYNC_BYTE&&(bytes[endIndex]===SYNC_BYTE||endIndex===bytes.byteLength)){
packet=bytes.subarray(startIndex, endIndex);
type=probe$2.ts.parseType(packet, pmt.pid);
switch (type){
case 'pes':
pesType=probe$2.ts.parsePesType(packet, pmt.table);
pusi=probe$2.ts.parsePayloadUnitStartIndicator(packet);
if(pesType==='audio'&&pusi){
parsed=probe$2.ts.parsePesTime(packet);
if(parsed){
parsed.type='audio';
result.audio.push(parsed);
endLoop=true;
}}
break;
default:
break;
}
if(endLoop){
break;
}
startIndex -=MP2T_PACKET_LENGTH;
endIndex -=MP2T_PACKET_LENGTH;
continue;
}
startIndex--;
endIndex--;
}};
var parseVideoPes_=function parseVideoPes_(bytes, pmt, result){
var startIndex=0,
endIndex=MP2T_PACKET_LENGTH,
packet,
type,
pesType,
pusi,
parsed,
frame,
i,
pes;
var endLoop=false;
var currentFrame={
data: [],
size: 0
};
while (endIndex < bytes.byteLength){
if(bytes[startIndex]===SYNC_BYTE&&bytes[endIndex]===SYNC_BYTE){
packet=bytes.subarray(startIndex, endIndex);
type=probe$2.ts.parseType(packet, pmt.pid);
switch (type){
case 'pes':
pesType=probe$2.ts.parsePesType(packet, pmt.table);
pusi=probe$2.ts.parsePayloadUnitStartIndicator(packet);
if(pesType==='video'){
if(pusi&&!endLoop){
parsed=probe$2.ts.parsePesTime(packet);
if(parsed){
parsed.type='video';
result.video.push(parsed);
endLoop=true;
}}
if(!result.firstKeyFrame){
if(pusi){
if(currentFrame.size!==0){
frame=new Uint8Array(currentFrame.size);
i=0;
while (currentFrame.data.length){
pes=currentFrame.data.shift();
frame.set(pes, i);
i +=pes.byteLength;
}
if(probe$2.ts.videoPacketContainsKeyFrame(frame)){
var firstKeyFrame=probe$2.ts.parsePesTime(frame);
if(firstKeyFrame){
result.firstKeyFrame=firstKeyFrame;
result.firstKeyFrame.type='video';
}else{
console.warn('Failed to extract PTS/DTS from PES at first keyframe. ' + 'This could be an unusual TS segment, or else mux.js did not ' + 'parse your TS segment correctly. If you know your TS ' + 'segments do contain PTS/DTS on keyframes please file a bug ' + 'report! You can try ffprobe to double check for yourself.');
}}
currentFrame.size=0;
}}
currentFrame.data.push(packet);
currentFrame.size +=packet.byteLength;
}}
break;
default:
break;
}
if(endLoop&&result.firstKeyFrame){
break;
}
startIndex +=MP2T_PACKET_LENGTH;
endIndex +=MP2T_PACKET_LENGTH;
continue;
}
startIndex++;
endIndex++;
}
endIndex=bytes.byteLength;
startIndex=endIndex - MP2T_PACKET_LENGTH;
endLoop=false;
while (startIndex >=0){
if(bytes[startIndex]===SYNC_BYTE&&bytes[endIndex]===SYNC_BYTE){
packet=bytes.subarray(startIndex, endIndex);
type=probe$2.ts.parseType(packet, pmt.pid);
switch (type){
case 'pes':
pesType=probe$2.ts.parsePesType(packet, pmt.table);
pusi=probe$2.ts.parsePayloadUnitStartIndicator(packet);
if(pesType==='video'&&pusi){
parsed=probe$2.ts.parsePesTime(packet);
if(parsed){
parsed.type='video';
result.video.push(parsed);
endLoop=true;
}}
break;
default:
break;
}
if(endLoop){
break;
}
startIndex -=MP2T_PACKET_LENGTH;
endIndex -=MP2T_PACKET_LENGTH;
continue;
}
startIndex--;
endIndex--;
}};
var adjustTimestamp_=function adjustTimestamp_(segmentInfo, baseTimestamp){
if(segmentInfo.audio&&segmentInfo.audio.length){
var audioBaseTimestamp=baseTimestamp;
if(typeof audioBaseTimestamp==='undefined'){
audioBaseTimestamp=segmentInfo.audio[0].dts;
}
segmentInfo.audio.forEach(function (info){
info.dts=handleRollover$1(info.dts, audioBaseTimestamp);
info.pts=handleRollover$1(info.pts, audioBaseTimestamp);
info.dtsTime=info.dts / ONE_SECOND_IN_TS$1;
info.ptsTime=info.pts / ONE_SECOND_IN_TS$1;
});
}
if(segmentInfo.video&&segmentInfo.video.length){
var videoBaseTimestamp=baseTimestamp;
if(typeof videoBaseTimestamp==='undefined'){
videoBaseTimestamp=segmentInfo.video[0].dts;
}
segmentInfo.video.forEach(function (info){
info.dts=handleRollover$1(info.dts, videoBaseTimestamp);
info.pts=handleRollover$1(info.pts, videoBaseTimestamp);
info.dtsTime=info.dts / ONE_SECOND_IN_TS$1;
info.ptsTime=info.pts / ONE_SECOND_IN_TS$1;
});
if(segmentInfo.firstKeyFrame){
var frame=segmentInfo.firstKeyFrame;
frame.dts=handleRollover$1(frame.dts, videoBaseTimestamp);
frame.pts=handleRollover$1(frame.pts, videoBaseTimestamp);
frame.dtsTime=frame.dts / ONE_SECOND_IN_TS$1;
frame.ptsTime=frame.dts / ONE_SECOND_IN_TS$1;
}}
};
var inspectAac_=function inspectAac_(bytes){
var endLoop=false,
audioCount=0,
sampleRate=null,
timestamp=null,
frameSize=0,
byteIndex=0,
packet;
while (bytes.length - byteIndex >=3){
var type=probe$2.aac.parseType(bytes, byteIndex);
switch (type){
case 'timed-metadata':
if(bytes.length - byteIndex < 10){
endLoop=true;
break;
}
frameSize=probe$2.aac.parseId3TagSize(bytes, byteIndex);
if(frameSize > bytes.length){
endLoop=true;
break;
}
if(timestamp===null){
packet=bytes.subarray(byteIndex, byteIndex + frameSize);
timestamp=probe$2.aac.parseAacTimestamp(packet);
}
byteIndex +=frameSize;
break;
case 'audio':
if(bytes.length - byteIndex < 7){
endLoop=true;
break;
}
frameSize=probe$2.aac.parseAdtsSize(bytes, byteIndex);
if(frameSize > bytes.length){
endLoop=true;
break;
}
if(sampleRate===null){
packet=bytes.subarray(byteIndex, byteIndex + frameSize);
sampleRate=probe$2.aac.parseSampleRate(packet);
}
audioCount++;
byteIndex +=frameSize;
break;
default:
byteIndex++;
break;
}
if(endLoop){
return null;
}}
if(sampleRate===null||timestamp===null){
return null;
}
var audioTimescale=ONE_SECOND_IN_TS$1 / sampleRate;
var result={
audio: [{
type: 'audio',
dts: timestamp,
pts: timestamp
}, {
type: 'audio',
dts: timestamp + audioCount * 1024 * audioTimescale,
pts: timestamp + audioCount * 1024 * audioTimescale
}]
};
return result;
};
var inspectTs_=function inspectTs_(bytes){
var pmt={
pid: null,
table: null
};
var result={};
parsePsi_(bytes, pmt);
for (var pid in pmt.table){
if(pmt.table.hasOwnProperty(pid)){
var type=pmt.table[pid];
switch (type){
case streamTypes.H264_STREAM_TYPE:
result.video=[];
parseVideoPes_(bytes, pmt, result);
if(result.video.length===0){
delete result.video;
}
break;
case streamTypes.ADTS_STREAM_TYPE:
result.audio=[];
parseAudioPes_(bytes, pmt, result);
if(result.audio.length===0){
delete result.audio;
}
break;
default:
break;
}}
}
return result;
};
var inspect=function inspect(bytes, baseTimestamp){
var isAacData=probe$2.aac.isLikelyAacData(bytes);
var result;
if(isAacData){
result=inspectAac_(bytes);
}else{
result=inspectTs_(bytes);
}
if(!result||!result.audio&&!result.video){
return null;
}
adjustTimestamp_(result, baseTimestamp);
return result;
};
var tsInspector={
inspect: inspect,
parseAudioPes_: parseAudioPes_
};
function unpad(padded){
return padded.subarray(0, padded.byteLength - padded[padded.byteLength - 1]);
}
var classCallCheck=function classCallCheck(instance, Constructor){
if(!(instance instanceof Constructor)){
throw new TypeError("Cannot call a class as a function");
}};
var createClass=function (){
function defineProperties(target, props){
for (var i=0; i < props.length; i++){
var descriptor=props[i];
descriptor.enumerable=descriptor.enumerable||false;
descriptor.configurable=true;
if("value" in descriptor) descriptor.writable=true;
Object.defineProperty(target, descriptor.key, descriptor);
}}
return function (Constructor, protoProps, staticProps){
if(protoProps) defineProperties(Constructor.prototype, protoProps);
if(staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};}();
var inherits$1=function inherits(subClass, superClass){
if(typeof superClass!=="function"&&superClass!==null){
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype=Object.create(superClass&&superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}});
if(superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass):subClass.__proto__=superClass;
};
var possibleConstructorReturn=function possibleConstructorReturn(self, call){
if(!self){
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call&&(typeof call==="object"||typeof call==="function") ? call:self;
};
var precompute=function precompute(){
var tables=[[[], [], [], [], []], [[], [], [], [], []]];
var encTable=tables[0];
var decTable=tables[1];
var sbox=encTable[4];
var sboxInv=decTable[4];
var i=void 0;
var x=void 0;
var xInv=void 0;
var d=[];
var th=[];
var x2=void 0;
var x4=void 0;
var x8=void 0;
var s=void 0;
var tEnc=void 0;
var tDec=void 0;
for (i=0; i < 256; i++){
th[(d[i]=i << 1 ^ (i >> 7) * 283) ^ i]=i;
}
for (x=xInv=0; !sbox[x]; x ^=x2||1, xInv=th[xInv]||1){
s=xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
s=s >> 8 ^ s & 255 ^ 99;
sbox[x]=s;
sboxInv[s]=x;
x8=d[x4=d[x2=d[x]]];
tDec=x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;
tEnc=d[s] * 0x101 ^ s * 0x1010100;
for (i=0; i < 4; i++){
encTable[i][x]=tEnc=tEnc << 24 ^ tEnc >>> 8;
decTable[i][s]=tDec=tDec << 24 ^ tDec >>> 8;
}}
for (i=0; i < 5; i++){
encTable[i]=encTable[i].slice(0);
decTable[i]=decTable[i].slice(0);
}
return tables;
};
var aesTables=null;
var AES=function (){
function AES(key){
classCallCheck(this, AES);
if(!aesTables){
aesTables=precompute();
}
this._tables=[[aesTables[0][0].slice(), aesTables[0][1].slice(), aesTables[0][2].slice(), aesTables[0][3].slice(), aesTables[0][4].slice()], [aesTables[1][0].slice(), aesTables[1][1].slice(), aesTables[1][2].slice(), aesTables[1][3].slice(), aesTables[1][4].slice()]];
var i=void 0;
var j=void 0;
var tmp=void 0;
var encKey=void 0;
var decKey=void 0;
var sbox=this._tables[0][4];
var decTable=this._tables[1];
var keyLen=key.length;
var rcon=1;
if(keyLen!==4&&keyLen!==6&&keyLen!==8){
throw new Error('Invalid aes key size');
}
encKey=key.slice(0);
decKey=[];
this._key=[encKey, decKey];
for (i=keyLen; i < 4 * keyLen + 28; i++){
tmp=encKey[i - 1];
if(i % keyLen===0||keyLen===8&&i % keyLen===4){
tmp=sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255];
if(i % keyLen===0){
tmp=tmp << 8 ^ tmp >>> 24 ^ rcon << 24;
rcon=rcon << 1 ^ (rcon >> 7) * 283;
}}
encKey[i]=encKey[i - keyLen] ^ tmp;
}
for (j=0; i; j++, i--){
tmp=encKey[j & 3 ? i:i - 4];
if(i <=4||j < 4){
decKey[j]=tmp;
}else{
decKey[j]=decTable[0][sbox[tmp >>> 24]] ^ decTable[1][sbox[tmp >> 16 & 255]] ^ decTable[2][sbox[tmp >> 8 & 255]] ^ decTable[3][sbox[tmp & 255]];
}}
}
AES.prototype.decrypt=function decrypt(encrypted0, encrypted1, encrypted2, encrypted3, out, offset){
var key=this._key[1];
var a=encrypted0 ^ key[0];
var b=encrypted3 ^ key[1];
var c=encrypted2 ^ key[2];
var d=encrypted1 ^ key[3];
var a2=void 0;
var b2=void 0;
var c2=void 0;
var nInnerRounds=key.length / 4 - 2;
var i=void 0;
var kIndex=4;
var table=this._tables[1];
var table0=table[0];
var table1=table[1];
var table2=table[2];
var table3=table[3];
var sbox=table[4];
for (i=0; i < nInnerRounds; i++){
a2=table0[a >>> 24] ^ table1[b >> 16 & 255] ^ table2[c >> 8 & 255] ^ table3[d & 255] ^ key[kIndex];
b2=table0[b >>> 24] ^ table1[c >> 16 & 255] ^ table2[d >> 8 & 255] ^ table3[a & 255] ^ key[kIndex + 1];
c2=table0[c >>> 24] ^ table1[d >> 16 & 255] ^ table2[a >> 8 & 255] ^ table3[b & 255] ^ key[kIndex + 2];
d=table0[d >>> 24] ^ table1[a >> 16 & 255] ^ table2[b >> 8 & 255] ^ table3[c & 255] ^ key[kIndex + 3];
kIndex +=4;
a=a2;
b=b2;
c=c2;
}
for (i=0; i < 4; i++){
out[(3 & -i) + offset]=sbox[a >>> 24] << 24 ^ sbox[b >> 16 & 255] << 16 ^ sbox[c >> 8 & 255] << 8 ^ sbox[d & 255] ^ key[kIndex++];
a2=a;
a=b;
b=c;
c=d;
d=a2;
}};
return AES;
}();
var Stream$2=function (){
function Stream(){
classCallCheck(this, Stream);
this.listeners={};}
Stream.prototype.on=function on(type, listener){
if(!this.listeners[type]){
this.listeners[type]=[];
}
this.listeners[type].push(listener);
};
Stream.prototype.off=function off(type, listener){
if(!this.listeners[type]){
return false;
}
var index=this.listeners[type].indexOf(listener);
this.listeners[type].splice(index, 1);
return index > -1;
};
Stream.prototype.trigger=function trigger(type){
var callbacks=this.listeners[type];
if(!callbacks){
return;
}
if(arguments.length===2){
var length=callbacks.length;
for (var i=0; i < length; ++i){
callbacks[i].call(this, arguments[1]);
}}else{
var args=Array.prototype.slice.call(arguments, 1);
var _length=callbacks.length;
for (var _i=0; _i < _length; ++_i){
callbacks[_i].apply(this, args);
}}
};
Stream.prototype.dispose=function dispose(){
this.listeners={};};
Stream.prototype.pipe=function pipe(destination){
this.on('data', function (data){
destination.push(data);
});
};
return Stream;
}();
var AsyncStream=function (_Stream){
inherits$1(AsyncStream, _Stream);
function AsyncStream(){
classCallCheck(this, AsyncStream);
var _this=possibleConstructorReturn(this, _Stream.call(this, Stream$2));
_this.jobs=[];
_this.delay=1;
_this.timeout_=null;
return _this;
}
AsyncStream.prototype.processJob_=function processJob_(){
this.jobs.shift()();
if(this.jobs.length){
this.timeout_=setTimeout(this.processJob_.bind(this), this.delay);
}else{
this.timeout_=null;
}};
AsyncStream.prototype.push=function push(job){
this.jobs.push(job);
if(!this.timeout_){
this.timeout_=setTimeout(this.processJob_.bind(this), this.delay);
}};
return AsyncStream;
}(Stream$2);
var ntoh=function ntoh(word){
return word << 24 | (word & 0xff00) << 8 | (word & 0xff0000) >> 8 | word >>> 24;
};
var decrypt=function decrypt(encrypted, key, initVector){
var encrypted32=new Int32Array(encrypted.buffer, encrypted.byteOffset, encrypted.byteLength >> 2);
var decipher=new AES(Array.prototype.slice.call(key));
var decrypted=new Uint8Array(encrypted.byteLength);
var decrypted32=new Int32Array(decrypted.buffer);
var init0=void 0;
var init1=void 0;
var init2=void 0;
var init3=void 0;
var encrypted0=void 0;
var encrypted1=void 0;
var encrypted2=void 0;
var encrypted3=void 0;
var wordIx=void 0;
init0=initVector[0];
init1=initVector[1];
init2=initVector[2];
init3=initVector[3];
for (wordIx=0; wordIx < encrypted32.length; wordIx +=4){
encrypted0=ntoh(encrypted32[wordIx]);
encrypted1=ntoh(encrypted32[wordIx + 1]);
encrypted2=ntoh(encrypted32[wordIx + 2]);
encrypted3=ntoh(encrypted32[wordIx + 3]);
decipher.decrypt(encrypted0, encrypted1, encrypted2, encrypted3, decrypted32, wordIx);
decrypted32[wordIx]=ntoh(decrypted32[wordIx] ^ init0);
decrypted32[wordIx + 1]=ntoh(decrypted32[wordIx + 1] ^ init1);
decrypted32[wordIx + 2]=ntoh(decrypted32[wordIx + 2] ^ init2);
decrypted32[wordIx + 3]=ntoh(decrypted32[wordIx + 3] ^ init3);
init0=encrypted0;
init1=encrypted1;
init2=encrypted2;
init3=encrypted3;
}
return decrypted;
};
var Decrypter=function (){
function Decrypter(encrypted, key, initVector, done){
classCallCheck(this, Decrypter);
var step=Decrypter.STEP;
var encrypted32=new Int32Array(encrypted.buffer);
var decrypted=new Uint8Array(encrypted.byteLength);
var i=0;
this.asyncStream_=new AsyncStream();
this.asyncStream_.push(this.decryptChunk_(encrypted32.subarray(i, i + step), key, initVector, decrypted));
for (i=step; i < encrypted32.length; i +=step){
initVector=new Uint32Array([ntoh(encrypted32[i - 4]), ntoh(encrypted32[i - 3]), ntoh(encrypted32[i - 2]), ntoh(encrypted32[i - 1])]);
this.asyncStream_.push(this.decryptChunk_(encrypted32.subarray(i, i + step), key, initVector, decrypted));
}
this.asyncStream_.push(function (){
done(null, unpad(decrypted));
});
}
Decrypter.prototype.decryptChunk_=function decryptChunk_(encrypted, key, initVector, decrypted){
return function (){
var bytes=decrypt(encrypted, key, initVector);
decrypted.set(bytes, encrypted.byteOffset);
};};
createClass(Decrypter, null, [{
key: 'STEP',
get: function get$$1(){
return 32000;
}}]);
return Decrypter;
}();
var resolveUrl$1=function resolveUrl(baseURL, relativeURL){
if(/^[a-z]+:/i.test(relativeURL)){
return relativeURL;
}
if(!/\/\//i.test(baseURL)){
baseURL=urlToolkit.buildAbsoluteURL(window$1.location.href, baseURL);
}
return urlToolkit.buildAbsoluteURL(baseURL, relativeURL);
};
var resolveManifestRedirect=function resolveManifestRedirect(handleManifestRedirect, url, req){
if(handleManifestRedirect&&req.responseURL&&url!==req.responseURL){
return req.responseURL;
}
return url;
};
var classCallCheck$1=function classCallCheck(instance, Constructor){
if(!(instance instanceof Constructor)){
throw new TypeError("Cannot call a class as a function");
}};
var createClass$1=function (){
function defineProperties(target, props){
for (var i=0; i < props.length; i++){
var descriptor=props[i];
descriptor.enumerable=descriptor.enumerable||false;
descriptor.configurable=true;
if("value" in descriptor) descriptor.writable=true;
Object.defineProperty(target, descriptor.key, descriptor);
}}
return function (Constructor, protoProps, staticProps){
if(protoProps) defineProperties(Constructor.prototype, protoProps);
if(staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};}();
var get$1=function get(object, property, receiver){
if(object===null) object=Function.prototype;
var desc=Object.getOwnPropertyDescriptor(object, property);
if(desc===undefined){
var parent=Object.getPrototypeOf(object);
if(parent===null){
return undefined;
}else{
return get(parent, property, receiver);
}}else if("value" in desc){
return desc.value;
}else{
var getter=desc.get;
if(getter===undefined){
return undefined;
}
return getter.call(receiver);
}};
var inherits$2=function inherits(subClass, superClass){
if(typeof superClass!=="function"&&superClass!==null){
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype=Object.create(superClass&&superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}});
if(superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass):subClass.__proto__=superClass;
};
var possibleConstructorReturn$1=function possibleConstructorReturn(self, call){
if(!self){
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call&&(typeof call==="object"||typeof call==="function") ? call:self;
};
var slicedToArray=function (){
function sliceIterator(arr, i){
var _arr=[];
var _n=true;
var _d=false;
var _e=undefined;
try {
for (var _i=arr[Symbol.iterator](), _s; !(_n=(_s=_i.next()).done); _n=true){
_arr.push(_s.value);
if(i&&_arr.length===i) break;
}} catch (err){
_d=true;
_e=err;
} finally {
try {
if(!_n&&_i["return"]) _i["return"]();
} finally {
if(_d) throw _e;
}}
return _arr;
}
return function (arr, i){
if(Array.isArray(arr)){
return arr;
}else if(Symbol.iterator in Object(arr)){
return sliceIterator(arr, i);
}else{
throw new TypeError("Invalid attempt to destructure non-iterable instance");
}};}();
var mergeOptions$1=videojs$1.mergeOptions,
EventTarget$1=videojs$1.EventTarget,
log$1=videojs$1.log;
var forEachMediaGroup=function forEachMediaGroup(master, callback){
['AUDIO', 'SUBTITLES'].forEach(function (mediaType){
for (var groupKey in master.mediaGroups[mediaType]){
for (var labelKey in master.mediaGroups[mediaType][groupKey]){
var mediaProperties=master.mediaGroups[mediaType][groupKey][labelKey];
callback(mediaProperties, mediaType, groupKey, labelKey);
}}
});
};
var updateSegments=function updateSegments(original, update, offset){
var result=update.slice();
offset=offset||0;
var length=Math.min(original.length, update.length + offset);
for (var i=offset; i < length; i++){
result[i - offset]=mergeOptions$1(original[i], result[i - offset]);
}
return result;
};
var resolveSegmentUris=function resolveSegmentUris(segment, baseUri){
if(!segment.resolvedUri){
segment.resolvedUri=resolveUrl$1(baseUri, segment.uri);
}
if(segment.key&&!segment.key.resolvedUri){
segment.key.resolvedUri=resolveUrl$1(baseUri, segment.key.uri);
}
if(segment.map&&!segment.map.resolvedUri){
segment.map.resolvedUri=resolveUrl$1(baseUri, segment.map.uri);
}};
var updateMaster=function updateMaster(master, media){
var result=mergeOptions$1(master, {});
var playlist=result.playlists[media.uri];
if(!playlist){
return null;
}
if(playlist.segments&&media.segments&&playlist.segments.length===media.segments.length&&playlist.endList===media.endList&&playlist.mediaSequence===media.mediaSequence){
return null;
}
var mergedPlaylist=mergeOptions$1(playlist, media);
if(playlist.segments){
mergedPlaylist.segments=updateSegments(playlist.segments, media.segments, media.mediaSequence - playlist.mediaSequence);
}
mergedPlaylist.segments.forEach(function (segment){
resolveSegmentUris(segment, mergedPlaylist.resolvedUri);
});
for (var i=0; i < result.playlists.length; i++){
if(result.playlists[i].uri===media.uri){
result.playlists[i]=mergedPlaylist;
}}
result.playlists[media.uri]=mergedPlaylist;
return result;
};
var setupMediaPlaylists=function setupMediaPlaylists(master){
var i=master.playlists.length;
while (i--){
var playlist=master.playlists[i];
master.playlists[playlist.uri]=playlist;
playlist.resolvedUri=resolveUrl$1(master.uri, playlist.uri);
playlist.id=i;
if(!playlist.attributes){
playlist.attributes={};
log$1.warn('Invalid playlist STREAM-INF detected. Missing BANDWIDTH attribute.');
}}
};
var resolveMediaGroupUris=function resolveMediaGroupUris(master){
forEachMediaGroup(master, function (properties){
if(properties.uri){
properties.resolvedUri=resolveUrl$1(master.uri, properties.uri);
}});
};
var refreshDelay=function refreshDelay(media, update){
var lastSegment=media.segments[media.segments.length - 1];
var delay=void 0;
if(update&&lastSegment&&lastSegment.duration){
delay=lastSegment.duration * 1000;
}else{
delay=(media.targetDuration||10) * 500;
}
return delay;
};
var PlaylistLoader=function (_EventTarget){
inherits$2(PlaylistLoader, _EventTarget);
function PlaylistLoader(srcUrl, hls){
var options=arguments.length > 2&&arguments[2]!==undefined ? arguments[2]:{};
classCallCheck$1(this, PlaylistLoader);
var _this=possibleConstructorReturn$1(this, (PlaylistLoader.__proto__||Object.getPrototypeOf(PlaylistLoader)).call(this));
var _options$withCredenti=options.withCredentials,
withCredentials=_options$withCredenti===undefined ? false:_options$withCredenti,
_options$handleManife=options.handleManifestRedirects,
handleManifestRedirects=_options$handleManife===undefined ? false:_options$handleManife;
_this.srcUrl=srcUrl;
_this.hls_=hls;
_this.withCredentials=withCredentials;
_this.handleManifestRedirects=handleManifestRedirects;
var hlsOptions=hls.options_;
_this.customTagParsers=hlsOptions&&hlsOptions.customTagParsers||[];
_this.customTagMappers=hlsOptions&&hlsOptions.customTagMappers||[];
if(!_this.srcUrl){
throw new Error('A non-empty playlist URL is required');
}
_this.state='HAVE_NOTHING';
_this.on('mediaupdatetimeout', function (){
if(_this.state!=='HAVE_METADATA'){
return;
}
_this.state='HAVE_CURRENT_METADATA';
_this.request=_this.hls_.xhr({
uri: resolveUrl$1(_this.master.uri, _this.media().uri),
withCredentials: _this.withCredentials
}, function (error, req){
if(!_this.request){
return;
}
if(error){
return _this.playlistRequestError(_this.request, _this.media().uri, 'HAVE_METADATA');
}
_this.haveMetadata(_this.request, _this.media().uri);
});
});
return _this;
}
createClass$1(PlaylistLoader, [{
key: 'playlistRequestError',
value: function playlistRequestError(xhr, url, startingState){
this.request=null;
if(startingState){
this.state=startingState;
}
this.error={
playlist: this.master.playlists[url],
status: xhr.status,
message: 'HLS playlist request error at URL: ' + url + '.',
responseText: xhr.responseText,
code: xhr.status >=500 ? 4:2
};
this.trigger('error');
}}, {
key: 'haveMetadata',
value: function haveMetadata(xhr, url){
var _this2=this;
this.request=null;
this.state='HAVE_METADATA';
var parser=new Parser();
this.customTagParsers.forEach(function (customParser){
return parser.addParser(customParser);
});
this.customTagMappers.forEach(function (mapper){
return parser.addTagMapper(mapper);
});
parser.push(xhr.responseText);
parser.end();
parser.manifest.uri=url;
parser.manifest.attributes=parser.manifest.attributes||{};
var update=updateMaster(this.master, parser.manifest);
this.targetDuration=parser.manifest.targetDuration;
if(update){
this.master=update;
this.media_=this.master.playlists[parser.manifest.uri];
}else{
this.trigger('playlistunchanged');
}
if(!this.media().endList){
window$1.clearTimeout(this.mediaUpdateTimeout);
this.mediaUpdateTimeout=window$1.setTimeout(function (){
_this2.trigger('mediaupdatetimeout');
}, refreshDelay(this.media(), !!update));
}
this.trigger('loadedplaylist');
}
}, {
key: 'dispose',
value: function dispose(){
this.stopRequest();
window$1.clearTimeout(this.mediaUpdateTimeout);
window$1.clearTimeout(this.finalRenditionTimeout);
}}, {
key: 'stopRequest',
value: function stopRequest(){
if(this.request){
var oldRequest=this.request;
this.request=null;
oldRequest.onreadystatechange=null;
oldRequest.abort();
}}
}, {
key: 'media',
value: function media(playlist, isFinalRendition){
var _this3=this;
if(!playlist){
return this.media_;
}
if(this.state==='HAVE_NOTHING'){
throw new Error('Cannot switch media playlist from ' + this.state);
}
if(typeof playlist==='string'){
if(!this.master.playlists[playlist]){
throw new Error('Unknown playlist URI: ' + playlist);
}
playlist=this.master.playlists[playlist];
}
window$1.clearTimeout(this.finalRenditionTimeout);
if(isFinalRendition){
var delay=playlist.targetDuration / 2 * 1000||5 * 1000;
this.finalRenditionTimeout=window$1.setTimeout(this.media.bind(this, playlist, false), delay);
return;
}
var startingState=this.state;
var mediaChange = !this.media_||playlist.uri!==this.media_.uri;
if(this.master.playlists[playlist.uri].endList){
if(this.request){
this.request.onreadystatechange=null;
this.request.abort();
this.request=null;
}
this.state='HAVE_METADATA';
this.media_=playlist;
if(mediaChange){
this.trigger('mediachanging');
this.trigger('mediachange');
}
return;
}
if(!mediaChange){
return;
}
this.state='SWITCHING_MEDIA';
if(this.request){
if(playlist.resolvedUri===this.request.url){
return;
}
this.request.onreadystatechange=null;
this.request.abort();
this.request=null;
}
if(this.media_){
this.trigger('mediachanging');
}
this.request=this.hls_.xhr({
uri: playlist.resolvedUri,
withCredentials: this.withCredentials
}, function (error, req){
if(!_this3.request){
return;
}
playlist.resolvedUri=resolveManifestRedirect(_this3.handleManifestRedirects, playlist.resolvedUri, req);
if(error){
return _this3.playlistRequestError(_this3.request, playlist.uri, startingState);
}
_this3.haveMetadata(req, playlist.uri);
if(startingState==='HAVE_MASTER'){
_this3.trigger('loadedmetadata');
}else{
_this3.trigger('mediachange');
}});
}
}, {
key: 'pause',
value: function pause(){
this.stopRequest();
window$1.clearTimeout(this.mediaUpdateTimeout);
if(this.state==='HAVE_NOTHING'){
this.started=false;
}
if(this.state==='SWITCHING_MEDIA'){
if(this.media_){
this.state='HAVE_METADATA';
}else{
this.state='HAVE_MASTER';
}}else if(this.state==='HAVE_CURRENT_METADATA'){
this.state='HAVE_METADATA';
}}
}, {
key: 'load',
value: function load(isFinalRendition){
var _this4=this;
window$1.clearTimeout(this.mediaUpdateTimeout);
var media=this.media();
if(isFinalRendition){
var delay=media ? media.targetDuration / 2 * 1000:5 * 1000;
this.mediaUpdateTimeout=window$1.setTimeout(function (){
return _this4.load();
}, delay);
return;
}
if(!this.started){
this.start();
return;
}
if(media&&!media.endList){
this.trigger('mediaupdatetimeout');
}else{
this.trigger('loadedplaylist');
}}
}, {
key: 'start',
value: function start(){
var _this5=this;
this.started=true;
this.request=this.hls_.xhr({
uri: this.srcUrl,
withCredentials: this.withCredentials
}, function (error, req){
if(!_this5.request){
return;
}
_this5.request=null;
if(error){
_this5.error={
status: req.status,
message: 'HLS playlist request error at URL: ' + _this5.srcUrl + '.',
responseText: req.responseText,
code: 2
};
if(_this5.state==='HAVE_NOTHING'){
_this5.started=false;
}
return _this5.trigger('error');
}
var parser=new Parser();
_this5.customTagParsers.forEach(function (customParser){
return parser.addParser(customParser);
});
_this5.customTagMappers.forEach(function (mapper){
return parser.addTagMapper(mapper);
});
parser.push(req.responseText);
parser.end();
_this5.state='HAVE_MASTER';
_this5.srcUrl=resolveManifestRedirect(_this5.handleManifestRedirects, _this5.srcUrl, req);
parser.manifest.uri=_this5.srcUrl;
if(parser.manifest.playlists){
_this5.master=parser.manifest;
setupMediaPlaylists(_this5.master);
resolveMediaGroupUris(_this5.master);
_this5.trigger('loadedplaylist');
if(!_this5.request){
_this5.media(parser.manifest.playlists[0]);
}
return;
}
_this5.master={
mediaGroups: {
'AUDIO': {},
'VIDEO': {},
'CLOSED-CAPTIONS': {},
'SUBTITLES': {}},
uri: window$1.location.href,
playlists: [{
uri: _this5.srcUrl,
id: 0,
resolvedUri: _this5.srcUrl,
attributes: {}}]
};
_this5.master.playlists[_this5.srcUrl]=_this5.master.playlists[0];
_this5.haveMetadata(req, _this5.srcUrl);
return _this5.trigger('loadedmetadata');
});
}}]);
return PlaylistLoader;
}(EventTarget$1);
var createTimeRange=videojs$1.createTimeRange;
var backwardDuration=function backwardDuration(playlist, endSequence){
var result=0;
var i=endSequence - playlist.mediaSequence;
var segment=playlist.segments[i];
if(segment){
if(typeof segment.start!=='undefined'){
return {
result: segment.start,
precise: true
};}
if(typeof segment.end!=='undefined'){
return {
result: segment.end - segment.duration,
precise: true
};}}
while (i--){
segment=playlist.segments[i];
if(typeof segment.end!=='undefined'){
return {
result: result + segment.end,
precise: true
};}
result +=segment.duration;
if(typeof segment.start!=='undefined'){
return {
result: result + segment.start,
precise: true
};}}
return {
result: result,
precise: false
};};
var forwardDuration=function forwardDuration(playlist, endSequence){
var result=0;
var segment=void 0;
var i=endSequence - playlist.mediaSequence;
for (; i < playlist.segments.length; i++){
segment=playlist.segments[i];
if(typeof segment.start!=='undefined'){
return {
result: segment.start - result,
precise: true
};}
result +=segment.duration;
if(typeof segment.end!=='undefined'){
return {
result: segment.end - result,
precise: true
};}}
return {
result: -1,
precise: false
};};
var intervalDuration=function intervalDuration(playlist, endSequence, expired){
var backward=void 0;
var forward=void 0;
if(typeof endSequence==='undefined'){
endSequence=playlist.mediaSequence + playlist.segments.length;
}
if(endSequence < playlist.mediaSequence){
return 0;
}
backward=backwardDuration(playlist, endSequence);
if(backward.precise){
return backward.result;
}
forward=forwardDuration(playlist, endSequence);
if(forward.precise){
return forward.result;
}
return backward.result + expired;
};
var duration=function duration(playlist, endSequence, expired){
if(!playlist){
return 0;
}
if(typeof expired!=='number'){
expired=0;
}
if(typeof endSequence==='undefined'){
if(playlist.totalDuration){
return playlist.totalDuration;
}
if(!playlist.endList){
return window$1.Infinity;
}}
return intervalDuration(playlist, endSequence, expired);
};
var sumDurations=function sumDurations(playlist, startIndex, endIndex){
var durations=0;
if(startIndex > endIndex){
var _ref=[endIndex, startIndex];
startIndex=_ref[0];
endIndex=_ref[1];
}
if(startIndex < 0){
for (var i=startIndex; i < Math.min(0, endIndex); i++){
durations +=playlist.targetDuration;
}
startIndex=0;
}
for (var _i=startIndex; _i < endIndex; _i++){
durations +=playlist.segments[_i].duration;
}
return durations;
};
var safeLiveIndex=function safeLiveIndex(playlist){
if(!playlist.segments.length){
return 0;
}
var i=playlist.segments.length - 1;
var distanceFromEnd=playlist.segments[i].duration||playlist.targetDuration;
var safeDistance=distanceFromEnd + playlist.targetDuration * 2;
while (i--){
distanceFromEnd +=playlist.segments[i].duration;
if(distanceFromEnd >=safeDistance){
break;
}}
return Math.max(0, i);
};
var playlistEnd=function playlistEnd(playlist, expired, useSafeLiveEnd){
if(!playlist||!playlist.segments){
return null;
}
if(playlist.endList){
return duration(playlist);
}
if(expired===null){
return null;
}
expired=expired||0;
var endSequence=useSafeLiveEnd ? safeLiveIndex(playlist):playlist.segments.length;
return intervalDuration(playlist, playlist.mediaSequence + endSequence, expired);
};
var seekable=function seekable(playlist, expired){
var useSafeLiveEnd=true;
var seekableStart=expired||0;
var seekableEnd=playlistEnd(playlist, expired, useSafeLiveEnd);
if(seekableEnd===null){
return createTimeRange();
}
return createTimeRange(seekableStart, seekableEnd);
};
var isWholeNumber=function isWholeNumber(num){
return num - Math.floor(num)===0;
};
var roundSignificantDigit=function roundSignificantDigit(increment, num){
if(isWholeNumber(num)){
return num + increment * 0.1;
}
var numDecimalDigits=num.toString().split('.')[1].length;
for (var i=1; i <=numDecimalDigits; i++){
var scale=Math.pow(10, i);
var temp=num * scale;
if(isWholeNumber(temp)||i===numDecimalDigits){
return (temp + increment) / scale;
}}
};
var ceilLeastSignificantDigit=roundSignificantDigit.bind(null, 1);
var floorLeastSignificantDigit=roundSignificantDigit.bind(null, -1);
var getMediaInfoForTime=function getMediaInfoForTime(playlist, currentTime, startIndex, startTime){
var i=void 0;
var segment=void 0;
var numSegments=playlist.segments.length;
var time=currentTime - startTime;
if(time < 0){
if(startIndex > 0){
for (i=startIndex - 1; i >=0; i--){
segment=playlist.segments[i];
time +=floorLeastSignificantDigit(segment.duration);
if(time > 0){
return {
mediaIndex: i,
startTime: startTime - sumDurations(playlist, startIndex, i)
};}}
}
return {
mediaIndex: 0,
startTime: currentTime
};}
if(startIndex < 0){
for (i=startIndex; i < 0; i++){
time -=playlist.targetDuration;
if(time < 0){
return {
mediaIndex: 0,
startTime: currentTime
};}}
startIndex=0;
}
for (i=startIndex; i < numSegments; i++){
segment=playlist.segments[i];
time -=ceilLeastSignificantDigit(segment.duration);
if(time < 0){
return {
mediaIndex: i,
startTime: startTime + sumDurations(playlist, startIndex, i)
};}}
return {
mediaIndex: numSegments - 1,
startTime: currentTime
};};
var isBlacklisted=function isBlacklisted(playlist){
return playlist.excludeUntil&&playlist.excludeUntil > Date.now();
};
var isIncompatible=function isIncompatible(playlist){
return playlist.excludeUntil&&playlist.excludeUntil===Infinity;
};
var isEnabled=function isEnabled(playlist){
var blacklisted=isBlacklisted(playlist);
return !playlist.disabled&&!blacklisted;
};
var isDisabled=function isDisabled(playlist){
return playlist.disabled;
};
var isAes=function isAes(media){
for (var i=0; i < media.segments.length; i++){
if(media.segments[i].key){
return true;
}}
return false;
};
var isFmp4=function isFmp4(media){
for (var i=0; i < media.segments.length; i++){
if(media.segments[i].map){
return true;
}}
return false;
};
var hasAttribute=function hasAttribute(attr, playlist){
return playlist.attributes&&playlist.attributes[attr];
};
var estimateSegmentRequestTime=function estimateSegmentRequestTime(segmentDuration, bandwidth, playlist){
var bytesReceived=arguments.length > 3&&arguments[3]!==undefined ? arguments[3]:0;
if(!hasAttribute('BANDWIDTH', playlist)){
return NaN;
}
var size=segmentDuration * playlist.attributes.BANDWIDTH;
return (size - bytesReceived * 8) / bandwidth;
};
var isLowestEnabledRendition=function isLowestEnabledRendition(master, media){
if(master.playlists.length===1){
return true;
}
var currentBandwidth=media.attributes.BANDWIDTH||Number.MAX_VALUE;
return master.playlists.filter(function (playlist){
if(!isEnabled(playlist)){
return false;
}
return (playlist.attributes.BANDWIDTH||0) < currentBandwidth;
}).length===0;
};
var Playlist={
duration: duration,
seekable: seekable,
safeLiveIndex: safeLiveIndex,
getMediaInfoForTime: getMediaInfoForTime,
isEnabled: isEnabled,
isDisabled: isDisabled,
isBlacklisted: isBlacklisted,
isIncompatible: isIncompatible,
playlistEnd: playlistEnd,
isAes: isAes,
isFmp4: isFmp4,
hasAttribute: hasAttribute,
estimateSegmentRequestTime: estimateSegmentRequestTime,
isLowestEnabledRendition: isLowestEnabledRendition
};
var videojsXHR=videojs$1.xhr,
mergeOptions$1$1=videojs$1.mergeOptions;
var xhrFactory=function xhrFactory(){
var xhr=function XhrFunction(options, callback){
options=mergeOptions$1$1({
timeout: 45e3
}, options);
var beforeRequest=XhrFunction.beforeRequest||videojs$1.Hls.xhr.beforeRequest;
if(beforeRequest&&typeof beforeRequest==='function'){
var newOptions=beforeRequest(options);
if(newOptions){
options=newOptions;
}}
var request=videojsXHR(options, function (error, response){
var reqResponse=request.response;
if(!error&&reqResponse){
request.responseTime=Date.now();
request.roundTripTime=request.responseTime - request.requestTime;
request.bytesReceived=reqResponse.byteLength||reqResponse.length;
if(!request.bandwidth){
request.bandwidth=Math.floor(request.bytesReceived / request.roundTripTime * 8 * 1000);
}}
if(response.headers){
request.responseHeaders=response.headers;
}
if(error&&error.code==='ETIMEDOUT'){
request.timedout=true;
}
if(!error&&!request.aborted&&response.statusCode!==200&&response.statusCode!==206&&response.statusCode!==0){
error=new Error('XHR Failed with a response of: ' + (request&&(reqResponse||request.responseText)));
}
callback(error, request);
});
var originalAbort=request.abort;
request.abort=function (){
request.aborted=true;
return originalAbort.apply(request, arguments);
};
request.uri=options.uri;
request.requestTime=Date.now();
return request;
};
return xhr;
};
var byterangeStr=function byterangeStr(byterange){
var byterangeStart=void 0;
var byterangeEnd=void 0;
byterangeEnd=byterange.offset + byterange.length - 1;
byterangeStart=byterange.offset;
return 'bytes=' + byterangeStart + '-' + byterangeEnd;
};
var segmentXhrHeaders=function segmentXhrHeaders(segment){
var headers={};
if(segment.byterange){
headers.Range=byterangeStr(segment.byterange);
}
return headers;
};
var textRange=function textRange(range, i){
return range.start(i) + '-' + range.end(i);
};
var formatHexString=function formatHexString(e, i){
var value=e.toString(16);
return '00'.substring(0, 2 - value.length) + value + (i % 2 ? ' ':'');
};
var formatAsciiString=function formatAsciiString(e){
if(e >=0x20&&e < 0x7e){
return String.fromCharCode(e);
}
return '.';
};
var createTransferableMessage=function createTransferableMessage(message){
var transferable={};
Object.keys(message).forEach(function (key){
var value=message[key];
if(ArrayBuffer.isView(value)){
transferable[key]={
bytes: value.buffer,
byteOffset: value.byteOffset,
byteLength: value.byteLength
};}else{
transferable[key]=value;
}});
return transferable;
};
var initSegmentId=function initSegmentId(initSegment){
var byterange=initSegment.byterange||{
length: Infinity,
offset: 0
};
return [byterange.length, byterange.offset, initSegment.resolvedUri].join(',');
};
var segmentKeyId=function segmentKeyId(key){
return key.resolvedUri;
};
var hexDump=function hexDump(data){
var bytes=Array.prototype.slice.call(data);
var step=16;
var result='';
var hex=void 0;
var ascii=void 0;
for (var j=0; j < bytes.length / step; j++){
hex=bytes.slice(j * step, j * step + step).map(formatHexString).join('');
ascii=bytes.slice(j * step, j * step + step).map(formatAsciiString).join('');
result +=hex + ' ' + ascii + '\n';
}
return result;
};
var tagDump=function tagDump(_ref){
var bytes=_ref.bytes;
return hexDump(bytes);
};
var textRanges=function textRanges(ranges){
var result='';
var i=void 0;
for (i=0; i < ranges.length; i++){
result +=textRange(ranges, i) + ' ';
}
return result;
};
var utils$1 =
Object.freeze({
createTransferableMessage: createTransferableMessage,
initSegmentId: initSegmentId,
segmentKeyId: segmentKeyId,
hexDump: hexDump,
tagDump: tagDump,
textRanges: textRanges
});
var SEGMENT_END_FUDGE_PERCENT=0.25;
var playerTimeToProgramTime=function playerTimeToProgramTime(playerTime, segment){
if(!segment.dateTimeObject){
return null;
}
var transmuxerPrependedSeconds=segment.videoTimingInfo.transmuxerPrependedSeconds;
var transmuxedStart=segment.videoTimingInfo.transmuxedPresentationStart;
var startOfSegment=transmuxedStart + transmuxerPrependedSeconds;
var offsetFromSegmentStart=playerTime - startOfSegment;
return new Date(segment.dateTimeObject.getTime() + offsetFromSegmentStart * 1000);
};
var originalSegmentVideoDuration=function originalSegmentVideoDuration(videoTimingInfo){
return videoTimingInfo.transmuxedPresentationEnd - videoTimingInfo.transmuxedPresentationStart - videoTimingInfo.transmuxerPrependedSeconds;
};
var findSegmentForProgramTime=function findSegmentForProgramTime(programTime, playlist){
var dateTimeObject=void 0;
try {
dateTimeObject=new Date(programTime);
} catch (e){
return null;
}
if(!playlist||!playlist.segments||playlist.segments.length===0){
return null;
}
var segment=playlist.segments[0];
if(dateTimeObject < segment.dateTimeObject){
return null;
}
for (var i=0; i < playlist.segments.length - 1; i++){
segment=playlist.segments[i];
var nextSegmentStart=playlist.segments[i + 1].dateTimeObject;
if(dateTimeObject < nextSegmentStart){
break;
}}
var lastSegment=playlist.segments[playlist.segments.length - 1];
var lastSegmentStart=lastSegment.dateTimeObject;
var lastSegmentDuration=lastSegment.videoTimingInfo ? originalSegmentVideoDuration(lastSegment.videoTimingInfo):lastSegment.duration + lastSegment.duration * SEGMENT_END_FUDGE_PERCENT;
var lastSegmentEnd=new Date(lastSegmentStart.getTime() + lastSegmentDuration * 1000);
if(dateTimeObject > lastSegmentEnd){
return null;
}
if(dateTimeObject > lastSegmentStart){
segment=lastSegment;
}
return {
segment: segment,
estimatedStart: segment.videoTimingInfo ? segment.videoTimingInfo.transmuxedPresentationStart:Playlist.duration(playlist, playlist.mediaSequence + playlist.segments.indexOf(segment)),
type: segment.videoTimingInfo ? 'accurate':'estimate'
};};
var findSegmentForPlayerTime=function findSegmentForPlayerTime(time, playlist){
if(!playlist||!playlist.segments||playlist.segments.length===0){
return null;
}
var segmentEnd=0;
var segment=void 0;
for (var i=0; i < playlist.segments.length; i++){
segment=playlist.segments[i];
segmentEnd=segment.videoTimingInfo ? segment.videoTimingInfo.transmuxedPresentationEnd:segmentEnd + segment.duration;
if(time <=segmentEnd){
break;
}}
var lastSegment=playlist.segments[playlist.segments.length - 1];
if(lastSegment.videoTimingInfo&&lastSegment.videoTimingInfo.transmuxedPresentationEnd < time){
return null;
}
if(time > segmentEnd){
if(time > segmentEnd + lastSegment.duration * SEGMENT_END_FUDGE_PERCENT){
return null;
}
segment=lastSegment;
}
return {
segment: segment,
estimatedStart: segment.videoTimingInfo ? segment.videoTimingInfo.transmuxedPresentationStart:segmentEnd - segment.duration,
type: segment.videoTimingInfo ? 'accurate':'estimate'
};};
var getOffsetFromTimestamp=function getOffsetFromTimestamp(comparisonTimeStamp, programTime){
var segmentDateTime=void 0;
var programDateTime=void 0;
try {
segmentDateTime=new Date(comparisonTimeStamp);
programDateTime=new Date(programTime);
} catch (e){
}
var segmentTimeEpoch=segmentDateTime.getTime();
var programTimeEpoch=programDateTime.getTime();
return (programTimeEpoch - segmentTimeEpoch) / 1000;
};
var verifyProgramDateTimeTags=function verifyProgramDateTimeTags(playlist){
if(!playlist.segments||playlist.segments.length===0){
return false;
}
for (var i=0; i < playlist.segments.length; i++){
var segment=playlist.segments[i];
if(!segment.dateTimeObject){
return false;
}}
return true;
};
var getProgramTime=function getProgramTime(_ref){
var playlist=_ref.playlist,
_ref$time=_ref.time,
time=_ref$time===undefined ? undefined:_ref$time,
callback=_ref.callback;
if(!callback){
throw new Error('getProgramTime: callback must be provided');
}
if(!playlist||time===undefined){
return callback({
message: 'getProgramTime: playlist and time must be provided'
});
}
var matchedSegment=findSegmentForPlayerTime(time, playlist);
if(!matchedSegment){
return callback({
message: 'valid programTime was not found'
});
}
if(matchedSegment.type==='estimate'){
return callback({
message: 'Accurate programTime could not be determined.' + ' Please seek to e.seekTime and try again',
seekTime: matchedSegment.estimatedStart
});
}
var programTimeObject={
mediaSeconds: time
};
var programTime=playerTimeToProgramTime(time, matchedSegment.segment);
if(programTime){
programTimeObject.programDateTime=programTime.toISOString();
}
return callback(null, programTimeObject);
};
var seekToProgramTime=function seekToProgramTime(_ref2){
var programTime=_ref2.programTime,
playlist=_ref2.playlist,
_ref2$retryCount=_ref2.retryCount,
retryCount=_ref2$retryCount===undefined ? 2:_ref2$retryCount,
seekTo=_ref2.seekTo,
_ref2$pauseAfterSeek=_ref2.pauseAfterSeek,
pauseAfterSeek=_ref2$pauseAfterSeek===undefined ? true:_ref2$pauseAfterSeek,
tech=_ref2.tech,
callback=_ref2.callback;
if(!callback){
throw new Error('seekToProgramTime: callback must be provided');
}
if(typeof programTime==='undefined'||!playlist||!seekTo){
return callback({
message: 'seekToProgramTime: programTime, seekTo and playlist must be provided'
});
}
if(!playlist.endList&&!tech.hasStarted_){
return callback({
message: 'player must be playing a live stream to start buffering'
});
}
if(!verifyProgramDateTimeTags(playlist)){
return callback({
message: 'programDateTime tags must be provided in the manifest ' + playlist.resolvedUri
});
}
var matchedSegment=findSegmentForProgramTime(programTime, playlist);
if(!matchedSegment){
return callback({
message: programTime + ' was not found in the stream'
});
}
var segment=matchedSegment.segment;
var mediaOffset=getOffsetFromTimestamp(segment.dateTimeObject, programTime);
if(matchedSegment.type==='estimate'){
if(retryCount===0){
return callback({
message: programTime + ' is not buffered yet. Try again'
});
}
seekTo(matchedSegment.estimatedStart + mediaOffset);
tech.one('seeked', function (){
seekToProgramTime({
programTime: programTime,
playlist: playlist,
retryCount: retryCount - 1,
seekTo: seekTo,
pauseAfterSeek: pauseAfterSeek,
tech: tech,
callback: callback
});
});
return;
}
var seekToTime=segment.start + mediaOffset;
var seekedCallback=function seekedCallback(){
return callback(null, tech.currentTime());
};
tech.one('seeked', seekedCallback);
if(pauseAfterSeek){
tech.pause();
}
seekTo(seekToTime);
};
var TIME_FUDGE_FACTOR=1 / 30;
var SAFE_TIME_DELTA=TIME_FUDGE_FACTOR * 3;
var filterRanges=function filterRanges(timeRanges, predicate){
var results=[];
var i=void 0;
if(timeRanges&&timeRanges.length){
for (i=0; i < timeRanges.length; i++){
if(predicate(timeRanges.start(i), timeRanges.end(i))){
results.push([timeRanges.start(i), timeRanges.end(i)]);
}}
}
return videojs$1.createTimeRanges(results);
};
var findRange=function findRange(buffered, time){
return filterRanges(buffered, function (start, end){
return start - SAFE_TIME_DELTA <=time&&end + SAFE_TIME_DELTA >=time;
});
};
var findNextRange=function findNextRange(timeRanges, time){
return filterRanges(timeRanges, function (start){
return start - TIME_FUDGE_FACTOR >=time;
});
};
var findGaps=function findGaps(buffered){
if(buffered.length < 2){
return videojs$1.createTimeRanges();
}
var ranges=[];
for (var i=1; i < buffered.length; i++){
var start=buffered.end(i - 1);
var end=buffered.start(i);
ranges.push([start, end]);
}
return videojs$1.createTimeRanges(ranges);
};
var printableRange=function printableRange(range){
var strArr=[];
if(!range||!range.length){
return '';
}
for (var i=0; i < range.length; i++){
strArr.push(range.start(i) + '=> ' + range.end(i));
}
return strArr.join(', ');
};
var timeUntilRebuffer=function timeUntilRebuffer(buffered, currentTime){
var playbackRate=arguments.length > 2&&arguments[2]!==undefined ? arguments[2]:1;
var bufferedEnd=buffered.length ? buffered.end(buffered.length - 1):0;
return (bufferedEnd - currentTime) / playbackRate;
};
var timeRangesToArray=function timeRangesToArray(timeRanges){
var timeRangesList=[];
for (var i=0; i < timeRanges.length; i++){
timeRangesList.push({
start: timeRanges.start(i),
end: timeRanges.end(i)
});
}
return timeRangesList;
};
var createTextTracksIfNecessary=function createTextTracksIfNecessary(sourceBuffer, mediaSource, segment){
var player=mediaSource.player_;
if(segment.captions&&segment.captions.length){
if(!sourceBuffer.inbandTextTracks_){
sourceBuffer.inbandTextTracks_={};}
for (var trackId in segment.captionStreams){
if(!sourceBuffer.inbandTextTracks_[trackId]){
player.tech_.trigger({
type: 'usage',
name: 'hls-608'
});
var track=player.textTracks().getTrackById(trackId);
if(track){
sourceBuffer.inbandTextTracks_[trackId]=track;
}else{
sourceBuffer.inbandTextTracks_[trackId]=player.addRemoteTextTrack({
kind: 'captions',
id: trackId,
label: trackId
}, false).track;
}}
}}
if(segment.metadata&&segment.metadata.length&&!sourceBuffer.metadataTrack_){
sourceBuffer.metadataTrack_=player.addRemoteTextTrack({
kind: 'metadata',
label: 'Timed Metadata'
}, false).track;
sourceBuffer.metadataTrack_.inBandMetadataTrackDispatchType=segment.metadata.dispatchType;
}};
var removeCuesFromTrack=function removeCuesFromTrack(start, end, track){
var i=void 0;
var cue=void 0;
if(!track){
return;
}
if(!track.cues){
return;
}
i=track.cues.length;
while (i--){
cue=track.cues[i];
if(cue.startTime <=end&&cue.endTime >=start){
track.removeCue(cue);
}}
};
var deprecateOldCue=function deprecateOldCue(cue){
Object.defineProperties(cue.frame, {
id: {
get: function get(){
videojs$1.log.warn('cue.frame.id is deprecated. Use cue.value.key instead.');
return cue.value.key;
}},
value: {
get: function get(){
videojs$1.log.warn('cue.frame.value is deprecated. Use cue.value.data instead.');
return cue.value.data;
}},
privateData: {
get: function get(){
videojs$1.log.warn('cue.frame.privateData is deprecated. Use cue.value.data instead.');
return cue.value.data;
}}
});
};
var durationOfVideo=function durationOfVideo(duration){
var dur=void 0;
if(isNaN(duration)||Math.abs(duration)===Infinity){
dur=Number.MAX_VALUE;
}else{
dur=duration;
}
return dur;
};
var addTextTrackData=function addTextTrackData(sourceHandler, captionArray, metadataArray){
var Cue=window$1.WebKitDataCue||window$1.VTTCue;
if(captionArray){
captionArray.forEach(function (caption){
var track=caption.stream;
this.inbandTextTracks_[track].addCue(new Cue(caption.startTime + this.timestampOffset, caption.endTime + this.timestampOffset, caption.text));
}, sourceHandler);
}
if(metadataArray){
var videoDuration=durationOfVideo(sourceHandler.mediaSource_.duration);
metadataArray.forEach(function (metadata){
var time=metadata.cueTime + this.timestampOffset;
if(typeof time!=='number'||window$1.isNaN(time)||time < 0||!(time < Infinity)){
return;
}
metadata.frames.forEach(function (frame){
var cue=new Cue(time, time, frame.value||frame.url||frame.data||'');
cue.frame=frame;
cue.value=frame;
deprecateOldCue(cue);
this.metadataTrack_.addCue(cue);
}, this);
}, sourceHandler);
if(sourceHandler.metadataTrack_&&sourceHandler.metadataTrack_.cues&&sourceHandler.metadataTrack_.cues.length){
var cues=sourceHandler.metadataTrack_.cues;
var cuesArray=[];
for (var i=0; i < cues.length; i++){
if(cues[i]){
cuesArray.push(cues[i]);
}}
var cuesGroupedByStartTime=cuesArray.reduce(function (obj, cue){
var timeSlot=obj[cue.startTime]||[];
timeSlot.push(cue);
obj[cue.startTime]=timeSlot;
return obj;
}, {});
var sortedStartTimes=Object.keys(cuesGroupedByStartTime).sort(function (a, b){
return Number(a) - Number(b);
});
sortedStartTimes.forEach(function (startTime, idx){
var cueGroup=cuesGroupedByStartTime[startTime];
var nextTime=Number(sortedStartTimes[idx + 1])||videoDuration;
cueGroup.forEach(function (cue){
cue.endTime=nextTime;
});
});
}}
};
var win=typeof window!=='undefined' ? window:{},
TARGET=typeof Symbol==='undefined' ? '__target':Symbol(),
SCRIPT_TYPE='application/javascript',
BlobBuilder=win.BlobBuilder||win.WebKitBlobBuilder||win.MozBlobBuilder||win.MSBlobBuilder,
URL=win.URL||win.webkitURL||URL&&URL.msURL,
Worker=win.Worker;
function shimWorker(filename, fn){
return function ShimWorker(forceFallback){
var o=this;
if(!fn){
return new Worker(filename);
}else if(Worker&&!forceFallback){
var source=fn.toString().replace(/^function.+?{/, '').slice(0, -1),
objURL=createSourceObject(source);
this[TARGET]=new Worker(objURL);
wrapTerminate(this[TARGET], objURL);
return this[TARGET];
}else{
var selfShim={
postMessage: function postMessage(m){
if(o.onmessage){
setTimeout(function (){
o.onmessage({
data: m,
target: selfShim
});
});
}}
};
fn.call(selfShim);
this.postMessage=function (m){
setTimeout(function (){
selfShim.onmessage({
data: m,
target: o
});
});
};
this.isThisThread=true;
}};}
if(Worker){
var testWorker,
objURL=createSourceObject('self.onmessage=function (){}'),
testArray=new Uint8Array(1);
try {
testWorker=new Worker(objURL);
testWorker.postMessage(testArray, [testArray.buffer]);
} catch (e){
Worker=null;
} finally {
URL.revokeObjectURL(objURL);
if(testWorker){
testWorker.terminate();
}}
}
function createSourceObject(str){
try {
return URL.createObjectURL(new Blob([str], {
type: SCRIPT_TYPE
}));
} catch (e){
var blob=new BlobBuilder();
blob.append(str);
return URL.createObjectURL(blob.getBlob(type));
}}
function wrapTerminate(worker, objURL){
if(!worker||!objURL) return;
var term=worker.terminate;
worker.objURL=objURL;
worker.terminate=function (){
if(worker.objURL) URL.revokeObjectURL(worker.objURL);
term.call(worker);
};}
var TransmuxWorker=new shimWorker("./transmuxer-worker.worker.js", function (window, document$$1){
var self=this;
var transmuxerWorker=function (){
var Stream=function Stream(){
this.init=function (){
var listeners={};
this.on=function (type, listener){
if(!listeners[type]){
listeners[type]=[];
}
listeners[type]=listeners[type].concat(listener);
};
this.off=function (type, listener){
var index;
if(!listeners[type]){
return false;
}
index=listeners[type].indexOf(listener);
listeners[type]=listeners[type].slice();
listeners[type].splice(index, 1);
return index > -1;
};
this.trigger=function (type){
var callbacks, i, length, args;
callbacks=listeners[type];
if(!callbacks){
return;
}
if(arguments.length===2){
length=callbacks.length;
for (i=0; i < length; ++i){
callbacks[i].call(this, arguments[1]);
}}else{
args=[];
i=arguments.length;
for (i=1; i < arguments.length; ++i){
args.push(arguments[i]);
}
length=callbacks.length;
for (i=0; i < length; ++i){
callbacks[i].apply(this, args);
}}
};
this.dispose=function (){
listeners={};};
};};
Stream.prototype.pipe=function (destination){
this.on('data', function (data){
destination.push(data);
});
this.on('done', function (flushSource){
destination.flush(flushSource);
});
this.on('partialdone', function (flushSource){
destination.partialFlush(flushSource);
});
this.on('endedtimeline', function (flushSource){
destination.endTimeline(flushSource);
});
this.on('reset', function (flushSource){
destination.reset(flushSource);
});
return destination;
};
Stream.prototype.push=function (data){
this.trigger('data', data);
};
Stream.prototype.flush=function (flushSource){
this.trigger('done', flushSource);
};
Stream.prototype.partialFlush=function (flushSource){
this.trigger('partialdone', flushSource);
};
Stream.prototype.endTimeline=function (flushSource){
this.trigger('endedtimeline', flushSource);
};
Stream.prototype.reset=function (flushSource){
this.trigger('reset', flushSource);
};
var stream=Stream;
var UINT32_MAX=Math.pow(2, 32) - 1;
var box, dinf, esds, ftyp, mdat, mfhd, minf, moof, moov, mvex, mvhd, trak, tkhd, mdia, mdhd, hdlr, sdtp, stbl, stsd, traf, trex, trun, types, MAJOR_BRAND, MINOR_VERSION, AVC1_BRAND, VIDEO_HDLR, AUDIO_HDLR, HDLR_TYPES, VMHD, SMHD, DREF, STCO, STSC, STSZ, STTS;
(function (){
var i;
types={
avc1: [],
avcC: [],
btrt: [],
dinf: [],
dref: [],
esds: [],
ftyp: [],
hdlr: [],
mdat: [],
mdhd: [],
mdia: [],
mfhd: [],
minf: [],
moof: [],
moov: [],
mp4a: [],
mvex: [],
mvhd: [],
pasp: [],
sdtp: [],
smhd: [],
stbl: [],
stco: [],
stsc: [],
stsd: [],
stsz: [],
stts: [],
styp: [],
tfdt: [],
tfhd: [],
traf: [],
trak: [],
trun: [],
trex: [],
tkhd: [],
vmhd: []
};
if(typeof Uint8Array==='undefined'){
return;
}
for (i in types){
if(types.hasOwnProperty(i)){
types[i]=[i.charCodeAt(0), i.charCodeAt(1), i.charCodeAt(2), i.charCodeAt(3)];
}}
MAJOR_BRAND=new Uint8Array(['i'.charCodeAt(0), 's'.charCodeAt(0), 'o'.charCodeAt(0), 'm'.charCodeAt(0)]);
AVC1_BRAND=new Uint8Array(['a'.charCodeAt(0), 'v'.charCodeAt(0), 'c'.charCodeAt(0), '1'.charCodeAt(0)]);
MINOR_VERSION=new Uint8Array([0, 0, 0, 1]);
VIDEO_HDLR=new Uint8Array([0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x76, 0x69, 0x64, 0x65,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x56, 0x69, 0x64, 0x65, 0x6f, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 
]);
AUDIO_HDLR=new Uint8Array([0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x73, 0x6f, 0x75, 0x6e,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x53, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 
]);
HDLR_TYPES={
video: VIDEO_HDLR,
audio: AUDIO_HDLR
};
DREF=new Uint8Array([0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x0c,
0x75, 0x72, 0x6c, 0x20, // 'url' type
0x00,
0x00, 0x00, 0x01 
]);
SMHD=new Uint8Array([0x00,
0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00 
]);
STCO=new Uint8Array([0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 
]);
STSC=STCO;
STSZ=new Uint8Array([0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 
]);
STTS=STCO;
VMHD=new Uint8Array([0x00,
0x00, 0x00, 0x01,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
]);
})();
box=function box(type){
var payload=[],
size=0,
i,
result,
view;
for (i=1; i < arguments.length; i++){
payload.push(arguments[i]);
}
i=payload.length;
while (i--){
size +=payload[i].byteLength;
}
result=new Uint8Array(size + 8);
view=new DataView(result.buffer, result.byteOffset, result.byteLength);
view.setUint32(0, result.byteLength);
result.set(type, 4);
for (i=0, size=8; i < payload.length; i++){
result.set(payload[i], size);
size +=payload[i].byteLength;
}
return result;
};
dinf=function dinf(){
return box(types.dinf, box(types.dref, DREF));
};
esds=function esds(track){
return box(types.esds, new Uint8Array([0x00,
0x00, 0x00, 0x00,
0x03,
0x19,
0x00, 0x00,
0x00,
0x04,
0x11,
0x40,
0x15,
0x00, 0x06, 0x00,
0x00, 0x00, 0xda, 0xc0,
0x00, 0x00, 0xda, 0xc0,
0x05,
0x02,
track.audioobjecttype << 3 | track.samplingfrequencyindex >>> 1, track.samplingfrequencyindex << 7 | track.channelcount << 3, 0x06, 0x01, 0x02 
]));
};
ftyp=function ftyp(){
return box(types.ftyp, MAJOR_BRAND, MINOR_VERSION, MAJOR_BRAND, AVC1_BRAND);
};
hdlr=function hdlr(type){
return box(types.hdlr, HDLR_TYPES[type]);
};
mdat=function mdat(data){
return box(types.mdat, data);
};
mdhd=function mdhd(track){
var result=new Uint8Array([0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x03,
0x00, 0x01, 0x5f, 0x90,
track.duration >>> 24 & 0xFF, track.duration >>> 16 & 0xFF, track.duration >>> 8 & 0xFF, track.duration & 0xFF,
0x55, 0xc4, // 'und' language (undetermined)
0x00, 0x00]);
if(track.samplerate){
result[12]=track.samplerate >>> 24 & 0xFF;
result[13]=track.samplerate >>> 16 & 0xFF;
result[14]=track.samplerate >>> 8 & 0xFF;
result[15]=track.samplerate & 0xFF;
}
return box(types.mdhd, result);
};
mdia=function mdia(track){
return box(types.mdia, mdhd(track), hdlr(track.type), minf(track));
};
mfhd=function mfhd(sequenceNumber){
return box(types.mfhd, new Uint8Array([0x00, 0x00, 0x00, 0x00,
(sequenceNumber & 0xFF000000) >> 24, (sequenceNumber & 0xFF0000) >> 16, (sequenceNumber & 0xFF00) >> 8, sequenceNumber & 0xFF
]));
};
minf=function minf(track){
return box(types.minf, track.type==='video' ? box(types.vmhd, VMHD):box(types.smhd, SMHD), dinf(), stbl(track));
};
moof=function moof(sequenceNumber, tracks){
var trackFragments=[],
i=tracks.length;
while (i--){
trackFragments[i]=traf(tracks[i]);
}
return box.apply(null, [types.moof, mfhd(sequenceNumber)].concat(trackFragments));
};
moov=function moov(tracks){
var i=tracks.length,
boxes=[];
while (i--){
boxes[i]=trak(tracks[i]);
}
return box.apply(null, [types.moov, mvhd(0xffffffff)].concat(boxes).concat(mvex(tracks)));
};
mvex=function mvex(tracks){
var i=tracks.length,
boxes=[];
while (i--){
boxes[i]=trex(tracks[i]);
}
return box.apply(null, [types.mvex].concat(boxes));
};
mvhd=function mvhd(duration){
var bytes=new Uint8Array([0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x02,
0x00, 0x01, 0x5f, 0x90,
(duration & 0xFF000000) >> 24, (duration & 0xFF0000) >> 16, (duration & 0xFF00) >> 8, duration & 0xFF,
0x00, 0x01, 0x00, 0x00,
0x01, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff
]);
return box(types.mvhd, bytes);
};
sdtp=function sdtp(track){
var samples=track.samples||[],
bytes=new Uint8Array(4 + samples.length),
flags,
i;
for (i=0; i < samples.length; i++){
flags=samples[i].flags;
bytes[i + 4]=flags.dependsOn << 4 | flags.isDependedOn << 2 | flags.hasRedundancy;
}
return box(types.sdtp, bytes);
};
stbl=function stbl(track){
return box(types.stbl, stsd(track), box(types.stts, STTS), box(types.stsc, STSC), box(types.stsz, STSZ), box(types.stco, STCO));
};
(function (){
var videoSample, audioSample;
stsd=function stsd(track){
return box(types.stsd, new Uint8Array([0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01]), track.type==='video' ? videoSample(track):audioSample(track));
};
videoSample=function videoSample(track){
var sps=track.sps||[],
pps=track.pps||[],
sequenceParameterSets=[],
pictureParameterSets=[],
i,
avc1Box;
for (i=0; i < sps.length; i++){
sequenceParameterSets.push((sps[i].byteLength & 0xFF00) >>> 8);
sequenceParameterSets.push(sps[i].byteLength & 0xFF);
sequenceParameterSets=sequenceParameterSets.concat(Array.prototype.slice.call(sps[i]));
}
for (i=0; i < pps.length; i++){
pictureParameterSets.push((pps[i].byteLength & 0xFF00) >>> 8);
pictureParameterSets.push(pps[i].byteLength & 0xFF);
pictureParameterSets=pictureParameterSets.concat(Array.prototype.slice.call(pps[i]));
}
avc1Box=[types.avc1, new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
(track.width & 0xff00) >> 8, track.width & 0xff,
(track.height & 0xff00) >> 8, track.height & 0xff,
0x00, 0x48, 0x00, 0x00,
0x00, 0x48, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x01,
0x13, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x6a, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x2d, 0x68, 0x6c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18,
0x11, 0x11 
]), box(types.avcC, new Uint8Array([0x01,
track.profileIdc,
track.profileCompatibility,
track.levelIdc,
0xff
].concat([sps.length],
sequenceParameterSets, // "SPS"
[pps.length],
pictureParameterSets // "PPS"
))), box(types.btrt, new Uint8Array([0x00, 0x1c, 0x9c, 0x80,
0x00, 0x2d, 0xc6, 0xc0,
0x00, 0x2d, 0xc6, 0xc0 
]))];
if(track.sarRatio){
var hSpacing=track.sarRatio[0],
vSpacing=track.sarRatio[1];
avc1Box.push(box(types.pasp, new Uint8Array([(hSpacing & 0xFF000000) >> 24, (hSpacing & 0xFF0000) >> 16, (hSpacing & 0xFF00) >> 8, hSpacing & 0xFF, (vSpacing & 0xFF000000) >> 24, (vSpacing & 0xFF0000) >> 16, (vSpacing & 0xFF00) >> 8, vSpacing & 0xFF])));
}
return box.apply(null, avc1Box);
};
audioSample=function audioSample(track){
return box(types.mp4a, new Uint8Array([
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
(track.channelcount & 0xff00) >> 8, track.channelcount & 0xff,
(track.samplesize & 0xff00) >> 8, track.samplesize & 0xff,
0x00, 0x00,
0x00, 0x00,
(track.samplerate & 0xff00) >> 8, track.samplerate & 0xff, 0x00, 0x00 
]), esds(track));
};})();
tkhd=function tkhd(track){
var result=new Uint8Array([0x00,
0x00, 0x00, 0x07,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
(track.id & 0xFF000000) >> 24, (track.id & 0xFF0000) >> 16, (track.id & 0xFF00) >> 8, track.id & 0xFF,
0x00, 0x00, 0x00, 0x00,
(track.duration & 0xFF000000) >> 24, (track.duration & 0xFF0000) >> 16, (track.duration & 0xFF00) >> 8, track.duration & 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x01, 0x00,
0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
(track.width & 0xFF00) >> 8, track.width & 0xFF, 0x00, 0x00,
(track.height & 0xFF00) >> 8, track.height & 0xFF, 0x00, 0x00 
]);
return box(types.tkhd, result);
};
traf=function traf(track){
var trackFragmentHeader, trackFragmentDecodeTime, trackFragmentRun, sampleDependencyTable, dataOffset, upperWordBaseMediaDecodeTime, lowerWordBaseMediaDecodeTime;
trackFragmentHeader=box(types.tfhd, new Uint8Array([0x00,
0x00, 0x00, 0x3a,
(track.id & 0xFF000000) >> 24, (track.id & 0xFF0000) >> 16, (track.id & 0xFF00) >> 8, track.id & 0xFF,
0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 
]));
upperWordBaseMediaDecodeTime=Math.floor(track.baseMediaDecodeTime / (UINT32_MAX + 1));
lowerWordBaseMediaDecodeTime=Math.floor(track.baseMediaDecodeTime % (UINT32_MAX + 1));
trackFragmentDecodeTime=box(types.tfdt, new Uint8Array([0x01,
0x00, 0x00, 0x00,
upperWordBaseMediaDecodeTime >>> 24 & 0xFF, upperWordBaseMediaDecodeTime >>> 16 & 0xFF, upperWordBaseMediaDecodeTime >>> 8 & 0xFF, upperWordBaseMediaDecodeTime & 0xFF, lowerWordBaseMediaDecodeTime >>> 24 & 0xFF, lowerWordBaseMediaDecodeTime >>> 16 & 0xFF, lowerWordBaseMediaDecodeTime >>> 8 & 0xFF, lowerWordBaseMediaDecodeTime & 0xFF]));
dataOffset=32 +
20 +
8 +
16 +
8 +
8;
if(track.type==='audio'){
trackFragmentRun=trun(track, dataOffset);
return box(types.traf, trackFragmentHeader, trackFragmentDecodeTime, trackFragmentRun);
}
sampleDependencyTable=sdtp(track);
trackFragmentRun=trun(track, sampleDependencyTable.length + dataOffset);
return box(types.traf, trackFragmentHeader, trackFragmentDecodeTime, trackFragmentRun, sampleDependencyTable);
};
trak=function trak(track){
track.duration=track.duration||0xffffffff;
return box(types.trak, tkhd(track), mdia(track));
};
trex=function trex(track){
var result=new Uint8Array([0x00,
0x00, 0x00, 0x00,
(track.id & 0xFF000000) >> 24, (track.id & 0xFF0000) >> 16, (track.id & 0xFF00) >> 8, track.id & 0xFF,
0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x00, 0x01 
]);
if(track.type!=='video'){
result[result.length - 1]=0x00;
}
return box(types.trex, result);
};
(function (){
var audioTrun, videoTrun, trunHeader;
trunHeader=function trunHeader(samples, offset){
var durationPresent=0,
sizePresent=0,
flagsPresent=0,
compositionTimeOffset=0;
if(samples.length){
if(samples[0].duration!==undefined){
durationPresent=0x1;
}
if(samples[0].size!==undefined){
sizePresent=0x2;
}
if(samples[0].flags!==undefined){
flagsPresent=0x4;
}
if(samples[0].compositionTimeOffset!==undefined){
compositionTimeOffset=0x8;
}}
return [0x00,
0x00, durationPresent | sizePresent | flagsPresent | compositionTimeOffset, 0x01,
(samples.length & 0xFF000000) >>> 24, (samples.length & 0xFF0000) >>> 16, (samples.length & 0xFF00) >>> 8, samples.length & 0xFF,
(offset & 0xFF000000) >>> 24, (offset & 0xFF0000) >>> 16, (offset & 0xFF00) >>> 8, offset & 0xFF
];
};
videoTrun=function videoTrun(track, offset){
var bytes, samples, sample, i;
samples=track.samples||[];
offset +=8 + 12 + 16 * samples.length;
bytes=trunHeader(samples, offset);
for (i=0; i < samples.length; i++){
sample=samples[i];
bytes=bytes.concat([(sample.duration & 0xFF000000) >>> 24, (sample.duration & 0xFF0000) >>> 16, (sample.duration & 0xFF00) >>> 8, sample.duration & 0xFF,
(sample.size & 0xFF000000) >>> 24, (sample.size & 0xFF0000) >>> 16, (sample.size & 0xFF00) >>> 8, sample.size & 0xFF,
sample.flags.isLeading << 2 | sample.flags.dependsOn, sample.flags.isDependedOn << 6 | sample.flags.hasRedundancy << 4 | sample.flags.paddingValue << 1 | sample.flags.isNonSyncSample, sample.flags.degradationPriority & 0xF0 << 8, sample.flags.degradationPriority & 0x0F,
(sample.compositionTimeOffset & 0xFF000000) >>> 24, (sample.compositionTimeOffset & 0xFF0000) >>> 16, (sample.compositionTimeOffset & 0xFF00) >>> 8, sample.compositionTimeOffset & 0xFF
]);
}
return box(types.trun, new Uint8Array(bytes));
};
audioTrun=function audioTrun(track, offset){
var bytes, samples, sample, i;
samples=track.samples||[];
offset +=8 + 12 + 8 * samples.length;
bytes=trunHeader(samples, offset);
for (i=0; i < samples.length; i++){
sample=samples[i];
bytes=bytes.concat([(sample.duration & 0xFF000000) >>> 24, (sample.duration & 0xFF0000) >>> 16, (sample.duration & 0xFF00) >>> 8, sample.duration & 0xFF,
(sample.size & 0xFF000000) >>> 24, (sample.size & 0xFF0000) >>> 16, (sample.size & 0xFF00) >>> 8, sample.size & 0xFF]);
}
return box(types.trun, new Uint8Array(bytes));
};
trun=function trun(track, offset){
if(track.type==='audio'){
return audioTrun(track, offset);
}
return videoTrun(track, offset);
};})();
var mp4Generator={
ftyp: ftyp,
mdat: mdat,
moof: moof,
moov: moov,
initSegment: function initSegment(tracks){
var fileType=ftyp(),
movie=moov(tracks),
result;
result=new Uint8Array(fileType.byteLength + movie.byteLength);
result.set(fileType);
result.set(movie, fileType.byteLength);
return result;
}};
var groupNalsIntoFrames=function groupNalsIntoFrames(nalUnits){
var i,
currentNal,
currentFrame=[],
frames=[];
frames.byteLength=0;
frames.nalCount=0;
frames.duration=0;
currentFrame.byteLength=0;
for (i=0; i < nalUnits.length; i++){
currentNal=nalUnits[i];
if(currentNal.nalUnitType==='access_unit_delimiter_rbsp'){
if(currentFrame.length){
currentFrame.duration=currentNal.dts - currentFrame.dts;
frames.byteLength +=currentFrame.byteLength;
frames.nalCount +=currentFrame.length;
frames.duration +=currentFrame.duration;
frames.push(currentFrame);
}
currentFrame=[currentNal];
currentFrame.byteLength=currentNal.data.byteLength;
currentFrame.pts=currentNal.pts;
currentFrame.dts=currentNal.dts;
}else{
if(currentNal.nalUnitType==='slice_layer_without_partitioning_rbsp_idr'){
currentFrame.keyFrame=true;
}
currentFrame.duration=currentNal.dts - currentFrame.dts;
currentFrame.byteLength +=currentNal.data.byteLength;
currentFrame.push(currentNal);
}}
if(frames.length&&(!currentFrame.duration||currentFrame.duration <=0)){
currentFrame.duration=frames[frames.length - 1].duration;
}
frames.byteLength +=currentFrame.byteLength;
frames.nalCount +=currentFrame.length;
frames.duration +=currentFrame.duration;
frames.push(currentFrame);
return frames;
};
var groupFramesIntoGops=function groupFramesIntoGops(frames){
var i,
currentFrame,
currentGop=[],
gops=[];
currentGop.byteLength=0;
currentGop.nalCount=0;
currentGop.duration=0;
currentGop.pts=frames[0].pts;
currentGop.dts=frames[0].dts;
gops.byteLength=0;
gops.nalCount=0;
gops.duration=0;
gops.pts=frames[0].pts;
gops.dts=frames[0].dts;
for (i=0; i < frames.length; i++){
currentFrame=frames[i];
if(currentFrame.keyFrame){
if(currentGop.length){
gops.push(currentGop);
gops.byteLength +=currentGop.byteLength;
gops.nalCount +=currentGop.nalCount;
gops.duration +=currentGop.duration;
}
currentGop=[currentFrame];
currentGop.nalCount=currentFrame.length;
currentGop.byteLength=currentFrame.byteLength;
currentGop.pts=currentFrame.pts;
currentGop.dts=currentFrame.dts;
currentGop.duration=currentFrame.duration;
}else{
currentGop.duration +=currentFrame.duration;
currentGop.nalCount +=currentFrame.length;
currentGop.byteLength +=currentFrame.byteLength;
currentGop.push(currentFrame);
}}
if(gops.length&&currentGop.duration <=0){
currentGop.duration=gops[gops.length - 1].duration;
}
gops.byteLength +=currentGop.byteLength;
gops.nalCount +=currentGop.nalCount;
gops.duration +=currentGop.duration;
gops.push(currentGop);
return gops;
};
var extendFirstKeyFrame=function extendFirstKeyFrame(gops){
var currentGop;
if(!gops[0][0].keyFrame&&gops.length > 1){
currentGop=gops.shift();
gops.byteLength -=currentGop.byteLength;
gops.nalCount -=currentGop.nalCount;
gops[0][0].dts=currentGop.dts;
gops[0][0].pts=currentGop.pts;
gops[0][0].duration +=currentGop.duration;
}
return gops;
};
var createDefaultSample=function createDefaultSample(){
return {
size: 0,
flags: {
isLeading: 0,
dependsOn: 1,
isDependedOn: 0,
hasRedundancy: 0,
degradationPriority: 0,
isNonSyncSample: 1
}};};
var sampleForFrame=function sampleForFrame(frame, dataOffset){
var sample=createDefaultSample();
sample.dataOffset=dataOffset;
sample.compositionTimeOffset=frame.pts - frame.dts;
sample.duration=frame.duration;
sample.size=4 * frame.length;
sample.size +=frame.byteLength;
if(frame.keyFrame){
sample.flags.dependsOn=2;
sample.flags.isNonSyncSample=0;
}
return sample;
};
var generateSampleTable=function generateSampleTable(gops, baseDataOffset){
var h,
i,
sample,
currentGop,
currentFrame,
dataOffset=baseDataOffset||0,
samples=[];
for (h=0; h < gops.length; h++){
currentGop=gops[h];
for (i=0; i < currentGop.length; i++){
currentFrame=currentGop[i];
sample=sampleForFrame(currentFrame, dataOffset);
dataOffset +=sample.size;
samples.push(sample);
}}
return samples;
};
var concatenateNalData=function concatenateNalData(gops){
var h,
i,
j,
currentGop,
currentFrame,
currentNal,
dataOffset=0,
nalsByteLength=gops.byteLength,
numberOfNals=gops.nalCount,
totalByteLength=nalsByteLength + 4 * numberOfNals,
data=new Uint8Array(totalByteLength),
view=new DataView(data.buffer);
for (h=0; h < gops.length; h++){
currentGop=gops[h];
for (i=0; i < currentGop.length; i++){
currentFrame=currentGop[i];
for (j=0; j < currentFrame.length; j++){
currentNal=currentFrame[j];
view.setUint32(dataOffset, currentNal.data.byteLength);
dataOffset +=4;
data.set(currentNal.data, dataOffset);
dataOffset +=currentNal.data.byteLength;
}}
}
return data;
};
var generateSampleTableForFrame=function generateSampleTableForFrame(frame, baseDataOffset){
var sample,
dataOffset=baseDataOffset||0,
samples=[];
sample=sampleForFrame(frame, dataOffset);
samples.push(sample);
return samples;
};
var concatenateNalDataForFrame=function concatenateNalDataForFrame(frame){
var i,
currentNal,
dataOffset=0,
nalsByteLength=frame.byteLength,
numberOfNals=frame.length,
totalByteLength=nalsByteLength + 4 * numberOfNals,
data=new Uint8Array(totalByteLength),
view=new DataView(data.buffer);
for (i=0; i < frame.length; i++){
currentNal=frame[i];
view.setUint32(dataOffset, currentNal.data.byteLength);
dataOffset +=4;
data.set(currentNal.data, dataOffset);
dataOffset +=currentNal.data.byteLength;
}
return data;
};
var frameUtils={
groupNalsIntoFrames: groupNalsIntoFrames,
groupFramesIntoGops: groupFramesIntoGops,
extendFirstKeyFrame: extendFirstKeyFrame,
generateSampleTable: generateSampleTable,
concatenateNalData: concatenateNalData,
generateSampleTableForFrame: generateSampleTableForFrame,
concatenateNalDataForFrame: concatenateNalDataForFrame
};
var highPrefix=[33, 16, 5, 32, 164, 27];
var lowPrefix=[33, 65, 108, 84, 1, 2, 4, 8, 168, 2, 4, 8, 17, 191, 252];
var zeroFill=function zeroFill(count){
var a=[];
while (count--){
a.push(0);
}
return a;
};
var makeTable=function makeTable(metaTable){
return Object.keys(metaTable).reduce(function (obj, key){
obj[key]=new Uint8Array(metaTable[key].reduce(function (arr, part){
return arr.concat(part);
}, []));
return obj;
}, {});
};
var coneOfSilence={
96000: [highPrefix, [227, 64], zeroFill(154), [56]],
88200: [highPrefix, [231], zeroFill(170), [56]],
64000: [highPrefix, [248, 192], zeroFill(240), [56]],
48000: [highPrefix, [255, 192], zeroFill(268), [55, 148, 128], zeroFill(54), [112]],
44100: [highPrefix, [255, 192], zeroFill(268), [55, 163, 128], zeroFill(84), [112]],
32000: [highPrefix, [255, 192], zeroFill(268), [55, 234], zeroFill(226), [112]],
24000: [highPrefix, [255, 192], zeroFill(268), [55, 255, 128], zeroFill(268), [111, 112], zeroFill(126), [224]],
16000: [highPrefix, [255, 192], zeroFill(268), [55, 255, 128], zeroFill(268), [111, 255], zeroFill(269), [223, 108], zeroFill(195), [1, 192]],
12000: [lowPrefix, zeroFill(268), [3, 127, 248], zeroFill(268), [6, 255, 240], zeroFill(268), [13, 255, 224], zeroFill(268), [27, 253, 128], zeroFill(259), [56]],
11025: [lowPrefix, zeroFill(268), [3, 127, 248], zeroFill(268), [6, 255, 240], zeroFill(268), [13, 255, 224], zeroFill(268), [27, 255, 192], zeroFill(268), [55, 175, 128], zeroFill(108), [112]],
8000: [lowPrefix, zeroFill(268), [3, 121, 16], zeroFill(47), [7]]
};
var silence=makeTable(coneOfSilence);
var ONE_SECOND_IN_TS=90000,
secondsToVideoTs,
secondsToAudioTs,
videoTsToSeconds,
audioTsToSeconds,
audioTsToVideoTs,
videoTsToAudioTs,
metadataTsToSeconds;
secondsToVideoTs=function secondsToVideoTs(seconds){
return seconds * ONE_SECOND_IN_TS;
};
secondsToAudioTs=function secondsToAudioTs(seconds, sampleRate){
return seconds * sampleRate;
};
videoTsToSeconds=function videoTsToSeconds(timestamp){
return timestamp / ONE_SECOND_IN_TS;
};
audioTsToSeconds=function audioTsToSeconds(timestamp, sampleRate){
return timestamp / sampleRate;
};
audioTsToVideoTs=function audioTsToVideoTs(timestamp, sampleRate){
return secondsToVideoTs(audioTsToSeconds(timestamp, sampleRate));
};
videoTsToAudioTs=function videoTsToAudioTs(timestamp, sampleRate){
return secondsToAudioTs(videoTsToSeconds(timestamp), sampleRate);
};
metadataTsToSeconds=function metadataTsToSeconds(timestamp, timelineStartPts, keepOriginalTimestamps){
return videoTsToSeconds(keepOriginalTimestamps ? timestamp:timestamp - timelineStartPts);
};
var clock={
ONE_SECOND_IN_TS: ONE_SECOND_IN_TS,
secondsToVideoTs: secondsToVideoTs,
secondsToAudioTs: secondsToAudioTs,
videoTsToSeconds: videoTsToSeconds,
audioTsToSeconds: audioTsToSeconds,
audioTsToVideoTs: audioTsToVideoTs,
videoTsToAudioTs: videoTsToAudioTs,
metadataTsToSeconds: metadataTsToSeconds
};
var sumFrameByteLengths=function sumFrameByteLengths(array){
var i,
currentObj,
sum=0;
for (i=0; i < array.length; i++){
currentObj=array[i];
sum +=currentObj.data.byteLength;
}
return sum;
};
var prefixWithSilence=function prefixWithSilence(track, frames, audioAppendStartTs, videoBaseMediaDecodeTime){
var baseMediaDecodeTimeTs,
frameDuration=0,
audioGapDuration=0,
audioFillFrameCount=0,
audioFillDuration=0,
silentFrame,
i,
firstFrame;
if(!frames.length){
return;
}
baseMediaDecodeTimeTs=clock.audioTsToVideoTs(track.baseMediaDecodeTime, track.samplerate);
frameDuration=Math.ceil(clock.ONE_SECOND_IN_TS / (track.samplerate / 1024));
if(audioAppendStartTs&&videoBaseMediaDecodeTime){
audioGapDuration=baseMediaDecodeTimeTs - Math.max(audioAppendStartTs, videoBaseMediaDecodeTime);
audioFillFrameCount=Math.floor(audioGapDuration / frameDuration);
audioFillDuration=audioFillFrameCount * frameDuration;
}
if(audioFillFrameCount < 1||audioFillDuration > clock.ONE_SECOND_IN_TS / 2){
return;
}
silentFrame=silence[track.samplerate];
if(!silentFrame){
silentFrame=frames[0].data;
}
for (i=0; i < audioFillFrameCount; i++){
firstFrame=frames[0];
frames.splice(0, 0, {
data: silentFrame,
dts: firstFrame.dts - frameDuration,
pts: firstFrame.pts - frameDuration
});
}
track.baseMediaDecodeTime -=Math.floor(clock.videoTsToAudioTs(audioFillDuration, track.samplerate));
};
var trimAdtsFramesByEarliestDts=function trimAdtsFramesByEarliestDts(adtsFrames, track, earliestAllowedDts){
if(track.minSegmentDts >=earliestAllowedDts){
return adtsFrames;
}
track.minSegmentDts=Infinity;
return adtsFrames.filter(function (currentFrame){
if(currentFrame.dts >=earliestAllowedDts){
track.minSegmentDts=Math.min(track.minSegmentDts, currentFrame.dts);
track.minSegmentPts=track.minSegmentDts;
return true;
}
return false;
});
};
var generateSampleTable$1=function generateSampleTable(frames){
var i,
currentFrame,
samples=[];
for (i=0; i < frames.length; i++){
currentFrame=frames[i];
samples.push({
size: currentFrame.data.byteLength,
duration: 1024 
});
}
return samples;
};
var concatenateFrameData=function concatenateFrameData(frames){
var i,
currentFrame,
dataOffset=0,
data=new Uint8Array(sumFrameByteLengths(frames));
for (i=0; i < frames.length; i++){
currentFrame=frames[i];
data.set(currentFrame.data, dataOffset);
dataOffset +=currentFrame.data.byteLength;
}
return data;
};
var audioFrameUtils={
prefixWithSilence: prefixWithSilence,
trimAdtsFramesByEarliestDts: trimAdtsFramesByEarliestDts,
generateSampleTable: generateSampleTable$1,
concatenateFrameData: concatenateFrameData
};
var ONE_SECOND_IN_TS$1=clock.ONE_SECOND_IN_TS;
var collectDtsInfo=function collectDtsInfo(track, data){
if(typeof data.pts==='number'){
if(track.timelineStartInfo.pts===undefined){
track.timelineStartInfo.pts=data.pts;
}
if(track.minSegmentPts===undefined){
track.minSegmentPts=data.pts;
}else{
track.minSegmentPts=Math.min(track.minSegmentPts, data.pts);
}
if(track.maxSegmentPts===undefined){
track.maxSegmentPts=data.pts;
}else{
track.maxSegmentPts=Math.max(track.maxSegmentPts, data.pts);
}}
if(typeof data.dts==='number'){
if(track.timelineStartInfo.dts===undefined){
track.timelineStartInfo.dts=data.dts;
}
if(track.minSegmentDts===undefined){
track.minSegmentDts=data.dts;
}else{
track.minSegmentDts=Math.min(track.minSegmentDts, data.dts);
}
if(track.maxSegmentDts===undefined){
track.maxSegmentDts=data.dts;
}else{
track.maxSegmentDts=Math.max(track.maxSegmentDts, data.dts);
}}
};
var clearDtsInfo=function clearDtsInfo(track){
delete track.minSegmentDts;
delete track.maxSegmentDts;
delete track.minSegmentPts;
delete track.maxSegmentPts;
};
var calculateTrackBaseMediaDecodeTime=function calculateTrackBaseMediaDecodeTime(track, keepOriginalTimestamps){
var baseMediaDecodeTime,
scale,
minSegmentDts=track.minSegmentDts;
if(!keepOriginalTimestamps){
minSegmentDts -=track.timelineStartInfo.dts;
}
baseMediaDecodeTime=track.timelineStartInfo.baseMediaDecodeTime;
baseMediaDecodeTime +=minSegmentDts;
baseMediaDecodeTime=Math.max(0, baseMediaDecodeTime);
if(track.type==='audio'){
scale=track.samplerate / ONE_SECOND_IN_TS$1;
baseMediaDecodeTime *=scale;
baseMediaDecodeTime=Math.floor(baseMediaDecodeTime);
}
return baseMediaDecodeTime;
};
var trackDecodeInfo={
clearDtsInfo: clearDtsInfo,
calculateTrackBaseMediaDecodeTime: calculateTrackBaseMediaDecodeTime,
collectDtsInfo: collectDtsInfo
};
var USER_DATA_REGISTERED_ITU_T_T35=4,
RBSP_TRAILING_BITS=128;
var parseSei=function parseSei(bytes){
var i=0,
result={
payloadType: -1,
payloadSize: 0
},
payloadType=0,
payloadSize=0;
while (i < bytes.byteLength){
if(bytes[i]===RBSP_TRAILING_BITS){
break;
}
while (bytes[i]===0xFF){
payloadType +=255;
i++;
}
payloadType +=bytes[i++];
while (bytes[i]===0xFF){
payloadSize +=255;
i++;
}
payloadSize +=bytes[i++];
if(!result.payload&&payloadType===USER_DATA_REGISTERED_ITU_T_T35){
result.payloadType=payloadType;
result.payloadSize=payloadSize;
result.payload=bytes.subarray(i, i + payloadSize);
break;
}
i +=payloadSize;
payloadType=0;
payloadSize=0;
}
return result;
};
var parseUserData=function parseUserData(sei){
if(sei.payload[0]!==181){
return null;
}
if((sei.payload[1] << 8 | sei.payload[2])!==49){
return null;
}
if(String.fromCharCode(sei.payload[3], sei.payload[4], sei.payload[5], sei.payload[6])!=='GA94'){
return null;
}
if(sei.payload[7]!==0x03){
return null;
}
return sei.payload.subarray(8, sei.payload.length - 1);
};
var parseCaptionPackets=function parseCaptionPackets(pts, userData){
var results=[],
i,
count,
offset,
data;
if(!(userData[0] & 0x40)){
return results;
}
count=userData[0] & 0x1f;
for (i=0; i < count; i++){
offset=i * 3;
data={
type: userData[offset + 2] & 0x03,
pts: pts
};
if(userData[offset + 2] & 0x04){
data.ccData=userData[offset + 3] << 8 | userData[offset + 4];
results.push(data);
}}
return results;
};
var discardEmulationPreventionBytes=function discardEmulationPreventionBytes(data){
var length=data.byteLength,
emulationPreventionBytesPositions=[],
i=1,
newLength,
newData;
while (i < length - 2){
if(data[i]===0&&data[i + 1]===0&&data[i + 2]===0x03){
emulationPreventionBytesPositions.push(i + 2);
i +=2;
}else{
i++;
}}
if(emulationPreventionBytesPositions.length===0){
return data;
}
newLength=length - emulationPreventionBytesPositions.length;
newData=new Uint8Array(newLength);
var sourceIndex=0;
for (i=0; i < newLength; sourceIndex++, i++){
if(sourceIndex===emulationPreventionBytesPositions[0]){
sourceIndex++;
emulationPreventionBytesPositions.shift();
}
newData[i]=data[sourceIndex];
}
return newData;
};
var captionPacketParser={
parseSei: parseSei,
parseUserData: parseUserData,
parseCaptionPackets: parseCaptionPackets,
discardEmulationPreventionBytes: discardEmulationPreventionBytes,
USER_DATA_REGISTERED_ITU_T_T35: USER_DATA_REGISTERED_ITU_T_T35
};
var CaptionStream=function CaptionStream(){
CaptionStream.prototype.init.call(this);
this.captionPackets_=[];
this.ccStreams_=[new Cea608Stream(0, 0),
new Cea608Stream(0, 1),
new Cea608Stream(1, 0),
new Cea608Stream(1, 1)
];
this.reset();
this.ccStreams_.forEach(function (cc){
cc.on('data', this.trigger.bind(this, 'data'));
cc.on('partialdone', this.trigger.bind(this, 'partialdone'));
cc.on('done', this.trigger.bind(this, 'done'));
}, this);
};
CaptionStream.prototype=new stream();
CaptionStream.prototype.push=function (event){
var sei, userData, newCaptionPackets;
if(event.nalUnitType!=='sei_rbsp'){
return;
}
sei=captionPacketParser.parseSei(event.escapedRBSP);
if(sei.payloadType!==captionPacketParser.USER_DATA_REGISTERED_ITU_T_T35){
return;
}
userData=captionPacketParser.parseUserData(sei);
if(!userData){
return;
}
if(event.dts < this.latestDts_){
this.ignoreNextEqualDts_=true;
return;
}else if(event.dts===this.latestDts_&&this.ignoreNextEqualDts_){
this.numSameDts_--;
if(!this.numSameDts_){
this.ignoreNextEqualDts_=false;
}
return;
}
newCaptionPackets=captionPacketParser.parseCaptionPackets(event.pts, userData);
this.captionPackets_=this.captionPackets_.concat(newCaptionPackets);
if(this.latestDts_!==event.dts){
this.numSameDts_=0;
}
this.numSameDts_++;
this.latestDts_=event.dts;
};
CaptionStream.prototype.flushCCStreams=function (flushType){
this.ccStreams_.forEach(function (cc){
return flushType==='flush' ? cc.flush():cc.partialFlush();
}, this);
};
CaptionStream.prototype.flushStream=function (flushType){
if(!this.captionPackets_.length){
this.flushCCStreams(flushType);
return;
}
this.captionPackets_.forEach(function (elem, idx){
elem.presortIndex=idx;
});
this.captionPackets_.sort(function (a, b){
if(a.pts===b.pts){
return a.presortIndex - b.presortIndex;
}
return a.pts - b.pts;
});
this.captionPackets_.forEach(function (packet){
if(packet.type < 2){
this.dispatchCea608Packet(packet);
}}, this);
this.captionPackets_.length=0;
this.flushCCStreams(flushType);
};
CaptionStream.prototype.flush=function (){
return this.flushStream('flush');
};
CaptionStream.prototype.partialFlush=function (){
return this.flushStream('partialFlush');
};
CaptionStream.prototype.reset=function (){
this.latestDts_=null;
this.ignoreNextEqualDts_=false;
this.numSameDts_=0;
this.activeCea608Channel_=[null, null];
this.ccStreams_.forEach(function (ccStream){
ccStream.reset();
});
};
CaptionStream.prototype.dispatchCea608Packet=function (packet){
if(this.setsTextOrXDSActive(packet)){
this.activeCea608Channel_[packet.type]=null;
}else if(this.setsChannel1Active(packet)){
this.activeCea608Channel_[packet.type]=0;
}else if(this.setsChannel2Active(packet)){
this.activeCea608Channel_[packet.type]=1;
}
if(this.activeCea608Channel_[packet.type]===null){
return;
}
this.ccStreams_[(packet.type << 1) + this.activeCea608Channel_[packet.type]].push(packet);
};
CaptionStream.prototype.setsChannel1Active=function (packet){
return (packet.ccData & 0x7800)===0x1000;
};
CaptionStream.prototype.setsChannel2Active=function (packet){
return (packet.ccData & 0x7800)===0x1800;
};
CaptionStream.prototype.setsTextOrXDSActive=function (packet){
return (packet.ccData & 0x7100)===0x0100||(packet.ccData & 0x78fe)===0x102a||(packet.ccData & 0x78fe)===0x182a;
};
var CHARACTER_TRANSLATION={
0x2a: 0xe1,
0x5c: 0xe9,
0x5e: 0xed,
0x5f: 0xf3,
0x60: 0xfa,
0x7b: 0xe7,
0x7c: 0xf7,
0x7d: 0xd1,
0x7e: 0xf1,
0x7f: 0x2588,
0x0130: 0xae,
0x0131: 0xb0,
0x0132: 0xbd,
0x0133: 0xbf,
0x0134: 0x2122,
0x0135: 0xa2,
0x0136: 0xa3,
0x0137: 0x266a,
0x0138: 0xe0,
0x0139: 0xa0,
0x013a: 0xe8,
0x013b: 0xe2,
0x013c: 0xea,
0x013d: 0xee,
0x013e: 0xf4,
0x013f: 0xfb,
0x0220: 0xc1,
0x0221: 0xc9,
0x0222: 0xd3,
0x0223: 0xda,
0x0224: 0xdc,
0x0225: 0xfc,
0x0226: 0x2018,
0x0227: 0xa1,
0x0228: 0x2a,
0x0229: 0x27,
0x022a: 0x2014,
0x022b: 0xa9,
0x022c: 0x2120,
0x022d: 0x2022,
0x022e: 0x201c,
0x022f: 0x201d,
0x0230: 0xc0,
0x0231: 0xc2,
0x0232: 0xc7,
0x0233: 0xc8,
0x0234: 0xca,
0x0235: 0xcb,
0x0236: 0xeb,
0x0237: 0xce,
0x0238: 0xcf,
0x0239: 0xef,
0x023a: 0xd4,
0x023b: 0xd9,
0x023c: 0xf9,
0x023d: 0xdb,
0x023e: 0xab,
0x023f: 0xbb,
0x0320: 0xc3,
0x0321: 0xe3,
0x0322: 0xcd,
0x0323: 0xcc,
0x0324: 0xec,
0x0325: 0xd2,
0x0326: 0xf2,
0x0327: 0xd5,
0x0328: 0xf5,
0x0329: 0x7b,
0x032a: 0x7d,
0x032b: 0x5c,
0x032c: 0x5e,
0x032d: 0x5f,
0x032e: 0x7c,
0x032f: 0x7e,
0x0330: 0xc4,
0x0331: 0xe4,
0x0332: 0xd6,
0x0333: 0xf6,
0x0334: 0xdf,
0x0335: 0xa5,
0x0336: 0xa4,
0x0337: 0x2502,
0x0338: 0xc5,
0x0339: 0xe5,
0x033a: 0xd8,
0x033b: 0xf8,
0x033c: 0x250c,
0x033d: 0x2510,
0x033e: 0x2514,
0x033f: 0x2518 
};
var getCharFromCode=function getCharFromCode(code){
if(code===null){
return '';
}
code=CHARACTER_TRANSLATION[code]||code;
return String.fromCharCode(code);
};
var BOTTOM_ROW=14;
var ROWS=[0x1100, 0x1120, 0x1200, 0x1220, 0x1500, 0x1520, 0x1600, 0x1620, 0x1700, 0x1720, 0x1000, 0x1300, 0x1320, 0x1400, 0x1420];
var createDisplayBuffer=function createDisplayBuffer(){
var result=[],
i=BOTTOM_ROW + 1;
while (i--){
result.push('');
}
return result;
};
var Cea608Stream=function Cea608Stream(field, dataChannel){
Cea608Stream.prototype.init.call(this);
this.field_=field||0;
this.dataChannel_=dataChannel||0;
this.name_='CC' + ((this.field_ << 1 | this.dataChannel_) + 1);
this.setConstants();
this.reset();
this.push=function (packet){
var data, swap, char0, char1, text;
data=packet.ccData & 0x7f7f;
if(data===this.lastControlCode_){
this.lastControlCode_=null;
return;
}
if((data & 0xf000)===0x1000){
this.lastControlCode_=data;
}else if(data!==this.PADDING_){
this.lastControlCode_=null;
}
char0=data >>> 8;
char1=data & 0xff;
if(data===this.PADDING_){
return;
}else if(data===this.RESUME_CAPTION_LOADING_){
this.mode_='popOn';
}else if(data===this.END_OF_CAPTION_){
this.mode_='popOn';
this.clearFormatting(packet.pts);
this.flushDisplayed(packet.pts);
swap=this.displayed_;
this.displayed_=this.nonDisplayed_;
this.nonDisplayed_=swap;
this.startPts_=packet.pts;
}else if(data===this.ROLL_UP_2_ROWS_){
this.rollUpRows_=2;
this.setRollUp(packet.pts);
}else if(data===this.ROLL_UP_3_ROWS_){
this.rollUpRows_=3;
this.setRollUp(packet.pts);
}else if(data===this.ROLL_UP_4_ROWS_){
this.rollUpRows_=4;
this.setRollUp(packet.pts);
}else if(data===this.CARRIAGE_RETURN_){
this.clearFormatting(packet.pts);
this.flushDisplayed(packet.pts);
this.shiftRowsUp_();
this.startPts_=packet.pts;
}else if(data===this.BACKSPACE_){
if(this.mode_==='popOn'){
this.nonDisplayed_[this.row_]=this.nonDisplayed_[this.row_].slice(0, -1);
}else{
this.displayed_[this.row_]=this.displayed_[this.row_].slice(0, -1);
}}else if(data===this.ERASE_DISPLAYED_MEMORY_){
this.flushDisplayed(packet.pts);
this.displayed_=createDisplayBuffer();
}else if(data===this.ERASE_NON_DISPLAYED_MEMORY_){
this.nonDisplayed_=createDisplayBuffer();
}else if(data===this.RESUME_DIRECT_CAPTIONING_){
if(this.mode_!=='paintOn'){
this.flushDisplayed(packet.pts);
this.displayed_=createDisplayBuffer();
}
this.mode_='paintOn';
this.startPts_=packet.pts;
}else if(this.isSpecialCharacter(char0, char1)){
char0=(char0 & 0x03) << 8;
text=getCharFromCode(char0 | char1);
this[this.mode_](packet.pts, text);
this.column_++;
}else if(this.isExtCharacter(char0, char1)){
if(this.mode_==='popOn'){
this.nonDisplayed_[this.row_]=this.nonDisplayed_[this.row_].slice(0, -1);
}else{
this.displayed_[this.row_]=this.displayed_[this.row_].slice(0, -1);
}
char0=(char0 & 0x03) << 8;
text=getCharFromCode(char0 | char1);
this[this.mode_](packet.pts, text);
this.column_++;
}else if(this.isMidRowCode(char0, char1)){
this.clearFormatting(packet.pts);
this[this.mode_](packet.pts, ' ');
this.column_++;
if((char1 & 0xe)===0xe){
this.addFormatting(packet.pts, ['i']);
}
if((char1 & 0x1)===0x1){
this.addFormatting(packet.pts, ['u']);
}}else if(this.isOffsetControlCode(char0, char1)){
this.column_ +=char1 & 0x03;
}else if(this.isPAC(char0, char1)){
var row=ROWS.indexOf(data & 0x1f20);
if(this.mode_==='rollUp'){
if(row - this.rollUpRows_ + 1 < 0){
row=this.rollUpRows_ - 1;
}
this.setRollUp(packet.pts, row);
}
if(row!==this.row_){
this.clearFormatting(packet.pts);
this.row_=row;
}
if(char1 & 0x1&&this.formatting_.indexOf('u')===-1){
this.addFormatting(packet.pts, ['u']);
}
if((data & 0x10)===0x10){
this.column_=((data & 0xe) >> 1) * 4;
}
if(this.isColorPAC(char1)){
if((char1 & 0xe)===0xe){
this.addFormatting(packet.pts, ['i']);
}}
}else if(this.isNormalChar(char0)){
if(char1===0x00){
char1=null;
}
text=getCharFromCode(char0);
text +=getCharFromCode(char1);
this[this.mode_](packet.pts, text);
this.column_ +=text.length;
}};};
Cea608Stream.prototype=new stream();
Cea608Stream.prototype.flushDisplayed=function (pts){
var content=this.displayed_
.map(function (row){
try {
return row.trim();
} catch (e){
console.error('Skipping malformed caption.');
return '';
}})
.join('\n')
.replace(/^\n+|\n+$/g, '');
if(content.length){
this.trigger('data', {
startPts: this.startPts_,
endPts: pts,
text: content,
stream: this.name_
});
}};
Cea608Stream.prototype.reset=function (){
this.mode_='popOn';
this.topRow_=0;
this.startPts_=0;
this.displayed_=createDisplayBuffer();
this.nonDisplayed_=createDisplayBuffer();
this.lastControlCode_=null;
this.column_=0;
this.row_=BOTTOM_ROW;
this.rollUpRows_=2;
this.formatting_=[];
};
Cea608Stream.prototype.setConstants=function (){
if(this.dataChannel_===0){
this.BASE_=0x10;
this.EXT_=0x11;
this.CONTROL_=(0x14 | this.field_) << 8;
this.OFFSET_=0x17;
}else if(this.dataChannel_===1){
this.BASE_=0x18;
this.EXT_=0x19;
this.CONTROL_=(0x1c | this.field_) << 8;
this.OFFSET_=0x1f;
}
this.PADDING_=0x0000;
this.RESUME_CAPTION_LOADING_=this.CONTROL_ | 0x20;
this.END_OF_CAPTION_=this.CONTROL_ | 0x2f;
this.ROLL_UP_2_ROWS_=this.CONTROL_ | 0x25;
this.ROLL_UP_3_ROWS_=this.CONTROL_ | 0x26;
this.ROLL_UP_4_ROWS_=this.CONTROL_ | 0x27;
this.CARRIAGE_RETURN_=this.CONTROL_ | 0x2d;
this.RESUME_DIRECT_CAPTIONING_=this.CONTROL_ | 0x29;
this.BACKSPACE_=this.CONTROL_ | 0x21;
this.ERASE_DISPLAYED_MEMORY_=this.CONTROL_ | 0x2c;
this.ERASE_NON_DISPLAYED_MEMORY_=this.CONTROL_ | 0x2e;
};
Cea608Stream.prototype.isSpecialCharacter=function (char0, char1){
return char0===this.EXT_&&char1 >=0x30&&char1 <=0x3f;
};
Cea608Stream.prototype.isExtCharacter=function (char0, char1){
return (char0===this.EXT_ + 1||char0===this.EXT_ + 2)&&char1 >=0x20&&char1 <=0x3f;
};
Cea608Stream.prototype.isMidRowCode=function (char0, char1){
return char0===this.EXT_&&char1 >=0x20&&char1 <=0x2f;
};
Cea608Stream.prototype.isOffsetControlCode=function (char0, char1){
return char0===this.OFFSET_&&char1 >=0x21&&char1 <=0x23;
};
Cea608Stream.prototype.isPAC=function (char0, char1){
return char0 >=this.BASE_&&char0 < this.BASE_ + 8&&char1 >=0x40&&char1 <=0x7f;
};
Cea608Stream.prototype.isColorPAC=function (char1){
return char1 >=0x40&&char1 <=0x4f||char1 >=0x60&&char1 <=0x7f;
};
Cea608Stream.prototype.isNormalChar=function (_char){
return _char >=0x20&&_char <=0x7f;
};
Cea608Stream.prototype.setRollUp=function (pts, newBaseRow){
if(this.mode_!=='rollUp'){
this.row_=BOTTOM_ROW;
this.mode_='rollUp';
this.flushDisplayed(pts);
this.nonDisplayed_=createDisplayBuffer();
this.displayed_=createDisplayBuffer();
}
if(newBaseRow!==undefined&&newBaseRow!==this.row_){
for (var i=0; i < this.rollUpRows_; i++){
this.displayed_[newBaseRow - i]=this.displayed_[this.row_ - i];
this.displayed_[this.row_ - i]='';
}}
if(newBaseRow===undefined){
newBaseRow=this.row_;
}
this.topRow_=newBaseRow - this.rollUpRows_ + 1;
};
Cea608Stream.prototype.addFormatting=function (pts, format){
this.formatting_=this.formatting_.concat(format);
var text=format.reduce(function (text, format){
return text + '<' + format + '>';
}, '');
this[this.mode_](pts, text);
};
Cea608Stream.prototype.clearFormatting=function (pts){
if(!this.formatting_.length){
return;
}
var text=this.formatting_.reverse().reduce(function (text, format){
return text + '</' + format + '>';
}, '');
this.formatting_=[];
this[this.mode_](pts, text);
};
Cea608Stream.prototype.popOn=function (pts, text){
var baseRow=this.nonDisplayed_[this.row_];
baseRow +=text;
this.nonDisplayed_[this.row_]=baseRow;
};
Cea608Stream.prototype.rollUp=function (pts, text){
var baseRow=this.displayed_[this.row_];
baseRow +=text;
this.displayed_[this.row_]=baseRow;
};
Cea608Stream.prototype.shiftRowsUp_=function (){
var i;
for (i=0; i < this.topRow_; i++){
this.displayed_[i]='';
}
for (i=this.row_ + 1; i < BOTTOM_ROW + 1; i++){
this.displayed_[i]='';
}
for (i=this.topRow_; i < this.row_; i++){
this.displayed_[i]=this.displayed_[i + 1];
}
this.displayed_[this.row_]='';
};
Cea608Stream.prototype.paintOn=function (pts, text){
var baseRow=this.displayed_[this.row_];
baseRow +=text;
this.displayed_[this.row_]=baseRow;
};
var captionStream={
CaptionStream: CaptionStream,
Cea608Stream: Cea608Stream
};
var streamTypes={
H264_STREAM_TYPE: 0x1B,
ADTS_STREAM_TYPE: 0x0F,
METADATA_STREAM_TYPE: 0x15
};
var MAX_TS=8589934592;
var RO_THRESH=4294967296;
var TYPE_SHARED='shared';
var handleRollover=function handleRollover(value, reference){
var direction=1;
if(value > reference){
direction=-1;
}
while (Math.abs(reference - value) > RO_THRESH){
value +=direction * MAX_TS;
}
return value;
};
var TimestampRolloverStream=function TimestampRolloverStream(type){
var lastDTS, referenceDTS;
TimestampRolloverStream.prototype.init.call(this);
this.type_=type||TYPE_SHARED;
this.push=function (data){
if(this.type_!==TYPE_SHARED&&data.type!==this.type_){
return;
}
if(referenceDTS===undefined){
referenceDTS=data.dts;
}
data.dts=handleRollover(data.dts, referenceDTS);
data.pts=handleRollover(data.pts, referenceDTS);
lastDTS=data.dts;
this.trigger('data', data);
};
this.flush=function (){
referenceDTS=lastDTS;
this.trigger('done');
};
this.endTimeline=function (){
this.flush();
this.trigger('endedtimeline');
};
this.discontinuity=function (){
referenceDTS=void 0;
lastDTS=void 0;
};
this.reset=function (){
this.discontinuity();
this.trigger('reset');
};};
TimestampRolloverStream.prototype=new stream();
var timestampRolloverStream={
TimestampRolloverStream: TimestampRolloverStream,
handleRollover: handleRollover
};
var percentEncode=function percentEncode(bytes, start, end){
var i,
result='';
for (i=start; i < end; i++){
result +='%' + ('00' + bytes[i].toString(16)).slice(-2);
}
return result;
},
parseUtf8=function parseUtf8(bytes, start, end){
return decodeURIComponent(percentEncode(bytes, start, end));
},
parseIso88591=function parseIso88591(bytes, start, end){
return unescape(percentEncode(bytes, start, end));
},
parseSyncSafeInteger=function parseSyncSafeInteger(data){
return data[0] << 21 | data[1] << 14 | data[2] << 7 | data[3];
},
tagParsers={
TXXX: function TXXX(tag){
var i;
if(tag.data[0]!==3){
return;
}
for (i=1; i < tag.data.length; i++){
if(tag.data[i]===0){
tag.description=parseUtf8(tag.data, 1, i);
tag.value=parseUtf8(tag.data, i + 1, tag.data.length).replace(/\0*$/, '');
break;
}}
tag.data=tag.value;
},
WXXX: function WXXX(tag){
var i;
if(tag.data[0]!==3){
return;
}
for (i=1; i < tag.data.length; i++){
if(tag.data[i]===0){
tag.description=parseUtf8(tag.data, 1, i);
tag.url=parseUtf8(tag.data, i + 1, tag.data.length);
break;
}}
},
PRIV: function PRIV(tag){
var i;
for (i=0; i < tag.data.length; i++){
if(tag.data[i]===0){
tag.owner=parseIso88591(tag.data, 0, i);
break;
}}
tag.privateData=tag.data.subarray(i + 1);
tag.data=tag.privateData;
}},
_MetadataStream;
_MetadataStream=function MetadataStream(options){
var settings={
debug: !!(options&&options.debug),
descriptor: options&&options.descriptor
},
tagSize=0,
buffer=[],
bufferSize=0,
i;
_MetadataStream.prototype.init.call(this);
this.dispatchType=streamTypes.METADATA_STREAM_TYPE.toString(16);
if(settings.descriptor){
for (i=0; i < settings.descriptor.length; i++){
this.dispatchType +=('00' + settings.descriptor[i].toString(16)).slice(-2);
}}
this.push=function (chunk){
var tag, frameStart, frameSize, frame, i, frameHeader;
if(chunk.type!=='timed-metadata'){
return;
}
if(chunk.dataAlignmentIndicator){
bufferSize=0;
buffer.length=0;
}
if(buffer.length===0&&(chunk.data.length < 10||chunk.data[0]!=='I'.charCodeAt(0)||chunk.data[1]!=='D'.charCodeAt(0)||chunk.data[2]!=='3'.charCodeAt(0))){
if(settings.debug){
console.log('Skipping unrecognized metadata packet');
}
return;
}
buffer.push(chunk);
bufferSize +=chunk.data.byteLength;
if(buffer.length===1){
tagSize=parseSyncSafeInteger(chunk.data.subarray(6, 10));
tagSize +=10;
}
if(bufferSize < tagSize){
return;
}
tag={
data: new Uint8Array(tagSize),
frames: [],
pts: buffer[0].pts,
dts: buffer[0].dts
};
for (i=0; i < tagSize;){
tag.data.set(buffer[0].data.subarray(0, tagSize - i), i);
i +=buffer[0].data.byteLength;
bufferSize -=buffer[0].data.byteLength;
buffer.shift();
}
frameStart=10;
if(tag.data[5] & 0x40){
frameStart +=4;
frameStart +=parseSyncSafeInteger(tag.data.subarray(10, 14));
tagSize -=parseSyncSafeInteger(tag.data.subarray(16, 20));
}
do {
frameSize=parseSyncSafeInteger(tag.data.subarray(frameStart + 4, frameStart + 8));
if(frameSize < 1){
return console.log('Malformed ID3 frame encountered. Skipping metadata parsing.');
}
frameHeader=String.fromCharCode(tag.data[frameStart], tag.data[frameStart + 1], tag.data[frameStart + 2], tag.data[frameStart + 3]);
frame={
id: frameHeader,
data: tag.data.subarray(frameStart + 10, frameStart + frameSize + 10)
};
frame.key=frame.id;
if(tagParsers[frame.id]){
tagParsers[frame.id](frame);
if(frame.owner==='com.apple.streaming.transportStreamTimestamp'){
var d=frame.data,
size=(d[3] & 0x01) << 30 | d[4] << 22 | d[5] << 14 | d[6] << 6 | d[7] >>> 2;
size *=4;
size +=d[7] & 0x03;
frame.timeStamp=size;
if(tag.pts===undefined&&tag.dts===undefined){
tag.pts=frame.timeStamp;
tag.dts=frame.timeStamp;
}
this.trigger('timestamp', frame);
}}
tag.frames.push(frame);
frameStart +=10;
frameStart +=frameSize;
} while (frameStart < tagSize);
this.trigger('data', tag);
};};
_MetadataStream.prototype=new stream();
var metadataStream=_MetadataStream;
var TimestampRolloverStream$1=timestampRolloverStream.TimestampRolloverStream;
var _TransportPacketStream, _TransportParseStream, _ElementaryStream;
var MP2T_PACKET_LENGTH=188,
SYNC_BYTE=0x47;
_TransportPacketStream=function TransportPacketStream(){
var buffer=new Uint8Array(MP2T_PACKET_LENGTH),
bytesInBuffer=0;
_TransportPacketStream.prototype.init.call(this);
this.push=function (bytes){
var startIndex=0,
endIndex=MP2T_PACKET_LENGTH,
everything;
if(bytesInBuffer){
everything=new Uint8Array(bytes.byteLength + bytesInBuffer);
everything.set(buffer.subarray(0, bytesInBuffer));
everything.set(bytes, bytesInBuffer);
bytesInBuffer=0;
}else{
everything=bytes;
}
while (endIndex < everything.byteLength){
if(everything[startIndex]===SYNC_BYTE&&everything[endIndex]===SYNC_BYTE){
this.trigger('data', everything.subarray(startIndex, endIndex));
startIndex +=MP2T_PACKET_LENGTH;
endIndex +=MP2T_PACKET_LENGTH;
continue;
}
startIndex++;
endIndex++;
}
if(startIndex < everything.byteLength){
buffer.set(everything.subarray(startIndex), 0);
bytesInBuffer=everything.byteLength - startIndex;
}};
this.flush=function (){
if(bytesInBuffer===MP2T_PACKET_LENGTH&&buffer[0]===SYNC_BYTE){
this.trigger('data', buffer);
bytesInBuffer=0;
}
this.trigger('done');
};
this.endTimeline=function (){
this.flush();
this.trigger('endedtimeline');
};
this.reset=function (){
bytesInBuffer=0;
this.trigger('reset');
};};
_TransportPacketStream.prototype=new stream();
_TransportParseStream=function TransportParseStream(){
var parsePsi, parsePat, parsePmt, self;
_TransportParseStream.prototype.init.call(this);
self=this;
this.packetsWaitingForPmt=[];
this.programMapTable=undefined;
parsePsi=function parsePsi(payload, psi){
var offset=0;
if(psi.payloadUnitStartIndicator){
offset +=payload[offset] + 1;
}
if(psi.type==='pat'){
parsePat(payload.subarray(offset), psi);
}else{
parsePmt(payload.subarray(offset), psi);
}};
parsePat=function parsePat(payload, pat){
pat.section_number=payload[7];
pat.last_section_number=payload[8];
self.pmtPid=(payload[10] & 0x1F) << 8 | payload[11];
pat.pmtPid=self.pmtPid;
};
parsePmt=function parsePmt(payload, pmt){
var sectionLength, tableEnd, programInfoLength, offset;
if(!(payload[5] & 0x01)){
return;
}
self.programMapTable={
video: null,
audio: null,
'timed-metadata': {}};
sectionLength=(payload[1] & 0x0f) << 8 | payload[2];
tableEnd=3 + sectionLength - 4;
programInfoLength=(payload[10] & 0x0f) << 8 | payload[11];
offset=12 + programInfoLength;
while (offset < tableEnd){
var streamType=payload[offset];
var pid=(payload[offset + 1] & 0x1F) << 8 | payload[offset + 2];
if(streamType===streamTypes.H264_STREAM_TYPE&&self.programMapTable.video===null){
self.programMapTable.video=pid;
}else if(streamType===streamTypes.ADTS_STREAM_TYPE&&self.programMapTable.audio===null){
self.programMapTable.audio=pid;
}else if(streamType===streamTypes.METADATA_STREAM_TYPE){
self.programMapTable['timed-metadata'][pid]=streamType;
}
offset +=((payload[offset + 3] & 0x0F) << 8 | payload[offset + 4]) + 5;
}
pmt.programMapTable=self.programMapTable;
};
this.push=function (packet){
var result={},
offset=4;
result.payloadUnitStartIndicator = !!(packet[1] & 0x40);
result.pid=packet[1] & 0x1f;
result.pid <<=8;
result.pid |=packet[2];
if((packet[3] & 0x30) >>> 4 > 0x01){
offset +=packet[offset] + 1;
}
if(result.pid===0){
result.type='pat';
parsePsi(packet.subarray(offset), result);
this.trigger('data', result);
}else if(result.pid===this.pmtPid){
result.type='pmt';
parsePsi(packet.subarray(offset), result);
this.trigger('data', result);
while (this.packetsWaitingForPmt.length){
this.processPes_.apply(this, this.packetsWaitingForPmt.shift());
}}else if(this.programMapTable===undefined){
this.packetsWaitingForPmt.push([packet, offset, result]);
}else{
this.processPes_(packet, offset, result);
}};
this.processPes_=function (packet, offset, result){
if(result.pid===this.programMapTable.video){
result.streamType=streamTypes.H264_STREAM_TYPE;
}else if(result.pid===this.programMapTable.audio){
result.streamType=streamTypes.ADTS_STREAM_TYPE;
}else{
result.streamType=this.programMapTable['timed-metadata'][result.pid];
}
result.type='pes';
result.data=packet.subarray(offset);
this.trigger('data', result);
};};
_TransportParseStream.prototype=new stream();
_TransportParseStream.STREAM_TYPES={
h264: 0x1b,
adts: 0x0f
};
_ElementaryStream=function ElementaryStream(){
var self=this,
video={
data: [],
size: 0
},
audio={
data: [],
size: 0
},
timedMetadata={
data: [],
size: 0
},
programMapTable,
parsePes=function parsePes(payload, pes){
var ptsDtsFlags;
pes.packetLength=6 + (payload[4] << 8 | payload[5]);
pes.dataAlignmentIndicator=(payload[6] & 0x04)!==0;
ptsDtsFlags=payload[7];
if(ptsDtsFlags & 0xC0){
pes.pts=(payload[9] & 0x0E) << 27 | (payload[10] & 0xFF) << 20 | (payload[11] & 0xFE) << 12 | (payload[12] & 0xFF) << 5 | (payload[13] & 0xFE) >>> 3;
pes.pts *=4;
pes.pts +=(payload[13] & 0x06) >>> 1;
pes.dts=pes.pts;
if(ptsDtsFlags & 0x40){
pes.dts=(payload[14] & 0x0E) << 27 | (payload[15] & 0xFF) << 20 | (payload[16] & 0xFE) << 12 | (payload[17] & 0xFF) << 5 | (payload[18] & 0xFE) >>> 3;
pes.dts *=4;
pes.dts +=(payload[18] & 0x06) >>> 1;
}}
pes.data=payload.subarray(9 + payload[8]);
},
flushStream=function flushStream(stream$$1, type, forceFlush){
var packetData=new Uint8Array(stream$$1.size),
event={
type: type
},
i=0,
offset=0,
packetFlushable=false,
fragment;
if(!stream$$1.data.length||stream$$1.size < 9){
return;
}
event.trackId=stream$$1.data[0].pid;
for (i=0; i < stream$$1.data.length; i++){
fragment=stream$$1.data[i];
packetData.set(fragment.data, offset);
offset +=fragment.data.byteLength;
}
parsePes(packetData, event);
packetFlushable=type==='video'||event.packetLength <=stream$$1.size;
if(forceFlush||packetFlushable){
stream$$1.size=0;
stream$$1.data.length=0;
}
if(packetFlushable){
self.trigger('data', event);
}};
_ElementaryStream.prototype.init.call(this);
this.push=function (data){
({
pat: function pat(){
},
pes: function pes(){
var stream$$1, streamType;
switch (data.streamType){
case streamTypes.H264_STREAM_TYPE:
case streamTypes.H264_STREAM_TYPE:
stream$$1=video;
streamType='video';
break;
case streamTypes.ADTS_STREAM_TYPE:
stream$$1=audio;
streamType='audio';
break;
case streamTypes.METADATA_STREAM_TYPE:
stream$$1=timedMetadata;
streamType='timed-metadata';
break;
default:
return;
}
if(data.payloadUnitStartIndicator){
flushStream(stream$$1, streamType, true);
}
stream$$1.data.push(data);
stream$$1.size +=data.data.byteLength;
},
pmt: function pmt(){
var event={
type: 'metadata',
tracks: []
};
programMapTable=data.programMapTable;
if(programMapTable.video!==null){
event.tracks.push({
timelineStartInfo: {
baseMediaDecodeTime: 0
},
id: +programMapTable.video,
codec: 'avc',
type: 'video'
});
}
if(programMapTable.audio!==null){
event.tracks.push({
timelineStartInfo: {
baseMediaDecodeTime: 0
},
id: +programMapTable.audio,
codec: 'adts',
type: 'audio'
});
}
self.trigger('data', event);
}})[data.type]();
};
this.reset=function (){
video.size=0;
video.data.length=0;
audio.size=0;
audio.data.length=0;
this.trigger('reset');
};
this.flushStreams_=function (){
flushStream(video, 'video');
flushStream(audio, 'audio');
flushStream(timedMetadata, 'timed-metadata');
};
this.flush=function (){
this.flushStreams_();
this.trigger('done');
};};
_ElementaryStream.prototype=new stream();
var m2ts={
PAT_PID: 0x0000,
MP2T_PACKET_LENGTH: MP2T_PACKET_LENGTH,
TransportPacketStream: _TransportPacketStream,
TransportParseStream: _TransportParseStream,
ElementaryStream: _ElementaryStream,
TimestampRolloverStream: TimestampRolloverStream$1,
CaptionStream: captionStream.CaptionStream,
Cea608Stream: captionStream.Cea608Stream,
MetadataStream: metadataStream
};
for (var type in streamTypes){
if(streamTypes.hasOwnProperty(type)){
m2ts[type]=streamTypes[type];
}}
var m2ts_1=m2ts;
var ONE_SECOND_IN_TS$2=clock.ONE_SECOND_IN_TS;
var _AdtsStream;
var ADTS_SAMPLING_FREQUENCIES=[96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350];
_AdtsStream=function AdtsStream(handlePartialSegments){
var buffer,
frameNum=0;
_AdtsStream.prototype.init.call(this);
this.push=function (packet){
var i=0,
frameLength,
protectionSkipBytes,
frameEnd,
oldBuffer,
sampleCount,
adtsFrameDuration;
if(!handlePartialSegments){
frameNum=0;
}
if(packet.type!=='audio'){
return;
}
if(buffer){
oldBuffer=buffer;
buffer=new Uint8Array(oldBuffer.byteLength + packet.data.byteLength);
buffer.set(oldBuffer);
buffer.set(packet.data, oldBuffer.byteLength);
}else{
buffer=packet.data;
}
while (i + 5 < buffer.length){
if(buffer[i]!==0xFF||(buffer[i + 1] & 0xF6)!==0xF0){
i++;
continue;
}
protectionSkipBytes=(~buffer[i + 1] & 0x01) * 2;
frameLength=(buffer[i + 3] & 0x03) << 11 | buffer[i + 4] << 3 | (buffer[i + 5] & 0xe0) >> 5;
sampleCount=((buffer[i + 6] & 0x03) + 1) * 1024;
adtsFrameDuration=sampleCount * ONE_SECOND_IN_TS$2 / ADTS_SAMPLING_FREQUENCIES[(buffer[i + 2] & 0x3c) >>> 2];
frameEnd=i + frameLength;
if(buffer.byteLength < frameEnd){
return;
}
this.trigger('data', {
pts: packet.pts + frameNum * adtsFrameDuration,
dts: packet.dts + frameNum * adtsFrameDuration,
sampleCount: sampleCount,
audioobjecttype: (buffer[i + 2] >>> 6 & 0x03) + 1,
channelcount: (buffer[i + 2] & 1) << 2 | (buffer[i + 3] & 0xc0) >>> 6,
samplerate: ADTS_SAMPLING_FREQUENCIES[(buffer[i + 2] & 0x3c) >>> 2],
samplingfrequencyindex: (buffer[i + 2] & 0x3c) >>> 2,
samplesize: 16,
data: buffer.subarray(i + 7 + protectionSkipBytes, frameEnd)
});
frameNum++;
if(buffer.byteLength===frameEnd){
buffer=undefined;
return;
}
buffer=buffer.subarray(frameEnd);
}};
this.flush=function (){
frameNum=0;
this.trigger('done');
};
this.reset=function (){
buffer=void 0;
this.trigger('reset');
};
this.endTimeline=function (){
buffer=void 0;
this.trigger('endedtimeline');
};};
_AdtsStream.prototype=new stream();
var adts=_AdtsStream;
var ExpGolomb;
ExpGolomb=function ExpGolomb(workingData){
var
workingBytesAvailable=workingData.byteLength,
workingWord=0,
workingBitsAvailable=0;
this.length=function (){
return 8 * workingBytesAvailable;
};
this.bitsAvailable=function (){
return 8 * workingBytesAvailable + workingBitsAvailable;
};
this.loadWord=function (){
var position=workingData.byteLength - workingBytesAvailable,
workingBytes=new Uint8Array(4),
availableBytes=Math.min(4, workingBytesAvailable);
if(availableBytes===0){
throw new Error('no bytes available');
}
workingBytes.set(workingData.subarray(position, position + availableBytes));
workingWord=new DataView(workingBytes.buffer).getUint32(0);
workingBitsAvailable=availableBytes * 8;
workingBytesAvailable -=availableBytes;
};
this.skipBits=function (count){
var skipBytes;
if(workingBitsAvailable > count){
workingWord <<=count;
workingBitsAvailable -=count;
}else{
count -=workingBitsAvailable;
skipBytes=Math.floor(count / 8);
count -=skipBytes * 8;
workingBytesAvailable -=skipBytes;
this.loadWord();
workingWord <<=count;
workingBitsAvailable -=count;
}};
this.readBits=function (size){
var bits=Math.min(workingBitsAvailable, size),
valu=workingWord >>> 32 - bits;
workingBitsAvailable -=bits;
if(workingBitsAvailable > 0){
workingWord <<=bits;
}else if(workingBytesAvailable > 0){
this.loadWord();
}
bits=size - bits;
if(bits > 0){
return valu << bits | this.readBits(bits);
}
return valu;
};
this.skipLeadingZeros=function (){
var leadingZeroCount;
for (leadingZeroCount=0; leadingZeroCount < workingBitsAvailable; ++leadingZeroCount){
if((workingWord & 0x80000000 >>> leadingZeroCount)!==0){
workingWord <<=leadingZeroCount;
workingBitsAvailable -=leadingZeroCount;
return leadingZeroCount;
}}
this.loadWord();
return leadingZeroCount + this.skipLeadingZeros();
};
this.skipUnsignedExpGolomb=function (){
this.skipBits(1 + this.skipLeadingZeros());
};
this.skipExpGolomb=function (){
this.skipBits(1 + this.skipLeadingZeros());
};
this.readUnsignedExpGolomb=function (){
var clz=this.skipLeadingZeros();
return this.readBits(clz + 1) - 1;
};
this.readExpGolomb=function (){
var valu=this.readUnsignedExpGolomb();
if(0x01 & valu){
return 1 + valu >>> 1;
}
return -1 * (valu >>> 1);
};
this.readBoolean=function (){
return this.readBits(1)===1;
};
this.readUnsignedByte=function (){
return this.readBits(8);
};
this.loadWord();
};
var expGolomb=ExpGolomb;
var _H264Stream, _NalByteStream;
var PROFILES_WITH_OPTIONAL_SPS_DATA;
_NalByteStream=function NalByteStream(){
var syncPoint=0,
i,
buffer;
_NalByteStream.prototype.init.call(this);
this.push=function (data){
var swapBuffer;
if(!buffer){
buffer=data.data;
}else{
swapBuffer=new Uint8Array(buffer.byteLength + data.data.byteLength);
swapBuffer.set(buffer);
swapBuffer.set(data.data, buffer.byteLength);
buffer=swapBuffer;
}
var len=buffer.byteLength;
for (; syncPoint < len - 3; syncPoint++){
if(buffer[syncPoint + 2]===1){
i=syncPoint + 5;
break;
}}
while (i < len){
switch (buffer[i]){
case 0:
if(buffer[i - 1]!==0){
i +=2;
break;
}else if(buffer[i - 2]!==0){
i++;
break;
}
if(syncPoint + 3!==i - 2){
this.trigger('data', buffer.subarray(syncPoint + 3, i - 2));
}
do {
i++;
} while (buffer[i]!==1&&i < len);
syncPoint=i - 2;
i +=3;
break;
case 1:
if(buffer[i - 1]!==0||buffer[i - 2]!==0){
i +=3;
break;
}
this.trigger('data', buffer.subarray(syncPoint + 3, i - 2));
syncPoint=i - 2;
i +=3;
break;
default:
i +=3;
break;
}}
buffer=buffer.subarray(syncPoint);
i -=syncPoint;
syncPoint=0;
};
this.reset=function (){
buffer=null;
syncPoint=0;
this.trigger('reset');
};
this.flush=function (){
if(buffer&&buffer.byteLength > 3){
this.trigger('data', buffer.subarray(syncPoint + 3));
}
buffer=null;
syncPoint=0;
this.trigger('done');
};
this.endTimeline=function (){
this.flush();
this.trigger('endedtimeline');
};};
_NalByteStream.prototype=new stream();
PROFILES_WITH_OPTIONAL_SPS_DATA={
100: true,
110: true,
122: true,
244: true,
44: true,
83: true,
86: true,
118: true,
128: true,
138: true,
139: true,
134: true
};
_H264Stream=function H264Stream(){
var nalByteStream=new _NalByteStream(),
self,
trackId,
currentPts,
currentDts,
discardEmulationPreventionBytes,
readSequenceParameterSet,
skipScalingList;
_H264Stream.prototype.init.call(this);
self=this;
this.push=function (packet){
if(packet.type!=='video'){
return;
}
trackId=packet.trackId;
currentPts=packet.pts;
currentDts=packet.dts;
nalByteStream.push(packet);
};
nalByteStream.on('data', function (data){
var event={
trackId: trackId,
pts: currentPts,
dts: currentDts,
data: data
};
switch (data[0] & 0x1f){
case 0x05:
event.nalUnitType='slice_layer_without_partitioning_rbsp_idr';
break;
case 0x06:
event.nalUnitType='sei_rbsp';
event.escapedRBSP=discardEmulationPreventionBytes(data.subarray(1));
break;
case 0x07:
event.nalUnitType='seq_parameter_set_rbsp';
event.escapedRBSP=discardEmulationPreventionBytes(data.subarray(1));
event.config=readSequenceParameterSet(event.escapedRBSP);
break;
case 0x08:
event.nalUnitType='pic_parameter_set_rbsp';
break;
case 0x09:
event.nalUnitType='access_unit_delimiter_rbsp';
break;
default:
break;
}
self.trigger('data', event);
});
nalByteStream.on('done', function (){
self.trigger('done');
});
nalByteStream.on('partialdone', function (){
self.trigger('partialdone');
});
nalByteStream.on('reset', function (){
self.trigger('reset');
});
nalByteStream.on('endedtimeline', function (){
self.trigger('endedtimeline');
});
this.flush=function (){
nalByteStream.flush();
};
this.partialFlush=function (){
nalByteStream.partialFlush();
};
this.reset=function (){
nalByteStream.reset();
};
this.endTimeline=function (){
nalByteStream.endTimeline();
};
skipScalingList=function skipScalingList(count, expGolombDecoder){
var lastScale=8,
nextScale=8,
j,
deltaScale;
for (j=0; j < count; j++){
if(nextScale!==0){
deltaScale=expGolombDecoder.readExpGolomb();
nextScale=(lastScale + deltaScale + 256) % 256;
}
lastScale=nextScale===0 ? lastScale:nextScale;
}};
discardEmulationPreventionBytes=function discardEmulationPreventionBytes(data){
var length=data.byteLength,
emulationPreventionBytesPositions=[],
i=1,
newLength,
newData;
while (i < length - 2){
if(data[i]===0&&data[i + 1]===0&&data[i + 2]===0x03){
emulationPreventionBytesPositions.push(i + 2);
i +=2;
}else{
i++;
}}
if(emulationPreventionBytesPositions.length===0){
return data;
}
newLength=length - emulationPreventionBytesPositions.length;
newData=new Uint8Array(newLength);
var sourceIndex=0;
for (i=0; i < newLength; sourceIndex++, i++){
if(sourceIndex===emulationPreventionBytesPositions[0]){
sourceIndex++;
emulationPreventionBytesPositions.shift();
}
newData[i]=data[sourceIndex];
}
return newData;
};
readSequenceParameterSet=function readSequenceParameterSet(data){
var frameCropLeftOffset=0,
frameCropRightOffset=0,
frameCropTopOffset=0,
frameCropBottomOffset=0,
sarScale=1,
expGolombDecoder,
profileIdc,
levelIdc,
profileCompatibility,
chromaFormatIdc,
picOrderCntType,
numRefFramesInPicOrderCntCycle,
picWidthInMbsMinus1,
picHeightInMapUnitsMinus1,
frameMbsOnlyFlag,
scalingListCount,
sarRatio,
aspectRatioIdc,
i;
expGolombDecoder=new expGolomb(data);
profileIdc=expGolombDecoder.readUnsignedByte();
profileCompatibility=expGolombDecoder.readUnsignedByte();
levelIdc=expGolombDecoder.readUnsignedByte();
expGolombDecoder.skipUnsignedExpGolomb();
if(PROFILES_WITH_OPTIONAL_SPS_DATA[profileIdc]){
chromaFormatIdc=expGolombDecoder.readUnsignedExpGolomb();
if(chromaFormatIdc===3){
expGolombDecoder.skipBits(1);
}
expGolombDecoder.skipUnsignedExpGolomb();
expGolombDecoder.skipUnsignedExpGolomb();
expGolombDecoder.skipBits(1);
if(expGolombDecoder.readBoolean()){
scalingListCount=chromaFormatIdc!==3 ? 8:12;
for (i=0; i < scalingListCount; i++){
if(expGolombDecoder.readBoolean()){
if(i < 6){
skipScalingList(16, expGolombDecoder);
}else{
skipScalingList(64, expGolombDecoder);
}}
}}
}
expGolombDecoder.skipUnsignedExpGolomb();
picOrderCntType=expGolombDecoder.readUnsignedExpGolomb();
if(picOrderCntType===0){
expGolombDecoder.readUnsignedExpGolomb();
}else if(picOrderCntType===1){
expGolombDecoder.skipBits(1);
expGolombDecoder.skipExpGolomb();
expGolombDecoder.skipExpGolomb();
numRefFramesInPicOrderCntCycle=expGolombDecoder.readUnsignedExpGolomb();
for (i=0; i < numRefFramesInPicOrderCntCycle; i++){
expGolombDecoder.skipExpGolomb();
}}
expGolombDecoder.skipUnsignedExpGolomb();
expGolombDecoder.skipBits(1);
picWidthInMbsMinus1=expGolombDecoder.readUnsignedExpGolomb();
picHeightInMapUnitsMinus1=expGolombDecoder.readUnsignedExpGolomb();
frameMbsOnlyFlag=expGolombDecoder.readBits(1);
if(frameMbsOnlyFlag===0){
expGolombDecoder.skipBits(1);
}
expGolombDecoder.skipBits(1);
if(expGolombDecoder.readBoolean()){
frameCropLeftOffset=expGolombDecoder.readUnsignedExpGolomb();
frameCropRightOffset=expGolombDecoder.readUnsignedExpGolomb();
frameCropTopOffset=expGolombDecoder.readUnsignedExpGolomb();
frameCropBottomOffset=expGolombDecoder.readUnsignedExpGolomb();
}
if(expGolombDecoder.readBoolean()){
if(expGolombDecoder.readBoolean()){
aspectRatioIdc=expGolombDecoder.readUnsignedByte();
switch (aspectRatioIdc){
case 1:
sarRatio=[1, 1];
break;
case 2:
sarRatio=[12, 11];
break;
case 3:
sarRatio=[10, 11];
break;
case 4:
sarRatio=[16, 11];
break;
case 5:
sarRatio=[40, 33];
break;
case 6:
sarRatio=[24, 11];
break;
case 7:
sarRatio=[20, 11];
break;
case 8:
sarRatio=[32, 11];
break;
case 9:
sarRatio=[80, 33];
break;
case 10:
sarRatio=[18, 11];
break;
case 11:
sarRatio=[15, 11];
break;
case 12:
sarRatio=[64, 33];
break;
case 13:
sarRatio=[160, 99];
break;
case 14:
sarRatio=[4, 3];
break;
case 15:
sarRatio=[3, 2];
break;
case 16:
sarRatio=[2, 1];
break;
case 255:
{
sarRatio=[expGolombDecoder.readUnsignedByte() << 8 | expGolombDecoder.readUnsignedByte(), expGolombDecoder.readUnsignedByte() << 8 | expGolombDecoder.readUnsignedByte()];
break;
}}
if(sarRatio){
sarScale=sarRatio[0] / sarRatio[1];
}}
}
return {
profileIdc: profileIdc,
levelIdc: levelIdc,
profileCompatibility: profileCompatibility,
width: Math.ceil(((picWidthInMbsMinus1 + 1) * 16 - frameCropLeftOffset * 2 - frameCropRightOffset * 2) * sarScale),
height: (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16 - frameCropTopOffset * 2 - frameCropBottomOffset * 2,
sarRatio: sarRatio
};};
};
_H264Stream.prototype=new stream();
var h264={
H264Stream: _H264Stream,
NalByteStream: _NalByteStream
};
var ADTS_SAMPLING_FREQUENCIES$1=[96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350];
var isLikelyAacData=function isLikelyAacData(data){
if(data[0]==='I'.charCodeAt(0)&&data[1]==='D'.charCodeAt(0)&&data[2]==='3'.charCodeAt(0)){
return true;
}
return false;
};
var parseSyncSafeInteger$1=function parseSyncSafeInteger(data){
return data[0] << 21 | data[1] << 14 | data[2] << 7 | data[3];
};
var percentEncode$1=function percentEncode(bytes, start, end){
var i,
result='';
for (i=start; i < end; i++){
result +='%' + ('00' + bytes[i].toString(16)).slice(-2);
}
return result;
};
var parseIso88591$1=function parseIso88591(bytes, start, end){
return unescape(percentEncode$1(bytes, start, end));
};
var parseId3TagSize=function parseId3TagSize(header, byteIndex){
var returnSize=header[byteIndex + 6] << 21 | header[byteIndex + 7] << 14 | header[byteIndex + 8] << 7 | header[byteIndex + 9],
flags=header[byteIndex + 5],
footerPresent=(flags & 16) >> 4;
if(footerPresent){
return returnSize + 20;
}
return returnSize + 10;
};
var parseAdtsSize=function parseAdtsSize(header, byteIndex){
var lowThree=(header[byteIndex + 5] & 0xE0) >> 5,
middle=header[byteIndex + 4] << 3,
highTwo=header[byteIndex + 3] & 0x3 << 11;
return highTwo | middle | lowThree;
};
var parseType=function parseType(header, byteIndex){
if(header[byteIndex]==='I'.charCodeAt(0)&&header[byteIndex + 1]==='D'.charCodeAt(0)&&header[byteIndex + 2]==='3'.charCodeAt(0)){
return 'timed-metadata';
}else if(header[byteIndex] & 0xff===0xff&&(header[byteIndex + 1] & 0xf0)===0xf0){
return 'audio';
}
return null;
};
var parseSampleRate=function parseSampleRate(packet){
var i=0;
while (i + 5 < packet.length){
if(packet[i]!==0xFF||(packet[i + 1] & 0xF6)!==0xF0){
i++;
continue;
}
return ADTS_SAMPLING_FREQUENCIES$1[(packet[i + 2] & 0x3c) >>> 2];
}
return null;
};
var parseAacTimestamp=function parseAacTimestamp(packet){
var frameStart, frameSize, frame, frameHeader;
frameStart=10;
if(packet[5] & 0x40){
frameStart +=4;
frameStart +=parseSyncSafeInteger$1(packet.subarray(10, 14));
}
do {
frameSize=parseSyncSafeInteger$1(packet.subarray(frameStart + 4, frameStart + 8));
if(frameSize < 1){
return null;
}
frameHeader=String.fromCharCode(packet[frameStart], packet[frameStart + 1], packet[frameStart + 2], packet[frameStart + 3]);
if(frameHeader==='PRIV'){
frame=packet.subarray(frameStart + 10, frameStart + frameSize + 10);
for (var i=0; i < frame.byteLength; i++){
if(frame[i]===0){
var owner=parseIso88591$1(frame, 0, i);
if(owner==='com.apple.streaming.transportStreamTimestamp'){
var d=frame.subarray(i + 1);
var size=(d[3] & 0x01) << 30 | d[4] << 22 | d[5] << 14 | d[6] << 6 | d[7] >>> 2;
size *=4;
size +=d[7] & 0x03;
return size;
}
break;
}}
}
frameStart +=10;
frameStart +=frameSize;
} while (frameStart < packet.byteLength);
return null;
};
var utils={
isLikelyAacData: isLikelyAacData,
parseId3TagSize: parseId3TagSize,
parseAdtsSize: parseAdtsSize,
parseType: parseType,
parseSampleRate: parseSampleRate,
parseAacTimestamp: parseAacTimestamp
};
var _AacStream;
_AacStream=function AacStream(){
var everything=new Uint8Array(),
timeStamp=0;
_AacStream.prototype.init.call(this);
this.setTimestamp=function (timestamp){
timeStamp=timestamp;
};
this.push=function (bytes){
var frameSize=0,
byteIndex=0,
bytesLeft,
chunk,
packet,
tempLength;
if(everything.length){
tempLength=everything.length;
everything=new Uint8Array(bytes.byteLength + tempLength);
everything.set(everything.subarray(0, tempLength));
everything.set(bytes, tempLength);
}else{
everything=bytes;
}
while (everything.length - byteIndex >=3){
if(everything[byteIndex]==='I'.charCodeAt(0)&&everything[byteIndex + 1]==='D'.charCodeAt(0)&&everything[byteIndex + 2]==='3'.charCodeAt(0)){
if(everything.length - byteIndex < 10){
break;
}
frameSize=utils.parseId3TagSize(everything, byteIndex);
if(byteIndex + frameSize > everything.length){
break;
}
chunk={
type: 'timed-metadata',
data: everything.subarray(byteIndex, byteIndex + frameSize)
};
this.trigger('data', chunk);
byteIndex +=frameSize;
continue;
}else if((everything[byteIndex] & 0xff)===0xff&&(everything[byteIndex + 1] & 0xf0)===0xf0){
if(everything.length - byteIndex < 7){
break;
}
frameSize=utils.parseAdtsSize(everything, byteIndex);
if(byteIndex + frameSize > everything.length){
break;
}
packet={
type: 'audio',
data: everything.subarray(byteIndex, byteIndex + frameSize),
pts: timeStamp,
dts: timeStamp
};
this.trigger('data', packet);
byteIndex +=frameSize;
continue;
}
byteIndex++;
}
bytesLeft=everything.length - byteIndex;
if(bytesLeft > 0){
everything=everything.subarray(byteIndex);
}else{
everything=new Uint8Array();
}};
this.reset=function (){
everything=new Uint8Array();
this.trigger('reset');
};
this.endTimeline=function (){
everything=new Uint8Array();
this.trigger('endedtimeline');
};};
_AacStream.prototype=new stream();
var aac=_AacStream;
var H264Stream=h264.H264Stream;
var isLikelyAacData$1=utils.isLikelyAacData;
var ONE_SECOND_IN_TS$3=clock.ONE_SECOND_IN_TS;
var AUDIO_PROPERTIES=['audioobjecttype', 'channelcount', 'samplerate', 'samplingfrequencyindex', 'samplesize'];
var VIDEO_PROPERTIES=['width', 'height', 'profileIdc', 'levelIdc', 'profileCompatibility', 'sarRatio'];
var _VideoSegmentStream, _AudioSegmentStream, _Transmuxer, _CoalesceStream;
var arrayEquals=function arrayEquals(a, b){
var i;
if(a.length!==b.length){
return false;
}
for (i=0; i < a.length; i++){
if(a[i]!==b[i]){
return false;
}}
return true;
};
var generateVideoSegmentTimingInfo=function generateVideoSegmentTimingInfo(baseMediaDecodeTime, startDts, startPts, endDts, endPts, prependedContentDuration){
var ptsOffsetFromDts=startPts - startDts,
decodeDuration=endDts - startDts,
presentationDuration=endPts - startPts;
return {
start: {
dts: baseMediaDecodeTime,
pts: baseMediaDecodeTime + ptsOffsetFromDts
},
end: {
dts: baseMediaDecodeTime + decodeDuration,
pts: baseMediaDecodeTime + presentationDuration
},
prependedContentDuration: prependedContentDuration,
baseMediaDecodeTime: baseMediaDecodeTime
};};
_AudioSegmentStream=function AudioSegmentStream(track, options){
var adtsFrames=[],
sequenceNumber=0,
earliestAllowedDts=0,
audioAppendStartTs=0,
videoBaseMediaDecodeTime=Infinity;
options=options||{};
_AudioSegmentStream.prototype.init.call(this);
this.push=function (data){
trackDecodeInfo.collectDtsInfo(track, data);
if(track){
AUDIO_PROPERTIES.forEach(function (prop){
track[prop]=data[prop];
});
}
adtsFrames.push(data);
};
this.setEarliestDts=function (earliestDts){
earliestAllowedDts=earliestDts - track.timelineStartInfo.baseMediaDecodeTime;
};
this.setVideoBaseMediaDecodeTime=function (baseMediaDecodeTime){
videoBaseMediaDecodeTime=baseMediaDecodeTime;
};
this.setAudioAppendStart=function (timestamp){
audioAppendStartTs=timestamp;
};
this.flush=function (){
var frames, moof, mdat, boxes, frameDuration;
if(adtsFrames.length===0){
this.trigger('done', 'AudioSegmentStream');
return;
}
frames=audioFrameUtils.trimAdtsFramesByEarliestDts(adtsFrames, track, earliestAllowedDts);
track.baseMediaDecodeTime=trackDecodeInfo.calculateTrackBaseMediaDecodeTime(track, options.keepOriginalTimestamps);
audioFrameUtils.prefixWithSilence(track, frames, audioAppendStartTs, videoBaseMediaDecodeTime);
track.samples=audioFrameUtils.generateSampleTable(frames);
mdat=mp4Generator.mdat(audioFrameUtils.concatenateFrameData(frames));
adtsFrames=[];
moof=mp4Generator.moof(sequenceNumber, [track]);
boxes=new Uint8Array(moof.byteLength + mdat.byteLength);
sequenceNumber++;
boxes.set(moof);
boxes.set(mdat, moof.byteLength);
trackDecodeInfo.clearDtsInfo(track);
frameDuration=Math.ceil(ONE_SECOND_IN_TS$3 * 1024 / track.samplerate);
if(frames.length){
this.trigger('timingInfo', {
start: frames[0].dts,
end: frames[0].dts + frames.length * frameDuration
});
}
this.trigger('data', {
track: track,
boxes: boxes
});
this.trigger('done', 'AudioSegmentStream');
};
this.reset=function (){
trackDecodeInfo.clearDtsInfo(track);
adtsFrames=[];
this.trigger('reset');
};};
_AudioSegmentStream.prototype=new stream();
_VideoSegmentStream=function VideoSegmentStream(track, options){
var sequenceNumber=0,
nalUnits=[],
gopsToAlignWith=[],
config,
pps;
options=options||{};
_VideoSegmentStream.prototype.init.call(this);
delete track.minPTS;
this.gopCache_=[];
this.push=function (nalUnit){
trackDecodeInfo.collectDtsInfo(track, nalUnit);
if(nalUnit.nalUnitType==='seq_parameter_set_rbsp'&&!config){
config=nalUnit.config;
track.sps=[nalUnit.data];
VIDEO_PROPERTIES.forEach(function (prop){
track[prop]=config[prop];
}, this);
}
if(nalUnit.nalUnitType==='pic_parameter_set_rbsp'&&!pps){
pps=nalUnit.data;
track.pps=[nalUnit.data];
}
nalUnits.push(nalUnit);
};
this.flush=function (){
var frames,
gopForFusion,
gops,
moof,
mdat,
boxes,
prependedContentDuration=0,
firstGop,
lastGop;
while (nalUnits.length){
if(nalUnits[0].nalUnitType==='access_unit_delimiter_rbsp'){
break;
}
nalUnits.shift();
}
if(nalUnits.length===0){
this.resetStream_();
this.trigger('done', 'VideoSegmentStream');
return;
}
frames=frameUtils.groupNalsIntoFrames(nalUnits);
gops=frameUtils.groupFramesIntoGops(frames);
if(!gops[0][0].keyFrame){
gopForFusion=this.getGopForFusion_(nalUnits[0], track);
if(gopForFusion){
prependedContentDuration=gopForFusion.duration;
gops.unshift(gopForFusion);
gops.byteLength +=gopForFusion.byteLength;
gops.nalCount +=gopForFusion.nalCount;
gops.pts=gopForFusion.pts;
gops.dts=gopForFusion.dts;
gops.duration +=gopForFusion.duration;
}else{
gops=frameUtils.extendFirstKeyFrame(gops);
}}
if(gopsToAlignWith.length){
var alignedGops;
if(options.alignGopsAtEnd){
alignedGops=this.alignGopsAtEnd_(gops);
}else{
alignedGops=this.alignGopsAtStart_(gops);
}
if(!alignedGops){
this.gopCache_.unshift({
gop: gops.pop(),
pps: track.pps,
sps: track.sps
});
this.gopCache_.length=Math.min(6, this.gopCache_.length);
nalUnits=[];
this.resetStream_();
this.trigger('done', 'VideoSegmentStream');
return;
}
trackDecodeInfo.clearDtsInfo(track);
gops=alignedGops;
}
trackDecodeInfo.collectDtsInfo(track, gops);
track.samples=frameUtils.generateSampleTable(gops);
mdat=mp4Generator.mdat(frameUtils.concatenateNalData(gops));
track.baseMediaDecodeTime=trackDecodeInfo.calculateTrackBaseMediaDecodeTime(track, options.keepOriginalTimestamps);
this.trigger('processedGopsInfo', gops.map(function (gop){
return {
pts: gop.pts,
dts: gop.dts,
byteLength: gop.byteLength
};}));
firstGop=gops[0];
lastGop=gops[gops.length - 1];
this.trigger('segmentTimingInfo', generateVideoSegmentTimingInfo(track.baseMediaDecodeTime, firstGop.dts, firstGop.pts, lastGop.dts + lastGop.duration, lastGop.pts + lastGop.duration, prependedContentDuration));
this.trigger('timingInfo', {
start: gops[0].dts,
end: gops[gops.length - 1].dts + gops[gops.length - 1].duration
});
this.gopCache_.unshift({
gop: gops.pop(),
pps: track.pps,
sps: track.sps
});
this.gopCache_.length=Math.min(6, this.gopCache_.length);
nalUnits=[];
this.trigger('baseMediaDecodeTime', track.baseMediaDecodeTime);
this.trigger('timelineStartInfo', track.timelineStartInfo);
moof=mp4Generator.moof(sequenceNumber, [track]);
boxes=new Uint8Array(moof.byteLength + mdat.byteLength);
sequenceNumber++;
boxes.set(moof);
boxes.set(mdat, moof.byteLength);
this.trigger('data', {
track: track,
boxes: boxes
});
this.resetStream_();
this.trigger('done', 'VideoSegmentStream');
};
this.reset=function (){
this.resetStream_();
nalUnits=[];
this.gopCache_.length=0;
gopsToAlignWith.length=0;
this.trigger('reset');
};
this.resetStream_=function (){
trackDecodeInfo.clearDtsInfo(track);
config=undefined;
pps=undefined;
};
this.getGopForFusion_=function (nalUnit){
var halfSecond=45000,
allowableOverlap=10000,
nearestDistance=Infinity,
dtsDistance,
nearestGopObj,
currentGop,
currentGopObj,
i;
for (i=0; i < this.gopCache_.length; i++){
currentGopObj=this.gopCache_[i];
currentGop=currentGopObj.gop;
if(!(track.pps&&arrayEquals(track.pps[0], currentGopObj.pps[0]))||!(track.sps&&arrayEquals(track.sps[0], currentGopObj.sps[0]))){
continue;
}
if(currentGop.dts < track.timelineStartInfo.dts){
continue;
}
dtsDistance=nalUnit.dts - currentGop.dts - currentGop.duration;
if(dtsDistance >=-allowableOverlap&&dtsDistance <=halfSecond){
if(!nearestGopObj||nearestDistance > dtsDistance){
nearestGopObj=currentGopObj;
nearestDistance=dtsDistance;
}}
}
if(nearestGopObj){
return nearestGopObj.gop;
}
return null;
};
this.alignGopsAtStart_=function (gops){
var alignIndex, gopIndex, align, gop, byteLength, nalCount, duration, alignedGops;
byteLength=gops.byteLength;
nalCount=gops.nalCount;
duration=gops.duration;
alignIndex=gopIndex=0;
while (alignIndex < gopsToAlignWith.length&&gopIndex < gops.length){
align=gopsToAlignWith[alignIndex];
gop=gops[gopIndex];
if(align.pts===gop.pts){
break;
}
if(gop.pts > align.pts){
alignIndex++;
continue;
}
gopIndex++;
byteLength -=gop.byteLength;
nalCount -=gop.nalCount;
duration -=gop.duration;
}
if(gopIndex===0){
return gops;
}
if(gopIndex===gops.length){
return null;
}
alignedGops=gops.slice(gopIndex);
alignedGops.byteLength=byteLength;
alignedGops.duration=duration;
alignedGops.nalCount=nalCount;
alignedGops.pts=alignedGops[0].pts;
alignedGops.dts=alignedGops[0].dts;
return alignedGops;
};
this.alignGopsAtEnd_=function (gops){
var alignIndex, gopIndex, align, gop, alignEndIndex, matchFound;
alignIndex=gopsToAlignWith.length - 1;
gopIndex=gops.length - 1;
alignEndIndex=null;
matchFound=false;
while (alignIndex >=0&&gopIndex >=0){
align=gopsToAlignWith[alignIndex];
gop=gops[gopIndex];
if(align.pts===gop.pts){
matchFound=true;
break;
}
if(align.pts > gop.pts){
alignIndex--;
continue;
}
if(alignIndex===gopsToAlignWith.length - 1){
alignEndIndex=gopIndex;
}
gopIndex--;
}
if(!matchFound&&alignEndIndex===null){
return null;
}
var trimIndex;
if(matchFound){
trimIndex=gopIndex;
}else{
trimIndex=alignEndIndex;
}
if(trimIndex===0){
return gops;
}
var alignedGops=gops.slice(trimIndex);
var metadata=alignedGops.reduce(function (total, gop){
total.byteLength +=gop.byteLength;
total.duration +=gop.duration;
total.nalCount +=gop.nalCount;
return total;
}, {
byteLength: 0,
duration: 0,
nalCount: 0
});
alignedGops.byteLength=metadata.byteLength;
alignedGops.duration=metadata.duration;
alignedGops.nalCount=metadata.nalCount;
alignedGops.pts=alignedGops[0].pts;
alignedGops.dts=alignedGops[0].dts;
return alignedGops;
};
this.alignGopsWith=function (newGopsToAlignWith){
gopsToAlignWith=newGopsToAlignWith;
};};
_VideoSegmentStream.prototype=new stream();
_CoalesceStream=function CoalesceStream(options, metadataStream){
this.numberOfTracks=0;
this.metadataStream=metadataStream;
options=options||{};
if(typeof options.remux!=='undefined'){
this.remuxTracks = !!options.remux;
}else{
this.remuxTracks=true;
}
if(typeof options.keepOriginalTimestamps==='boolean'){
this.keepOriginalTimestamps=options.keepOriginalTimestamps;
}else{
this.keepOriginalTimestamps=false;
}
this.pendingTracks=[];
this.videoTrack=null;
this.pendingBoxes=[];
this.pendingCaptions=[];
this.pendingMetadata=[];
this.pendingBytes=0;
this.emittedTracks=0;
_CoalesceStream.prototype.init.call(this);
this.push=function (output){
if(output.text){
return this.pendingCaptions.push(output);
}
if(output.frames){
return this.pendingMetadata.push(output);
}
this.pendingTracks.push(output.track);
this.pendingBytes +=output.boxes.byteLength;
if(output.track.type==='video'){
this.videoTrack=output.track;
this.pendingBoxes.push(output.boxes);
}
if(output.track.type==='audio'){
this.audioTrack=output.track;
this.pendingBoxes.unshift(output.boxes);
}};};
_CoalesceStream.prototype=new stream();
_CoalesceStream.prototype.flush=function (flushSource){
var offset=0,
event={
captions: [],
captionStreams: {},
metadata: [],
info: {}},
caption,
id3,
initSegment,
timelineStartPts=0,
i;
if(this.pendingTracks.length < this.numberOfTracks){
if(flushSource!=='VideoSegmentStream'&&flushSource!=='AudioSegmentStream'){
return;
}else if(this.remuxTracks){
return;
}else if(this.pendingTracks.length===0){
this.emittedTracks++;
if(this.emittedTracks >=this.numberOfTracks){
this.trigger('done');
this.emittedTracks=0;
}
return;
}}
if(this.videoTrack){
timelineStartPts=this.videoTrack.timelineStartInfo.pts;
VIDEO_PROPERTIES.forEach(function (prop){
event.info[prop]=this.videoTrack[prop];
}, this);
}else if(this.audioTrack){
timelineStartPts=this.audioTrack.timelineStartInfo.pts;
AUDIO_PROPERTIES.forEach(function (prop){
event.info[prop]=this.audioTrack[prop];
}, this);
}
if(this.videoTrack||this.audioTrack){
if(this.pendingTracks.length===1){
event.type=this.pendingTracks[0].type;
}else{
event.type='combined';
}
this.emittedTracks +=this.pendingTracks.length;
initSegment=mp4Generator.initSegment(this.pendingTracks);
event.initSegment=new Uint8Array(initSegment.byteLength);
event.initSegment.set(initSegment);
event.data=new Uint8Array(this.pendingBytes);
for (i=0; i < this.pendingBoxes.length; i++){
event.data.set(this.pendingBoxes[i], offset);
offset +=this.pendingBoxes[i].byteLength;
}
for (i=0; i < this.pendingCaptions.length; i++){
caption=this.pendingCaptions[i];
caption.startTime=clock.metadataTsToSeconds(caption.startPts, timelineStartPts, this.keepOriginalTimestamps);
caption.endTime=clock.metadataTsToSeconds(caption.endPts, timelineStartPts, this.keepOriginalTimestamps);
event.captionStreams[caption.stream]=true;
event.captions.push(caption);
}
for (i=0; i < this.pendingMetadata.length; i++){
id3=this.pendingMetadata[i];
id3.cueTime=clock.metadataTsToSeconds(id3.pts, timelineStartPts, this.keepOriginalTimestamps);
event.metadata.push(id3);
}
event.metadata.dispatchType=this.metadataStream.dispatchType;
this.pendingTracks.length=0;
this.videoTrack=null;
this.pendingBoxes.length=0;
this.pendingCaptions.length=0;
this.pendingBytes=0;
this.pendingMetadata.length=0;
this.trigger('data', event);
for (i=0; i < event.captions.length; i++){
caption=event.captions[i];
this.trigger('caption', caption);
}
for (i=0; i < event.metadata.length; i++){
id3=event.metadata[i];
this.trigger('id3Frame', id3);
}}
if(this.emittedTracks >=this.numberOfTracks){
this.trigger('done');
this.emittedTracks=0;
}};
_CoalesceStream.prototype.setRemux=function (val){
this.remuxTracks=val;
};
_Transmuxer=function Transmuxer(options){
var self=this,
hasFlushed=true,
videoTrack,
audioTrack;
_Transmuxer.prototype.init.call(this);
options=options||{};
this.baseMediaDecodeTime=options.baseMediaDecodeTime||0;
this.transmuxPipeline_={};
this.setupAacPipeline=function (){
var pipeline={};
this.transmuxPipeline_=pipeline;
pipeline.type='aac';
pipeline.metadataStream=new m2ts_1.MetadataStream();
pipeline.aacStream=new aac();
pipeline.audioTimestampRolloverStream=new m2ts_1.TimestampRolloverStream('audio');
pipeline.timedMetadataTimestampRolloverStream=new m2ts_1.TimestampRolloverStream('timed-metadata');
pipeline.adtsStream=new adts();
pipeline.coalesceStream=new _CoalesceStream(options, pipeline.metadataStream);
pipeline.headOfPipeline=pipeline.aacStream;
pipeline.aacStream.pipe(pipeline.audioTimestampRolloverStream).pipe(pipeline.adtsStream);
pipeline.aacStream.pipe(pipeline.timedMetadataTimestampRolloverStream).pipe(pipeline.metadataStream).pipe(pipeline.coalesceStream);
pipeline.metadataStream.on('timestamp', function (frame){
pipeline.aacStream.setTimestamp(frame.timeStamp);
});
pipeline.aacStream.on('data', function (data){
if(data.type==='timed-metadata'&&!pipeline.audioSegmentStream){
audioTrack=audioTrack||{
timelineStartInfo: {
baseMediaDecodeTime: self.baseMediaDecodeTime
},
codec: 'adts',
type: 'audio'
};
pipeline.coalesceStream.numberOfTracks++;
pipeline.audioSegmentStream=new _AudioSegmentStream(audioTrack, options);
pipeline.audioSegmentStream.on('timingInfo', self.trigger.bind(self, 'audioTimingInfo'));
pipeline.adtsStream.pipe(pipeline.audioSegmentStream).pipe(pipeline.coalesceStream);
}
self.trigger('trackinfo', {
hasAudio: !!audioTrack,
hasVideo: !!videoTrack
});
});
pipeline.coalesceStream.on('data', this.trigger.bind(this, 'data'));
pipeline.coalesceStream.on('done', this.trigger.bind(this, 'done'));
};
this.setupTsPipeline=function (){
var pipeline={};
this.transmuxPipeline_=pipeline;
pipeline.type='ts';
pipeline.metadataStream=new m2ts_1.MetadataStream();
pipeline.packetStream=new m2ts_1.TransportPacketStream();
pipeline.parseStream=new m2ts_1.TransportParseStream();
pipeline.elementaryStream=new m2ts_1.ElementaryStream();
pipeline.timestampRolloverStream=new m2ts_1.TimestampRolloverStream();
pipeline.adtsStream=new adts();
pipeline.h264Stream=new H264Stream();
pipeline.captionStream=new m2ts_1.CaptionStream();
pipeline.coalesceStream=new _CoalesceStream(options, pipeline.metadataStream);
pipeline.headOfPipeline=pipeline.packetStream;
pipeline.packetStream.pipe(pipeline.parseStream).pipe(pipeline.elementaryStream).pipe(pipeline.timestampRolloverStream);
pipeline.timestampRolloverStream.pipe(pipeline.h264Stream);
pipeline.timestampRolloverStream.pipe(pipeline.adtsStream);
pipeline.timestampRolloverStream.pipe(pipeline.metadataStream).pipe(pipeline.coalesceStream);
pipeline.h264Stream.pipe(pipeline.captionStream).pipe(pipeline.coalesceStream);
pipeline.elementaryStream.on('data', function (data){
var i;
if(data.type==='metadata'){
i=data.tracks.length;
while (i--){
if(!videoTrack&&data.tracks[i].type==='video'){
videoTrack=data.tracks[i];
videoTrack.timelineStartInfo.baseMediaDecodeTime=self.baseMediaDecodeTime;
}else if(!audioTrack&&data.tracks[i].type==='audio'){
audioTrack=data.tracks[i];
audioTrack.timelineStartInfo.baseMediaDecodeTime=self.baseMediaDecodeTime;
}}
if(videoTrack&&!pipeline.videoSegmentStream){
pipeline.coalesceStream.numberOfTracks++;
pipeline.videoSegmentStream=new _VideoSegmentStream(videoTrack, options);
pipeline.videoSegmentStream.on('timelineStartInfo', function (timelineStartInfo){
if(audioTrack){
audioTrack.timelineStartInfo=timelineStartInfo;
pipeline.audioSegmentStream.setEarliestDts(timelineStartInfo.dts);
}});
pipeline.videoSegmentStream.on('processedGopsInfo', self.trigger.bind(self, 'gopInfo'));
pipeline.videoSegmentStream.on('segmentTimingInfo', self.trigger.bind(self, 'videoSegmentTimingInfo'));
pipeline.videoSegmentStream.on('baseMediaDecodeTime', function (baseMediaDecodeTime){
if(audioTrack){
pipeline.audioSegmentStream.setVideoBaseMediaDecodeTime(baseMediaDecodeTime);
}});
pipeline.videoSegmentStream.on('timingInfo', self.trigger.bind(self, 'videoTimingInfo'));
pipeline.h264Stream.pipe(pipeline.videoSegmentStream).pipe(pipeline.coalesceStream);
}
if(audioTrack&&!pipeline.audioSegmentStream){
pipeline.coalesceStream.numberOfTracks++;
pipeline.audioSegmentStream=new _AudioSegmentStream(audioTrack, options);
pipeline.audioSegmentStream.on('timingInfo', self.trigger.bind(self, 'audioTimingInfo'));
pipeline.adtsStream.pipe(pipeline.audioSegmentStream).pipe(pipeline.coalesceStream);
}
self.trigger('trackinfo', {
hasAudio: !!audioTrack,
hasVideo: !!videoTrack
});
}});
pipeline.coalesceStream.on('data', this.trigger.bind(this, 'data'));
pipeline.coalesceStream.on('id3Frame', function (id3Frame){
id3Frame.dispatchType=pipeline.metadataStream.dispatchType;
self.trigger('id3Frame', id3Frame);
});
pipeline.coalesceStream.on('caption', this.trigger.bind(this, 'caption'));
pipeline.coalesceStream.on('done', this.trigger.bind(this, 'done'));
};
this.setBaseMediaDecodeTime=function (baseMediaDecodeTime){
var pipeline=this.transmuxPipeline_;
if(!options.keepOriginalTimestamps){
this.baseMediaDecodeTime=baseMediaDecodeTime;
}
if(audioTrack){
audioTrack.timelineStartInfo.dts=undefined;
audioTrack.timelineStartInfo.pts=undefined;
trackDecodeInfo.clearDtsInfo(audioTrack);
if(!options.keepOriginalTimestamps){
audioTrack.timelineStartInfo.baseMediaDecodeTime=baseMediaDecodeTime;
}
if(pipeline.audioTimestampRolloverStream){
pipeline.audioTimestampRolloverStream.discontinuity();
}}
if(videoTrack){
if(pipeline.videoSegmentStream){
pipeline.videoSegmentStream.gopCache_=[];
}
videoTrack.timelineStartInfo.dts=undefined;
videoTrack.timelineStartInfo.pts=undefined;
trackDecodeInfo.clearDtsInfo(videoTrack);
pipeline.captionStream.reset();
if(!options.keepOriginalTimestamps){
videoTrack.timelineStartInfo.baseMediaDecodeTime=baseMediaDecodeTime;
}}
if(pipeline.timestampRolloverStream){
pipeline.timestampRolloverStream.discontinuity();
}};
this.setAudioAppendStart=function (timestamp){
if(audioTrack){
this.transmuxPipeline_.audioSegmentStream.setAudioAppendStart(timestamp);
}};
this.setRemux=function (val){
var pipeline=this.transmuxPipeline_;
options.remux=val;
if(pipeline&&pipeline.coalesceStream){
pipeline.coalesceStream.setRemux(val);
}};
this.alignGopsWith=function (gopsToAlignWith){
if(videoTrack&&this.transmuxPipeline_.videoSegmentStream){
this.transmuxPipeline_.videoSegmentStream.alignGopsWith(gopsToAlignWith);
}};
this.push=function (data){
if(hasFlushed){
var isAac=isLikelyAacData$1(data);
if(isAac&&this.transmuxPipeline_.type!=='aac'){
this.setupAacPipeline();
}else if(!isAac&&this.transmuxPipeline_.type!=='ts'){
this.setupTsPipeline();
}
hasFlushed=false;
}
this.transmuxPipeline_.headOfPipeline.push(data);
};
this.flush=function (){
hasFlushed=true;
this.transmuxPipeline_.headOfPipeline.flush();
};
this.endTimeline=function (){
this.transmuxPipeline_.headOfPipeline.endTimeline();
};
this.reset=function (){
if(this.transmuxPipeline_.headOfPipeline){
this.transmuxPipeline_.headOfPipeline.reset();
}};
this.resetCaptions=function (){
if(this.transmuxPipeline_.captionStream){
this.transmuxPipeline_.captionStream.reset();
}};};
_Transmuxer.prototype=new stream();
var transmuxer={
Transmuxer: _Transmuxer,
VideoSegmentStream: _VideoSegmentStream,
AudioSegmentStream: _AudioSegmentStream,
AUDIO_PROPERTIES: AUDIO_PROPERTIES,
VIDEO_PROPERTIES: VIDEO_PROPERTIES,
generateVideoSegmentTimingInfo: generateVideoSegmentTimingInfo
};
var classCallCheck=function classCallCheck(instance, Constructor){
if(!(instance instanceof Constructor)){
throw new TypeError("Cannot call a class as a function");
}};
var createClass=function (){
function defineProperties(target, props){
for (var i=0; i < props.length; i++){
var descriptor=props[i];
descriptor.enumerable=descriptor.enumerable||false;
descriptor.configurable=true;
if("value" in descriptor) descriptor.writable=true;
Object.defineProperty(target, descriptor.key, descriptor);
}}
return function (Constructor, protoProps, staticProps){
if(protoProps) defineProperties(Constructor.prototype, protoProps);
if(staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};}();
var wireTransmuxerEvents=function wireTransmuxerEvents(self, transmuxer$$1){
transmuxer$$1.on('data', function (segment){
var initArray=segment.initSegment;
segment.initSegment={
data: initArray.buffer,
byteOffset: initArray.byteOffset,
byteLength: initArray.byteLength
};
var typedArray=segment.data;
segment.data=typedArray.buffer;
self.postMessage({
action: 'data',
segment: segment,
byteOffset: typedArray.byteOffset,
byteLength: typedArray.byteLength
}, [segment.data]);
});
if(transmuxer$$1.captionStream){
transmuxer$$1.captionStream.on('data', function (caption){
self.postMessage({
action: 'caption',
data: caption
});
});
}
transmuxer$$1.on('done', function (data){
self.postMessage({
action: 'done'
});
});
transmuxer$$1.on('gopInfo', function (gopInfo){
self.postMessage({
action: 'gopInfo',
gopInfo: gopInfo
});
});
transmuxer$$1.on('videoSegmentTimingInfo', function (videoSegmentTimingInfo){
self.postMessage({
action: 'videoSegmentTimingInfo',
videoSegmentTimingInfo: videoSegmentTimingInfo
});
});
};
var MessageHandlers=function (){
function MessageHandlers(self, options){
classCallCheck(this, MessageHandlers);
this.options=options||{};
this.self=self;
this.init();
}
createClass(MessageHandlers, [{
key: 'init',
value: function init(){
if(this.transmuxer){
this.transmuxer.dispose();
}
this.transmuxer=new transmuxer.Transmuxer(this.options);
wireTransmuxerEvents(this.self, this.transmuxer);
}
}, {
key: 'push',
value: function push(data){
var segment=new Uint8Array(data.data, data.byteOffset, data.byteLength);
this.transmuxer.push(segment);
}
}, {
key: 'reset',
value: function reset(){
this.init();
}
}, {
key: 'setTimestampOffset',
value: function setTimestampOffset(data){
var timestampOffset=data.timestampOffset||0;
this.transmuxer.setBaseMediaDecodeTime(Math.round(timestampOffset * 90000));
}}, {
key: 'setAudioAppendStart',
value: function setAudioAppendStart(data){
this.transmuxer.setAudioAppendStart(Math.ceil(data.appendStart * 90000));
}
}, {
key: 'flush',
value: function flush(data){
this.transmuxer.flush();
}}, {
key: 'resetCaptions',
value: function resetCaptions(){
this.transmuxer.resetCaptions();
}}, {
key: 'alignGopsWith',
value: function alignGopsWith(data){
this.transmuxer.alignGopsWith(data.gopsToAlignWith.slice());
}}]);
return MessageHandlers;
}();
var TransmuxerWorker=function TransmuxerWorker(self){
self.onmessage=function (event){
if(event.data.action==='init'&&event.data.options){
this.messageHandlers=new MessageHandlers(self, event.data.options);
return;
}
if(!this.messageHandlers){
this.messageHandlers=new MessageHandlers(self);
}
if(event.data&&event.data.action&&event.data.action!=='init'){
if(this.messageHandlers[event.data.action]){
this.messageHandlers[event.data.action](event.data);
}}
};};
var transmuxerWorker=new TransmuxerWorker(self);
return transmuxerWorker;
}();
});
var defaultCodecs={
videoCodec: 'avc1',
videoObjectTypeIndicator: '.4d400d',
audioProfile: '2'
};
var translateLegacyCodecs=function translateLegacyCodecs(codecs){
return codecs.map(function (codec){
return codec.replace(/avc1\.(\d+)\.(\d+)/i, function (orig, profile, avcLevel){
var profileHex=('00' + Number(profile).toString(16)).slice(-2);
var avcLevelHex=('00' + Number(avcLevel).toString(16)).slice(-2);
return 'avc1.' + profileHex + '00' + avcLevelHex;
});
});
};
var parseCodecs=function parseCodecs(){
var codecs=arguments.length > 0&&arguments[0]!==undefined ? arguments[0]:'';
var result={
codecCount: 0
};
var parsed=void 0;
result.codecCount=codecs.split(',').length;
result.codecCount=result.codecCount||2;
parsed=/(^|\s|,)+(avc[13])([^ ,]*)/i.exec(codecs);
if(parsed){
result.videoCodec=parsed[2];
result.videoObjectTypeIndicator=parsed[3];
}
result.audioProfile=/(^|\s|,)+mp4a.[0-9A-Fa-f]+\.([0-9A-Fa-f]+)/i.exec(codecs);
result.audioProfile=result.audioProfile&&result.audioProfile[2];
return result;
};
var mapLegacyAvcCodecs=function mapLegacyAvcCodecs(codecString){
return codecString.replace(/avc1\.(\d+)\.(\d+)/i, function (match){
return translateLegacyCodecs([match])[0];
});
};
var makeMimeTypeString=function makeMimeTypeString(type, container, codecs){
return type + '/' + container + '; codecs="' + codecs.filter(function (c){
return !!c;
}).join(', ') + '"';
};
var getContainerType=function getContainerType(media){
if(media.segments&&media.segments.length&&media.segments[0].map){
return 'mp4';
}
return 'mp2t';
};
var getCodecs=function getCodecs(media){
var mediaAttributes=media.attributes||{};
if(mediaAttributes.CODECS){
return parseCodecs(mediaAttributes.CODECS);
}
return defaultCodecs;
};
var audioProfileFromDefault=function audioProfileFromDefault(master, audioGroupId){
if(!master.mediaGroups.AUDIO||!audioGroupId){
return null;
}
var audioGroup=master.mediaGroups.AUDIO[audioGroupId];
if(!audioGroup){
return null;
}
for (var name in audioGroup){
var audioType=audioGroup[name];
if(audioType["default"]&&audioType.playlists){
return parseCodecs(audioType.playlists[0].attributes.CODECS).audioProfile;
}}
return null;
};
var mimeTypesForPlaylist=function mimeTypesForPlaylist(master, media){
var containerType=getContainerType(media);
var codecInfo=getCodecs(media);
var mediaAttributes=media.attributes||{};
var isMuxed=true;
var isMaat=false;
if(!media){
return [];
}
if(master.mediaGroups.AUDIO&&mediaAttributes.AUDIO){
var audioGroup=master.mediaGroups.AUDIO[mediaAttributes.AUDIO];
if(audioGroup){
isMaat=true;
isMuxed=false;
for (var groupId in audioGroup){
if(!audioGroup[groupId].uri&&!audioGroup[groupId].playlists){
isMuxed=true;
break;
}}
}}
if(isMaat&&!codecInfo.audioProfile){
if(!isMuxed){
codecInfo.audioProfile=audioProfileFromDefault(master, mediaAttributes.AUDIO);
}
if(!codecInfo.audioProfile){
videojs$1.log.warn('Multiple audio tracks present but no audio codec string is specified. ' + 'Attempting to use the default audio codec (mp4a.40.2)');
codecInfo.audioProfile=defaultCodecs.audioProfile;
}}
var codecStrings={};
if(codecInfo.videoCodec){
codecStrings.video='' + codecInfo.videoCodec + codecInfo.videoObjectTypeIndicator;
}
if(codecInfo.audioProfile){
codecStrings.audio='mp4a.40.' + codecInfo.audioProfile;
}
var justAudio=makeMimeTypeString('audio', containerType, [codecStrings.audio]);
var justVideo=makeMimeTypeString('video', containerType, [codecStrings.video]);
var bothVideoAudio=makeMimeTypeString('video', containerType, [codecStrings.video, codecStrings.audio]);
if(isMaat){
if(!isMuxed&&codecStrings.video){
return [justVideo, justAudio];
}
if(!isMuxed&&!codecStrings.video){
return [justAudio, justAudio];
}
return [bothVideoAudio, justAudio];
}
if(!codecStrings.video){
return [justAudio];
}
return [bothVideoAudio];
};
var parseContentType=function parseContentType(type){
var object={
type: '',
parameters: {}};
var parameters=type.trim().split(';');
object.type=parameters.shift().trim();
parameters.forEach(function (parameter){
var pair=parameter.trim().split('=');
if(pair.length > 1){
var name=pair[0].replace(/"/g, '').trim();
var value=pair[1].replace(/"/g, '').trim();
object.parameters[name]=value;
}});
return object;
};
var isAudioCodec=function isAudioCodec(codec){
return /mp4a\.\d+.\d+/i.test(codec);
};
var isVideoCodec=function isVideoCodec(codec){
return /avc1\.[\da-f]+/i.test(codec);
};
var gopsSafeToAlignWith=function gopsSafeToAlignWith(buffer, currentTime, mapping){
if(typeof currentTime==='undefined'||currentTime===null||!buffer.length){
return [];
}
var currentTimePts=Math.ceil((currentTime - mapping + 3) * 90000);
var i=void 0;
for (i=0; i < buffer.length; i++){
if(buffer[i].pts > currentTimePts){
break;
}}
return buffer.slice(i);
};
var updateGopBuffer=function updateGopBuffer(buffer, gops, replace){
if(!gops.length){
return buffer;
}
if(replace){
return gops.slice();
}
var start=gops[0].pts;
var i=0;
for (i; i < buffer.length; i++){
if(buffer[i].pts >=start){
break;
}}
return buffer.slice(0, i).concat(gops);
};
var removeGopBuffer=function removeGopBuffer(buffer, start, end, mapping){
var startPts=Math.ceil((start - mapping) * 90000);
var endPts=Math.ceil((end - mapping) * 90000);
var updatedBuffer=buffer.slice();
var i=buffer.length;
while (i--){
if(buffer[i].pts <=endPts){
break;
}}
if(i===-1){
return updatedBuffer;
}
var j=i + 1;
while (j--){
if(buffer[j].pts <=startPts){
break;
}}
j=Math.max(j, 0);
updatedBuffer.splice(j, i - j + 1);
return updatedBuffer;
};
var buffered=function buffered(videoBuffer, audioBuffer, audioDisabled){
var start=null;
var end=null;
var arity=0;
var extents=[];
var ranges=[];
if(!videoBuffer&&!audioBuffer){
return videojs$1.createTimeRange();
}
if(!videoBuffer){
return audioBuffer.buffered;
}
if(!audioBuffer){
return videoBuffer.buffered;
}
if(audioDisabled){
return videoBuffer.buffered;
}
if(videoBuffer.buffered.length===0&&audioBuffer.buffered.length===0){
return videojs$1.createTimeRange();
}
var videoBuffered=videoBuffer.buffered;
var audioBuffered=audioBuffer.buffered;
var count=videoBuffered.length;
while (count--){
extents.push({
time: videoBuffered.start(count),
type: 'start'
});
extents.push({
time: videoBuffered.end(count),
type: 'end'
});
}
count=audioBuffered.length;
while (count--){
extents.push({
time: audioBuffered.start(count),
type: 'start'
});
extents.push({
time: audioBuffered.end(count),
type: 'end'
});
}
extents.sort(function (a, b){
return a.time - b.time;
});
for (count=0; count < extents.length; count++){
if(extents[count].type==='start'){
arity++;
if(arity===2){
start=extents[count].time;
}}else if(extents[count].type==='end'){
arity--;
if(arity===1){
end=extents[count].time;
}}
if(start!==null&&end!==null){
ranges.push([start, end]);
start=null;
end=null;
}}
return videojs$1.createTimeRanges(ranges);
};
var ONE_SECOND_IN_TS$2=90000;
var makeWrappedSourceBuffer=function makeWrappedSourceBuffer(mediaSource, mimeType){
var sourceBuffer=mediaSource.addSourceBuffer(mimeType);
var wrapper=Object.create(null);
wrapper.updating=false;
wrapper.realBuffer_=sourceBuffer;
var _loop=function _loop(key){
if(typeof sourceBuffer[key]==='function'){
wrapper[key]=function (){
return sourceBuffer[key].apply(sourceBuffer, arguments);
};}else if(typeof wrapper[key]==='undefined'){
Object.defineProperty(wrapper, key, {
get: function get$$1(){
return sourceBuffer[key];
},
set: function set$$1(v){
return sourceBuffer[key]=v;
}});
}};
for (var key in sourceBuffer){
_loop(key);
}
return wrapper;
};
var VirtualSourceBuffer=function (_videojs$EventTarget){
inherits$2(VirtualSourceBuffer, _videojs$EventTarget);
function VirtualSourceBuffer(mediaSource, codecs){
classCallCheck$1(this, VirtualSourceBuffer);
var _this=possibleConstructorReturn$1(this, (VirtualSourceBuffer.__proto__||Object.getPrototypeOf(VirtualSourceBuffer)).call(this, videojs$1.EventTarget));
_this.timestampOffset_=0;
_this.pendingBuffers_=[];
_this.bufferUpdating_=false;
_this.mediaSource_=mediaSource;
_this.codecs_=codecs;
_this.audioCodec_=null;
_this.videoCodec_=null;
_this.audioDisabled_=false;
_this.appendAudioInitSegment_=true;
_this.gopBuffer_=[];
_this.timeMapping_=0;
_this.safeAppend_=videojs$1.browser.IE_VERSION >=11;
var options={
remux: false,
alignGopsAtEnd: _this.safeAppend_
};
_this.codecs_.forEach(function (codec){
if(isAudioCodec(codec)){
_this.audioCodec_=codec;
}else if(isVideoCodec(codec)){
_this.videoCodec_=codec;
}});
_this.transmuxer_=new TransmuxWorker();
_this.transmuxer_.postMessage({
action: 'init',
options: options
});
_this.transmuxer_.onmessage=function (event){
if(event.data.action==='data'){
return _this.data_(event);
}
if(event.data.action==='done'){
return _this.done_(event);
}
if(event.data.action==='gopInfo'){
return _this.appendGopInfo_(event);
}
if(event.data.action==='videoSegmentTimingInfo'){
return _this.videoSegmentTimingInfo_(event.data.videoSegmentTimingInfo);
}};
Object.defineProperty(_this, 'timestampOffset', {
get: function get$$1(){
return this.timestampOffset_;
},
set: function set$$1(val){
if(typeof val==='number'&&val >=0){
this.timestampOffset_=val;
this.appendAudioInitSegment_=true;
this.gopBuffer_.length=0;
this.timeMapping_=0;
this.transmuxer_.postMessage({
action: 'setTimestampOffset',
timestampOffset: val
});
}}
});
Object.defineProperty(_this, 'appendWindowStart', {
get: function get$$1(){
return (this.videoBuffer_||this.audioBuffer_).appendWindowStart;
},
set: function set$$1(start){
if(this.videoBuffer_){
this.videoBuffer_.appendWindowStart=start;
}
if(this.audioBuffer_){
this.audioBuffer_.appendWindowStart=start;
}}
});
Object.defineProperty(_this, 'updating', {
get: function get$$1(){
return !!(this.bufferUpdating_||!this.audioDisabled_&&this.audioBuffer_&&this.audioBuffer_.updating||this.videoBuffer_&&this.videoBuffer_.updating);
}});
Object.defineProperty(_this, 'buffered', {
get: function get$$1(){
return buffered(this.videoBuffer_, this.audioBuffer_, this.audioDisabled_);
}});
return _this;
}
createClass$1(VirtualSourceBuffer, [{
key: 'data_',
value: function data_(event){
var segment=event.data.segment;
segment.data=new Uint8Array(segment.data, event.data.byteOffset, event.data.byteLength);
segment.initSegment=new Uint8Array(segment.initSegment.data, segment.initSegment.byteOffset, segment.initSegment.byteLength);
createTextTracksIfNecessary(this, this.mediaSource_, segment);
this.pendingBuffers_.push(segment);
return;
}
}, {
key: 'done_',
value: function done_(event){
if(this.mediaSource_.readyState==='closed'){
this.pendingBuffers_.length=0;
return;
}
this.processPendingSegments_();
return;
}}, {
key: 'videoSegmentTimingInfo_',
value: function videoSegmentTimingInfo_(timingInfo){
var timingInfoInSeconds={
start: {
decode: timingInfo.start.dts / ONE_SECOND_IN_TS$2,
presentation: timingInfo.start.pts / ONE_SECOND_IN_TS$2
},
end: {
decode: timingInfo.end.dts / ONE_SECOND_IN_TS$2,
presentation: timingInfo.end.pts / ONE_SECOND_IN_TS$2
},
baseMediaDecodeTime: timingInfo.baseMediaDecodeTime / ONE_SECOND_IN_TS$2
};
if(timingInfo.prependedContentDuration){
timingInfoInSeconds.prependedContentDuration=timingInfo.prependedContentDuration / ONE_SECOND_IN_TS$2;
}
this.trigger({
type: 'videoSegmentTimingInfo',
videoSegmentTimingInfo: timingInfoInSeconds
});
}
}, {
key: 'createRealSourceBuffers_',
value: function createRealSourceBuffers_(){
var _this2=this;
var types=['audio', 'video'];
types.forEach(function (type){
if(!_this2[type + 'Codec_']){
return;
}
if(_this2[type + 'Buffer_']){
return;
}
var buffer=null;
if(_this2.mediaSource_[type + 'Buffer_']){
buffer=_this2.mediaSource_[type + 'Buffer_'];
buffer.updating=false;
}else{
var codecProperty=type + 'Codec_';
var mimeType=type + '/mp4;codecs="' + _this2[codecProperty] + '"';
buffer=makeWrappedSourceBuffer(_this2.mediaSource_.nativeMediaSource_, mimeType);
_this2.mediaSource_[type + 'Buffer_']=buffer;
}
_this2[type + 'Buffer_']=buffer;
['update', 'updatestart', 'updateend'].forEach(function (event){
buffer.addEventListener(event, function (){
if(type==='audio'&&_this2.audioDisabled_){
return;
}
if(event==='updateend'){
_this2[type + 'Buffer_'].updating=false;
}
var shouldTrigger=types.every(function (t){
if(t==='audio'&&_this2.audioDisabled_){
return true;
}
if(type!==t&&_this2[t + 'Buffer_']&&_this2[t + 'Buffer_'].updating){
return false;
}
return true;
});
if(shouldTrigger){
return _this2.trigger(event);
}});
});
});
}
}, {
key: 'appendBuffer',
value: function appendBuffer(segment){
this.bufferUpdating_=true;
if(this.audioBuffer_&&this.audioBuffer_.buffered.length){
var audioBuffered=this.audioBuffer_.buffered;
this.transmuxer_.postMessage({
action: 'setAudioAppendStart',
appendStart: audioBuffered.end(audioBuffered.length - 1)
});
}
if(this.videoBuffer_){
this.transmuxer_.postMessage({
action: 'alignGopsWith',
gopsToAlignWith: gopsSafeToAlignWith(this.gopBuffer_, this.mediaSource_.player_ ? this.mediaSource_.player_.currentTime():null, this.timeMapping_)
});
}
this.transmuxer_.postMessage({
action: 'push',
data: segment.buffer,
byteOffset: segment.byteOffset,
byteLength: segment.byteLength
}, [segment.buffer]);
this.transmuxer_.postMessage({
action: 'flush'
});
}
}, {
key: 'appendGopInfo_',
value: function appendGopInfo_(event){
this.gopBuffer_=updateGopBuffer(this.gopBuffer_, event.data.gopInfo, this.safeAppend_);
}
}, {
key: 'remove',
value: function remove(start, end){
if(this.videoBuffer_){
this.videoBuffer_.updating=true;
this.videoBuffer_.remove(start, end);
this.gopBuffer_=removeGopBuffer(this.gopBuffer_, start, end, this.timeMapping_);
}
if(!this.audioDisabled_&&this.audioBuffer_){
this.audioBuffer_.updating=true;
this.audioBuffer_.remove(start, end);
}
removeCuesFromTrack(start, end, this.metadataTrack_);
if(this.inbandTextTracks_){
for (var track in this.inbandTextTracks_){
removeCuesFromTrack(start, end, this.inbandTextTracks_[track]);
}}
}
}, {
key: 'processPendingSegments_',
value: function processPendingSegments_(){
var sortedSegments={
video: {
segments: [],
bytes: 0
},
audio: {
segments: [],
bytes: 0
},
captions: [],
metadata: []
};
if(!this.pendingBuffers_.length){
this.trigger('updateend');
this.bufferUpdating_=false;
return;
}
sortedSegments=this.pendingBuffers_.reduce(function (segmentObj, segment){
var type=segment.type;
var data=segment.data;
var initSegment=segment.initSegment;
segmentObj[type].segments.push(data);
segmentObj[type].bytes +=data.byteLength;
segmentObj[type].initSegment=initSegment;
if(segment.captions){
segmentObj.captions=segmentObj.captions.concat(segment.captions);
}
if(segment.info){
segmentObj[type].info=segment.info;
}
if(segment.metadata){
segmentObj.metadata=segmentObj.metadata.concat(segment.metadata);
}
return segmentObj;
}, sortedSegments);
if(!this.videoBuffer_&&!this.audioBuffer_){
if(sortedSegments.video.bytes===0){
this.videoCodec_=null;
}
if(sortedSegments.audio.bytes===0){
this.audioCodec_=null;
}
this.createRealSourceBuffers_();
}
if(sortedSegments.audio.info){
this.mediaSource_.trigger({
type: 'audioinfo',
info: sortedSegments.audio.info
});
}
if(sortedSegments.video.info){
this.mediaSource_.trigger({
type: 'videoinfo',
info: sortedSegments.video.info
});
}
if(this.appendAudioInitSegment_){
if(!this.audioDisabled_&&this.audioBuffer_){
sortedSegments.audio.segments.unshift(sortedSegments.audio.initSegment);
sortedSegments.audio.bytes +=sortedSegments.audio.initSegment.byteLength;
}
this.appendAudioInitSegment_=false;
}
var triggerUpdateend=false;
if(this.videoBuffer_&&sortedSegments.video.bytes){
sortedSegments.video.segments.unshift(sortedSegments.video.initSegment);
sortedSegments.video.bytes +=sortedSegments.video.initSegment.byteLength;
this.concatAndAppendSegments_(sortedSegments.video, this.videoBuffer_);
}else if(this.videoBuffer_&&(this.audioDisabled_||!this.audioBuffer_)){
triggerUpdateend=true;
}
addTextTrackData(this, sortedSegments.captions, sortedSegments.metadata);
if(!this.audioDisabled_&&this.audioBuffer_){
this.concatAndAppendSegments_(sortedSegments.audio, this.audioBuffer_);
}
this.pendingBuffers_.length=0;
if(triggerUpdateend){
this.trigger('updateend');
}
this.bufferUpdating_=false;
}
}, {
key: 'concatAndAppendSegments_',
value: function concatAndAppendSegments_(segmentObj, destinationBuffer){
var offset=0;
var tempBuffer=void 0;
if(segmentObj.bytes){
tempBuffer=new Uint8Array(segmentObj.bytes);
segmentObj.segments.forEach(function (segment){
tempBuffer.set(segment, offset);
offset +=segment.byteLength;
});
try {
destinationBuffer.updating=true;
destinationBuffer.appendBuffer(tempBuffer);
} catch (error){
if(this.mediaSource_.player_){
this.mediaSource_.player_.error({
code: -3,
type: 'APPEND_BUFFER_ERR',
message: error.message,
originalError: error
});
}}
}}
}, {
key: 'abort',
value: function abort(){
if(this.videoBuffer_){
this.videoBuffer_.abort();
}
if(!this.audioDisabled_&&this.audioBuffer_){
this.audioBuffer_.abort();
}
if(this.transmuxer_){
this.transmuxer_.postMessage({
action: 'reset'
});
}
this.pendingBuffers_.length=0;
this.bufferUpdating_=false;
}}]);
return VirtualSourceBuffer;
}(videojs$1.EventTarget);
var HtmlMediaSource=function (_videojs$EventTarget){
inherits$2(HtmlMediaSource, _videojs$EventTarget);
function HtmlMediaSource(){
classCallCheck$1(this, HtmlMediaSource);
var _this=possibleConstructorReturn$1(this, (HtmlMediaSource.__proto__||Object.getPrototypeOf(HtmlMediaSource)).call(this));
var property=void 0;
_this.nativeMediaSource_=new window$1.MediaSource();
for (property in _this.nativeMediaSource_){
if(!(property in HtmlMediaSource.prototype)&&typeof _this.nativeMediaSource_[property]==='function'){
_this[property]=_this.nativeMediaSource_[property].bind(_this.nativeMediaSource_);
}}
_this.duration_=NaN;
Object.defineProperty(_this, 'duration', {
get: function get$$1(){
if(this.duration_===Infinity){
return this.duration_;
}
return this.nativeMediaSource_.duration;
},
set: function set$$1(duration){
this.duration_=duration;
if(duration!==Infinity){
this.nativeMediaSource_.duration=duration;
return;
}}
});
Object.defineProperty(_this, 'seekable', {
get: function get$$1(){
if(this.duration_===Infinity){
return videojs$1.createTimeRanges([[0, this.nativeMediaSource_.duration]]);
}
return this.nativeMediaSource_.seekable;
}});
Object.defineProperty(_this, 'readyState', {
get: function get$$1(){
return this.nativeMediaSource_.readyState;
}});
Object.defineProperty(_this, 'activeSourceBuffers', {
get: function get$$1(){
return this.activeSourceBuffers_;
}});
_this.sourceBuffers=[];
_this.activeSourceBuffers_=[];
_this.updateActiveSourceBuffers_=function (){
_this.activeSourceBuffers_.length=0;
if(_this.sourceBuffers.length===1){
var sourceBuffer=_this.sourceBuffers[0];
sourceBuffer.appendAudioInitSegment_=true;
sourceBuffer.audioDisabled_ = !sourceBuffer.audioCodec_;
_this.activeSourceBuffers_.push(sourceBuffer);
return;
}
var disableCombined=false;
var disableAudioOnly=true;
for (var i=0; i < _this.player_.audioTracks().length; i++){
var track=_this.player_.audioTracks()[i];
if(track.enabled&&track.kind!=='main'){
disableCombined=true;
disableAudioOnly=false;
break;
}}
_this.sourceBuffers.forEach(function (sourceBuffer, index){
sourceBuffer.appendAudioInitSegment_=true;
if(sourceBuffer.videoCodec_&&sourceBuffer.audioCodec_){
sourceBuffer.audioDisabled_=disableCombined;
}else if(sourceBuffer.videoCodec_&&!sourceBuffer.audioCodec_){
sourceBuffer.audioDisabled_=true;
disableAudioOnly=false;
}else if(!sourceBuffer.videoCodec_&&sourceBuffer.audioCodec_){
sourceBuffer.audioDisabled_=index ? disableAudioOnly:!disableAudioOnly;
if(sourceBuffer.audioDisabled_){
return;
}}
_this.activeSourceBuffers_.push(sourceBuffer);
});
};
_this.onPlayerMediachange_=function (){
_this.sourceBuffers.forEach(function (sourceBuffer){
sourceBuffer.appendAudioInitSegment_=true;
});
};
_this.onHlsReset_=function (){
_this.sourceBuffers.forEach(function (sourceBuffer){
if(sourceBuffer.transmuxer_){
sourceBuffer.transmuxer_.postMessage({
action: 'resetCaptions'
});
}});
};
_this.onHlsSegmentTimeMapping_=function (event){
_this.sourceBuffers.forEach(function (buffer){
return buffer.timeMapping_=event.mapping;
});
};
['sourceopen', 'sourceclose', 'sourceended'].forEach(function (eventName){
this.nativeMediaSource_.addEventListener(eventName, this.trigger.bind(this));
}, _this);
_this.on('sourceopen', function (event){
var video=document.querySelector('[src="' + _this.url_ + '"]');
if(!video){
return;
}
_this.player_=videojs$1(video.parentNode);
if(!_this.player_){
return;
}
_this.player_.tech_.on('hls-reset', _this.onHlsReset_);
_this.player_.tech_.on('hls-segment-time-mapping', _this.onHlsSegmentTimeMapping_);
if(_this.player_.audioTracks&&_this.player_.audioTracks()){
_this.player_.audioTracks().on('change', _this.updateActiveSourceBuffers_);
_this.player_.audioTracks().on('addtrack', _this.updateActiveSourceBuffers_);
_this.player_.audioTracks().on('removetrack', _this.updateActiveSourceBuffers_);
}
_this.player_.on('mediachange', _this.onPlayerMediachange_);
});
_this.on('sourceended', function (event){
var duration=durationOfVideo(_this.duration);
for (var i=0; i < _this.sourceBuffers.length; i++){
var sourcebuffer=_this.sourceBuffers[i];
var cues=sourcebuffer.metadataTrack_&&sourcebuffer.metadataTrack_.cues;
if(cues&&cues.length){
cues[cues.length - 1].endTime=duration;
}}
});
_this.on('sourceclose', function (event){
this.sourceBuffers.forEach(function (sourceBuffer){
if(sourceBuffer.transmuxer_){
sourceBuffer.transmuxer_.terminate();
}});
this.sourceBuffers.length=0;
if(!this.player_){
return;
}
if(this.player_.audioTracks&&this.player_.audioTracks()){
this.player_.audioTracks().off('change', this.updateActiveSourceBuffers_);
this.player_.audioTracks().off('addtrack', this.updateActiveSourceBuffers_);
this.player_.audioTracks().off('removetrack', this.updateActiveSourceBuffers_);
}
if(this.player_.el_){
this.player_.off('mediachange', this.onPlayerMediachange_);
}
if(this.player_.tech_&&this.player_.tech_.el_){
this.player_.tech_.off('hls-reset', this.onHlsReset_);
this.player_.tech_.off('hls-segment-time-mapping', this.onHlsSegmentTimeMapping_);
}});
return _this;
}
createClass$1(HtmlMediaSource, [{
key: 'addSeekableRange_',
value: function addSeekableRange_(start, end){
var error=void 0;
if(this.duration!==Infinity){
error=new Error('MediaSource.addSeekableRange() can only be invoked ' + 'when the duration is Infinity');
error.name='InvalidStateError';
error.code=11;
throw error;
}
if(end > this.nativeMediaSource_.duration||isNaN(this.nativeMediaSource_.duration)){
this.nativeMediaSource_.duration=end;
}}
}, {
key: 'addSourceBuffer',
value: function addSourceBuffer(type){
var buffer=void 0;
var parsedType=parseContentType(type);
if(/^(video|audio)\/mp2t$/i.test(parsedType.type)){
var codecs=[];
if(parsedType.parameters&&parsedType.parameters.codecs){
codecs=parsedType.parameters.codecs.split(',');
codecs=translateLegacyCodecs(codecs);
codecs=codecs.filter(function (codec){
return isAudioCodec(codec)||isVideoCodec(codec);
});
}
if(codecs.length===0){
codecs=['avc1.4d400d', 'mp4a.40.2'];
}
buffer=new VirtualSourceBuffer(this, codecs);
if(this.sourceBuffers.length!==0){
this.sourceBuffers[0].createRealSourceBuffers_();
buffer.createRealSourceBuffers_();
this.sourceBuffers[0].audioDisabled_=true;
}}else{
buffer=this.nativeMediaSource_.addSourceBuffer(type);
}
this.sourceBuffers.push(buffer);
return buffer;
}}]);
return HtmlMediaSource;
}(videojs$1.EventTarget);
var urlCount=0;
videojs$1.mediaSources={};
var open=function open(msObjectURL, swfId){
var mediaSource=videojs$1.mediaSources[msObjectURL];
if(mediaSource){
mediaSource.trigger({
type: 'sourceopen',
swfId: swfId
});
}else{
throw new Error('Media Source not found (Video.js)');
}};
var supportsNativeMediaSources=function supportsNativeMediaSources(){
return !!window$1.MediaSource&&!!window$1.MediaSource.isTypeSupported&&window$1.MediaSource.isTypeSupported('video/mp4;codecs="avc1.4d400d,mp4a.40.2"');
};
var MediaSource=function MediaSource(){
this.MediaSource={
open: open,
supportsNativeMediaSources: supportsNativeMediaSources
};
if(supportsNativeMediaSources()){
return new HtmlMediaSource();
}
throw new Error('Cannot use create a virtual MediaSource for this video');
};
MediaSource.open=open;
MediaSource.supportsNativeMediaSources=supportsNativeMediaSources;
var URL$1={
createObjectURL: function createObjectURL(object){
var objectUrlPrefix='blob:vjs-media-source/';
var url=void 0;
if(object instanceof HtmlMediaSource){
url=window$1.URL.createObjectURL(object.nativeMediaSource_);
object.url_=url;
return url;
}
if(!(object instanceof HtmlMediaSource)){
url=window$1.URL.createObjectURL(object);
object.url_=url;
return url;
}
url=objectUrlPrefix + urlCount;
urlCount++;
videojs$1.mediaSources[url]=object;
return url;
}};
videojs$1.MediaSource=MediaSource;
videojs$1.URL=URL$1;
var EventTarget$1$1=videojs$1.EventTarget,
mergeOptions$2=videojs$1.mergeOptions;
var updateMaster$1=function updateMaster$$1(oldMaster, newMaster){
var noChanges=void 0;
var update=mergeOptions$2(oldMaster, {
duration: newMaster.duration,
minimumUpdatePeriod: newMaster.minimumUpdatePeriod
});
for (var i=0; i < newMaster.playlists.length; i++){
var playlistUpdate=updateMaster(update, newMaster.playlists[i]);
if(playlistUpdate){
update=playlistUpdate;
}else{
noChanges=true;
}}
forEachMediaGroup(newMaster, function (properties, type, group, label){
if(properties.playlists&&properties.playlists.length){
var uri=properties.playlists[0].uri;
var _playlistUpdate=updateMaster(update, properties.playlists[0]);
if(_playlistUpdate){
update=_playlistUpdate;
update.mediaGroups[type][group][label].playlists[0]=update.playlists[uri];
noChanges=false;
}}
});
if(noChanges){
return null;
}
return update;
};
var generateSidxKey=function generateSidxKey(sidxInfo){
var sidxByteRangeEnd=sidxInfo.byterange.offset + sidxInfo.byterange.length - 1;
return sidxInfo.uri + '-' + sidxInfo.byterange.offset + '-' + sidxByteRangeEnd;
};
var equivalentSidx=function equivalentSidx(a, b){
var neitherMap=Boolean(!a.map&&!b.map);
var equivalentMap=neitherMap||Boolean(a.map&&b.map&&a.map.byterange.offset===b.map.byterange.offset&&a.map.byterange.length===b.map.byterange.length);
return equivalentMap&&a.uri===b.uri&&a.byterange.offset===b.byterange.offset&&a.byterange.length===b.byterange.length;
};
var compareSidxEntry=function compareSidxEntry(playlists, oldSidxMapping){
var newSidxMapping={};
for (var uri in playlists){
var playlist=playlists[uri];
var currentSidxInfo=playlist.sidx;
if(currentSidxInfo){
var key=generateSidxKey(currentSidxInfo);
if(!oldSidxMapping[key]){
break;
}
var savedSidxInfo=oldSidxMapping[key].sidxInfo;
if(equivalentSidx(savedSidxInfo, currentSidxInfo)){
newSidxMapping[key]=oldSidxMapping[key];
}}
}
return newSidxMapping;
};
var filterChangedSidxMappings=function filterChangedSidxMappings(masterXml, srcUrl, clientOffset, oldSidxMapping){
var master=parse(masterXml, {
manifestUri: srcUrl,
clientOffset: clientOffset
});
var videoSidx=compareSidxEntry(master.playlists, oldSidxMapping);
var mediaGroupSidx=videoSidx;
forEachMediaGroup(master, function (properties, mediaType, groupKey, labelKey){
if(properties.playlists&&properties.playlists.length){
var playlists=properties.playlists;
mediaGroupSidx=mergeOptions$2(mediaGroupSidx, compareSidxEntry(playlists, oldSidxMapping));
}});
return mediaGroupSidx;
};
var requestSidx_=function requestSidx_(sidxRange, playlist, xhr, options, finishProcessingFn){
var sidxInfo={
uri: resolveManifestRedirect(options.handleManifestRedirects, sidxRange.resolvedUri),
byterange: sidxRange.byterange,
playlist: playlist
};
var sidxRequestOptions=videojs$1.mergeOptions(sidxInfo, {
responseType: 'arraybuffer',
headers: segmentXhrHeaders(sidxInfo)
});
return xhr(sidxRequestOptions, finishProcessingFn);
};
var DashPlaylistLoader=function (_EventTarget){
inherits$2(DashPlaylistLoader, _EventTarget);
function DashPlaylistLoader(srcUrlOrPlaylist, hls){
var options=arguments.length > 2&&arguments[2]!==undefined ? arguments[2]:{};
var masterPlaylistLoader=arguments[3];
classCallCheck$1(this, DashPlaylistLoader);
var _this=possibleConstructorReturn$1(this, (DashPlaylistLoader.__proto__||Object.getPrototypeOf(DashPlaylistLoader)).call(this));
var _options$withCredenti=options.withCredentials,
withCredentials=_options$withCredenti===undefined ? false:_options$withCredenti,
_options$handleManife=options.handleManifestRedirects,
handleManifestRedirects=_options$handleManife===undefined ? false:_options$handleManife;
_this.hls_=hls;
_this.withCredentials=withCredentials;
_this.handleManifestRedirects=handleManifestRedirects;
if(!srcUrlOrPlaylist){
throw new Error('A non-empty playlist URL or playlist is required');
}
_this.on('minimumUpdatePeriod', function (){
_this.refreshXml_();
});
_this.on('mediaupdatetimeout', function (){
_this.refreshMedia_(_this.media().uri);
});
_this.state='HAVE_NOTHING';
_this.loadedPlaylists_={};
if(typeof srcUrlOrPlaylist==='string'){
_this.srcUrl=srcUrlOrPlaylist;
_this.sidxMapping_={};
return possibleConstructorReturn$1(_this);
}
_this.setupChildLoader(masterPlaylistLoader, srcUrlOrPlaylist);
return _this;
}
createClass$1(DashPlaylistLoader, [{
key: 'setupChildLoader',
value: function setupChildLoader(masterPlaylistLoader, playlist){
this.masterPlaylistLoader_=masterPlaylistLoader;
this.childPlaylist_=playlist;
}}, {
key: 'dispose',
value: function dispose(){
this.stopRequest();
this.loadedPlaylists_={};
window$1.clearTimeout(this.minimumUpdatePeriodTimeout_);
window$1.clearTimeout(this.mediaRequest_);
window$1.clearTimeout(this.mediaUpdateTimeout);
}}, {
key: 'hasPendingRequest',
value: function hasPendingRequest(){
return this.request||this.mediaRequest_;
}}, {
key: 'stopRequest',
value: function stopRequest(){
if(this.request){
var oldRequest=this.request;
this.request=null;
oldRequest.onreadystatechange=null;
oldRequest.abort();
}}
}, {
key: 'sidxRequestFinished_',
value: function sidxRequestFinished_(playlist, master, startingState, doneFn){
var _this2=this;
return function (err, request){
if(!_this2.request){
return;
}
_this2.request=null;
if(err){
_this2.error={
status: request.status,
message: 'DASH playlist request error at URL: ' + playlist.uri,
response: request.response,
code: 2
};
if(startingState){
_this2.state=startingState;
}
_this2.trigger('error');
return doneFn(master, null);
}
var bytes=new Uint8Array(request.response);
var sidx=mp4Inspector.parseSidx(bytes.subarray(8));
return doneFn(master, sidx);
};}}, {
key: 'media',
value: function media(playlist){
var _this3=this;
if(!playlist){
return this.media_;
}
if(this.state==='HAVE_NOTHING'){
throw new Error('Cannot switch media playlist from ' + this.state);
}
var startingState=this.state;
if(typeof playlist==='string'){
if(!this.master.playlists[playlist]){
throw new Error('Unknown playlist URI: ' + playlist);
}
playlist=this.master.playlists[playlist];
}
var mediaChange = !this.media_||playlist.uri!==this.media_.uri;
if(mediaChange&&this.loadedPlaylists_[playlist.uri]&&this.loadedPlaylists_[playlist.uri].endList){
this.state='HAVE_METADATA';
this.media_=playlist;
if(mediaChange){
this.trigger('mediachanging');
this.trigger('mediachange');
}
return;
}
if(!mediaChange){
return;
}
if(this.media_){
this.trigger('mediachanging');
}
if(!playlist.sidx){
this.mediaRequest_=window$1.setTimeout(this.haveMetadata.bind(this, {
startingState: startingState,
playlist: playlist
}), 0);
return;
}
var oldMaster=void 0;
var sidxMapping=void 0;
if(this.masterPlaylistLoader_){
oldMaster=this.masterPlaylistLoader_.master;
sidxMapping=this.masterPlaylistLoader_.sidxMapping_;
}else{
oldMaster=this.master;
sidxMapping=this.sidxMapping_;
}
var sidxKey=generateSidxKey(playlist.sidx);
sidxMapping[sidxKey]={
sidxInfo: playlist.sidx
};
this.request=requestSidx_(playlist.sidx, playlist, this.hls_.xhr, {
handleManifestRedirects: this.handleManifestRedirects
}, this.sidxRequestFinished_(playlist, oldMaster, startingState, function (newMaster, sidx){
if(!newMaster||!sidx){
throw new Error('failed to request sidx');
}
sidxMapping[sidxKey].sidx=sidx;
_this3.haveMetadata({
startingState: startingState,
playlist: newMaster.playlists[playlist.uri]
});
}));
}}, {
key: 'haveMetadata',
value: function haveMetadata(_ref){
var startingState=_ref.startingState,
playlist=_ref.playlist;
this.state='HAVE_METADATA';
this.loadedPlaylists_[playlist.uri]=playlist;
this.mediaRequest_=null;
this.refreshMedia_(playlist.uri);
if(startingState==='HAVE_MASTER'){
this.trigger('loadedmetadata');
}else{
this.trigger('mediachange');
}}
}, {
key: 'pause',
value: function pause(){
this.stopRequest();
window$1.clearTimeout(this.mediaUpdateTimeout);
window$1.clearTimeout(this.minimumUpdatePeriodTimeout_);
if(this.state==='HAVE_NOTHING'){
this.started=false;
}}
}, {
key: 'load',
value: function load(isFinalRendition){
var _this4=this;
window$1.clearTimeout(this.mediaUpdateTimeout);
window$1.clearTimeout(this.minimumUpdatePeriodTimeout_);
var media=this.media();
if(isFinalRendition){
var delay=media ? media.targetDuration / 2 * 1000:5 * 1000;
this.mediaUpdateTimeout=window$1.setTimeout(function (){
return _this4.load();
}, delay);
return;
}
if(!this.started){
this.start();
return;
}
this.trigger('loadedplaylist');
}
}, {
key: 'parseMasterXml',
value: function parseMasterXml(){
var master=parse(this.masterXml_, {
manifestUri: this.srcUrl,
clientOffset: this.clientOffset_,
sidxMapping: this.sidxMapping_
});
master.uri=this.srcUrl;
for (var i=0; i < master.playlists.length; i++){
var phonyUri='placeholder-uri-' + i;
master.playlists[i].uri=phonyUri;
master.playlists[phonyUri]=master.playlists[i];
}
forEachMediaGroup(master, function (properties, mediaType, groupKey, labelKey){
if(properties.playlists&&properties.playlists.length){
var _phonyUri='placeholder-uri-' + mediaType + '-' + groupKey + '-' + labelKey;
properties.playlists[0].uri=_phonyUri;
master.playlists[_phonyUri]=properties.playlists[0];
}});
setupMediaPlaylists(master);
resolveMediaGroupUris(master);
return master;
}}, {
key: 'start',
value: function start(){
var _this5=this;
this.started=true;
if(this.masterPlaylistLoader_){
this.mediaRequest_=window$1.setTimeout(this.haveMaster_.bind(this), 0);
return;
}
this.request=this.hls_.xhr({
uri: this.srcUrl,
withCredentials: this.withCredentials
}, function (error, req){
if(!_this5.request){
return;
}
_this5.request=null;
if(error){
_this5.error={
status: req.status,
message: 'DASH playlist request error at URL: ' + _this5.srcUrl,
responseText: req.responseText,
code: 2
};
if(_this5.state==='HAVE_NOTHING'){
_this5.started=false;
}
return _this5.trigger('error');
}
_this5.masterXml_=req.responseText;
if(req.responseHeaders&&req.responseHeaders.date){
_this5.masterLoaded_=Date.parse(req.responseHeaders.date);
}else{
_this5.masterLoaded_=Date.now();
}
_this5.srcUrl=resolveManifestRedirect(_this5.handleManifestRedirects, _this5.srcUrl, req);
_this5.syncClientServerClock_(_this5.onClientServerClockSync_.bind(_this5));
});
}
}, {
key: 'syncClientServerClock_',
value: function syncClientServerClock_(done){
var _this6=this;
var utcTiming=parseUTCTiming(this.masterXml_);
if(utcTiming===null){
this.clientOffset_=this.masterLoaded_ - Date.now();
return done();
}
if(utcTiming.method==='DIRECT'){
this.clientOffset_=utcTiming.value - Date.now();
return done();
}
this.request=this.hls_.xhr({
uri: resolveUrl$1(this.srcUrl, utcTiming.value),
method: utcTiming.method,
withCredentials: this.withCredentials
}, function (error, req){
if(!_this6.request){
return;
}
if(error){
_this6.clientOffset_=_this6.masterLoaded_ - Date.now();
return done();
}
var serverTime=void 0;
if(utcTiming.method==='HEAD'){
if(!req.responseHeaders||!req.responseHeaders.date){
serverTime=_this6.masterLoaded_;
}else{
serverTime=Date.parse(req.responseHeaders.date);
}}else{
serverTime=Date.parse(req.responseText);
}
_this6.clientOffset_=serverTime - Date.now();
done();
});
}}, {
key: 'haveMaster_',
value: function haveMaster_(){
this.state='HAVE_MASTER';
this.mediaRequest_=null;
if(!this.masterPlaylistLoader_){
this.master=this.parseMasterXml();
this.trigger('loadedplaylist');
}else if(!this.media_){
this.media(this.childPlaylist_);
}}
}, {
key: 'onClientServerClockSync_',
value: function onClientServerClockSync_(){
var _this7=this;
this.haveMaster_();
if(!this.hasPendingRequest()&&!this.media_){
this.media(this.master.playlists[0]);
}
if(this.master&&this.master.minimumUpdatePeriod){
this.minimumUpdatePeriodTimeout_=window$1.setTimeout(function (){
_this7.trigger('minimumUpdatePeriod');
}, this.master.minimumUpdatePeriod);
}}
}, {
key: 'refreshXml_',
value: function refreshXml_(){
var _this8=this;
this.request=this.hls_.xhr({
uri: this.srcUrl,
withCredentials: this.withCredentials
}, function (error, req){
if(!_this8.request){
return;
}
_this8.request=null;
if(error){
_this8.error={
status: req.status,
message: 'DASH playlist request error at URL: ' + _this8.srcUrl,
responseText: req.responseText,
code: 2
};
if(_this8.state==='HAVE_NOTHING'){
_this8.started=false;
}
return _this8.trigger('error');
}
_this8.masterXml_=req.responseText;
_this8.sidxMapping_=filterChangedSidxMappings(_this8.masterXml_, _this8.srcUrl, _this8.clientOffset_, _this8.sidxMapping_);
var master=_this8.parseMasterXml();
var updatedMaster=updateMaster$1(_this8.master, master);
var currentSidxInfo=_this8.media().sidx;
if(updatedMaster){
if(currentSidxInfo){
var sidxKey=generateSidxKey(currentSidxInfo);
if(!_this8.sidxMapping_[sidxKey]){
var playlist=_this8.media();
_this8.request=requestSidx_(playlist.sidx, playlist, _this8.hls_.xhr, {
handleManifestRedirects: _this8.handleManifestRedirects
}, _this8.sidxRequestFinished_(playlist, master, _this8.state, function (newMaster, sidx){
if(!newMaster||!sidx){
throw new Error('failed to request sidx on minimumUpdatePeriod');
}
_this8.sidxMapping_[sidxKey].sidx=sidx;
_this8.minimumUpdatePeriodTimeout_=window$1.setTimeout(function (){
_this8.trigger('minimumUpdatePeriod');
}, _this8.master.minimumUpdatePeriod);
_this8.refreshMedia_(_this8.media().uri);
return;
}));
}}else{
_this8.master=updatedMaster;
}}
_this8.minimumUpdatePeriodTimeout_=window$1.setTimeout(function (){
_this8.trigger('minimumUpdatePeriod');
}, _this8.master.minimumUpdatePeriod);
});
}
}, {
key: 'refreshMedia_',
value: function refreshMedia_(mediaUri){
var _this9=this;
if(!mediaUri){
throw new Error('refreshMedia_ must take a media uri');
}
var oldMaster=void 0;
var newMaster=void 0;
if(this.masterPlaylistLoader_){
oldMaster=this.masterPlaylistLoader_.master;
newMaster=this.masterPlaylistLoader_.parseMasterXml();
}else{
oldMaster=this.master;
newMaster=this.parseMasterXml();
}
var updatedMaster=updateMaster$1(oldMaster, newMaster);
if(updatedMaster){
if(this.masterPlaylistLoader_){
this.masterPlaylistLoader_.master=updatedMaster;
}else{
this.master=updatedMaster;
}
this.media_=updatedMaster.playlists[mediaUri];
}else{
this.media_=newMaster.playlists[mediaUri];
this.trigger('playlistunchanged');
}
if(!this.media().endList){
this.mediaUpdateTimeout=window$1.setTimeout(function (){
_this9.trigger('mediaupdatetimeout');
}, refreshDelay(this.media(), !!updatedMaster));
}
this.trigger('loadedplaylist');
}}]);
return DashPlaylistLoader;
}(EventTarget$1$1);
var logger=function logger(source){
if(videojs$1.log.debug){
return videojs$1.log.debug.bind(videojs$1, 'VHS:', source + ' >');
}
return function (){};};
function noop$1(){}
var SourceUpdater=function (){
function SourceUpdater(mediaSource, mimeType, type, sourceBufferEmitter){
classCallCheck$1(this, SourceUpdater);
this.callbacks_=[];
this.pendingCallback_=null;
this.timestampOffset_=0;
this.mediaSource=mediaSource;
this.processedAppend_=false;
this.type_=type;
this.mimeType_=mimeType;
this.logger_=logger('SourceUpdater[' + type + '][' + mimeType + ']');
if(mediaSource.readyState==='closed'){
mediaSource.addEventListener('sourceopen', this.createSourceBuffer_.bind(this, mimeType, sourceBufferEmitter));
}else{
this.createSourceBuffer_(mimeType, sourceBufferEmitter);
}}
createClass$1(SourceUpdater, [{
key: 'createSourceBuffer_',
value: function createSourceBuffer_(mimeType, sourceBufferEmitter){
var _this=this;
this.sourceBuffer_=this.mediaSource.addSourceBuffer(mimeType);
this.logger_('created SourceBuffer');
if(sourceBufferEmitter){
sourceBufferEmitter.trigger('sourcebufferadded');
if(this.mediaSource.sourceBuffers.length < 2){
sourceBufferEmitter.on('sourcebufferadded', function (){
_this.start_();
});
return;
}}
this.start_();
}}, {
key: 'start_',
value: function start_(){
var _this2=this;
this.started_=true;
this.onUpdateendCallback_=function (){
var pendingCallback=_this2.pendingCallback_;
_this2.pendingCallback_=null;
_this2.sourceBuffer_.removing=false;
_this2.logger_('buffered [' + printableRange(_this2.buffered()) + ']');
if(pendingCallback){
pendingCallback();
}
_this2.runCallback_();
};
this.sourceBuffer_.addEventListener('updateend', this.onUpdateendCallback_);
this.runCallback_();
}
}, {
key: 'abort',
value: function abort(done){
var _this3=this;
if(this.processedAppend_){
this.queueCallback_(function (){
_this3.sourceBuffer_.abort();
}, done);
}}
}, {
key: 'appendBuffer',
value: function appendBuffer(config, done){
var _this4=this;
this.processedAppend_=true;
this.queueCallback_(function (){
if(config.videoSegmentTimingInfoCallback){
_this4.sourceBuffer_.addEventListener('videoSegmentTimingInfo', config.videoSegmentTimingInfoCallback);
}
_this4.sourceBuffer_.appendBuffer(config.bytes);
}, function (){
if(config.videoSegmentTimingInfoCallback){
_this4.sourceBuffer_.removeEventListener('videoSegmentTimingInfo', config.videoSegmentTimingInfoCallback);
}
done();
});
}
}, {
key: 'buffered',
value: function buffered(){
if(!this.sourceBuffer_){
return videojs$1.createTimeRanges();
}
return this.sourceBuffer_.buffered;
}
}, {
key: 'remove',
value: function remove(start, end){
var _this5=this;
var done=arguments.length > 2&&arguments[2]!==undefined ? arguments[2]:noop$1;
if(this.processedAppend_){
this.queueCallback_(function (){
_this5.logger_('remove [' + start + '=> ' + end + ']');
_this5.sourceBuffer_.removing=true;
_this5.sourceBuffer_.remove(start, end);
}, done);
}}
}, {
key: 'updating',
value: function updating(){
return !this.sourceBuffer_||this.sourceBuffer_.updating ||
!!this.pendingCallback_&&this.pendingCallback_!==noop$1;
}
}, {
key: 'timestampOffset',
value: function timestampOffset(offset){
var _this6=this;
if(typeof offset!=='undefined'){
this.queueCallback_(function (){
_this6.sourceBuffer_.timestampOffset=offset;
_this6.runCallback_();
});
this.timestampOffset_=offset;
}
return this.timestampOffset_;
}
}, {
key: 'queueCallback_',
value: function queueCallback_(callback, done){
this.callbacks_.push([callback.bind(this), done]);
this.runCallback_();
}
}, {
key: 'runCallback_',
value: function runCallback_(){
var callbacks=void 0;
if(!this.updating()&&this.callbacks_.length&&this.started_){
callbacks=this.callbacks_.shift();
this.pendingCallback_=callbacks[1];
callbacks[0]();
}}
}, {
key: 'dispose',
value: function dispose(){
var _this7=this;
var disposeFn=function disposeFn(){
if(_this7.sourceBuffer_&&_this7.mediaSource.readyState==='open'){
_this7.sourceBuffer_.abort();
}
_this7.sourceBuffer_.removeEventListener('updateend', disposeFn);
};
this.sourceBuffer_.removeEventListener('updateend', this.onUpdateendCallback_);
if(this.sourceBuffer_.removing){
this.sourceBuffer_.addEventListener('updateend', disposeFn);
}else{
disposeFn();
}}
}]);
return SourceUpdater;
}();
var Config={
GOAL_BUFFER_LENGTH: 30,
MAX_GOAL_BUFFER_LENGTH: 60,
GOAL_BUFFER_LENGTH_RATE: 1,
INITIAL_BANDWIDTH: 4194304,
BANDWIDTH_VARIANCE: 1.2,
BUFFER_LOW_WATER_LINE: 0,
MAX_BUFFER_LOW_WATER_LINE: 30,
BUFFER_LOW_WATER_LINE_RATE: 1
};
var REQUEST_ERRORS={
FAILURE: 2,
TIMEOUT: -101,
ABORTED: -102
};
var abortAll=function abortAll(activeXhrs){
activeXhrs.forEach(function (xhr){
xhr.abort();
});
};
var getRequestStats=function getRequestStats(request){
return {
bandwidth: request.bandwidth,
bytesReceived: request.bytesReceived||0,
roundTripTime: request.roundTripTime||0
};};
var getProgressStats=function getProgressStats(progressEvent){
var request=progressEvent.target;
var roundTripTime=Date.now() - request.requestTime;
var stats={
bandwidth: Infinity,
bytesReceived: 0,
roundTripTime: roundTripTime||0
};
stats.bytesReceived=progressEvent.loaded;
stats.bandwidth=Math.floor(stats.bytesReceived / stats.roundTripTime * 8 * 1000);
return stats;
};
var handleErrors=function handleErrors(error, request){
if(request.timedout){
return {
status: request.status,
message: 'HLS request timed-out at URL: ' + request.uri,
code: REQUEST_ERRORS.TIMEOUT,
xhr: request
};}
if(request.aborted){
return {
status: request.status,
message: 'HLS request aborted at URL: ' + request.uri,
code: REQUEST_ERRORS.ABORTED,
xhr: request
};}
if(error){
return {
status: request.status,
message: 'HLS request errored at URL: ' + request.uri,
code: REQUEST_ERRORS.FAILURE,
xhr: request
};}
return null;
};
var handleKeyResponse=function handleKeyResponse(segment, finishProcessingFn){
return function (error, request){
var response=request.response;
var errorObj=handleErrors(error, request);
if(errorObj){
return finishProcessingFn(errorObj, segment);
}
if(response.byteLength!==16){
return finishProcessingFn({
status: request.status,
message: 'Invalid HLS key at URL: ' + request.uri,
code: REQUEST_ERRORS.FAILURE,
xhr: request
}, segment);
}
var view=new DataView(response);
segment.key.bytes=new Uint32Array([view.getUint32(0), view.getUint32(4), view.getUint32(8), view.getUint32(12)]);
return finishProcessingFn(null, segment);
};};
var handleInitSegmentResponse=function handleInitSegmentResponse(segment, captionParser, finishProcessingFn){
return function (error, request){
var response=request.response;
var errorObj=handleErrors(error, request);
if(errorObj){
return finishProcessingFn(errorObj, segment);
}
if(response.byteLength===0){
return finishProcessingFn({
status: request.status,
message: 'Empty HLS segment content at URL: ' + request.uri,
code: REQUEST_ERRORS.FAILURE,
xhr: request
}, segment);
}
segment.map.bytes=new Uint8Array(request.response);
if(captionParser&&!captionParser.isInitialized()){
captionParser.init();
}
segment.map.timescales=probe.timescale(segment.map.bytes);
segment.map.videoTrackIds=probe.videoTrackIds(segment.map.bytes);
return finishProcessingFn(null, segment);
};};
var handleSegmentResponse=function handleSegmentResponse(segment, captionParser, finishProcessingFn){
return function (error, request){
var response=request.response;
var errorObj=handleErrors(error, request);
var parsed=void 0;
if(errorObj){
return finishProcessingFn(errorObj, segment);
}
if(response.byteLength===0){
return finishProcessingFn({
status: request.status,
message: 'Empty HLS segment content at URL: ' + request.uri,
code: REQUEST_ERRORS.FAILURE,
xhr: request
}, segment);
}
segment.stats=getRequestStats(request);
if(segment.key){
segment.encryptedBytes=new Uint8Array(request.response);
}else{
segment.bytes=new Uint8Array(request.response);
}
if(captionParser&&segment.map&&segment.map.bytes){
if(!captionParser.isInitialized()){
captionParser.init();
}
parsed=captionParser.parse(segment.bytes, segment.map.videoTrackIds, segment.map.timescales);
if(parsed&&parsed.captions){
segment.captionStreams=parsed.captionStreams;
segment.fmp4Captions=parsed.captions;
}}
return finishProcessingFn(null, segment);
};};
var decryptSegment=function decryptSegment(decrypter, segment, doneFn){
var decryptionHandler=function decryptionHandler(event){
if(event.data.source===segment.requestId){
decrypter.removeEventListener('message', decryptionHandler);
var decrypted=event.data.decrypted;
segment.bytes=new Uint8Array(decrypted.bytes, decrypted.byteOffset, decrypted.byteLength);
return doneFn(null, segment);
}};
decrypter.addEventListener('message', decryptionHandler);
var keyBytes=void 0;
if(segment.key.bytes.slice){
keyBytes=segment.key.bytes.slice();
}else{
keyBytes=new Uint32Array(Array.prototype.slice.call(segment.key.bytes));
}
decrypter.postMessage(createTransferableMessage({
source: segment.requestId,
encrypted: segment.encryptedBytes,
key: keyBytes,
iv: segment.key.iv
}), [segment.encryptedBytes.buffer, keyBytes.buffer]);
};
var waitForCompletion=function waitForCompletion(activeXhrs, decrypter, doneFn){
var count=0;
var didError=false;
return function (error, segment){
if(didError){
return;
}
if(error){
didError=true;
abortAll(activeXhrs);
return doneFn(error, segment);
}
count +=1;
if(count===activeXhrs.length){
segment.endOfAllRequests=Date.now();
if(segment.encryptedBytes){
return decryptSegment(decrypter, segment, doneFn);
}
return doneFn(null, segment);
}};};
var handleProgress=function handleProgress(segment, progressFn){
return function (event){
segment.stats=videojs$1.mergeOptions(segment.stats, getProgressStats(event));
if(!segment.stats.firstBytesReceivedAt&&segment.stats.bytesReceived){
segment.stats.firstBytesReceivedAt=Date.now();
}
return progressFn(event, segment);
};};
var mediaSegmentRequest=function mediaSegmentRequest(xhr, xhrOptions, decryptionWorker, captionParser, segment, progressFn, doneFn){
var activeXhrs=[];
var finishProcessingFn=waitForCompletion(activeXhrs, decryptionWorker, doneFn);
if(segment.key&&!segment.key.bytes){
var keyRequestOptions=videojs$1.mergeOptions(xhrOptions, {
uri: segment.key.resolvedUri,
responseType: 'arraybuffer'
});
var keyRequestCallback=handleKeyResponse(segment, finishProcessingFn);
var keyXhr=xhr(keyRequestOptions, keyRequestCallback);
activeXhrs.push(keyXhr);
}
if(segment.map&&!segment.map.bytes){
var initSegmentOptions=videojs$1.mergeOptions(xhrOptions, {
uri: segment.map.resolvedUri,
responseType: 'arraybuffer',
headers: segmentXhrHeaders(segment.map)
});
var initSegmentRequestCallback=handleInitSegmentResponse(segment, captionParser, finishProcessingFn);
var initSegmentXhr=xhr(initSegmentOptions, initSegmentRequestCallback);
activeXhrs.push(initSegmentXhr);
}
var segmentRequestOptions=videojs$1.mergeOptions(xhrOptions, {
uri: segment.resolvedUri,
responseType: 'arraybuffer',
headers: segmentXhrHeaders(segment)
});
var segmentRequestCallback=handleSegmentResponse(segment, captionParser, finishProcessingFn);
var segmentXhr=xhr(segmentRequestOptions, segmentRequestCallback);
segmentXhr.addEventListener('progress', handleProgress(segment, progressFn));
activeXhrs.push(segmentXhr);
return function (){
return abortAll(activeXhrs);
};};
var safeGetComputedStyle=function safeGetComputedStyle(el, property){
var result=void 0;
if(!el){
return '';
}
result=window$1.getComputedStyle(el);
if(!result){
return '';
}
return result[property];
};
var stableSort=function stableSort(array, sortFn){
var newArray=array.slice();
array.sort(function (left, right){
var cmp=sortFn(left, right);
if(cmp===0){
return newArray.indexOf(left) - newArray.indexOf(right);
}
return cmp;
});
};
var comparePlaylistBandwidth=function comparePlaylistBandwidth(left, right){
var leftBandwidth=void 0;
var rightBandwidth=void 0;
if(left.attributes.BANDWIDTH){
leftBandwidth=left.attributes.BANDWIDTH;
}
leftBandwidth=leftBandwidth||window$1.Number.MAX_VALUE;
if(right.attributes.BANDWIDTH){
rightBandwidth=right.attributes.BANDWIDTH;
}
rightBandwidth=rightBandwidth||window$1.Number.MAX_VALUE;
return leftBandwidth - rightBandwidth;
};
var comparePlaylistResolution=function comparePlaylistResolution(left, right){
var leftWidth=void 0;
var rightWidth=void 0;
if(left.attributes.RESOLUTION&&left.attributes.RESOLUTION.width){
leftWidth=left.attributes.RESOLUTION.width;
}
leftWidth=leftWidth||window$1.Number.MAX_VALUE;
if(right.attributes.RESOLUTION&&right.attributes.RESOLUTION.width){
rightWidth=right.attributes.RESOLUTION.width;
}
rightWidth=rightWidth||window$1.Number.MAX_VALUE;
if(leftWidth===rightWidth&&left.attributes.BANDWIDTH&&right.attributes.BANDWIDTH){
return left.attributes.BANDWIDTH - right.attributes.BANDWIDTH;
}
return leftWidth - rightWidth;
};
var simpleSelector=function simpleSelector(master, playerBandwidth, playerWidth, playerHeight, limitRenditionByPlayerDimensions){
var sortedPlaylistReps=master.playlists.map(function (playlist){
var width=void 0;
var height=void 0;
var bandwidth=void 0;
width=playlist.attributes.RESOLUTION&&playlist.attributes.RESOLUTION.width;
height=playlist.attributes.RESOLUTION&&playlist.attributes.RESOLUTION.height;
bandwidth=playlist.attributes.BANDWIDTH;
bandwidth=bandwidth||window$1.Number.MAX_VALUE;
return {
bandwidth: bandwidth,
width: width,
height: height,
playlist: playlist
};});
stableSort(sortedPlaylistReps, function (left, right){
return left.bandwidth - right.bandwidth;
});
sortedPlaylistReps=sortedPlaylistReps.filter(function (rep){
return !Playlist.isIncompatible(rep.playlist);
});
var enabledPlaylistReps=sortedPlaylistReps.filter(function (rep){
return Playlist.isEnabled(rep.playlist);
});
if(!enabledPlaylistReps.length){
enabledPlaylistReps=sortedPlaylistReps.filter(function (rep){
return !Playlist.isDisabled(rep.playlist);
});
}
var bandwidthPlaylistReps=enabledPlaylistReps.filter(function (rep){
return rep.bandwidth * Config.BANDWIDTH_VARIANCE < playerBandwidth;
});
var highestRemainingBandwidthRep=bandwidthPlaylistReps[bandwidthPlaylistReps.length - 1];
var bandwidthBestRep=bandwidthPlaylistReps.filter(function (rep){
return rep.bandwidth===highestRemainingBandwidthRep.bandwidth;
})[0];
if(limitRenditionByPlayerDimensions===false){
var _chosenRep=bandwidthBestRep||enabledPlaylistReps[0]||sortedPlaylistReps[0];
return _chosenRep ? _chosenRep.playlist:null;
}
var haveResolution=bandwidthPlaylistReps.filter(function (rep){
return rep.width&&rep.height;
});
stableSort(haveResolution, function (left, right){
return left.width - right.width;
});
var resolutionBestRepList=haveResolution.filter(function (rep){
return rep.width===playerWidth&&rep.height===playerHeight;
});
highestRemainingBandwidthRep=resolutionBestRepList[resolutionBestRepList.length - 1];
var resolutionBestRep=resolutionBestRepList.filter(function (rep){
return rep.bandwidth===highestRemainingBandwidthRep.bandwidth;
})[0];
var resolutionPlusOneList=void 0;
var resolutionPlusOneSmallest=void 0;
var resolutionPlusOneRep=void 0;
if(!resolutionBestRep){
resolutionPlusOneList=haveResolution.filter(function (rep){
return rep.width > playerWidth||rep.height > playerHeight;
});
resolutionPlusOneSmallest=resolutionPlusOneList.filter(function (rep){
return rep.width===resolutionPlusOneList[0].width&&rep.height===resolutionPlusOneList[0].height;
});
highestRemainingBandwidthRep=resolutionPlusOneSmallest[resolutionPlusOneSmallest.length - 1];
resolutionPlusOneRep=resolutionPlusOneSmallest.filter(function (rep){
return rep.bandwidth===highestRemainingBandwidthRep.bandwidth;
})[0];
}
var chosenRep=resolutionPlusOneRep||resolutionBestRep||bandwidthBestRep||enabledPlaylistReps[0]||sortedPlaylistReps[0];
return chosenRep ? chosenRep.playlist:null;
};
var lastBandwidthSelector=function lastBandwidthSelector(){
return simpleSelector(this.playlists.master, this.systemBandwidth, parseInt(safeGetComputedStyle(this.tech_.el(), 'width'), 10), parseInt(safeGetComputedStyle(this.tech_.el(), 'height'), 10), this.limitRenditionByPlayerDimensions);
};
var minRebufferMaxBandwidthSelector=function minRebufferMaxBandwidthSelector(settings){
var master=settings.master,
currentTime=settings.currentTime,
bandwidth=settings.bandwidth,
duration$$1=settings.duration,
segmentDuration=settings.segmentDuration,
timeUntilRebuffer=settings.timeUntilRebuffer,
currentTimeline=settings.currentTimeline,
syncController=settings.syncController;
var compatiblePlaylists=master.playlists.filter(function (playlist){
return !Playlist.isIncompatible(playlist);
});
var enabledPlaylists=compatiblePlaylists.filter(Playlist.isEnabled);
if(!enabledPlaylists.length){
enabledPlaylists=compatiblePlaylists.filter(function (playlist){
return !Playlist.isDisabled(playlist);
});
}
var bandwidthPlaylists=enabledPlaylists.filter(Playlist.hasAttribute.bind(null, 'BANDWIDTH'));
var rebufferingEstimates=bandwidthPlaylists.map(function (playlist){
var syncPoint=syncController.getSyncPoint(playlist, duration$$1, currentTimeline, currentTime);
var numRequests=syncPoint ? 1:2;
var requestTimeEstimate=Playlist.estimateSegmentRequestTime(segmentDuration, bandwidth, playlist);
var rebufferingImpact=requestTimeEstimate * numRequests - timeUntilRebuffer;
return {
playlist: playlist,
rebufferingImpact: rebufferingImpact
};});
var noRebufferingPlaylists=rebufferingEstimates.filter(function (estimate){
return estimate.rebufferingImpact <=0;
});
stableSort(noRebufferingPlaylists, function (a, b){
return comparePlaylistBandwidth(b.playlist, a.playlist);
});
if(noRebufferingPlaylists.length){
return noRebufferingPlaylists[0];
}
stableSort(rebufferingEstimates, function (a, b){
return a.rebufferingImpact - b.rebufferingImpact;
});
return rebufferingEstimates[0]||null;
};
var lowestBitrateCompatibleVariantSelector=function lowestBitrateCompatibleVariantSelector(){
var playlists=this.playlists.master.playlists.filter(Playlist.isEnabled);
stableSort(playlists, function (a, b){
return comparePlaylistBandwidth(a, b);
});
var playlistsWithVideo=playlists.filter(function (playlist){
return parseCodecs(playlist.attributes.CODECS).videoCodec;
});
return playlistsWithVideo[0]||null;
};
var createCaptionsTrackIfNotExists=function createCaptionsTrackIfNotExists(inbandTextTracks, tech, captionStreams){
for (var trackId in captionStreams){
if(!inbandTextTracks[trackId]){
tech.trigger({
type: 'usage',
name: 'hls-608'
});
var track=tech.textTracks().getTrackById(trackId);
if(track){
inbandTextTracks[trackId]=track;
}else{
inbandTextTracks[trackId]=tech.addRemoteTextTrack({
kind: 'captions',
id: trackId,
label: trackId
}, false).track;
}}
}};
var addCaptionData=function addCaptionData(_ref){
var inbandTextTracks=_ref.inbandTextTracks,
captionArray=_ref.captionArray,
timestampOffset=_ref.timestampOffset;
if(!captionArray){
return;
}
var Cue=window.WebKitDataCue||window.VTTCue;
captionArray.forEach(function (caption){
var track=caption.stream;
var startTime=caption.startTime;
var endTime=caption.endTime;
if(!inbandTextTracks[track]){
return;
}
startTime +=timestampOffset;
endTime +=timestampOffset;
inbandTextTracks[track].addCue(new Cue(startTime, endTime, caption.text));
});
};
var CHECK_BUFFER_DELAY=500;
var detectEndOfStream=function detectEndOfStream(playlist, mediaSource, segmentIndex){
if(!playlist||!mediaSource){
return false;
}
var segments=playlist.segments;
var appendedLastSegment=segmentIndex===segments.length;
return playlist.endList&&mediaSource.readyState==='open'&&appendedLastSegment;
};
var finite=function finite(num){
return typeof num==='number'&&isFinite(num);
};
var illegalMediaSwitch=function illegalMediaSwitch(loaderType, startingMedia, newSegmentMedia){
if(loaderType!=='main'||!startingMedia||!newSegmentMedia){
return null;
}
if(!newSegmentMedia.containsAudio&&!newSegmentMedia.containsVideo){
return 'Neither audio nor video found in segment.';
}
if(startingMedia.containsVideo&&!newSegmentMedia.containsVideo){
return 'Only audio found in segment when we expected video.' + ' We can\'t switch to audio only from a stream that had video.' + ' To get rid of this message, please add codec information to the manifest.';
}
if(!startingMedia.containsVideo&&newSegmentMedia.containsVideo){
return 'Video found in segment when we expected only audio.' + ' We can\'t switch to a stream with video from an audio only stream.' + ' To get rid of this message, please add codec information to the manifest.';
}
return null;
};
var safeBackBufferTrimTime=function safeBackBufferTrimTime(seekable$$1, currentTime, targetDuration){
var removeToTime=void 0;
if(seekable$$1.length&&seekable$$1.start(0) > 0&&seekable$$1.start(0) < currentTime){
removeToTime=seekable$$1.start(0);
}else{
removeToTime=currentTime - 30;
}
return Math.min(removeToTime, currentTime - targetDuration);
};
var segmentInfoString=function segmentInfoString(segmentInfo){
var _segmentInfo$segment=segmentInfo.segment,
start=_segmentInfo$segment.start,
end=_segmentInfo$segment.end,
_segmentInfo$playlist=segmentInfo.playlist,
seq=_segmentInfo$playlist.mediaSequence,
id=_segmentInfo$playlist.id,
_segmentInfo$playlist2=_segmentInfo$playlist.segments,
segments=_segmentInfo$playlist2===undefined ? []:_segmentInfo$playlist2,
index=segmentInfo.mediaIndex,
timeline=segmentInfo.timeline;
return ['appending [' + index + '] of [' + seq + ', ' + (seq + segments.length) + '] from playlist [' + id + ']', '[' + start + '=> ' + end + '] in timeline [' + timeline + ']'].join(' ');
};
var SegmentLoader=function (_videojs$EventTarget){
inherits$2(SegmentLoader, _videojs$EventTarget);
function SegmentLoader(settings){
classCallCheck$1(this, SegmentLoader);
var _this=possibleConstructorReturn$1(this, (SegmentLoader.__proto__||Object.getPrototypeOf(SegmentLoader)).call(this));
if(!settings){
throw new TypeError('Initialization settings are required');
}
if(typeof settings.currentTime!=='function'){
throw new TypeError('No currentTime getter specified');
}
if(!settings.mediaSource){
throw new TypeError('No MediaSource specified');
}
_this.bandwidth=settings.bandwidth;
_this.throughput={
rate: 0,
count: 0
};
_this.roundTrip=NaN;
_this.resetStats_();
_this.mediaIndex=null;
_this.hasPlayed_=settings.hasPlayed;
_this.currentTime_=settings.currentTime;
_this.seekable_=settings.seekable;
_this.seeking_=settings.seeking;
_this.duration_=settings.duration;
_this.mediaSource_=settings.mediaSource;
_this.hls_=settings.hls;
_this.loaderType_=settings.loaderType;
_this.startingMedia_=void 0;
_this.segmentMetadataTrack_=settings.segmentMetadataTrack;
_this.goalBufferLength_=settings.goalBufferLength;
_this.sourceType_=settings.sourceType;
_this.inbandTextTracks_=settings.inbandTextTracks;
_this.state_='INIT';
_this.checkBufferTimeout_=null;
_this.error_=void 0;
_this.currentTimeline_=-1;
_this.pendingSegment_=null;
_this.mimeType_=null;
_this.sourceUpdater_=null;
_this.xhrOptions_=null;
_this.activeInitSegmentId_=null;
_this.initSegments_={};
_this.cacheEncryptionKeys_=settings.cacheEncryptionKeys;
_this.keyCache_={};
if(_this.loaderType_==='main'){
_this.captionParser_=new captionParser();
}else{
_this.captionParser_=null;
}
_this.decrypter_=settings.decrypter;
_this.syncController_=settings.syncController;
_this.syncPoint_={
segmentIndex: 0,
time: 0
};
_this.syncController_.on('syncinfoupdate', function (){
return _this.trigger('syncinfoupdate');
});
_this.mediaSource_.addEventListener('sourceopen', function (){
return _this.ended_=false;
});
_this.fetchAtBuffer_=false;
_this.logger_=logger('SegmentLoader[' + _this.loaderType_ + ']');
Object.defineProperty(_this, 'state', {
get: function get$$1(){
return this.state_;
},
set: function set$$1(newState){
if(newState!==this.state_){
this.logger_(this.state_ + ' -> ' + newState);
this.state_=newState;
}}
});
return _this;
}
createClass$1(SegmentLoader, [{
key: 'resetStats_',
value: function resetStats_(){
this.mediaBytesTransferred=0;
this.mediaRequests=0;
this.mediaRequestsAborted=0;
this.mediaRequestsTimedout=0;
this.mediaRequestsErrored=0;
this.mediaTransferDuration=0;
this.mediaSecondsLoaded=0;
}
}, {
key: 'dispose',
value: function dispose(){
this.state='DISPOSED';
this.pause();
this.abort_();
if(this.sourceUpdater_){
this.sourceUpdater_.dispose();
}
this.resetStats_();
if(this.captionParser_){
this.captionParser_.reset();
}}
}, {
key: 'abort',
value: function abort(){
if(this.state!=='WAITING'){
if(this.pendingSegment_){
this.pendingSegment_=null;
}
return;
}
this.abort_();
this.state='READY';
if(!this.paused()){
this.monitorBuffer_();
}}
}, {
key: 'abort_',
value: function abort_(){
if(this.pendingSegment_){
this.pendingSegment_.abortRequests();
}
this.pendingSegment_=null;
}
}, {
key: 'error',
value: function error(_error){
if(typeof _error!=='undefined'){
this.error_=_error;
}
this.pendingSegment_=null;
return this.error_;
}}, {
key: 'endOfStream',
value: function endOfStream(){
this.ended_=true;
this.pause();
this.trigger('ended');
}
}, {
key: 'buffered_',
value: function buffered_(){
if(!this.sourceUpdater_){
return videojs$1.createTimeRanges();
}
return this.sourceUpdater_.buffered();
}
}, {
key: 'initSegment',
value: function initSegment(map){
var set$$1=arguments.length > 1&&arguments[1]!==undefined ? arguments[1]:false;
if(!map){
return null;
}
var id=initSegmentId(map);
var storedMap=this.initSegments_[id];
if(set$$1&&!storedMap&&map.bytes){
this.initSegments_[id]=storedMap={
resolvedUri: map.resolvedUri,
byterange: map.byterange,
bytes: map.bytes,
timescales: map.timescales,
videoTrackIds: map.videoTrackIds
};}
return storedMap||map;
}
}, {
key: 'segmentKey',
value: function segmentKey(key){
var set$$1=arguments.length > 1&&arguments[1]!==undefined ? arguments[1]:false;
if(!key){
return null;
}
var id=segmentKeyId(key);
var storedKey=this.keyCache_[id];
if(this.cacheEncryptionKeys_&&set$$1&&!storedKey&&key.bytes){
this.keyCache_[id]=storedKey={
resolvedUri: key.resolvedUri,
bytes: key.bytes
};}
var result={
resolvedUri: (storedKey||key).resolvedUri
};
if(storedKey){
result.bytes=storedKey.bytes;
}
return result;
}
}, {
key: 'couldBeginLoading_',
value: function couldBeginLoading_(){
return this.playlist_&&(
this.sourceUpdater_||this.mimeType_&&this.state==='INIT')&&!this.paused();
}
}, {
key: 'load',
value: function load(){
this.monitorBuffer_();
if(!this.playlist_){
return;
}
this.syncController_.setDateTimeMapping(this.playlist_);
if(this.state==='INIT'&&this.couldBeginLoading_()){
return this.init_();
}
if(!this.couldBeginLoading_()||this.state!=='READY'&&this.state!=='INIT'){
return;
}
this.state='READY';
}
}, {
key: 'init_',
value: function init_(){
this.state='READY';
this.sourceUpdater_=new SourceUpdater(this.mediaSource_, this.mimeType_, this.loaderType_, this.sourceBufferEmitter_);
this.resetEverything();
return this.monitorBuffer_();
}
}, {
key: 'playlist',
value: function playlist(newPlaylist){
var options=arguments.length > 1&&arguments[1]!==undefined ? arguments[1]:{};
if(!newPlaylist){
return;
}
var oldPlaylist=this.playlist_;
var segmentInfo=this.pendingSegment_;
this.playlist_=newPlaylist;
this.xhrOptions_=options;
if(!this.hasPlayed_()){
newPlaylist.syncInfo={
mediaSequence: newPlaylist.mediaSequence,
time: 0
};}
var oldId=null;
if(oldPlaylist){
if(oldPlaylist.id){
oldId=oldPlaylist.id;
}else if(oldPlaylist.uri){
oldId=oldPlaylist.uri;
}}
this.logger_('playlist update [' + oldId + '=> ' + (newPlaylist.id||newPlaylist.uri) + ']');
this.trigger('syncinfoupdate');
if(this.state==='INIT'&&this.couldBeginLoading_()){
return this.init_();
}
if(!oldPlaylist||oldPlaylist.uri!==newPlaylist.uri){
if(this.mediaIndex!==null){
this.resyncLoader();
}
return;
}
var mediaSequenceDiff=newPlaylist.mediaSequence - oldPlaylist.mediaSequence;
this.logger_('live window shift [' + mediaSequenceDiff + ']');
if(this.mediaIndex!==null){
this.mediaIndex -=mediaSequenceDiff;
}
if(segmentInfo){
segmentInfo.mediaIndex -=mediaSequenceDiff;
if(segmentInfo.mediaIndex >=0){
segmentInfo.segment=newPlaylist.segments[segmentInfo.mediaIndex];
}}
this.syncController_.saveExpiredSegmentInfo(oldPlaylist, newPlaylist);
}
}, {
key: 'pause',
value: function pause(){
if(this.checkBufferTimeout_){
window$1.clearTimeout(this.checkBufferTimeout_);
this.checkBufferTimeout_=null;
}}
}, {
key: 'paused',
value: function paused(){
return this.checkBufferTimeout_===null;
}
}, {
key: 'mimeType',
value: function mimeType(_mimeType, sourceBufferEmitter){
if(this.mimeType_){
return;
}
this.mimeType_=_mimeType;
this.sourceBufferEmitter_=sourceBufferEmitter;
if(this.state==='INIT'&&this.couldBeginLoading_()){
this.init_();
}}
}, {
key: 'resetEverything',
value: function resetEverything(done){
this.ended_=false;
this.resetLoader();
this.remove(0, this.duration_(), done);
if(this.captionParser_){
this.captionParser_.clearAllCaptions();
}
this.trigger('reseteverything');
}
}, {
key: 'resetLoader',
value: function resetLoader(){
this.fetchAtBuffer_=false;
this.resyncLoader();
}
}, {
key: 'resyncLoader',
value: function resyncLoader(){
this.mediaIndex=null;
this.syncPoint_=null;
this.abort();
}
}, {
key: 'remove',
value: function remove(start, end, done){
if(this.sourceUpdater_){
this.sourceUpdater_.remove(start, end, done);
}
removeCuesFromTrack(start, end, this.segmentMetadataTrack_);
if(this.inbandTextTracks_){
for (var id in this.inbandTextTracks_){
removeCuesFromTrack(start, end, this.inbandTextTracks_[id]);
}}
}
}, {
key: 'monitorBuffer_',
value: function monitorBuffer_(){
if(this.checkBufferTimeout_){
window$1.clearTimeout(this.checkBufferTimeout_);
}
this.checkBufferTimeout_=window$1.setTimeout(this.monitorBufferTick_.bind(this), 1);
}
}, {
key: 'monitorBufferTick_',
value: function monitorBufferTick_(){
if(this.state==='READY'){
this.fillBuffer_();
}
if(this.checkBufferTimeout_){
window$1.clearTimeout(this.checkBufferTimeout_);
}
this.checkBufferTimeout_=window$1.setTimeout(this.monitorBufferTick_.bind(this), CHECK_BUFFER_DELAY);
}
}, {
key: 'fillBuffer_',
value: function fillBuffer_(){
if(this.sourceUpdater_.updating()){
return;
}
if(!this.syncPoint_){
this.syncPoint_=this.syncController_.getSyncPoint(this.playlist_, this.duration_(), this.currentTimeline_, this.currentTime_());
}
var segmentInfo=this.checkBuffer_(this.buffered_(), this.playlist_, this.mediaIndex, this.hasPlayed_(), this.currentTime_(), this.syncPoint_);
if(!segmentInfo){
return;
}
if(this.isEndOfStream_(segmentInfo.mediaIndex)){
this.endOfStream();
return;
}
if(segmentInfo.mediaIndex===this.playlist_.segments.length - 1&&this.mediaSource_.readyState==='ended'&&!this.seeking_()){
return;
}
if(segmentInfo.timeline!==this.currentTimeline_){
this.syncController_.reset();
segmentInfo.timestampOffset=segmentInfo.startOfSegment;
if(this.captionParser_){
this.captionParser_.clearAllCaptions();
}}
this.loadSegment_(segmentInfo);
}
}, {
key: 'isEndOfStream_',
value: function isEndOfStream_(mediaIndex){
var playlist=arguments.length > 1&&arguments[1]!==undefined ? arguments[1]:this.playlist_;
return detectEndOfStream(playlist, this.mediaSource_, mediaIndex)&&!this.sourceUpdater_.updating();
}
}, {
key: 'checkBuffer_',
value: function checkBuffer_(buffered, playlist, mediaIndex, hasPlayed, currentTime, syncPoint){
var lastBufferedEnd=0;
var startOfSegment=void 0;
if(buffered.length){
lastBufferedEnd=buffered.end(buffered.length - 1);
}
var bufferedTime=Math.max(0, lastBufferedEnd - currentTime);
if(!playlist.segments.length){
return null;
}
if(bufferedTime >=this.goalBufferLength_()){
return null;
}
if(!hasPlayed&&bufferedTime >=1){
return null;
}
if(syncPoint===null){
mediaIndex=this.getSyncSegmentCandidate_(playlist);
return this.generateSegmentInfo_(playlist, mediaIndex, null, true);
}
if(mediaIndex!==null){
var segment=playlist.segments[mediaIndex];
startOfSegment=lastBufferedEnd;
return this.generateSegmentInfo_(playlist, mediaIndex + 1, startOfSegment, false);
}
if(this.fetchAtBuffer_){
var mediaSourceInfo=Playlist.getMediaInfoForTime(playlist, lastBufferedEnd, syncPoint.segmentIndex, syncPoint.time);
mediaIndex=mediaSourceInfo.mediaIndex;
startOfSegment=mediaSourceInfo.startTime;
}else{
var _mediaSourceInfo=Playlist.getMediaInfoForTime(playlist, currentTime, syncPoint.segmentIndex, syncPoint.time);
mediaIndex=_mediaSourceInfo.mediaIndex;
startOfSegment=_mediaSourceInfo.startTime;
}
return this.generateSegmentInfo_(playlist, mediaIndex, startOfSegment, false);
}
}, {
key: 'getSyncSegmentCandidate_',
value: function getSyncSegmentCandidate_(playlist){
var _this2=this;
if(this.currentTimeline_===-1){
return 0;
}
var segmentIndexArray=playlist.segments.map(function (s, i){
return {
timeline: s.timeline,
segmentIndex: i
};}).filter(function (s){
return s.timeline===_this2.currentTimeline_;
});
if(segmentIndexArray.length){
return segmentIndexArray[Math.min(segmentIndexArray.length - 1, 1)].segmentIndex;
}
return Math.max(playlist.segments.length - 1, 0);
}}, {
key: 'generateSegmentInfo_',
value: function generateSegmentInfo_(playlist, mediaIndex, startOfSegment, isSyncRequest){
if(mediaIndex < 0||mediaIndex >=playlist.segments.length){
return null;
}
var segment=playlist.segments[mediaIndex];
return {
requestId: 'segment-loader-' + Math.random(),
uri: segment.resolvedUri,
mediaIndex: mediaIndex,
isSyncRequest: isSyncRequest,
startOfSegment: startOfSegment,
playlist: playlist,
bytes: null,
encryptedBytes: null,
timestampOffset: null,
timeline: segment.timeline,
duration: segment.duration,
segment: segment
};}
}, {
key: 'abortRequestEarly_',
value: function abortRequestEarly_(stats){
if(this.hls_.tech_.paused() ||
!this.xhrOptions_.timeout ||
!this.playlist_.attributes.BANDWIDTH){
return false;
}
if(Date.now() - (stats.firstBytesReceivedAt||Date.now()) < 1000){
return false;
}
var currentTime=this.currentTime_();
var measuredBandwidth=stats.bandwidth;
var segmentDuration=this.pendingSegment_.duration;
var requestTimeRemaining=Playlist.estimateSegmentRequestTime(segmentDuration, measuredBandwidth, this.playlist_, stats.bytesReceived);
var timeUntilRebuffer$$1=timeUntilRebuffer(this.buffered_(), currentTime, this.hls_.tech_.playbackRate()) - 1;
if(requestTimeRemaining <=timeUntilRebuffer$$1){
return false;
}
var switchCandidate=minRebufferMaxBandwidthSelector({
master: this.hls_.playlists.master,
currentTime: currentTime,
bandwidth: measuredBandwidth,
duration: this.duration_(),
segmentDuration: segmentDuration,
timeUntilRebuffer: timeUntilRebuffer$$1,
currentTimeline: this.currentTimeline_,
syncController: this.syncController_
});
if(!switchCandidate){
return;
}
var rebufferingImpact=requestTimeRemaining - timeUntilRebuffer$$1;
var timeSavedBySwitching=rebufferingImpact - switchCandidate.rebufferingImpact;
var minimumTimeSaving=0.5;
if(timeUntilRebuffer$$1 <=TIME_FUDGE_FACTOR){
minimumTimeSaving=1;
}
if(!switchCandidate.playlist||switchCandidate.playlist.uri===this.playlist_.uri||timeSavedBySwitching < minimumTimeSaving){
return false;
}
this.bandwidth=switchCandidate.playlist.attributes.BANDWIDTH * Config.BANDWIDTH_VARIANCE + 1;
this.abort();
this.trigger('earlyabort');
return true;
}
}, {
key: 'handleProgress_',
value: function handleProgress_(event, simpleSegment){
if(!this.pendingSegment_||simpleSegment.requestId!==this.pendingSegment_.requestId||this.abortRequestEarly_(simpleSegment.stats)){
return;
}
this.trigger('progress');
}
}, {
key: 'loadSegment_',
value: function loadSegment_(segmentInfo){
this.state='WAITING';
this.pendingSegment_=segmentInfo;
this.trimBackBuffer_(segmentInfo);
segmentInfo.abortRequests=mediaSegmentRequest(this.hls_.xhr, this.xhrOptions_, this.decrypter_, this.captionParser_, this.createSimplifiedSegmentObj_(segmentInfo),
this.handleProgress_.bind(this), this.segmentRequestFinished_.bind(this));
}
}, {
key: 'trimBackBuffer_',
value: function trimBackBuffer_(segmentInfo){
var removeToTime=safeBackBufferTrimTime(this.seekable_(), this.currentTime_(), this.playlist_.targetDuration||10);
if(removeToTime > 0){
this.remove(0, removeToTime);
}}
}, {
key: 'createSimplifiedSegmentObj_',
value: function createSimplifiedSegmentObj_(segmentInfo){
var segment=segmentInfo.segment;
var simpleSegment={
resolvedUri: segment.resolvedUri,
byterange: segment.byterange,
requestId: segmentInfo.requestId
};
if(segment.key){
var iv=segment.key.iv||new Uint32Array([0, 0, 0, segmentInfo.mediaIndex + segmentInfo.playlist.mediaSequence]);
simpleSegment.key=this.segmentKey(segment.key);
simpleSegment.key.iv=iv;
}
if(segment.map){
simpleSegment.map=this.initSegment(segment.map);
}
return simpleSegment;
}
}, {
key: 'segmentRequestFinished_',
value: function segmentRequestFinished_(error, simpleSegment){
this.mediaRequests +=1;
if(simpleSegment.stats){
this.mediaBytesTransferred +=simpleSegment.stats.bytesReceived;
this.mediaTransferDuration +=simpleSegment.stats.roundTripTime;
}
if(!this.pendingSegment_){
this.mediaRequestsAborted +=1;
return;
}
if(simpleSegment.requestId!==this.pendingSegment_.requestId){
return;
}
if(error){
this.pendingSegment_=null;
this.state='READY';
if(error.code===REQUEST_ERRORS.ABORTED){
this.mediaRequestsAborted +=1;
return;
}
this.pause();
if(error.code===REQUEST_ERRORS.TIMEOUT){
this.mediaRequestsTimedout +=1;
this.bandwidth=1;
this.roundTrip=NaN;
this.trigger('bandwidthupdate');
return;
}
this.mediaRequestsErrored +=1;
this.error(error);
this.trigger('error');
return;
}
this.bandwidth=simpleSegment.stats.bandwidth;
this.roundTrip=simpleSegment.stats.roundTripTime;
if(simpleSegment.map){
simpleSegment.map=this.initSegment(simpleSegment.map, true);
}
if(simpleSegment.key){
this.segmentKey(simpleSegment.key, true);
}
this.processSegmentResponse_(simpleSegment);
}
}, {
key: 'processSegmentResponse_',
value: function processSegmentResponse_(simpleSegment){
var segmentInfo=this.pendingSegment_;
segmentInfo.bytes=simpleSegment.bytes;
if(simpleSegment.map){
segmentInfo.segment.map.bytes=simpleSegment.map.bytes;
}
segmentInfo.endOfAllRequests=simpleSegment.endOfAllRequests;
if(simpleSegment.fmp4Captions){
createCaptionsTrackIfNotExists(this.inbandTextTracks_, this.hls_.tech_, simpleSegment.captionStreams);
addCaptionData({
inbandTextTracks: this.inbandTextTracks_,
captionArray: simpleSegment.fmp4Captions,
timestampOffset: 0
});
if(this.captionParser_){
this.captionParser_.clearParsedCaptions();
}}
this.handleSegment_();
}
}, {
key: 'handleSegment_',
value: function handleSegment_(){
var _this3=this;
if(!this.pendingSegment_){
this.state='READY';
return;
}
var segmentInfo=this.pendingSegment_;
var segment=segmentInfo.segment;
var timingInfo=this.syncController_.probeSegmentInfo(segmentInfo);
if(typeof this.startingMedia_==='undefined'&&timingInfo&&(
timingInfo.containsAudio||timingInfo.containsVideo)){
this.startingMedia_={
containsAudio: timingInfo.containsAudio,
containsVideo: timingInfo.containsVideo
};}
var illegalMediaSwitchError=illegalMediaSwitch(this.loaderType_, this.startingMedia_, timingInfo);
if(illegalMediaSwitchError){
this.error({
message: illegalMediaSwitchError,
blacklistDuration: Infinity
});
this.trigger('error');
return;
}
if(segmentInfo.isSyncRequest){
this.trigger('syncinfoupdate');
this.pendingSegment_=null;
this.state='READY';
return;
}
if(segmentInfo.timestampOffset!==null&&segmentInfo.timestampOffset!==this.sourceUpdater_.timestampOffset()){
if(timingInfo&&timingInfo.segmentTimestampInfo){
var ptsStartTime=timingInfo.segmentTimestampInfo[0].ptsTime;
var dtsStartTime=timingInfo.segmentTimestampInfo[0].dtsTime;
segmentInfo.timestampOffset -=ptsStartTime - dtsStartTime;
}
this.sourceUpdater_.timestampOffset(segmentInfo.timestampOffset);
this.trigger('timestampoffset');
}
var timelineMapping=this.syncController_.mappingForTimeline(segmentInfo.timeline);
if(timelineMapping!==null){
this.trigger({
type: 'segmenttimemapping',
mapping: timelineMapping
});
}
this.state='APPENDING';
if(segment.map){
var initId=initSegmentId(segment.map);
if(!this.activeInitSegmentId_||this.activeInitSegmentId_!==initId){
var initSegment=this.initSegment(segment.map);
this.sourceUpdater_.appendBuffer({
bytes: initSegment.bytes
}, function (){
_this3.activeInitSegmentId_=initId;
});
}}
segmentInfo.byteLength=segmentInfo.bytes.byteLength;
if(typeof segment.start==='number'&&typeof segment.end==='number'){
this.mediaSecondsLoaded +=segment.end - segment.start;
}else{
this.mediaSecondsLoaded +=segment.duration;
}
this.logger_(segmentInfoString(segmentInfo));
this.sourceUpdater_.appendBuffer({
bytes: segmentInfo.bytes,
videoSegmentTimingInfoCallback: this.handleVideoSegmentTimingInfo_.bind(this, segmentInfo.requestId)
}, this.handleUpdateEnd_.bind(this));
}}, {
key: 'handleVideoSegmentTimingInfo_',
value: function handleVideoSegmentTimingInfo_(requestId, event){
if(!this.pendingSegment_||requestId!==this.pendingSegment_.requestId){
return;
}
var segment=this.pendingSegment_.segment;
if(!segment.videoTimingInfo){
segment.videoTimingInfo={};}
segment.videoTimingInfo.transmuxerPrependedSeconds=event.videoSegmentTimingInfo.prependedContentDuration||0;
segment.videoTimingInfo.transmuxedPresentationStart=event.videoSegmentTimingInfo.start.presentation;
segment.videoTimingInfo.transmuxedPresentationEnd=event.videoSegmentTimingInfo.end.presentation;
segment.videoTimingInfo.baseMediaDecodeTime=event.videoSegmentTimingInfo.baseMediaDecodeTime;
}
}, {
key: 'handleUpdateEnd_',
value: function handleUpdateEnd_(){
if(!this.pendingSegment_){
this.state='READY';
if(!this.paused()){
this.monitorBuffer_();
}
return;
}
var segmentInfo=this.pendingSegment_;
var segment=segmentInfo.segment;
var isWalkingForward=this.mediaIndex!==null;
this.pendingSegment_=null;
this.recordThroughput_(segmentInfo);
this.addSegmentMetadataCue_(segmentInfo);
this.state='READY';
this.mediaIndex=segmentInfo.mediaIndex;
this.fetchAtBuffer_=true;
this.currentTimeline_=segmentInfo.timeline;
this.trigger('syncinfoupdate');
if(segment.end&&this.currentTime_() - segment.end > segmentInfo.playlist.targetDuration * 3){
this.resetEverything();
return;
}
if(isWalkingForward){
this.trigger('bandwidthupdate');
}
this.trigger('progress');
if(this.isEndOfStream_(segmentInfo.mediaIndex + 1, segmentInfo.playlist)){
this.endOfStream();
}
if(!this.paused()){
this.monitorBuffer_();
}}
}, {
key: 'recordThroughput_',
value: function recordThroughput_(segmentInfo){
var rate=this.throughput.rate;
var segmentProcessingTime=Date.now() - segmentInfo.endOfAllRequests + 1;
var segmentProcessingThroughput=Math.floor(segmentInfo.byteLength / segmentProcessingTime * 8 * 1000);
this.throughput.rate +=(segmentProcessingThroughput - rate) / ++this.throughput.count;
}
}, {
key: 'addSegmentMetadataCue_',
value: function addSegmentMetadataCue_(segmentInfo){
if(!this.segmentMetadataTrack_){
return;
}
var segment=segmentInfo.segment;
var start=segment.start;
var end=segment.end;
if(!finite(start)||!finite(end)){
return;
}
removeCuesFromTrack(start, end, this.segmentMetadataTrack_);
var Cue=window$1.WebKitDataCue||window$1.VTTCue;
var value={
custom: segment.custom,
dateTimeObject: segment.dateTimeObject,
dateTimeString: segment.dateTimeString,
bandwidth: segmentInfo.playlist.attributes.BANDWIDTH,
resolution: segmentInfo.playlist.attributes.RESOLUTION,
codecs: segmentInfo.playlist.attributes.CODECS,
byteLength: segmentInfo.byteLength,
uri: segmentInfo.uri,
timeline: segmentInfo.timeline,
playlist: segmentInfo.playlist.uri,
start: start,
end: end
};
var data=JSON.stringify(value);
var cue=new Cue(start, end, data);
cue.value=value;
this.segmentMetadataTrack_.addCue(cue);
}}]);
return SegmentLoader;
}(videojs$1.EventTarget);
var uint8ToUtf8=function uint8ToUtf8(uintArray){
return decodeURIComponent(escape(String.fromCharCode.apply(null, uintArray)));
};
var VTT_LINE_TERMINATORS=new Uint8Array('\n\n'.split('').map(function (_char2){
return _char2.charCodeAt(0);
}));
var VTTSegmentLoader=function (_SegmentLoader){
inherits$2(VTTSegmentLoader, _SegmentLoader);
function VTTSegmentLoader(settings){
var options=arguments.length > 1&&arguments[1]!==undefined ? arguments[1]:{};
classCallCheck$1(this, VTTSegmentLoader);
var _this=possibleConstructorReturn$1(this, (VTTSegmentLoader.__proto__||Object.getPrototypeOf(VTTSegmentLoader)).call(this, settings, options));
_this.mediaSource_=null;
_this.subtitlesTrack_=null;
return _this;
}
createClass$1(VTTSegmentLoader, [{
key: 'buffered_',
value: function buffered_(){
if(!this.subtitlesTrack_||!this.subtitlesTrack_.cues.length){
return videojs$1.createTimeRanges();
}
var cues=this.subtitlesTrack_.cues;
var start=cues[0].startTime;
var end=cues[cues.length - 1].startTime;
return videojs$1.createTimeRanges([[start, end]]);
}
}, {
key: 'initSegment',
value: function initSegment(map){
var set$$1=arguments.length > 1&&arguments[1]!==undefined ? arguments[1]:false;
if(!map){
return null;
}
var id=initSegmentId(map);
var storedMap=this.initSegments_[id];
if(set$$1&&!storedMap&&map.bytes){
var combinedByteLength=VTT_LINE_TERMINATORS.byteLength + map.bytes.byteLength;
var combinedSegment=new Uint8Array(combinedByteLength);
combinedSegment.set(map.bytes);
combinedSegment.set(VTT_LINE_TERMINATORS, map.bytes.byteLength);
this.initSegments_[id]=storedMap={
resolvedUri: map.resolvedUri,
byterange: map.byterange,
bytes: combinedSegment
};}
return storedMap||map;
}
}, {
key: 'couldBeginLoading_',
value: function couldBeginLoading_(){
return this.playlist_&&this.subtitlesTrack_&&!this.paused();
}
}, {
key: 'init_',
value: function init_(){
this.state='READY';
this.resetEverything();
return this.monitorBuffer_();
}
}, {
key: 'track',
value: function track(_track){
if(typeof _track==='undefined'){
return this.subtitlesTrack_;
}
this.subtitlesTrack_=_track;
if(this.state==='INIT'&&this.couldBeginLoading_()){
this.init_();
}
return this.subtitlesTrack_;
}
}, {
key: 'remove',
value: function remove(start, end){
removeCuesFromTrack(start, end, this.subtitlesTrack_);
}
}, {
key: 'fillBuffer_',
value: function fillBuffer_(){
var _this2=this;
if(!this.syncPoint_){
this.syncPoint_=this.syncController_.getSyncPoint(this.playlist_, this.duration_(), this.currentTimeline_, this.currentTime_());
}
var segmentInfo=this.checkBuffer_(this.buffered_(), this.playlist_, this.mediaIndex, this.hasPlayed_(), this.currentTime_(), this.syncPoint_);
segmentInfo=this.skipEmptySegments_(segmentInfo);
if(!segmentInfo){
return;
}
if(this.syncController_.timestampOffsetForTimeline(segmentInfo.timeline)===null){
var checkTimestampOffset=function checkTimestampOffset(){
_this2.state='READY';
if(!_this2.paused()){
_this2.monitorBuffer_();
}};
this.syncController_.one('timestampoffset', checkTimestampOffset);
this.state='WAITING_ON_TIMELINE';
return;
}
this.loadSegment_(segmentInfo);
}
}, {
key: 'skipEmptySegments_',
value: function skipEmptySegments_(segmentInfo){
while (segmentInfo&&segmentInfo.segment.empty){
segmentInfo=this.generateSegmentInfo_(segmentInfo.playlist, segmentInfo.mediaIndex + 1, segmentInfo.startOfSegment + segmentInfo.duration, segmentInfo.isSyncRequest);
}
return segmentInfo;
}
}, {
key: 'handleSegment_',
value: function handleSegment_(){
var _this3=this;
if(!this.pendingSegment_||!this.subtitlesTrack_){
this.state='READY';
return;
}
this.state='APPENDING';
var segmentInfo=this.pendingSegment_;
var segment=segmentInfo.segment;
if(typeof window$1.WebVTT!=='function'&&this.subtitlesTrack_&&this.subtitlesTrack_.tech_){
var loadHandler=void 0;
var errorHandler=function errorHandler(){
_this3.subtitlesTrack_.tech_.off('vttjsloaded', loadHandler);
_this3.error({
message: 'Error loading vtt.js'
});
_this3.state='READY';
_this3.pause();
_this3.trigger('error');
};
loadHandler=function loadHandler(){
_this3.subtitlesTrack_.tech_.off('vttjserror', errorHandler);
_this3.handleSegment_();
};
this.state='WAITING_ON_VTTJS';
this.subtitlesTrack_.tech_.one('vttjsloaded', loadHandler);
this.subtitlesTrack_.tech_.one('vttjserror', errorHandler);
return;
}
segment.requested=true;
try {
this.parseVTTCues_(segmentInfo);
} catch (e){
this.error({
message: e.message
});
this.state='READY';
this.pause();
return this.trigger('error');
}
this.updateTimeMapping_(segmentInfo, this.syncController_.timelines[segmentInfo.timeline], this.playlist_);
if(segmentInfo.isSyncRequest){
this.trigger('syncinfoupdate');
this.pendingSegment_=null;
this.state='READY';
return;
}
segmentInfo.byteLength=segmentInfo.bytes.byteLength;
this.mediaSecondsLoaded +=segment.duration;
if(segmentInfo.cues.length){
this.remove(segmentInfo.cues[0].endTime, segmentInfo.cues[segmentInfo.cues.length - 1].endTime);
}
segmentInfo.cues.forEach(function (cue){
_this3.subtitlesTrack_.addCue(cue);
});
this.handleUpdateEnd_();
}
}, {
key: 'parseVTTCues_',
value: function parseVTTCues_(segmentInfo){
var decoder=void 0;
var decodeBytesToString=false;
if(typeof window$1.TextDecoder==='function'){
decoder=new window$1.TextDecoder('utf8');
}else{
decoder=window$1.WebVTT.StringDecoder();
decodeBytesToString=true;
}
var parser=new window$1.WebVTT.Parser(window$1, window$1.vttjs, decoder);
segmentInfo.cues=[];
segmentInfo.timestampmap={
MPEGTS: 0,
LOCAL: 0
};
parser.oncue=segmentInfo.cues.push.bind(segmentInfo.cues);
parser.ontimestampmap=function (map){
return segmentInfo.timestampmap=map;
};
parser.onparsingerror=function (error){
videojs$1.log.warn('Error encountered when parsing cues: ' + error.message);
};
if(segmentInfo.segment.map){
var mapData=segmentInfo.segment.map.bytes;
if(decodeBytesToString){
mapData=uint8ToUtf8(mapData);
}
parser.parse(mapData);
}
var segmentData=segmentInfo.bytes;
if(decodeBytesToString){
segmentData=uint8ToUtf8(segmentData);
}
parser.parse(segmentData);
parser.flush();
}
}, {
key: 'updateTimeMapping_',
value: function updateTimeMapping_(segmentInfo, mappingObj, playlist){
var segment=segmentInfo.segment;
if(!mappingObj){
return;
}
if(!segmentInfo.cues.length){
segment.empty=true;
return;
}
var timestampmap=segmentInfo.timestampmap;
var diff=timestampmap.MPEGTS / 90000 - timestampmap.LOCAL + mappingObj.mapping;
segmentInfo.cues.forEach(function (cue){
cue.startTime +=diff;
cue.endTime +=diff;
});
if(!playlist.syncInfo){
var firstStart=segmentInfo.cues[0].startTime;
var lastStart=segmentInfo.cues[segmentInfo.cues.length - 1].startTime;
playlist.syncInfo={
mediaSequence: playlist.mediaSequence + segmentInfo.mediaIndex,
time: Math.min(firstStart, lastStart - segment.duration)
};}}
}]);
return VTTSegmentLoader;
}(SegmentLoader);
var findAdCue=function findAdCue(track, mediaTime){
var cues=track.cues;
for (var i=0; i < cues.length; i++){
var cue=cues[i];
if(mediaTime >=cue.adStartTime&&mediaTime <=cue.adEndTime){
return cue;
}}
return null;
};
var updateAdCues=function updateAdCues(media, track){
var offset=arguments.length > 2&&arguments[2]!==undefined ? arguments[2]:0;
if(!media.segments){
return;
}
var mediaTime=offset;
var cue=void 0;
for (var i=0; i < media.segments.length; i++){
var segment=media.segments[i];
if(!cue){
cue=findAdCue(track, mediaTime + segment.duration / 2);
}
if(cue){
if('cueIn' in segment){
cue.endTime=mediaTime;
cue.adEndTime=mediaTime;
mediaTime +=segment.duration;
cue=null;
continue;
}
if(mediaTime < cue.endTime){
mediaTime +=segment.duration;
continue;
}
cue.endTime +=segment.duration;
}else{
if('cueOut' in segment){
cue=new window$1.VTTCue(mediaTime, mediaTime + segment.duration, segment.cueOut);
cue.adStartTime=mediaTime;
cue.adEndTime=mediaTime + parseFloat(segment.cueOut);
track.addCue(cue);
}
if('cueOutCont' in segment){
var adOffset=void 0;
var adTotal=void 0;
var _segment$cueOutCont$s=segment.cueOutCont.split('/').map(parseFloat);
var _segment$cueOutCont$s2=slicedToArray(_segment$cueOutCont$s, 2);
adOffset=_segment$cueOutCont$s2[0];
adTotal=_segment$cueOutCont$s2[1];
cue=new window$1.VTTCue(mediaTime, mediaTime + segment.duration, '');
cue.adStartTime=mediaTime - adOffset;
cue.adEndTime=cue.adStartTime + adTotal;
track.addCue(cue);
}}
mediaTime +=segment.duration;
}};
var tsprobe=tsInspector.inspect;
var syncPointStrategies=[
{
name: 'VOD',
run: function run(syncController, playlist, duration$$1, currentTimeline, currentTime){
if(duration$$1!==Infinity){
var syncPoint={
time: 0,
segmentIndex: 0
};
return syncPoint;
}
return null;
}},
{
name: 'ProgramDateTime',
run: function run(syncController, playlist, duration$$1, currentTimeline, currentTime){
if(!syncController.datetimeToDisplayTime){
return null;
}
var segments=playlist.segments||[];
var syncPoint=null;
var lastDistance=null;
currentTime=currentTime||0;
for (var i=0; i < segments.length; i++){
var segment=segments[i];
if(segment.dateTimeObject){
var segmentTime=segment.dateTimeObject.getTime() / 1000;
var segmentStart=segmentTime + syncController.datetimeToDisplayTime;
var distance=Math.abs(currentTime - segmentStart);
if(lastDistance!==null&&(distance===0||lastDistance < distance)){
break;
}
lastDistance=distance;
syncPoint={
time: segmentStart,
segmentIndex: i
};}}
return syncPoint;
}},
{
name: 'Segment',
run: function run(syncController, playlist, duration$$1, currentTimeline, currentTime){
var segments=playlist.segments||[];
var syncPoint=null;
var lastDistance=null;
currentTime=currentTime||0;
for (var i=0; i < segments.length; i++){
var segment=segments[i];
if(segment.timeline===currentTimeline&&typeof segment.start!=='undefined'){
var distance=Math.abs(currentTime - segment.start);
if(lastDistance!==null&&lastDistance < distance){
break;
}
if(!syncPoint||lastDistance===null||lastDistance >=distance){
lastDistance=distance;
syncPoint={
time: segment.start,
segmentIndex: i
};}}
}
return syncPoint;
}},
{
name: 'Discontinuity',
run: function run(syncController, playlist, duration$$1, currentTimeline, currentTime){
var syncPoint=null;
currentTime=currentTime||0;
if(playlist.discontinuityStarts&&playlist.discontinuityStarts.length){
var lastDistance=null;
for (var i=0; i < playlist.discontinuityStarts.length; i++){
var segmentIndex=playlist.discontinuityStarts[i];
var discontinuity=playlist.discontinuitySequence + i + 1;
var discontinuitySync=syncController.discontinuities[discontinuity];
if(discontinuitySync){
var distance=Math.abs(currentTime - discontinuitySync.time);
if(lastDistance!==null&&lastDistance < distance){
break;
}
if(!syncPoint||lastDistance===null||lastDistance >=distance){
lastDistance=distance;
syncPoint={
time: discontinuitySync.time,
segmentIndex: segmentIndex
};}}
}}
return syncPoint;
}},
{
name: 'Playlist',
run: function run(syncController, playlist, duration$$1, currentTimeline, currentTime){
if(playlist.syncInfo){
var syncPoint={
time: playlist.syncInfo.time,
segmentIndex: playlist.syncInfo.mediaSequence - playlist.mediaSequence
};
return syncPoint;
}
return null;
}}];
var SyncController=function (_videojs$EventTarget){
inherits$2(SyncController, _videojs$EventTarget);
function SyncController(){
classCallCheck$1(this, SyncController);
var _this=possibleConstructorReturn$1(this, (SyncController.__proto__||Object.getPrototypeOf(SyncController)).call(this));
_this.inspectCache_=undefined;
_this.timelines=[];
_this.discontinuities=[];
_this.datetimeToDisplayTime=null;
_this.logger_=logger('SyncController');
return _this;
}
createClass$1(SyncController, [{
key: 'getSyncPoint',
value: function getSyncPoint(playlist, duration$$1, currentTimeline, currentTime){
var syncPoints=this.runStrategies_(playlist, duration$$1, currentTimeline, currentTime);
if(!syncPoints.length){
return null;
}
return this.selectSyncPoint_(syncPoints, {
key: 'time',
value: currentTime
});
}
}, {
key: 'getExpiredTime',
value: function getExpiredTime(playlist, duration$$1){
if(!playlist||!playlist.segments){
return null;
}
var syncPoints=this.runStrategies_(playlist, duration$$1, playlist.discontinuitySequence, 0);
if(!syncPoints.length){
return null;
}
var syncPoint=this.selectSyncPoint_(syncPoints, {
key: 'segmentIndex',
value: 0
});
if(syncPoint.segmentIndex > 0){
syncPoint.time *=-1;
}
return Math.abs(syncPoint.time + sumDurations(playlist, syncPoint.segmentIndex, 0));
}
}, {
key: 'runStrategies_',
value: function runStrategies_(playlist, duration$$1, currentTimeline, currentTime){
var syncPoints=[];
for (var i=0; i < syncPointStrategies.length; i++){
var strategy=syncPointStrategies[i];
var syncPoint=strategy.run(this, playlist, duration$$1, currentTimeline, currentTime);
if(syncPoint){
syncPoint.strategy=strategy.name;
syncPoints.push({
strategy: strategy.name,
syncPoint: syncPoint
});
}}
return syncPoints;
}
}, {
key: 'selectSyncPoint_',
value: function selectSyncPoint_(syncPoints, target){
var bestSyncPoint=syncPoints[0].syncPoint;
var bestDistance=Math.abs(syncPoints[0].syncPoint[target.key] - target.value);
var bestStrategy=syncPoints[0].strategy;
for (var i=1; i < syncPoints.length; i++){
var newDistance=Math.abs(syncPoints[i].syncPoint[target.key] - target.value);
if(newDistance < bestDistance){
bestDistance=newDistance;
bestSyncPoint=syncPoints[i].syncPoint;
bestStrategy=syncPoints[i].strategy;
}}
this.logger_('syncPoint for [' + target.key + ': ' + target.value + '] chosen with strategy' + (' [' + bestStrategy + ']: [time:' + bestSyncPoint.time + ',') + (' segmentIndex:' + bestSyncPoint.segmentIndex + ']'));
return bestSyncPoint;
}
}, {
key: 'saveExpiredSegmentInfo',
value: function saveExpiredSegmentInfo(oldPlaylist, newPlaylist){
var mediaSequenceDiff=newPlaylist.mediaSequence - oldPlaylist.mediaSequence;
for (var i=mediaSequenceDiff - 1; i >=0; i--){
var lastRemovedSegment=oldPlaylist.segments[i];
if(lastRemovedSegment&&typeof lastRemovedSegment.start!=='undefined'){
newPlaylist.syncInfo={
mediaSequence: oldPlaylist.mediaSequence + i,
time: lastRemovedSegment.start
};
this.logger_('playlist refresh sync: [time:' + newPlaylist.syncInfo.time + ',' + (' mediaSequence: ' + newPlaylist.syncInfo.mediaSequence + ']'));
this.trigger('syncinfoupdate');
break;
}}
}
}, {
key: 'setDateTimeMapping',
value: function setDateTimeMapping(playlist){
if(!this.datetimeToDisplayTime&&playlist.segments&&playlist.segments.length&&playlist.segments[0].dateTimeObject){
var playlistTimestamp=playlist.segments[0].dateTimeObject.getTime() / 1000;
this.datetimeToDisplayTime=-playlistTimestamp;
}}
}, {
key: 'reset',
value: function reset(){
this.inspectCache_=undefined;
}
}, {
key: 'probeSegmentInfo',
value: function probeSegmentInfo(segmentInfo){
var segment=segmentInfo.segment;
var playlist=segmentInfo.playlist;
var timingInfo=void 0;
if(segment.map){
timingInfo=this.probeMp4Segment_(segmentInfo);
}else{
timingInfo=this.probeTsSegment_(segmentInfo);
}
if(timingInfo){
if(this.calculateSegmentTimeMapping_(segmentInfo, timingInfo)){
this.saveDiscontinuitySyncInfo_(segmentInfo);
if(!playlist.syncInfo){
playlist.syncInfo={
mediaSequence: playlist.mediaSequence + segmentInfo.mediaIndex,
time: segment.start
};}}
}
return timingInfo;
}
}, {
key: 'probeMp4Segment_',
value: function probeMp4Segment_(segmentInfo){
var segment=segmentInfo.segment;
var timescales=probe.timescale(segment.map.bytes);
var compositionStartTime=probe.compositionStartTime(timescales, segmentInfo.bytes);
if(segmentInfo.timestampOffset!==null){
segmentInfo.timestampOffset -=compositionStartTime;
}
return {
start: compositionStartTime,
end: compositionStartTime + segment.duration
};}
}, {
key: 'probeTsSegment_',
value: function probeTsSegment_(segmentInfo){
var timeInfo=tsprobe(segmentInfo.bytes, this.inspectCache_);
var segmentStartTime=void 0;
var segmentEndTime=void 0;
var segmentTimestampInfo=void 0;
if(!timeInfo){
return null;
}
if(timeInfo.video&&timeInfo.video.length===2){
this.inspectCache_=timeInfo.video[1].dts;
segmentStartTime=timeInfo.video[0].dtsTime;
segmentEndTime=timeInfo.video[1].dtsTime;
segmentTimestampInfo=timeInfo.video;
}else if(timeInfo.audio&&timeInfo.audio.length===2){
this.inspectCache_=timeInfo.audio[1].dts;
segmentStartTime=timeInfo.audio[0].dtsTime;
segmentEndTime=timeInfo.audio[1].dtsTime;
segmentTimestampInfo=timeInfo.audio;
}
var probedInfo={
segmentTimestampInfo: segmentTimestampInfo,
start: segmentStartTime,
end: segmentEndTime,
containsVideo: timeInfo.video&&timeInfo.video.length===2,
containsAudio: timeInfo.audio&&timeInfo.audio.length===2
};
return probedInfo;
}}, {
key: 'timestampOffsetForTimeline',
value: function timestampOffsetForTimeline(timeline){
if(typeof this.timelines[timeline]==='undefined'){
return null;
}
return this.timelines[timeline].time;
}}, {
key: 'mappingForTimeline',
value: function mappingForTimeline(timeline){
if(typeof this.timelines[timeline]==='undefined'){
return null;
}
return this.timelines[timeline].mapping;
}
}, {
key: 'calculateSegmentTimeMapping_',
value: function calculateSegmentTimeMapping_(segmentInfo, timingInfo){
var segment=segmentInfo.segment;
var mappingObj=this.timelines[segmentInfo.timeline];
if(segmentInfo.timestampOffset!==null){
mappingObj={
time: segmentInfo.startOfSegment,
mapping: segmentInfo.startOfSegment - timingInfo.start
};
this.timelines[segmentInfo.timeline]=mappingObj;
this.trigger('timestampoffset');
this.logger_('time mapping for timeline ' + segmentInfo.timeline + ': ' + ('[time: ' + mappingObj.time + '] [mapping: ' + mappingObj.mapping + ']'));
segment.start=segmentInfo.startOfSegment;
segment.end=timingInfo.end + mappingObj.mapping;
}else if(mappingObj){
segment.start=timingInfo.start + mappingObj.mapping;
segment.end=timingInfo.end + mappingObj.mapping;
}else{
return false;
}
return true;
}
}, {
key: 'saveDiscontinuitySyncInfo_',
value: function saveDiscontinuitySyncInfo_(segmentInfo){
var playlist=segmentInfo.playlist;
var segment=segmentInfo.segment;
if(segment.discontinuity){
this.discontinuities[segment.timeline]={
time: segment.start,
accuracy: 0
};}else if(playlist.discontinuityStarts&&playlist.discontinuityStarts.length){
for (var i=0; i < playlist.discontinuityStarts.length; i++){
var segmentIndex=playlist.discontinuityStarts[i];
var discontinuity=playlist.discontinuitySequence + i + 1;
var mediaIndexDiff=segmentIndex - segmentInfo.mediaIndex;
var accuracy=Math.abs(mediaIndexDiff);
if(!this.discontinuities[discontinuity]||this.discontinuities[discontinuity].accuracy > accuracy){
var time=void 0;
if(mediaIndexDiff < 0){
time=segment.start - sumDurations(playlist, segmentInfo.mediaIndex, segmentIndex);
}else{
time=segment.end + sumDurations(playlist, segmentInfo.mediaIndex + 1, segmentIndex);
}
this.discontinuities[discontinuity]={
time: time,
accuracy: accuracy
};}}
}}
}]);
return SyncController;
}(videojs$1.EventTarget);
var Decrypter$1=new shimWorker("./decrypter-worker.worker.js", function (window, document$$1){
var self=this;
var decrypterWorker=function (){
function unpad(padded){
return padded.subarray(0, padded.byteLength - padded[padded.byteLength - 1]);
}
var classCallCheck=function classCallCheck(instance, Constructor){
if(!(instance instanceof Constructor)){
throw new TypeError("Cannot call a class as a function");
}};
var createClass=function (){
function defineProperties(target, props){
for (var i=0; i < props.length; i++){
var descriptor=props[i];
descriptor.enumerable=descriptor.enumerable||false;
descriptor.configurable=true;
if("value" in descriptor) descriptor.writable=true;
Object.defineProperty(target, descriptor.key, descriptor);
}}
return function (Constructor, protoProps, staticProps){
if(protoProps) defineProperties(Constructor.prototype, protoProps);
if(staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};}();
var inherits=function inherits(subClass, superClass){
if(typeof superClass!=="function"&&superClass!==null){
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype=Object.create(superClass&&superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}});
if(superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass):subClass.__proto__=superClass;
};
var possibleConstructorReturn=function possibleConstructorReturn(self, call){
if(!self){
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call&&(typeof call==="object"||typeof call==="function") ? call:self;
};
var precompute=function precompute(){
var tables=[[[], [], [], [], []], [[], [], [], [], []]];
var encTable=tables[0];
var decTable=tables[1];
var sbox=encTable[4];
var sboxInv=decTable[4];
var i=void 0;
var x=void 0;
var xInv=void 0;
var d=[];
var th=[];
var x2=void 0;
var x4=void 0;
var x8=void 0;
var s=void 0;
var tEnc=void 0;
var tDec=void 0;
for (i=0; i < 256; i++){
th[(d[i]=i << 1 ^ (i >> 7) * 283) ^ i]=i;
}
for (x=xInv=0; !sbox[x]; x ^=x2||1, xInv=th[xInv]||1){
s=xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
s=s >> 8 ^ s & 255 ^ 99;
sbox[x]=s;
sboxInv[s]=x;
x8=d[x4=d[x2=d[x]]];
tDec=x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;
tEnc=d[s] * 0x101 ^ s * 0x1010100;
for (i=0; i < 4; i++){
encTable[i][x]=tEnc=tEnc << 24 ^ tEnc >>> 8;
decTable[i][s]=tDec=tDec << 24 ^ tDec >>> 8;
}}
for (i=0; i < 5; i++){
encTable[i]=encTable[i].slice(0);
decTable[i]=decTable[i].slice(0);
}
return tables;
};
var aesTables=null;
var AES=function (){
function AES(key){
classCallCheck(this, AES);
if(!aesTables){
aesTables=precompute();
}
this._tables=[[aesTables[0][0].slice(), aesTables[0][1].slice(), aesTables[0][2].slice(), aesTables[0][3].slice(), aesTables[0][4].slice()], [aesTables[1][0].slice(), aesTables[1][1].slice(), aesTables[1][2].slice(), aesTables[1][3].slice(), aesTables[1][4].slice()]];
var i=void 0;
var j=void 0;
var tmp=void 0;
var encKey=void 0;
var decKey=void 0;
var sbox=this._tables[0][4];
var decTable=this._tables[1];
var keyLen=key.length;
var rcon=1;
if(keyLen!==4&&keyLen!==6&&keyLen!==8){
throw new Error('Invalid aes key size');
}
encKey=key.slice(0);
decKey=[];
this._key=[encKey, decKey];
for (i=keyLen; i < 4 * keyLen + 28; i++){
tmp=encKey[i - 1];
if(i % keyLen===0||keyLen===8&&i % keyLen===4){
tmp=sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255];
if(i % keyLen===0){
tmp=tmp << 8 ^ tmp >>> 24 ^ rcon << 24;
rcon=rcon << 1 ^ (rcon >> 7) * 283;
}}
encKey[i]=encKey[i - keyLen] ^ tmp;
}
for (j=0; i; j++, i--){
tmp=encKey[j & 3 ? i:i - 4];
if(i <=4||j < 4){
decKey[j]=tmp;
}else{
decKey[j]=decTable[0][sbox[tmp >>> 24]] ^ decTable[1][sbox[tmp >> 16 & 255]] ^ decTable[2][sbox[tmp >> 8 & 255]] ^ decTable[3][sbox[tmp & 255]];
}}
}
AES.prototype.decrypt=function decrypt$$1(encrypted0, encrypted1, encrypted2, encrypted3, out, offset){
var key=this._key[1];
var a=encrypted0 ^ key[0];
var b=encrypted3 ^ key[1];
var c=encrypted2 ^ key[2];
var d=encrypted1 ^ key[3];
var a2=void 0;
var b2=void 0;
var c2=void 0;
var nInnerRounds=key.length / 4 - 2;
var i=void 0;
var kIndex=4;
var table=this._tables[1];
var table0=table[0];
var table1=table[1];
var table2=table[2];
var table3=table[3];
var sbox=table[4];
for (i=0; i < nInnerRounds; i++){
a2=table0[a >>> 24] ^ table1[b >> 16 & 255] ^ table2[c >> 8 & 255] ^ table3[d & 255] ^ key[kIndex];
b2=table0[b >>> 24] ^ table1[c >> 16 & 255] ^ table2[d >> 8 & 255] ^ table3[a & 255] ^ key[kIndex + 1];
c2=table0[c >>> 24] ^ table1[d >> 16 & 255] ^ table2[a >> 8 & 255] ^ table3[b & 255] ^ key[kIndex + 2];
d=table0[d >>> 24] ^ table1[a >> 16 & 255] ^ table2[b >> 8 & 255] ^ table3[c & 255] ^ key[kIndex + 3];
kIndex +=4;
a=a2;
b=b2;
c=c2;
}
for (i=0; i < 4; i++){
out[(3 & -i) + offset]=sbox[a >>> 24] << 24 ^ sbox[b >> 16 & 255] << 16 ^ sbox[c >> 8 & 255] << 8 ^ sbox[d & 255] ^ key[kIndex++];
a2=a;
a=b;
b=c;
c=d;
d=a2;
}};
return AES;
}();
var Stream=function (){
function Stream(){
classCallCheck(this, Stream);
this.listeners={};}
Stream.prototype.on=function on(type, listener){
if(!this.listeners[type]){
this.listeners[type]=[];
}
this.listeners[type].push(listener);
};
Stream.prototype.off=function off(type, listener){
if(!this.listeners[type]){
return false;
}
var index=this.listeners[type].indexOf(listener);
this.listeners[type].splice(index, 1);
return index > -1;
};
Stream.prototype.trigger=function trigger(type){
var callbacks=this.listeners[type];
if(!callbacks){
return;
}
if(arguments.length===2){
var length=callbacks.length;
for (var i=0; i < length; ++i){
callbacks[i].call(this, arguments[1]);
}}else{
var args=Array.prototype.slice.call(arguments, 1);
var _length=callbacks.length;
for (var _i=0; _i < _length; ++_i){
callbacks[_i].apply(this, args);
}}
};
Stream.prototype.dispose=function dispose(){
this.listeners={};};
Stream.prototype.pipe=function pipe(destination){
this.on('data', function (data){
destination.push(data);
});
};
return Stream;
}();
var AsyncStream$$1=function (_Stream){
inherits(AsyncStream$$1, _Stream);
function AsyncStream$$1(){
classCallCheck(this, AsyncStream$$1);
var _this=possibleConstructorReturn(this, _Stream.call(this, Stream));
_this.jobs=[];
_this.delay=1;
_this.timeout_=null;
return _this;
}
AsyncStream$$1.prototype.processJob_=function processJob_(){
this.jobs.shift()();
if(this.jobs.length){
this.timeout_=setTimeout(this.processJob_.bind(this), this.delay);
}else{
this.timeout_=null;
}};
AsyncStream$$1.prototype.push=function push(job){
this.jobs.push(job);
if(!this.timeout_){
this.timeout_=setTimeout(this.processJob_.bind(this), this.delay);
}};
return AsyncStream$$1;
}(Stream);
var ntoh=function ntoh(word){
return word << 24 | (word & 0xff00) << 8 | (word & 0xff0000) >> 8 | word >>> 24;
};
var decrypt$$1=function decrypt$$1(encrypted, key, initVector){
var encrypted32=new Int32Array(encrypted.buffer, encrypted.byteOffset, encrypted.byteLength >> 2);
var decipher=new AES(Array.prototype.slice.call(key));
var decrypted=new Uint8Array(encrypted.byteLength);
var decrypted32=new Int32Array(decrypted.buffer);
var init0=void 0;
var init1=void 0;
var init2=void 0;
var init3=void 0;
var encrypted0=void 0;
var encrypted1=void 0;
var encrypted2=void 0;
var encrypted3=void 0;
var wordIx=void 0;
init0=initVector[0];
init1=initVector[1];
init2=initVector[2];
init3=initVector[3];
for (wordIx=0; wordIx < encrypted32.length; wordIx +=4){
encrypted0=ntoh(encrypted32[wordIx]);
encrypted1=ntoh(encrypted32[wordIx + 1]);
encrypted2=ntoh(encrypted32[wordIx + 2]);
encrypted3=ntoh(encrypted32[wordIx + 3]);
decipher.decrypt(encrypted0, encrypted1, encrypted2, encrypted3, decrypted32, wordIx);
decrypted32[wordIx]=ntoh(decrypted32[wordIx] ^ init0);
decrypted32[wordIx + 1]=ntoh(decrypted32[wordIx + 1] ^ init1);
decrypted32[wordIx + 2]=ntoh(decrypted32[wordIx + 2] ^ init2);
decrypted32[wordIx + 3]=ntoh(decrypted32[wordIx + 3] ^ init3);
init0=encrypted0;
init1=encrypted1;
init2=encrypted2;
init3=encrypted3;
}
return decrypted;
};
var Decrypter$$1=function (){
function Decrypter$$1(encrypted, key, initVector, done){
classCallCheck(this, Decrypter$$1);
var step=Decrypter$$1.STEP;
var encrypted32=new Int32Array(encrypted.buffer);
var decrypted=new Uint8Array(encrypted.byteLength);
var i=0;
this.asyncStream_=new AsyncStream$$1();
this.asyncStream_.push(this.decryptChunk_(encrypted32.subarray(i, i + step), key, initVector, decrypted));
for (i=step; i < encrypted32.length; i +=step){
initVector=new Uint32Array([ntoh(encrypted32[i - 4]), ntoh(encrypted32[i - 3]), ntoh(encrypted32[i - 2]), ntoh(encrypted32[i - 1])]);
this.asyncStream_.push(this.decryptChunk_(encrypted32.subarray(i, i + step), key, initVector, decrypted));
}
this.asyncStream_.push(function (){
done(null, unpad(decrypted));
});
}
Decrypter$$1.prototype.decryptChunk_=function decryptChunk_(encrypted, key, initVector, decrypted){
return function (){
var bytes=decrypt$$1(encrypted, key, initVector);
decrypted.set(bytes, encrypted.byteOffset);
};};
createClass(Decrypter$$1, null, [{
key: 'STEP',
get: function get$$1(){
return 32000;
}}]);
return Decrypter$$1;
}();
var createTransferableMessage=function createTransferableMessage(message){
var transferable={};
Object.keys(message).forEach(function (key){
var value=message[key];
if(ArrayBuffer.isView(value)){
transferable[key]={
bytes: value.buffer,
byteOffset: value.byteOffset,
byteLength: value.byteLength
};}else{
transferable[key]=value;
}});
return transferable;
};
var DecrypterWorker=function DecrypterWorker(self){
self.onmessage=function (event){
var data=event.data;
var encrypted=new Uint8Array(data.encrypted.bytes, data.encrypted.byteOffset, data.encrypted.byteLength);
var key=new Uint32Array(data.key.bytes, data.key.byteOffset, data.key.byteLength / 4);
var iv=new Uint32Array(data.iv.bytes, data.iv.byteOffset, data.iv.byteLength / 4);
new Decrypter$$1(encrypted, key, iv, function (err, bytes){
self.postMessage(createTransferableMessage({
source: data.source,
decrypted: bytes
}), [bytes.buffer]);
});
};};
var decrypterWorker=new DecrypterWorker(self);
return decrypterWorker;
}();
});
var audioTrackKind_=function audioTrackKind_(properties){
var kind=properties["default"] ? 'main':'alternative';
if(properties.characteristics&&properties.characteristics.indexOf('public.accessibility.describes-video') >=0){
kind='main-desc';
}
return kind;
};
var stopLoaders=function stopLoaders(segmentLoader, mediaType){
segmentLoader.abort();
segmentLoader.pause();
if(mediaType&&mediaType.activePlaylistLoader){
mediaType.activePlaylistLoader.pause();
mediaType.activePlaylistLoader=null;
}};
var startLoaders=function startLoaders(playlistLoader, mediaType){
mediaType.activePlaylistLoader=playlistLoader;
playlistLoader.load();
};
var onGroupChanged=function onGroupChanged(type, settings){
return function (){
var _settings$segmentLoad=settings.segmentLoaders,
segmentLoader=_settings$segmentLoad[type],
mainSegmentLoader=_settings$segmentLoad.main,
mediaType=settings.mediaTypes[type];
var activeTrack=mediaType.activeTrack();
var activeGroup=mediaType.activeGroup(activeTrack);
var previousActiveLoader=mediaType.activePlaylistLoader;
stopLoaders(segmentLoader, mediaType);
if(!activeGroup){
return;
}
if(!activeGroup.playlistLoader){
if(previousActiveLoader){
mainSegmentLoader.resetEverything();
}
return;
}
segmentLoader.resyncLoader();
startLoaders(activeGroup.playlistLoader, mediaType);
};};
var onTrackChanged=function onTrackChanged(type, settings){
return function (){
var _settings$segmentLoad2=settings.segmentLoaders,
segmentLoader=_settings$segmentLoad2[type],
mainSegmentLoader=_settings$segmentLoad2.main,
mediaType=settings.mediaTypes[type];
var activeTrack=mediaType.activeTrack();
var activeGroup=mediaType.activeGroup(activeTrack);
var previousActiveLoader=mediaType.activePlaylistLoader;
stopLoaders(segmentLoader, mediaType);
if(!activeGroup){
return;
}
if(!activeGroup.playlistLoader){
mainSegmentLoader.resetEverything();
return;
}
if(previousActiveLoader===activeGroup.playlistLoader){
startLoaders(activeGroup.playlistLoader, mediaType);
return;
}
if(segmentLoader.track){
segmentLoader.track(activeTrack);
}
segmentLoader.resetEverything();
startLoaders(activeGroup.playlistLoader, mediaType);
};};
var onError={
AUDIO: function AUDIO(type, settings){
return function (){
var segmentLoader=settings.segmentLoaders[type],
mediaType=settings.mediaTypes[type],
blacklistCurrentPlaylist=settings.blacklistCurrentPlaylist;
stopLoaders(segmentLoader, mediaType);
var activeTrack=mediaType.activeTrack();
var activeGroup=mediaType.activeGroup();
var id=(activeGroup.filter(function (group){
return group["default"];
})[0]||activeGroup[0]).id;
var defaultTrack=mediaType.tracks[id];
if(activeTrack===defaultTrack){
blacklistCurrentPlaylist({
message: 'Problem encountered loading the default audio track.'
});
return;
}
videojs$1.log.warn('Problem encountered loading the alternate audio track.' + 'Switching back to default.');
for (var trackId in mediaType.tracks){
mediaType.tracks[trackId].enabled=mediaType.tracks[trackId]===defaultTrack;
}
mediaType.onTrackChanged();
};},
SUBTITLES: function SUBTITLES(type, settings){
return function (){
var segmentLoader=settings.segmentLoaders[type],
mediaType=settings.mediaTypes[type];
videojs$1.log.warn('Problem encountered loading the subtitle track.' + 'Disabling subtitle track.');
stopLoaders(segmentLoader, mediaType);
var track=mediaType.activeTrack();
if(track){
track.mode='disabled';
}
mediaType.onTrackChanged();
};}};
var setupListeners={
AUDIO: function AUDIO(type, playlistLoader, settings){
if(!playlistLoader){
return;
}
var tech=settings.tech,
requestOptions=settings.requestOptions,
segmentLoader=settings.segmentLoaders[type];
playlistLoader.on('loadedmetadata', function (){
var media=playlistLoader.media();
segmentLoader.playlist(media, requestOptions);
if(!tech.paused()||media.endList&&tech.preload()!=='none'){
segmentLoader.load();
}});
playlistLoader.on('loadedplaylist', function (){
segmentLoader.playlist(playlistLoader.media(), requestOptions);
if(!tech.paused()){
segmentLoader.load();
}});
playlistLoader.on('error', onError[type](type, settings));
},
SUBTITLES: function SUBTITLES(type, playlistLoader, settings){
var tech=settings.tech,
requestOptions=settings.requestOptions,
segmentLoader=settings.segmentLoaders[type],
mediaType=settings.mediaTypes[type];
playlistLoader.on('loadedmetadata', function (){
var media=playlistLoader.media();
segmentLoader.playlist(media, requestOptions);
segmentLoader.track(mediaType.activeTrack());
if(!tech.paused()||media.endList&&tech.preload()!=='none'){
segmentLoader.load();
}});
playlistLoader.on('loadedplaylist', function (){
segmentLoader.playlist(playlistLoader.media(), requestOptions);
if(!tech.paused()){
segmentLoader.load();
}});
playlistLoader.on('error', onError[type](type, settings));
}};
var initialize={
'AUDIO': function AUDIO(type, settings){
var hls=settings.hls,
sourceType=settings.sourceType,
segmentLoader=settings.segmentLoaders[type],
requestOptions=settings.requestOptions,
mediaGroups=settings.master.mediaGroups,
_settings$mediaTypes$=settings.mediaTypes[type],
groups=_settings$mediaTypes$.groups,
tracks=_settings$mediaTypes$.tracks,
masterPlaylistLoader=settings.masterPlaylistLoader;
if(!mediaGroups[type]||Object.keys(mediaGroups[type]).length===0){
mediaGroups[type]={
main: {
"default": {
"default": true
}}
};}
for (var groupId in mediaGroups[type]){
if(!groups[groupId]){
groups[groupId]=[];
}
for (var variantLabel in mediaGroups[type][groupId]){
var properties=mediaGroups[type][groupId][variantLabel];
var playlistLoader=void 0;
if(properties.resolvedUri){
playlistLoader=new PlaylistLoader(properties.resolvedUri, hls, requestOptions);
}else if(properties.playlists&&sourceType==='dash'){
playlistLoader=new DashPlaylistLoader(properties.playlists[0], hls, requestOptions, masterPlaylistLoader);
}else{
playlistLoader=null;
}
properties=videojs$1.mergeOptions({
id: variantLabel,
playlistLoader: playlistLoader
}, properties);
setupListeners[type](type, properties.playlistLoader, settings);
groups[groupId].push(properties);
if(typeof tracks[variantLabel]==='undefined'){
var track=new videojs$1.AudioTrack({
id: variantLabel,
kind: audioTrackKind_(properties),
enabled: false,
language: properties.language,
"default": properties["default"],
label: variantLabel
});
tracks[variantLabel]=track;
}}
}
segmentLoader.on('error', onError[type](type, settings));
},
'SUBTITLES': function SUBTITLES(type, settings){
var tech=settings.tech,
hls=settings.hls,
sourceType=settings.sourceType,
segmentLoader=settings.segmentLoaders[type],
requestOptions=settings.requestOptions,
mediaGroups=settings.master.mediaGroups,
_settings$mediaTypes$2=settings.mediaTypes[type],
groups=_settings$mediaTypes$2.groups,
tracks=_settings$mediaTypes$2.tracks,
masterPlaylistLoader=settings.masterPlaylistLoader;
for (var groupId in mediaGroups[type]){
if(!groups[groupId]){
groups[groupId]=[];
}
for (var variantLabel in mediaGroups[type][groupId]){
if(mediaGroups[type][groupId][variantLabel].forced){
continue;
}
var properties=mediaGroups[type][groupId][variantLabel];
var playlistLoader=void 0;
if(sourceType==='hls'){
playlistLoader=new PlaylistLoader(properties.resolvedUri, hls, requestOptions);
}else if(sourceType==='dash'){
playlistLoader=new DashPlaylistLoader(properties.playlists[0], hls, requestOptions, masterPlaylistLoader);
}
properties=videojs$1.mergeOptions({
id: variantLabel,
playlistLoader: playlistLoader
}, properties);
setupListeners[type](type, properties.playlistLoader, settings);
groups[groupId].push(properties);
if(typeof tracks[variantLabel]==='undefined'){
var track=tech.addRemoteTextTrack({
id: variantLabel,
kind: 'subtitles',
"default": properties["default"]&&properties.autoselect,
language: properties.language,
label: variantLabel
}, false).track;
tracks[variantLabel]=track;
}}
}
segmentLoader.on('error', onError[type](type, settings));
},
'CLOSED-CAPTIONS': function CLOSEDCAPTIONS(type, settings){
var tech=settings.tech,
mediaGroups=settings.master.mediaGroups,
_settings$mediaTypes$3=settings.mediaTypes[type],
groups=_settings$mediaTypes$3.groups,
tracks=_settings$mediaTypes$3.tracks;
for (var groupId in mediaGroups[type]){
if(!groups[groupId]){
groups[groupId]=[];
}
for (var variantLabel in mediaGroups[type][groupId]){
var properties=mediaGroups[type][groupId][variantLabel];
if(!properties.instreamId.match(/CC\d/)){
continue;
}
groups[groupId].push(videojs$1.mergeOptions({
id: variantLabel
}, properties));
if(typeof tracks[variantLabel]==='undefined'){
var track=tech.addRemoteTextTrack({
id: properties.instreamId,
kind: 'captions',
"default": properties["default"]&&properties.autoselect,
language: properties.language,
label: variantLabel
}, false).track;
tracks[variantLabel]=track;
}}
}}
};
var activeGroup=function activeGroup(type, settings){
return function (track){
var masterPlaylistLoader=settings.masterPlaylistLoader,
groups=settings.mediaTypes[type].groups;
var media=masterPlaylistLoader.media();
if(!media){
return null;
}
var variants=null;
if(media.attributes[type]){
variants=groups[media.attributes[type]];
}
variants=variants||groups.main;
if(typeof track==='undefined'){
return variants;
}
if(track===null){
return null;
}
return variants.filter(function (props){
return props.id===track.id;
})[0]||null;
};};
var activeTrack={
AUDIO: function AUDIO(type, settings){
return function (){
var tracks=settings.mediaTypes[type].tracks;
for (var id in tracks){
if(tracks[id].enabled){
return tracks[id];
}}
return null;
};},
SUBTITLES: function SUBTITLES(type, settings){
return function (){
var tracks=settings.mediaTypes[type].tracks;
for (var id in tracks){
if(tracks[id].mode==='showing'){
return tracks[id];
}}
return null;
};}};
var setupMediaGroups=function setupMediaGroups(settings){
['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(function (type){
initialize[type](type, settings);
});
var mediaTypes=settings.mediaTypes,
masterPlaylistLoader=settings.masterPlaylistLoader,
tech=settings.tech,
hls=settings.hls;
['AUDIO', 'SUBTITLES'].forEach(function (type){
mediaTypes[type].activeGroup=activeGroup(type, settings);
mediaTypes[type].activeTrack=activeTrack[type](type, settings);
mediaTypes[type].onGroupChanged=onGroupChanged(type, settings);
mediaTypes[type].onTrackChanged=onTrackChanged(type, settings);
});
var audioGroup=mediaTypes.AUDIO.activeGroup();
var groupId=(audioGroup.filter(function (group){
return group["default"];
})[0]||audioGroup[0]).id;
mediaTypes.AUDIO.tracks[groupId].enabled=true;
mediaTypes.AUDIO.onTrackChanged();
masterPlaylistLoader.on('mediachange', function (){
['AUDIO', 'SUBTITLES'].forEach(function (type){
return mediaTypes[type].onGroupChanged();
});
});
var onAudioTrackChanged=function onAudioTrackChanged(){
mediaTypes.AUDIO.onTrackChanged();
tech.trigger({
type: 'usage',
name: 'hls-audio-change'
});
};
tech.audioTracks().addEventListener('change', onAudioTrackChanged);
tech.remoteTextTracks().addEventListener('change', mediaTypes.SUBTITLES.onTrackChanged);
hls.on('dispose', function (){
tech.audioTracks().removeEventListener('change', onAudioTrackChanged);
tech.remoteTextTracks().removeEventListener('change', mediaTypes.SUBTITLES.onTrackChanged);
});
tech.clearTracks('audio');
for (var id in mediaTypes.AUDIO.tracks){
tech.audioTracks().addTrack(mediaTypes.AUDIO.tracks[id]);
}};
var createMediaTypes=function createMediaTypes(){
var mediaTypes={};
['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(function (type){
mediaTypes[type]={
groups: {},
tracks: {},
activePlaylistLoader: null,
activeGroup: noop$1,
activeTrack: noop$1,
onGroupChanged: noop$1,
onTrackChanged: noop$1
};});
return mediaTypes;
};
var ABORT_EARLY_BLACKLIST_SECONDS=60 * 2;
var Hls=void 0;
var loaderStats=['mediaRequests', 'mediaRequestsAborted', 'mediaRequestsTimedout', 'mediaRequestsErrored', 'mediaTransferDuration', 'mediaBytesTransferred'];
var sumLoaderStat=function sumLoaderStat(stat){
return this.audioSegmentLoader_[stat] + this.mainSegmentLoader_[stat];
};
var MasterPlaylistController=function (_videojs$EventTarget){
inherits$2(MasterPlaylistController, _videojs$EventTarget);
function MasterPlaylistController(options){
classCallCheck$1(this, MasterPlaylistController);
var _this=possibleConstructorReturn$1(this, (MasterPlaylistController.__proto__||Object.getPrototypeOf(MasterPlaylistController)).call(this));
var url=options.url,
handleManifestRedirects=options.handleManifestRedirects,
withCredentials=options.withCredentials,
tech=options.tech,
bandwidth=options.bandwidth,
externHls=options.externHls,
useCueTags=options.useCueTags,
blacklistDuration=options.blacklistDuration,
enableLowInitialPlaylist=options.enableLowInitialPlaylist,
sourceType=options.sourceType,
seekTo=options.seekTo,
cacheEncryptionKeys=options.cacheEncryptionKeys;
if(!url){
throw new Error('A non-empty playlist URL is required');
}
Hls=externHls;
_this.withCredentials=withCredentials;
_this.tech_=tech;
_this.hls_=tech.hls;
_this.seekTo_=seekTo;
_this.sourceType_=sourceType;
_this.useCueTags_=useCueTags;
_this.blacklistDuration=blacklistDuration;
_this.enableLowInitialPlaylist=enableLowInitialPlaylist;
if(_this.useCueTags_){
_this.cueTagsTrack_=_this.tech_.addTextTrack('metadata', 'ad-cues');
_this.cueTagsTrack_.inBandMetadataTrackDispatchType='';
}
_this.requestOptions_={
withCredentials: withCredentials,
handleManifestRedirects: handleManifestRedirects,
timeout: null
};
_this.mediaTypes_=createMediaTypes();
_this.mediaSource=new videojs$1.MediaSource();
_this.mediaSource.addEventListener('sourceopen', _this.handleSourceOpen_.bind(_this));
_this.seekable_=videojs$1.createTimeRanges();
_this.hasPlayed_=function (){
return false;
};
_this.syncController_=new SyncController(options);
_this.segmentMetadataTrack_=tech.addRemoteTextTrack({
kind: 'metadata',
label: 'segment-metadata'
}, false).track;
_this.decrypter_=new Decrypter$1();
_this.inbandTextTracks_={};
var segmentLoaderSettings={
hls: _this.hls_,
mediaSource: _this.mediaSource,
currentTime: _this.tech_.currentTime.bind(_this.tech_),
seekable: function seekable$$1(){
return _this.seekable();
},
seeking: function seeking(){
return _this.tech_.seeking();
},
duration: function duration$$1(){
return _this.mediaSource.duration;
},
hasPlayed: function hasPlayed(){
return _this.hasPlayed_();
},
goalBufferLength: function goalBufferLength(){
return _this.goalBufferLength();
},
bandwidth: bandwidth,
syncController: _this.syncController_,
decrypter: _this.decrypter_,
sourceType: _this.sourceType_,
inbandTextTracks: _this.inbandTextTracks_,
cacheEncryptionKeys: cacheEncryptionKeys
};
_this.masterPlaylistLoader_=_this.sourceType_==='dash' ? new DashPlaylistLoader(url, _this.hls_, _this.requestOptions_):new PlaylistLoader(url, _this.hls_, _this.requestOptions_);
_this.setupMasterPlaylistLoaderListeners_();
_this.mainSegmentLoader_=new SegmentLoader(videojs$1.mergeOptions(segmentLoaderSettings, {
segmentMetadataTrack: _this.segmentMetadataTrack_,
loaderType: 'main'
}), options);
_this.audioSegmentLoader_=new SegmentLoader(videojs$1.mergeOptions(segmentLoaderSettings, {
loaderType: 'audio'
}), options);
_this.subtitleSegmentLoader_=new VTTSegmentLoader(videojs$1.mergeOptions(segmentLoaderSettings, {
loaderType: 'vtt'
}), options);
_this.setupSegmentLoaderListeners_();
loaderStats.forEach(function (stat){
_this[stat + '_']=sumLoaderStat.bind(_this, stat);
});
_this.logger_=logger('MPC');
_this.masterPlaylistLoader_.load();
return _this;
}
createClass$1(MasterPlaylistController, [{
key: 'setupMasterPlaylistLoaderListeners_',
value: function setupMasterPlaylistLoaderListeners_(){
var _this2=this;
this.masterPlaylistLoader_.on('loadedmetadata', function (){
var media=_this2.masterPlaylistLoader_.media();
var requestTimeout=media.targetDuration * 1.5 * 1000;
if(isLowestEnabledRendition(_this2.masterPlaylistLoader_.master, _this2.masterPlaylistLoader_.media())){
_this2.requestOptions_.timeout=0;
}else{
_this2.requestOptions_.timeout=requestTimeout;
}
if(media.endList&&_this2.tech_.preload()!=='none'){
_this2.mainSegmentLoader_.playlist(media, _this2.requestOptions_);
_this2.mainSegmentLoader_.load();
}
setupMediaGroups({
sourceType: _this2.sourceType_,
segmentLoaders: {
AUDIO: _this2.audioSegmentLoader_,
SUBTITLES: _this2.subtitleSegmentLoader_,
main: _this2.mainSegmentLoader_
},
tech: _this2.tech_,
requestOptions: _this2.requestOptions_,
masterPlaylistLoader: _this2.masterPlaylistLoader_,
hls: _this2.hls_,
master: _this2.master(),
mediaTypes: _this2.mediaTypes_,
blacklistCurrentPlaylist: _this2.blacklistCurrentPlaylist.bind(_this2)
});
_this2.triggerPresenceUsage_(_this2.master(), media);
try {
_this2.setupSourceBuffers_();
} catch (e){
videojs$1.log.warn('Failed to create SourceBuffers', e);
return _this2.mediaSource.endOfStream('decode');
}
_this2.setupFirstPlay();
if(!_this2.mediaTypes_.AUDIO.activePlaylistLoader||_this2.mediaTypes_.AUDIO.activePlaylistLoader.media()){
_this2.trigger('selectedinitialmedia');
}else{
_this2.mediaTypes_.AUDIO.activePlaylistLoader.one('loadedmetadata', function (){
_this2.trigger('selectedinitialmedia');
});
}});
this.masterPlaylistLoader_.on('loadedplaylist', function (){
var updatedPlaylist=_this2.masterPlaylistLoader_.media();
if(!updatedPlaylist){
_this2.excludeUnsupportedVariants_();
var selectedMedia=void 0;
if(_this2.enableLowInitialPlaylist){
selectedMedia=_this2.selectInitialPlaylist();
}
if(!selectedMedia){
selectedMedia=_this2.selectPlaylist();
}
_this2.initialMedia_=selectedMedia;
_this2.masterPlaylistLoader_.media(_this2.initialMedia_);
return;
}
if(_this2.useCueTags_){
_this2.updateAdCues_(updatedPlaylist);
}
_this2.mainSegmentLoader_.playlist(updatedPlaylist, _this2.requestOptions_);
_this2.updateDuration();
if(!_this2.tech_.paused()){
_this2.mainSegmentLoader_.load();
if(_this2.audioSegmentLoader_){
_this2.audioSegmentLoader_.load();
}}
if(!updatedPlaylist.endList){
var addSeekableRange=function addSeekableRange(){
var seekable$$1=_this2.seekable();
if(seekable$$1.length!==0){
_this2.mediaSource.addSeekableRange_(seekable$$1.start(0), seekable$$1.end(0));
}};
if(_this2.duration()!==Infinity){
var onDurationchange=function onDurationchange(){
if(_this2.duration()===Infinity){
addSeekableRange();
}else{
_this2.tech_.one('durationchange', onDurationchange);
}};
_this2.tech_.one('durationchange', onDurationchange);
}else{
addSeekableRange();
}}
});
this.masterPlaylistLoader_.on('error', function (){
_this2.blacklistCurrentPlaylist(_this2.masterPlaylistLoader_.error);
});
this.masterPlaylistLoader_.on('mediachanging', function (){
_this2.mainSegmentLoader_.abort();
_this2.mainSegmentLoader_.pause();
});
this.masterPlaylistLoader_.on('mediachange', function (){
var media=_this2.masterPlaylistLoader_.media();
var requestTimeout=media.targetDuration * 1.5 * 1000;
if(isLowestEnabledRendition(_this2.masterPlaylistLoader_.master, _this2.masterPlaylistLoader_.media())){
_this2.requestOptions_.timeout=0;
}else{
_this2.requestOptions_.timeout=requestTimeout;
}
_this2.mainSegmentLoader_.playlist(media, _this2.requestOptions_);
_this2.mainSegmentLoader_.load();
_this2.tech_.trigger({
type: 'mediachange',
bubbles: true
});
});
this.masterPlaylistLoader_.on('playlistunchanged', function (){
var updatedPlaylist=_this2.masterPlaylistLoader_.media();
var playlistOutdated=_this2.stuckAtPlaylistEnd_(updatedPlaylist);
if(playlistOutdated){
_this2.blacklistCurrentPlaylist({
message: 'Playlist no longer updating.'
});
_this2.tech_.trigger('playliststuck');
}});
this.masterPlaylistLoader_.on('renditiondisabled', function (){
_this2.tech_.trigger({
type: 'usage',
name: 'hls-rendition-disabled'
});
});
this.masterPlaylistLoader_.on('renditionenabled', function (){
_this2.tech_.trigger({
type: 'usage',
name: 'hls-rendition-enabled'
});
});
}
}, {
key: 'triggerPresenceUsage_',
value: function triggerPresenceUsage_(master, media){
var mediaGroups=master.mediaGroups||{};
var defaultDemuxed=true;
var audioGroupKeys=Object.keys(mediaGroups.AUDIO);
for (var mediaGroup in mediaGroups.AUDIO){
for (var label in mediaGroups.AUDIO[mediaGroup]){
var properties=mediaGroups.AUDIO[mediaGroup][label];
if(!properties.uri){
defaultDemuxed=false;
}}
}
if(defaultDemuxed){
this.tech_.trigger({
type: 'usage',
name: 'hls-demuxed'
});
}
if(Object.keys(mediaGroups.SUBTITLES).length){
this.tech_.trigger({
type: 'usage',
name: 'hls-webvtt'
});
}
if(Hls.Playlist.isAes(media)){
this.tech_.trigger({
type: 'usage',
name: 'hls-aes'
});
}
if(Hls.Playlist.isFmp4(media)){
this.tech_.trigger({
type: 'usage',
name: 'hls-fmp4'
});
}
if(audioGroupKeys.length&&Object.keys(mediaGroups.AUDIO[audioGroupKeys[0]]).length > 1){
this.tech_.trigger({
type: 'usage',
name: 'hls-alternate-audio'
});
}
if(this.useCueTags_){
this.tech_.trigger({
type: 'usage',
name: 'hls-playlist-cue-tags'
});
}}
}, {
key: 'setupSegmentLoaderListeners_',
value: function setupSegmentLoaderListeners_(){
var _this3=this;
this.mainSegmentLoader_.on('bandwidthupdate', function (){
var nextPlaylist=_this3.selectPlaylist();
var currentPlaylist=_this3.masterPlaylistLoader_.media();
var buffered=_this3.tech_.buffered();
var forwardBuffer=buffered.length ? buffered.end(buffered.length - 1) - _this3.tech_.currentTime():0;
var bufferLowWaterLine=_this3.bufferLowWaterLine();
if(!currentPlaylist.endList ||
_this3.duration() < Config.MAX_BUFFER_LOW_WATER_LINE ||
nextPlaylist.attributes.BANDWIDTH < currentPlaylist.attributes.BANDWIDTH ||
forwardBuffer >=bufferLowWaterLine){
_this3.masterPlaylistLoader_.media(nextPlaylist);
}
_this3.tech_.trigger('bandwidthupdate');
});
this.mainSegmentLoader_.on('progress', function (){
_this3.trigger('progress');
});
this.mainSegmentLoader_.on('error', function (){
_this3.blacklistCurrentPlaylist(_this3.mainSegmentLoader_.error());
});
this.mainSegmentLoader_.on('syncinfoupdate', function (){
_this3.onSyncInfoUpdate_();
});
this.mainSegmentLoader_.on('timestampoffset', function (){
_this3.tech_.trigger({
type: 'usage',
name: 'hls-timestamp-offset'
});
});
this.audioSegmentLoader_.on('syncinfoupdate', function (){
_this3.onSyncInfoUpdate_();
});
this.mainSegmentLoader_.on('ended', function (){
_this3.onEndOfStream();
});
this.mainSegmentLoader_.on('earlyabort', function (){
_this3.blacklistCurrentPlaylist({
message: 'Aborted early because there isn\'t enough bandwidth to complete the ' + 'request without rebuffering.'
}, ABORT_EARLY_BLACKLIST_SECONDS);
});
this.mainSegmentLoader_.on('reseteverything', function (){
_this3.tech_.trigger('hls-reset');
});
this.mainSegmentLoader_.on('segmenttimemapping', function (event){
_this3.tech_.trigger({
type: 'hls-segment-time-mapping',
mapping: event.mapping
});
});
this.audioSegmentLoader_.on('ended', function (){
_this3.onEndOfStream();
});
}}, {
key: 'mediaSecondsLoaded_',
value: function mediaSecondsLoaded_(){
return Math.max(this.audioSegmentLoader_.mediaSecondsLoaded + this.mainSegmentLoader_.mediaSecondsLoaded);
}
}, {
key: 'load',
value: function load(){
this.mainSegmentLoader_.load();
if(this.mediaTypes_.AUDIO.activePlaylistLoader){
this.audioSegmentLoader_.load();
}
if(this.mediaTypes_.SUBTITLES.activePlaylistLoader){
this.subtitleSegmentLoader_.load();
}}
}, {
key: 'smoothQualityChange_',
value: function smoothQualityChange_(){
var media=this.selectPlaylist();
if(media!==this.masterPlaylistLoader_.media()){
this.masterPlaylistLoader_.media(media);
this.mainSegmentLoader_.resetLoader();
}}
}, {
key: 'fastQualityChange_',
value: function fastQualityChange_(){
var _this4=this;
var media=this.selectPlaylist();
if(media===this.masterPlaylistLoader_.media()){
return;
}
this.masterPlaylistLoader_.media(media);
this.mainSegmentLoader_.resetEverything(function (){
if(videojs$1.browser.IE_VERSION||videojs$1.browser.IS_EDGE){
_this4.tech_.setCurrentTime(_this4.tech_.currentTime() + 0.04);
}else{
_this4.tech_.setCurrentTime(_this4.tech_.currentTime());
}});
}
}, {
key: 'play',
value: function play(){
if(this.setupFirstPlay()){
return;
}
if(this.tech_.ended()){
this.seekTo_(0);
}
if(this.hasPlayed_()){
this.load();
}
var seekable$$1=this.tech_.seekable();
if(this.tech_.duration()===Infinity){
if(this.tech_.currentTime() < seekable$$1.start(0)){
return this.seekTo_(seekable$$1.end(seekable$$1.length - 1));
}}
}
}, {
key: 'setupFirstPlay',
value: function setupFirstPlay(){
var _this5=this;
var media=this.masterPlaylistLoader_.media();
if(!media||this.tech_.paused()||this.hasPlayed_()){
return false;
}
if(!media.endList){
var seekable$$1=this.seekable();
if(!seekable$$1.length){
return false;
}
if(videojs$1.browser.IE_VERSION&&this.tech_.readyState()===0){
this.tech_.one('loadedmetadata', function (){
_this5.trigger('firstplay');
_this5.seekTo_(seekable$$1.end(0));
_this5.hasPlayed_=function (){
return true;
};});
return false;
}
this.trigger('firstplay');
this.seekTo_(seekable$$1.end(0));
}
this.hasPlayed_=function (){
return true;
};
this.load();
return true;
}
}, {
key: 'handleSourceOpen_',
value: function handleSourceOpen_(){
try {
this.setupSourceBuffers_();
} catch (e){
videojs$1.log.warn('Failed to create Source Buffers', e);
return this.mediaSource.endOfStream('decode');
}
if(this.tech_.autoplay()){
var playPromise=this.tech_.play();
if(typeof playPromise!=='undefined'&&typeof playPromise.then==='function'){
playPromise.then(null, function (e){});
}}
this.trigger('sourceopen');
}
}, {
key: 'onEndOfStream',
value: function onEndOfStream(){
var isEndOfStream=this.mainSegmentLoader_.ended_;
if(this.mediaTypes_.AUDIO.activePlaylistLoader){
if(!this.mainSegmentLoader_.startingMedia_||this.mainSegmentLoader_.startingMedia_.containsVideo){
isEndOfStream=isEndOfStream&&this.audioSegmentLoader_.ended_;
}else{
isEndOfStream=this.audioSegmentLoader_.ended_;
}}
if(!isEndOfStream){
return;
}
this.logger_('calling mediaSource.endOfStream()');
try {
this.mediaSource.endOfStream();
} catch (e){
videojs$1.log.warn('Failed to call media source endOfStream', e);
}}
}, {
key: 'stuckAtPlaylistEnd_',
value: function stuckAtPlaylistEnd_(playlist){
var seekable$$1=this.seekable();
if(!seekable$$1.length){
return false;
}
var expired=this.syncController_.getExpiredTime(playlist, this.mediaSource.duration);
if(expired===null){
return false;
}
var absolutePlaylistEnd=Hls.Playlist.playlistEnd(playlist, expired);
var currentTime=this.tech_.currentTime();
var buffered=this.tech_.buffered();
if(!buffered.length){
return absolutePlaylistEnd - currentTime <=SAFE_TIME_DELTA;
}
var bufferedEnd=buffered.end(buffered.length - 1);
return bufferedEnd - currentTime <=SAFE_TIME_DELTA&&absolutePlaylistEnd - bufferedEnd <=SAFE_TIME_DELTA;
}
}, {
key: 'blacklistCurrentPlaylist',
value: function blacklistCurrentPlaylist(){
var error=arguments.length > 0&&arguments[0]!==undefined ? arguments[0]:{};
var blacklistDuration=arguments[1];
var currentPlaylist=void 0;
var nextPlaylist=void 0;
currentPlaylist=error.playlist||this.masterPlaylistLoader_.media();
blacklistDuration=blacklistDuration||error.blacklistDuration||this.blacklistDuration;
if(!currentPlaylist){
this.error=error;
try {
return this.mediaSource.endOfStream('network');
} catch (e){
return this.trigger('error');
}}
var isFinalRendition=this.masterPlaylistLoader_.master.playlists.filter(isEnabled).length===1;
var playlists=this.masterPlaylistLoader_.master.playlists;
if(playlists.length===1){
videojs$1.log.warn('Problem encountered with the current ' + 'HLS playlist. Trying again since it is the only playlist.');
this.tech_.trigger('retryplaylist');
return this.masterPlaylistLoader_.load(isFinalRendition);
}
if(isFinalRendition){
videojs$1.log.warn('Removing all playlists from the blacklist because the last ' + 'rendition is about to be blacklisted.');
playlists.forEach(function (playlist){
if(playlist.excludeUntil!==Infinity){
delete playlist.excludeUntil;
}});
this.tech_.trigger('retryplaylist');
}
currentPlaylist.excludeUntil=Date.now() + blacklistDuration * 1000;
this.tech_.trigger('blacklistplaylist');
this.tech_.trigger({
type: 'usage',
name: 'hls-rendition-blacklisted'
});
nextPlaylist=this.selectPlaylist();
videojs$1.log.warn('Problem encountered with the current HLS playlist.' + (error.message ? ' ' + error.message:'') + ' Switching to another playlist.');
return this.masterPlaylistLoader_.media(nextPlaylist, isFinalRendition);
}
}, {
key: 'pauseLoading',
value: function pauseLoading(){
this.mainSegmentLoader_.pause();
if(this.mediaTypes_.AUDIO.activePlaylistLoader){
this.audioSegmentLoader_.pause();
}
if(this.mediaTypes_.SUBTITLES.activePlaylistLoader){
this.subtitleSegmentLoader_.pause();
}}
}, {
key: 'setCurrentTime',
value: function setCurrentTime(currentTime){
var buffered=findRange(this.tech_.buffered(), currentTime);
if(!(this.masterPlaylistLoader_&&this.masterPlaylistLoader_.media())){
return 0;
}
if(!this.masterPlaylistLoader_.media().segments){
return 0;
}
if(buffered&&buffered.length){
return currentTime;
}
this.mainSegmentLoader_.resetEverything();
this.mainSegmentLoader_.abort();
if(this.mediaTypes_.AUDIO.activePlaylistLoader){
this.audioSegmentLoader_.resetEverything();
this.audioSegmentLoader_.abort();
}
if(this.mediaTypes_.SUBTITLES.activePlaylistLoader){
this.subtitleSegmentLoader_.resetEverything();
this.subtitleSegmentLoader_.abort();
}
this.load();
}
}, {
key: 'duration',
value: function duration$$1(){
if(!this.masterPlaylistLoader_){
return 0;
}
if(this.mediaSource){
return this.mediaSource.duration;
}
return Hls.Playlist.duration(this.masterPlaylistLoader_.media());
}
}, {
key: 'seekable',
value: function seekable$$1(){
return this.seekable_;
}}, {
key: 'onSyncInfoUpdate_',
value: function onSyncInfoUpdate_(){
var mainSeekable=void 0;
var audioSeekable=void 0;
if(!this.masterPlaylistLoader_){
return;
}
var media=this.masterPlaylistLoader_.media();
if(!media){
return;
}
var expired=this.syncController_.getExpiredTime(media, this.mediaSource.duration);
if(expired===null){
return;
}
mainSeekable=Hls.Playlist.seekable(media, expired);
if(mainSeekable.length===0){
return;
}
if(this.mediaTypes_.AUDIO.activePlaylistLoader){
media=this.mediaTypes_.AUDIO.activePlaylistLoader.media();
expired=this.syncController_.getExpiredTime(media, this.mediaSource.duration);
if(expired===null){
return;
}
audioSeekable=Hls.Playlist.seekable(media, expired);
if(audioSeekable.length===0){
return;
}}
var oldEnd=void 0;
var oldStart=void 0;
if(this.seekable_&&this.seekable_.length){
oldEnd=this.seekable_.end(0);
oldStart=this.seekable_.start(0);
}
if(!audioSeekable){
this.seekable_=mainSeekable;
}else if(audioSeekable.start(0) > mainSeekable.end(0)||mainSeekable.start(0) > audioSeekable.end(0)){
this.seekable_=mainSeekable;
}else{
this.seekable_=videojs$1.createTimeRanges([[audioSeekable.start(0) > mainSeekable.start(0) ? audioSeekable.start(0):mainSeekable.start(0), audioSeekable.end(0) < mainSeekable.end(0) ? audioSeekable.end(0):mainSeekable.end(0)]]);
}
if(this.seekable_&&this.seekable_.length){
if(this.seekable_.end(0)===oldEnd&&this.seekable_.start(0)===oldStart){
return;
}}
this.logger_('seekable updated [' + printableRange(this.seekable_) + ']');
this.tech_.trigger('seekablechanged');
}
}, {
key: 'updateDuration',
value: function updateDuration(){
var _this6=this;
var oldDuration=this.mediaSource.duration;
var newDuration=Hls.Playlist.duration(this.masterPlaylistLoader_.media());
var buffered=this.tech_.buffered();
var setDuration=function setDuration(){
_this6.logger_('Setting duration from ' + _this6.mediaSource.duration + '=> ' + newDuration);
try {
_this6.mediaSource.duration=newDuration;
} catch (e){
videojs$1.log.warn('Failed to set media source duration', e);
}
_this6.tech_.trigger('durationchange');
_this6.mediaSource.removeEventListener('sourceopen', setDuration);
};
if(buffered.length > 0){
newDuration=Math.max(newDuration, buffered.end(buffered.length - 1));
}
if(oldDuration!==newDuration){
if(this.mediaSource.readyState!=='open'){
this.mediaSource.addEventListener('sourceopen', setDuration);
}else{
setDuration();
}}
}
}, {
key: 'dispose',
value: function dispose(){
var _this7=this;
this.decrypter_.terminate();
this.masterPlaylistLoader_.dispose();
this.mainSegmentLoader_.dispose();
['AUDIO', 'SUBTITLES'].forEach(function (type){
var groups=_this7.mediaTypes_[type].groups;
for (var id in groups){
groups[id].forEach(function (group){
if(group.playlistLoader){
group.playlistLoader.dispose();
}});
}});
this.audioSegmentLoader_.dispose();
this.subtitleSegmentLoader_.dispose();
}
}, {
key: 'master',
value: function master(){
return this.masterPlaylistLoader_.master;
}
}, {
key: 'media',
value: function media(){
return this.masterPlaylistLoader_.media()||this.initialMedia_;
}
}, {
key: 'setupSourceBuffers_',
value: function setupSourceBuffers_(){
var media=this.masterPlaylistLoader_.media();
var mimeTypes=void 0;
if(!media||this.mediaSource.readyState!=='open'){
return;
}
mimeTypes=mimeTypesForPlaylist(this.masterPlaylistLoader_.master, media);
if(mimeTypes.length < 1){
this.error='No compatible SourceBuffer configuration for the variant stream:' + media.resolvedUri;
return this.mediaSource.endOfStream('decode');
}
this.configureLoaderMimeTypes_(mimeTypes);
this.excludeIncompatibleVariants_(media);
}}, {
key: 'configureLoaderMimeTypes_',
value: function configureLoaderMimeTypes_(mimeTypes){
var sourceBufferEmitter =
mimeTypes.length > 1 &&
mimeTypes[0].indexOf(',')===-1 &&
mimeTypes[0]!==mimeTypes[1] ?
new videojs$1.EventTarget() :
null;
this.mainSegmentLoader_.mimeType(mimeTypes[0], sourceBufferEmitter);
if(mimeTypes[1]){
this.audioSegmentLoader_.mimeType(mimeTypes[1], sourceBufferEmitter);
}}
}, {
key: 'excludeUnsupportedVariants_',
value: function excludeUnsupportedVariants_(){
this.master().playlists.forEach(function (variant){
if(variant.attributes.CODECS&&window$1.MediaSource&&window$1.MediaSource.isTypeSupported&&!window$1.MediaSource.isTypeSupported('video/mp4; codecs="' + mapLegacyAvcCodecs(variant.attributes.CODECS) + '"')){
variant.excludeUntil=Infinity;
}});
}
}, {
key: 'excludeIncompatibleVariants_',
value: function excludeIncompatibleVariants_(media){
var codecCount=2;
var videoCodec=null;
var codecs=void 0;
if(media.attributes.CODECS){
codecs=parseCodecs(media.attributes.CODECS);
videoCodec=codecs.videoCodec;
codecCount=codecs.codecCount;
}
this.master().playlists.forEach(function (variant){
var variantCodecs={
codecCount: 2,
videoCodec: null
};
if(variant.attributes.CODECS){
variantCodecs=parseCodecs(variant.attributes.CODECS);
}
if(variantCodecs.codecCount!==codecCount){
variant.excludeUntil=Infinity;
}
if(variantCodecs.videoCodec!==videoCodec){
variant.excludeUntil=Infinity;
}});
}}, {
key: 'updateAdCues_',
value: function updateAdCues_(media){
var offset=0;
var seekable$$1=this.seekable();
if(seekable$$1.length){
offset=seekable$$1.start(0);
}
updateAdCues(media, this.cueTagsTrack_, offset);
}
}, {
key: 'goalBufferLength',
value: function goalBufferLength(){
var currentTime=this.tech_.currentTime();
var initial=Config.GOAL_BUFFER_LENGTH;
var rate=Config.GOAL_BUFFER_LENGTH_RATE;
var max=Math.max(initial, Config.MAX_GOAL_BUFFER_LENGTH);
return Math.min(initial + currentTime * rate, max);
}
}, {
key: 'bufferLowWaterLine',
value: function bufferLowWaterLine(){
var currentTime=this.tech_.currentTime();
var initial=Config.BUFFER_LOW_WATER_LINE;
var rate=Config.BUFFER_LOW_WATER_LINE_RATE;
var max=Math.max(initial, Config.MAX_BUFFER_LOW_WATER_LINE);
return Math.min(initial + currentTime * rate, max);
}}]);
return MasterPlaylistController;
}(videojs$1.EventTarget);
var enableFunction=function enableFunction(loader, playlistUri, changePlaylistFn){
return function (enable){
var playlist=loader.master.playlists[playlistUri];
var incompatible=isIncompatible(playlist);
var currentlyEnabled=isEnabled(playlist);
if(typeof enable==='undefined'){
return currentlyEnabled;
}
if(enable){
delete playlist.disabled;
}else{
playlist.disabled=true;
}
if(enable!==currentlyEnabled&&!incompatible){
changePlaylistFn();
if(enable){
loader.trigger('renditionenabled');
}else{
loader.trigger('renditiondisabled');
}}
return enable;
};};
var Representation=function Representation(hlsHandler, playlist, id){
classCallCheck$1(this, Representation);
var mpc=hlsHandler.masterPlaylistController_,
smoothQualityChange=hlsHandler.options_.smoothQualityChange;
var changeType=smoothQualityChange ? 'smooth':'fast';
var qualityChangeFunction=mpc[changeType + 'QualityChange_'].bind(mpc);
if(playlist.attributes.RESOLUTION){
var resolution=playlist.attributes.RESOLUTION;
this.width=resolution.width;
this.height=resolution.height;
}
this.bandwidth=playlist.attributes.BANDWIDTH;
this.id=id;
this.enabled=enableFunction(hlsHandler.playlists, playlist.uri, qualityChangeFunction);
};
var renditionSelectionMixin=function renditionSelectionMixin(hlsHandler){
var playlists=hlsHandler.playlists;
hlsHandler.representations=function (){
return playlists.master.playlists.filter(function (media){
return !isIncompatible(media);
}).map(function (e, i){
return new Representation(hlsHandler, e, e.uri);
});
};};
var timerCancelEvents=['seeking', 'seeked', 'pause', 'playing', 'error'];
var PlaybackWatcher=function (){
function PlaybackWatcher(options){
var _this=this;
classCallCheck$1(this, PlaybackWatcher);
this.tech_=options.tech;
this.seekable=options.seekable;
this.seekTo=options.seekTo;
this.allowSeeksWithinUnsafeLiveWindow=options.allowSeeksWithinUnsafeLiveWindow;
this.media=options.media;
this.consecutiveUpdates=0;
this.lastRecordedTime=null;
this.timer_=null;
this.checkCurrentTimeTimeout_=null;
this.logger_=logger('PlaybackWatcher');
this.logger_('initialize');
var canPlayHandler=function canPlayHandler(){
return _this.monitorCurrentTime_();
};
var waitingHandler=function waitingHandler(){
return _this.techWaiting_();
};
var cancelTimerHandler=function cancelTimerHandler(){
return _this.cancelTimer_();
};
var fixesBadSeeksHandler=function fixesBadSeeksHandler(){
return _this.fixesBadSeeks_();
};
this.tech_.on('seekablechanged', fixesBadSeeksHandler);
this.tech_.on('waiting', waitingHandler);
this.tech_.on(timerCancelEvents, cancelTimerHandler);
this.tech_.on('canplay', canPlayHandler);
this.dispose=function (){
_this.logger_('dispose');
_this.tech_.off('seekablechanged', fixesBadSeeksHandler);
_this.tech_.off('waiting', waitingHandler);
_this.tech_.off(timerCancelEvents, cancelTimerHandler);
_this.tech_.off('canplay', canPlayHandler);
if(_this.checkCurrentTimeTimeout_){
window$1.clearTimeout(_this.checkCurrentTimeTimeout_);
}
_this.cancelTimer_();
};}
createClass$1(PlaybackWatcher, [{
key: 'monitorCurrentTime_',
value: function monitorCurrentTime_(){
this.checkCurrentTime_();
if(this.checkCurrentTimeTimeout_){
window$1.clearTimeout(this.checkCurrentTimeTimeout_);
} // 42=24 fps // 250 is what Webkit uses // FF uses 15
this.checkCurrentTimeTimeout_=window$1.setTimeout(this.monitorCurrentTime_.bind(this), 250);
}
}, {
key: 'checkCurrentTime_',
value: function checkCurrentTime_(){
if(this.tech_.seeking()&&this.fixesBadSeeks_()){
this.consecutiveUpdates=0;
this.lastRecordedTime=this.tech_.currentTime();
return;
}
if(this.tech_.paused()||this.tech_.seeking()){
return;
}
var currentTime=this.tech_.currentTime();
var buffered=this.tech_.buffered();
if(this.lastRecordedTime===currentTime&&(!buffered.length||currentTime + SAFE_TIME_DELTA >=buffered.end(buffered.length - 1))){
return this.techWaiting_();
}
if(this.consecutiveUpdates >=5&&currentTime===this.lastRecordedTime){
this.consecutiveUpdates++;
this.waiting_();
}else if(currentTime===this.lastRecordedTime){
this.consecutiveUpdates++;
}else{
this.consecutiveUpdates=0;
this.lastRecordedTime=currentTime;
}}
}, {
key: 'cancelTimer_',
value: function cancelTimer_(){
this.consecutiveUpdates=0;
if(this.timer_){
this.logger_('cancelTimer_');
clearTimeout(this.timer_);
}
this.timer_=null;
}
}, {
key: 'fixesBadSeeks_',
value: function fixesBadSeeks_(){
var seeking=this.tech_.seeking();
if(!seeking){
return false;
}
var seekable=this.seekable();
var currentTime=this.tech_.currentTime();
var isAfterSeekableRange=this.afterSeekableWindow_(seekable, currentTime, this.media(), this.allowSeeksWithinUnsafeLiveWindow);
var seekTo=void 0;
if(isAfterSeekableRange){
var seekableEnd=seekable.end(seekable.length - 1);
seekTo=seekableEnd;
}
if(this.beforeSeekableWindow_(seekable, currentTime)){
var seekableStart=seekable.start(0);
seekTo=seekableStart + SAFE_TIME_DELTA;
}
if(typeof seekTo!=='undefined'){
this.logger_('Trying to seek outside of seekable at time ' + currentTime + ' with ' + ('seekable range ' + printableRange(seekable) + '. Seeking to ') + (seekTo + '.'));
this.seekTo(seekTo);
return true;
}
return false;
}
}, {
key: 'waiting_',
value: function waiting_(){
if(this.techWaiting_()){
return;
}
var currentTime=this.tech_.currentTime();
var buffered=this.tech_.buffered();
var currentRange=findRange(buffered, currentTime);
if(currentRange.length&&currentTime + 3 <=currentRange.end(0)){
this.cancelTimer_();
this.seekTo(currentTime);
this.logger_('Stopped at ' + currentTime + ' while inside a buffered region ' + ('[' + currentRange.start(0) + ' -> ' + currentRange.end(0) + ']. Attempting to resume ') + 'playback by seeking to the current time.');
this.tech_.trigger({
type: 'usage',
name: 'hls-unknown-waiting'
});
return;
}}
}, {
key: 'techWaiting_',
value: function techWaiting_(){
var seekable=this.seekable();
var currentTime=this.tech_.currentTime();
if(this.tech_.seeking()&&this.fixesBadSeeks_()){
return true;
}
if(this.tech_.seeking()||this.timer_!==null){
return true;
}
if(this.beforeSeekableWindow_(seekable, currentTime)){
var livePoint=seekable.end(seekable.length - 1);
this.logger_('Fell out of live window at time ' + currentTime + '. Seeking to ' + ('live point (seekable end) ' + livePoint));
this.cancelTimer_();
this.seekTo(livePoint);
this.tech_.trigger({
type: 'usage',
name: 'hls-live-resync'
});
return true;
}
var buffered=this.tech_.buffered();
var nextRange=findNextRange(buffered, currentTime);
if(this.videoUnderflow_(nextRange, buffered, currentTime)){
this.cancelTimer_();
this.seekTo(currentTime);
this.tech_.trigger({
type: 'usage',
name: 'hls-video-underflow'
});
return true;
}
if(nextRange.length > 0){
var difference=nextRange.start(0) - currentTime;
this.logger_('Stopped at ' + currentTime + ', setting timer for ' + difference + ', seeking ' + ('to ' + nextRange.start(0)));
this.timer_=setTimeout(this.skipTheGap_.bind(this), difference * 1000, currentTime);
return true;
}
return false;
}}, {
key: 'afterSeekableWindow_',
value: function afterSeekableWindow_(seekable, currentTime, playlist){
var allowSeeksWithinUnsafeLiveWindow=arguments.length > 3&&arguments[3]!==undefined ? arguments[3]:false;
if(!seekable.length){
return false;
}
var allowedEnd=seekable.end(seekable.length - 1) + SAFE_TIME_DELTA;
var isLive = !playlist.endList;
if(isLive&&allowSeeksWithinUnsafeLiveWindow){
allowedEnd=seekable.end(seekable.length - 1) + playlist.targetDuration * 3;
}
if(currentTime > allowedEnd){
return true;
}
return false;
}}, {
key: 'beforeSeekableWindow_',
value: function beforeSeekableWindow_(seekable, currentTime){
if(seekable.length &&
seekable.start(0) > 0&&currentTime < seekable.start(0) - SAFE_TIME_DELTA){
return true;
}
return false;
}}, {
key: 'videoUnderflow_',
value: function videoUnderflow_(nextRange, buffered, currentTime){
if(nextRange.length===0){
var gap=this.gapFromVideoUnderflow_(buffered, currentTime);
if(gap){
this.logger_('Encountered a gap in video from ' + gap.start + ' to ' + gap.end + '. ' + ('Seeking to current time ' + currentTime));
return true;
}}
return false;
}
}, {
key: 'skipTheGap_',
value: function skipTheGap_(scheduledCurrentTime){
var buffered=this.tech_.buffered();
var currentTime=this.tech_.currentTime();
var nextRange=findNextRange(buffered, currentTime);
this.cancelTimer_();
if(nextRange.length===0||currentTime!==scheduledCurrentTime){
return;
}
this.logger_('skipTheGap_:', 'currentTime:', currentTime, 'scheduled currentTime:', scheduledCurrentTime, 'nextRange start:', nextRange.start(0));
this.seekTo(nextRange.start(0) + TIME_FUDGE_FACTOR);
this.tech_.trigger({
type: 'usage',
name: 'hls-gap-skip'
});
}}, {
key: 'gapFromVideoUnderflow_',
value: function gapFromVideoUnderflow_(buffered, currentTime){
var gaps=findGaps(buffered);
for (var i=0; i < gaps.length; i++){
var start=gaps.start(i);
var end=gaps.end(i);
if(currentTime - start < 4&&currentTime - start > 2){
return {
start: start,
end: end
};}}
return null;
}}]);
return PlaybackWatcher;
}();
var defaultOptions={
errorInterval: 30,
getSource: function getSource(next){
var tech=this.tech({
IWillNotUseThisInPlugins: true
});
var sourceObj=tech.currentSource_;
return next(sourceObj);
}};
var initPlugin=function initPlugin(player, options){
var lastCalled=0;
var seekTo=0;
var localOptions=videojs$1.mergeOptions(defaultOptions, options);
player.ready(function (){
player.trigger({
type: 'usage',
name: 'hls-error-reload-initialized'
});
});
var loadedMetadataHandler=function loadedMetadataHandler(){
if(seekTo){
player.currentTime(seekTo);
}};
var setSource=function setSource(sourceObj){
if(sourceObj===null||sourceObj===undefined){
return;
}
seekTo=player.duration()!==Infinity&&player.currentTime()||0;
player.one('loadedmetadata', loadedMetadataHandler);
player.src(sourceObj);
player.trigger({
type: 'usage',
name: 'hls-error-reload'
});
player.play();
};
var errorHandler=function errorHandler(){
if(Date.now() - lastCalled < localOptions.errorInterval * 1000){
player.trigger({
type: 'usage',
name: 'hls-error-reload-canceled'
});
return;
}
if(!localOptions.getSource||typeof localOptions.getSource!=='function'){
videojs$1.log.error('ERROR: reloadSourceOnError - The option getSource must be a function!');
return;
}
lastCalled=Date.now();
return localOptions.getSource.call(player, setSource);
};
var cleanupEvents=function cleanupEvents(){
player.off('loadedmetadata', loadedMetadataHandler);
player.off('error', errorHandler);
player.off('dispose', cleanupEvents);
};
var reinitPlugin=function reinitPlugin(newOptions){
cleanupEvents();
initPlugin(player, newOptions);
};
player.on('error', errorHandler);
player.on('dispose', cleanupEvents);
player.reloadSourceOnError=reinitPlugin;
};
var reloadSourceOnError=function reloadSourceOnError(options){
initPlugin(this, options);
};
var version$1="1.11.2";
videojs$1.use('*', function (player){
return {
setSource: function setSource(srcObj, next){
next(null, srcObj);
},
setCurrentTime: function setCurrentTime(time){
if(player.vhs&&player.currentSource().src===player.vhs.source_.src){
player.vhs.setCurrentTime(time);
}
return time;
},
play: function play(){
if(player.vhs&&player.currentSource().src===player.vhs.source_.src){
player.vhs.setCurrentTime(player.tech_.currentTime());
}}
};});
var Hls$1={
PlaylistLoader: PlaylistLoader,
Playlist: Playlist,
Decrypter: Decrypter,
AsyncStream: AsyncStream,
decrypt: decrypt,
utils: utils$1,
STANDARD_PLAYLIST_SELECTOR: lastBandwidthSelector,
INITIAL_PLAYLIST_SELECTOR: lowestBitrateCompatibleVariantSelector,
comparePlaylistBandwidth: comparePlaylistBandwidth,
comparePlaylistResolution: comparePlaylistResolution,
xhr: xhrFactory()
};
['GOAL_BUFFER_LENGTH', 'MAX_GOAL_BUFFER_LENGTH', 'GOAL_BUFFER_LENGTH_RATE', 'BUFFER_LOW_WATER_LINE', 'MAX_BUFFER_LOW_WATER_LINE', 'BUFFER_LOW_WATER_LINE_RATE', 'BANDWIDTH_VARIANCE'].forEach(function (prop){
Object.defineProperty(Hls$1, prop, {
get: function get$$1(){
videojs$1.log.warn('using Hls.' + prop + ' is UNSAFE be sure you know what you are doing');
return Config[prop];
},
set: function set$$1(value){
videojs$1.log.warn('using Hls.' + prop + ' is UNSAFE be sure you know what you are doing');
if(typeof value!=='number'||value < 0){
videojs$1.log.warn('value of Hls.' + prop + ' must be greater than or equal to 0');
return;
}
Config[prop]=value;
}});
});
var LOCAL_STORAGE_KEY$1='videojs-vhs';
var simpleTypeFromSourceType=function simpleTypeFromSourceType(type){
var mpegurlRE=/^(audio|video|application)\/(x-|vnd\.apple\.)?mpegurl/i;
if(mpegurlRE.test(type)){
return 'hls';
}
var dashRE=/^application\/dash\+xml/i;
if(dashRE.test(type)){
return 'dash';
}
return null;
};
var handleHlsMediaChange=function handleHlsMediaChange(qualityLevels, playlistLoader){
var newPlaylist=playlistLoader.media();
var selectedIndex=-1;
for (var i=0; i < qualityLevels.length; i++){
if(qualityLevels[i].id===newPlaylist.uri){
selectedIndex=i;
break;
}}
qualityLevels.selectedIndex_=selectedIndex;
qualityLevels.trigger({
selectedIndex: selectedIndex,
type: 'change'
});
};
var handleHlsLoadedMetadata=function handleHlsLoadedMetadata(qualityLevels, hls){
hls.representations().forEach(function (rep){
qualityLevels.addQualityLevel(rep);
});
handleHlsMediaChange(qualityLevels, hls.playlists);
};
Hls$1.canPlaySource=function (){
return videojs$1.log.warn('HLS is no longer a tech. Please remove it from ' + 'your player\'s techOrder.');
};
var emeKeySystems=function emeKeySystems(keySystemOptions, mainSegmentLoader, audioSegmentLoader){
if(!keySystemOptions){
return keySystemOptions;
}
var videoMimeType=void 0;
var audioMimeType=void 0;
if(audioSegmentLoader.mimeType_){
videoMimeType=mainSegmentLoader.mimeType_;
audioMimeType=audioSegmentLoader.mimeType_;
}else{
var parsedMimeType=parseContentType(mainSegmentLoader.mimeType_);
var codecs=parsedMimeType.parameters.codecs.split(',');
var audioCodec=void 0;
var videoCodec=void 0;
codecs.forEach(function (codec){
codec=codec.trim();
if(isAudioCodec(codec)){
audioCodec=codec;
}else if(isVideoCodec(codec)){
videoCodec=codec;
}});
videoMimeType=parsedMimeType.type + '; codecs="' + videoCodec + '"';
audioMimeType=parsedMimeType.type.replace('video', 'audio') + '; codecs="' + audioCodec + '"';
}
var keySystemContentTypes={};
var videoPlaylist=mainSegmentLoader.playlist_;
for (var keySystem in keySystemOptions){
keySystemContentTypes[keySystem]={
audioContentType: audioMimeType,
videoContentType: videoMimeType
};
if(videoPlaylist.contentProtection&&videoPlaylist.contentProtection[keySystem]&&videoPlaylist.contentProtection[keySystem].pssh){
keySystemContentTypes[keySystem].pssh=videoPlaylist.contentProtection[keySystem].pssh;
}
if(typeof keySystemOptions[keySystem]==='string'){
keySystemContentTypes[keySystem].url=keySystemOptions[keySystem];
}}
return videojs$1.mergeOptions(keySystemOptions, keySystemContentTypes);
};
var setupEmeOptions=function setupEmeOptions(hlsHandler){
var mainSegmentLoader=hlsHandler.masterPlaylistController_.mainSegmentLoader_;
var audioSegmentLoader=hlsHandler.masterPlaylistController_.audioSegmentLoader_;
var player=videojs$1.players[hlsHandler.tech_.options_.playerId];
if(player.eme){
var sourceOptions=emeKeySystems(hlsHandler.source_.keySystems, mainSegmentLoader, audioSegmentLoader);
if(sourceOptions){
player.currentSource().keySystems=sourceOptions; // Works around https://bugs.chromium.org/p/chromium/issues/detail?id=895449
if(!(videojs$1.browser.IE_VERSION===11)&&player.eme.initializeMediaKeys){
player.eme.initializeMediaKeys();
}}
}};
var getVhsLocalStorage=function getVhsLocalStorage(){
if(!window.localStorage){
return null;
}
var storedObject=window.localStorage.getItem(LOCAL_STORAGE_KEY$1);
if(!storedObject){
return null;
}
try {
return JSON.parse(storedObject);
} catch (e){
return null;
}};
var updateVhsLocalStorage=function updateVhsLocalStorage(options){
if(!window.localStorage){
return false;
}
var objectToStore=getVhsLocalStorage();
objectToStore=objectToStore ? videojs$1.mergeOptions(objectToStore, options):options;
try {
window.localStorage.setItem(LOCAL_STORAGE_KEY$1, JSON.stringify(objectToStore));
} catch (e){
return false;
}
return objectToStore;
};
Hls$1.supportsNativeHls=function (){
var video=document.createElement('video');
if(!videojs$1.getTech('Html5').isSupported()){
return false;
}
var canPlay=[
'application/vnd.apple.mpegurl',
'audio/mpegurl',
'audio/x-mpegurl',
'application/x-mpegurl',
'video/x-mpegurl', 'video/mpegurl', 'application/mpegurl'];
return canPlay.some(function (canItPlay){
return /maybe|probably/i.test(video.canPlayType(canItPlay));
});
}();
Hls$1.supportsNativeDash=function (){
if(!videojs$1.getTech('Html5').isSupported()){
return false;
}
return /maybe|probably/i.test(document.createElement('video').canPlayType('application/dash+xml'));
}();
Hls$1.supportsTypeNatively=function (type){
if(type==='hls'){
return Hls$1.supportsNativeHls;
}
if(type==='dash'){
return Hls$1.supportsNativeDash;
}
return false;
};
Hls$1.isSupported=function (){
return videojs$1.log.warn('HLS is no longer a tech. Please remove it from ' + 'your player\'s techOrder.');
};
var Component$1=videojs$1.getComponent('Component');
var HlsHandler=function (_Component){
inherits$2(HlsHandler, _Component);
function HlsHandler(source, tech, options){
classCallCheck$1(this, HlsHandler);
var _this=possibleConstructorReturn$1(this, (HlsHandler.__proto__||Object.getPrototypeOf(HlsHandler)).call(this, tech, options.hls));
if(tech.options_&&tech.options_.playerId){
var _player=videojs$1(tech.options_.playerId);
if(!_player.hasOwnProperty('hls')){
Object.defineProperty(_player, 'hls', {
get: function get$$1(){
videojs$1.log.warn('player.hls is deprecated. Use player.tech().hls instead.');
tech.trigger({
type: 'usage',
name: 'hls-player-access'
});
return _this;
},
configurable: true
});
}
_player.vhs=_this;
_player.dash=_this;
_this.player_=_player;
}
_this.tech_=tech;
_this.source_=source;
_this.stats={};
_this.setOptions_();
if(_this.options_.overrideNative&&tech.overrideNativeAudioTracks&&tech.overrideNativeVideoTracks){
tech.overrideNativeAudioTracks(true);
tech.overrideNativeVideoTracks(true);
}else if(_this.options_.overrideNative&&(tech.featuresNativeVideoTracks||tech.featuresNativeAudioTracks)){
throw new Error('Overriding native HLS requires emulated tracks. ' + 'See https://git.io/vMpjB');
}
_this.on(document, ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange'], function (event){
var fullscreenElement=document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement;
if(fullscreenElement&&fullscreenElement.contains(_this.tech_.el())){
_this.masterPlaylistController_.smoothQualityChange_();
}});
_this.on(_this.tech_, 'seeking', function (){
if(this.tech_.currentTime()===0&&this.tech_.player_.loop()){
this.setCurrentTime(0);
}});
_this.on(_this.tech_, 'error', function (){
if(this.masterPlaylistController_){
this.masterPlaylistController_.pauseLoading();
}});
_this.on(_this.tech_, 'play', _this.play);
return _this;
}
createClass$1(HlsHandler, [{
key: 'setOptions_',
value: function setOptions_(){
var _this2=this;
this.options_.withCredentials=this.options_.withCredentials||false;
this.options_.handleManifestRedirects=this.options_.handleManifestRedirects||false;
this.options_.limitRenditionByPlayerDimensions=this.options_.limitRenditionByPlayerDimensions===false ? false:true;
this.options_.smoothQualityChange=this.options_.smoothQualityChange||false;
this.options_.useBandwidthFromLocalStorage=typeof this.source_.useBandwidthFromLocalStorage!=='undefined' ? this.source_.useBandwidthFromLocalStorage:this.options_.useBandwidthFromLocalStorage||false;
this.options_.customTagParsers=this.options_.customTagParsers||[];
this.options_.customTagMappers=this.options_.customTagMappers||[];
this.options_.cacheEncryptionKeys=this.options_.cacheEncryptionKeys||false;
if(typeof this.options_.blacklistDuration!=='number'){
this.options_.blacklistDuration=5 * 60;
}
if(typeof this.options_.bandwidth!=='number'){
if(this.options_.useBandwidthFromLocalStorage){
var storedObject=getVhsLocalStorage();
if(storedObject&&storedObject.bandwidth){
this.options_.bandwidth=storedObject.bandwidth;
this.tech_.trigger({
type: 'usage',
name: 'hls-bandwidth-from-local-storage'
});
}
if(storedObject&&storedObject.throughput){
this.options_.throughput=storedObject.throughput;
this.tech_.trigger({
type: 'usage',
name: 'hls-throughput-from-local-storage'
});
}}
}
if(typeof this.options_.bandwidth!=='number'){
this.options_.bandwidth=Config.INITIAL_BANDWIDTH;
}
this.options_.enableLowInitialPlaylist=this.options_.enableLowInitialPlaylist&&this.options_.bandwidth===Config.INITIAL_BANDWIDTH;
['withCredentials', 'limitRenditionByPlayerDimensions', 'bandwidth', 'smoothQualityChange', 'customTagParsers', 'customTagMappers', 'handleManifestRedirects', 'cacheEncryptionKeys'].forEach(function (option){
if(typeof _this2.source_[option]!=='undefined'){
_this2.options_[option]=_this2.source_[option];
}});
this.limitRenditionByPlayerDimensions=this.options_.limitRenditionByPlayerDimensions;
}
}, {
key: 'src',
value: function src(_src, type){
var _this3=this;
if(!_src){
return;
}
this.setOptions_();
this.options_.url=this.source_.src;
this.options_.tech=this.tech_;
this.options_.externHls=Hls$1;
this.options_.sourceType=simpleTypeFromSourceType(type);
this.options_.seekTo=function (time){
_this3.tech_.setCurrentTime(time);
_this3.setCurrentTime(time);
};
this.masterPlaylistController_=new MasterPlaylistController(this.options_);
this.playbackWatcher_=new PlaybackWatcher(videojs$1.mergeOptions(this.options_, {
seekable: function seekable$$1(){
return _this3.seekable();
},
media: function media(){
return _this3.masterPlaylistController_.media();
}}));
this.masterPlaylistController_.on('error', function (){
var player=videojs$1.players[_this3.tech_.options_.playerId];
player.error(_this3.masterPlaylistController_.error);
});
this.masterPlaylistController_.selectPlaylist=this.selectPlaylist ? this.selectPlaylist.bind(this):Hls$1.STANDARD_PLAYLIST_SELECTOR.bind(this);
this.masterPlaylistController_.selectInitialPlaylist=Hls$1.INITIAL_PLAYLIST_SELECTOR.bind(this);
this.playlists=this.masterPlaylistController_.masterPlaylistLoader_;
this.mediaSource=this.masterPlaylistController_.mediaSource;
Object.defineProperties(this, {
selectPlaylist: {
get: function get$$1(){
return this.masterPlaylistController_.selectPlaylist;
},
set: function set$$1(selectPlaylist){
this.masterPlaylistController_.selectPlaylist=selectPlaylist.bind(this);
}},
throughput: {
get: function get$$1(){
return this.masterPlaylistController_.mainSegmentLoader_.throughput.rate;
},
set: function set$$1(throughput){
this.masterPlaylistController_.mainSegmentLoader_.throughput.rate=throughput;
this.masterPlaylistController_.mainSegmentLoader_.throughput.count=1;
}},
bandwidth: {
get: function get$$1(){
return this.masterPlaylistController_.mainSegmentLoader_.bandwidth;
},
set: function set$$1(bandwidth){
this.masterPlaylistController_.mainSegmentLoader_.bandwidth=bandwidth;
this.masterPlaylistController_.mainSegmentLoader_.throughput={
rate: 0,
count: 0
};}},
systemBandwidth: {
get: function get$$1(){
var invBandwidth=1 / (this.bandwidth||1);
var invThroughput=void 0;
if(this.throughput > 0){
invThroughput=1 / this.throughput;
}else{
invThroughput=0;
}
var systemBitrate=Math.floor(1 / (invBandwidth + invThroughput));
return systemBitrate;
},
set: function set$$1(){
videojs$1.log.error('The "systemBandwidth" property is read-only');
}}
});
if(this.options_.bandwidth){
this.bandwidth=this.options_.bandwidth;
}
if(this.options_.throughput){
this.throughput=this.options_.throughput;
}
Object.defineProperties(this.stats, {
bandwidth: {
get: function get$$1(){
return _this3.bandwidth||0;
},
enumerable: true
},
mediaRequests: {
get: function get$$1(){
return _this3.masterPlaylistController_.mediaRequests_()||0;
},
enumerable: true
},
mediaRequestsAborted: {
get: function get$$1(){
return _this3.masterPlaylistController_.mediaRequestsAborted_()||0;
},
enumerable: true
},
mediaRequestsTimedout: {
get: function get$$1(){
return _this3.masterPlaylistController_.mediaRequestsTimedout_()||0;
},
enumerable: true
},
mediaRequestsErrored: {
get: function get$$1(){
return _this3.masterPlaylistController_.mediaRequestsErrored_()||0;
},
enumerable: true
},
mediaTransferDuration: {
get: function get$$1(){
return _this3.masterPlaylistController_.mediaTransferDuration_()||0;
},
enumerable: true
},
mediaBytesTransferred: {
get: function get$$1(){
return _this3.masterPlaylistController_.mediaBytesTransferred_()||0;
},
enumerable: true
},
mediaSecondsLoaded: {
get: function get$$1(){
return _this3.masterPlaylistController_.mediaSecondsLoaded_()||0;
},
enumerable: true
},
buffered: {
get: function get$$1(){
return timeRangesToArray(_this3.tech_.buffered());
},
enumerable: true
},
currentTime: {
get: function get$$1(){
return _this3.tech_.currentTime();
},
enumerable: true
},
currentSource: {
get: function get$$1(){
return _this3.tech_.currentSource_;
},
enumerable: true
},
currentTech: {
get: function get$$1(){
return _this3.tech_.name_;
},
enumerable: true
},
duration: {
get: function get$$1(){
return _this3.tech_.duration();
},
enumerable: true
},
master: {
get: function get$$1(){
return _this3.playlists.master;
},
enumerable: true
},
playerDimensions: {
get: function get$$1(){
return _this3.tech_.currentDimensions();
},
enumerable: true
},
seekable: {
get: function get$$1(){
return timeRangesToArray(_this3.tech_.seekable());
},
enumerable: true
},
timestamp: {
get: function get$$1(){
return Date.now();
},
enumerable: true
},
videoPlaybackQuality: {
get: function get$$1(){
return _this3.tech_.getVideoPlaybackQuality();
},
enumerable: true
}});
this.tech_.one('canplay', this.masterPlaylistController_.setupFirstPlay.bind(this.masterPlaylistController_));
this.tech_.on('bandwidthupdate', function (){
if(_this3.options_.useBandwidthFromLocalStorage){
updateVhsLocalStorage({
bandwidth: _this3.bandwidth,
throughput: Math.round(_this3.throughput)
});
}});
this.masterPlaylistController_.on('selectedinitialmedia', function (){
renditionSelectionMixin(_this3);
setupEmeOptions(_this3);
});
this.on(this.masterPlaylistController_, 'progress', function (){
this.tech_.trigger('progress');
});
this.tech_.ready(function (){
return _this3.setupQualityLevels_();
});
if(!this.tech_.el()){
return;
}
this.tech_.src(videojs$1.URL.createObjectURL(this.masterPlaylistController_.mediaSource));
}
}, {
key: 'setupQualityLevels_',
value: function setupQualityLevels_(){
var _this4=this;
var player=videojs$1.players[this.tech_.options_.playerId];
if(player&&player.qualityLevels){
this.qualityLevels_=player.qualityLevels();
this.masterPlaylistController_.on('selectedinitialmedia', function (){
handleHlsLoadedMetadata(_this4.qualityLevels_, _this4);
});
this.playlists.on('mediachange', function (){
handleHlsMediaChange(_this4.qualityLevels_, _this4.playlists);
});
}}
}, {
key: 'play',
value: function play(){
this.masterPlaylistController_.play();
}
}, {
key: 'setCurrentTime',
value: function setCurrentTime(currentTime){
this.masterPlaylistController_.setCurrentTime(currentTime);
}
}, {
key: 'duration',
value: function duration$$1(){
return this.masterPlaylistController_.duration();
}
}, {
key: 'seekable',
value: function seekable$$1(){
return this.masterPlaylistController_.seekable();
}
}, {
key: 'dispose',
value: function dispose(){
if(this.playbackWatcher_){
this.playbackWatcher_.dispose();
}
if(this.masterPlaylistController_){
this.masterPlaylistController_.dispose();
}
if(this.qualityLevels_){
this.qualityLevels_.dispose();
}
if(this.player_){
delete this.player_.vhs;
delete this.player_.dash;
delete this.player_.hls;
}
if(this.tech_&&this.tech_.hls){
delete this.tech_.hls;
}
get$1(HlsHandler.prototype.__proto__||Object.getPrototypeOf(HlsHandler.prototype), 'dispose', this).call(this);
}}, {
key: 'convertToProgramTime',
value: function convertToProgramTime(time, callback){
return getProgramTime({
playlist: this.masterPlaylistController_.media(),
time: time,
callback: callback
});
}}, {
key: 'seekToProgramTime',
value: function seekToProgramTime$$1(programTime, callback){
var pauseAfterSeek=arguments.length > 2&&arguments[2]!==undefined ? arguments[2]:true;
var retryCount=arguments.length > 3&&arguments[3]!==undefined ? arguments[3]:2;
return seekToProgramTime({
programTime: programTime,
playlist: this.masterPlaylistController_.media(),
retryCount: retryCount,
pauseAfterSeek: pauseAfterSeek,
seekTo: this.options_.seekTo,
tech: this.options_.tech,
callback: callback
});
}}]);
return HlsHandler;
}(Component$1);
var HlsSourceHandler={
name: 'videojs-http-streaming',
VERSION: version$1,
canHandleSource: function canHandleSource(srcObj){
var options=arguments.length > 1&&arguments[1]!==undefined ? arguments[1]:{};
var localOptions=videojs$1.mergeOptions(videojs$1.options, options);
return HlsSourceHandler.canPlayType(srcObj.type, localOptions);
},
handleSource: function handleSource(source, tech){
var options=arguments.length > 2&&arguments[2]!==undefined ? arguments[2]:{};
var localOptions=videojs$1.mergeOptions(videojs$1.options, options);
tech.hls=new HlsHandler(source, tech, localOptions);
tech.hls.xhr=xhrFactory();
tech.hls.src(source.src, source.type);
return tech.hls;
},
canPlayType: function canPlayType(type){
var options=arguments.length > 1&&arguments[1]!==undefined ? arguments[1]:{};
var _videojs$mergeOptions=videojs$1.mergeOptions(videojs$1.options, options),
overrideNative=_videojs$mergeOptions.hls.overrideNative;
var supportedType=simpleTypeFromSourceType(type);
var canUseMsePlayback=supportedType&&(!Hls$1.supportsTypeNatively(supportedType)||overrideNative);
return canUseMsePlayback ? 'maybe':'';
}};
if(typeof videojs$1.MediaSource==='undefined'||typeof videojs$1.URL==='undefined'){
videojs$1.MediaSource=MediaSource;
videojs$1.URL=URL$1;
}
if(MediaSource.supportsNativeMediaSources()){
videojs$1.getTech('Html5').registerSourceHandler(HlsSourceHandler, 0);
}
videojs$1.HlsHandler=HlsHandler;
videojs$1.HlsSourceHandler=HlsSourceHandler;
videojs$1.Hls=Hls$1;
if(!videojs$1.use){
videojs$1.registerComponent('Hls', Hls$1);
}
videojs$1.options.hls=videojs$1.options.hls||{};
if(videojs$1.registerPlugin){
videojs$1.registerPlugin('reloadSourceOnError', reloadSourceOnError);
}else{
videojs$1.plugin('reloadSourceOnError', reloadSourceOnError);
}
return videojs$1;
}));
(function (global, factory){
typeof exports==='object'&&typeof module!=='undefined' ? module.exports=factory(require('global/window'), require('global/document'), require('video.js')) :
typeof define==='function'&&define.amd ? define(['global/window', 'global/document', 'video.js'], factory) :
(global=global||self, global.videojsVr=factory(global.window, global.document, global.videojs));
}(this, (function (window$1, document$1, videojs){ 'use strict';
window$1=window$1&&window$1.hasOwnProperty('default') ? window$1['default']:window$1;
document$1=document$1&&document$1.hasOwnProperty('default') ? document$1['default']:document$1;
videojs=videojs&&videojs.hasOwnProperty('default') ? videojs['default']:videojs;
function _assertThisInitialized(self){
if(self===void 0){
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self;
}
var assertThisInitialized=_assertThisInitialized;
function _inheritsLoose(subClass, superClass){
subClass.prototype=Object.create(superClass.prototype);
subClass.prototype.constructor=subClass;
subClass.__proto__=superClass;
}
var inheritsLoose=_inheritsLoose;
var version="1.7.2";
var commonjsGlobal=typeof globalThis!=='undefined' ? globalThis:typeof window!=='undefined' ? window:typeof global!=='undefined' ? global:typeof self!=='undefined' ? self:{};
function unwrapExports (x){
return x&&x.__esModule&&Object.prototype.hasOwnProperty.call(x, 'default') ? x['default']:x;
}
function createCommonjsModule(fn, module){
return module={ exports: {}}, fn(module, module.exports), module.exports;
}
var webvrPolyfill=createCommonjsModule(function (module, exports){
(function (global, factory){
module.exports=factory() ;
}(commonjsGlobal, (function (){
var commonjsGlobal$1=typeof window!=='undefined' ? window:typeof commonjsGlobal!=='undefined' ? commonjsGlobal:typeof self!=='undefined' ? self:{};
function unwrapExports (x){
return x&&x.__esModule&&Object.prototype.hasOwnProperty.call(x, 'default') ? x['default']:x;
}
function createCommonjsModule(fn, module){
return module={ exports: {}}, fn(module, module.exports), module.exports;
}
var race=function race(promises){
if(Promise.race){
return Promise.race(promises);
}
return new Promise(function (resolve, reject){
for (var i=0; i < promises.length; i++){
promises[i].then(resolve, reject);
}});
};
var isMobile=function isMobile(){
return (/Android/i.test(navigator.userAgent)||/iPhone|iPad|iPod/i.test(navigator.userAgent)
);
};
var copyArray=function copyArray(source, dest){
for (var i=0, n=source.length; i < n; i++){
dest[i]=source[i];
}};
var extend=function extend(dest, src){
for (var key in src){
if(src.hasOwnProperty(key)){
dest[key]=src[key];
}}
return dest;
};
var cardboardVrDisplay=createCommonjsModule(function (module, exports){
(function (global, factory){
module.exports=factory();
}(commonjsGlobal$1, (function (){ var classCallCheck=function (instance, Constructor){
if(!(instance instanceof Constructor)){
throw new TypeError("Cannot call a class as a function");
}};
var createClass=function (){
function defineProperties(target, props){
for (var i=0; i < props.length; i++){
var descriptor=props[i];
descriptor.enumerable=descriptor.enumerable||false;
descriptor.configurable=true;
if("value" in descriptor) descriptor.writable=true;
Object.defineProperty(target, descriptor.key, descriptor);
}}
return function (Constructor, protoProps, staticProps){
if(protoProps) defineProperties(Constructor.prototype, protoProps);
if(staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};}();
var slicedToArray=function (){
function sliceIterator(arr, i){
var _arr=[];
var _n=true;
var _d=false;
var _e=undefined;
try {
for (var _i=arr[Symbol.iterator](), _s; !(_n=(_s=_i.next()).done); _n=true){
_arr.push(_s.value);
if(i&&_arr.length===i) break;
}} catch (err){
_d=true;
_e=err;
} finally {
try {
if(!_n&&_i["return"]) _i["return"]();
} finally {
if(_d) throw _e;
}}
return _arr;
}
return function (arr, i){
if(Array.isArray(arr)){
return arr;
}else if(Symbol.iterator in Object(arr)){
return sliceIterator(arr, i);
}else{
throw new TypeError("Invalid attempt to destructure non-iterable instance");
}};}();
var MIN_TIMESTEP=0.001;
var MAX_TIMESTEP=1;
var base64=function base64(mimeType, _base){
return 'data:' + mimeType + ';base64,' + _base;
};
var lerp=function lerp(a, b, t){
return a + (b - a) * t;
};
var isIOS=function (){
var isIOS=/iPad|iPhone|iPod/.test(navigator.platform);
return function (){
return isIOS;
};}();
var isWebViewAndroid=function (){
var isWebViewAndroid=navigator.userAgent.indexOf('Version')!==-1&&navigator.userAgent.indexOf('Android')!==-1&&navigator.userAgent.indexOf('Chrome')!==-1;
return function (){
return isWebViewAndroid;
};}();
var isSafari=function (){
var isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);
return function (){
return isSafari;
};}();
var isFirefoxAndroid=function (){
var isFirefoxAndroid=navigator.userAgent.indexOf('Firefox')!==-1&&navigator.userAgent.indexOf('Android')!==-1;
return function (){
return isFirefoxAndroid;
};}();
var getChromeVersion=function (){
var match=navigator.userAgent.match(/.*Chrome\/([0-9]+)/);
var value=match ? parseInt(match[1], 10):null;
return function (){
return value;
};}();
var isChromeWithoutDeviceMotion=function (){
var value=false;
if(getChromeVersion()===65){
var match=navigator.userAgent.match(/.*Chrome\/([0-9\.]*)/);
if(match){
var _match$1$split=match[1].split('.'),
_match$1$split2=slicedToArray(_match$1$split, 4),
major=_match$1$split2[0],
minor=_match$1$split2[1],
branch=_match$1$split2[2],
build=_match$1$split2[3];
value=parseInt(branch, 10)===3325&&parseInt(build, 10) < 148;
}}
return function (){
return value;
};}();
var isR7=function (){
var isR7=navigator.userAgent.indexOf('R7 Build')!==-1;
return function (){
return isR7;
};}();
var isLandscapeMode=function isLandscapeMode(){
var rtn=window.orientation==90||window.orientation==-90;
return isR7() ? !rtn:rtn;
};
var isTimestampDeltaValid=function isTimestampDeltaValid(timestampDeltaS){
if(isNaN(timestampDeltaS)){
return false;
}
if(timestampDeltaS <=MIN_TIMESTEP){
return false;
}
if(timestampDeltaS > MAX_TIMESTEP){
return false;
}
return true;
};
var getScreenWidth=function getScreenWidth(){
return Math.max(window.screen.width, window.screen.height) * window.devicePixelRatio;
};
var getScreenHeight=function getScreenHeight(){
return Math.min(window.screen.width, window.screen.height) * window.devicePixelRatio;
};
var requestFullscreen=function requestFullscreen(element){
if(isWebViewAndroid()){
return false;
}
if(element.requestFullscreen){
element.requestFullscreen();
}else if(element.webkitRequestFullscreen){
element.webkitRequestFullscreen();
}else if(element.mozRequestFullScreen){
element.mozRequestFullScreen();
}else if(element.msRequestFullscreen){
element.msRequestFullscreen();
}else{
return false;
}
return true;
};
var exitFullscreen=function exitFullscreen(){
if(document.exitFullscreen){
document.exitFullscreen();
}else if(document.webkitExitFullscreen){
document.webkitExitFullscreen();
}else if(document.mozCancelFullScreen){
document.mozCancelFullScreen();
}else if(document.msExitFullscreen){
document.msExitFullscreen();
}else{
return false;
}
return true;
};
var getFullscreenElement=function getFullscreenElement(){
return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement;
};
var linkProgram=function linkProgram(gl, vertexSource, fragmentSource, attribLocationMap){
var vertexShader=gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexSource);
gl.compileShader(vertexShader);
var fragmentShader=gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentSource);
gl.compileShader(fragmentShader);
var program=gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
for (var attribName in attribLocationMap){
gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);
}gl.linkProgram(program);
gl.deleteShader(vertexShader);
gl.deleteShader(fragmentShader);
return program;
};
var getProgramUniforms=function getProgramUniforms(gl, program){
var uniforms={};
var uniformCount=gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
var uniformName='';
for (var i=0; i < uniformCount; i++){
var uniformInfo=gl.getActiveUniform(program, i);
uniformName=uniformInfo.name.replace('[0]', '');
uniforms[uniformName]=gl.getUniformLocation(program, uniformName);
}
return uniforms;
};
var orthoMatrix=function orthoMatrix(out, left, right, bottom, top, near, far){
var lr=1 / (left - right),
bt=1 / (bottom - top),
nf=1 / (near - far);
out[0]=-2 * lr;
out[1]=0;
out[2]=0;
out[3]=0;
out[4]=0;
out[5]=-2 * bt;
out[6]=0;
out[7]=0;
out[8]=0;
out[9]=0;
out[10]=2 * nf;
out[11]=0;
out[12]=(left + right) * lr;
out[13]=(top + bottom) * bt;
out[14]=(far + near) * nf;
out[15]=1;
return out;
};
var isMobile=function isMobile(){
var check=false;
(function (a){
if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm(os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s)|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(|\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(|\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg(g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v)|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v)|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|)|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check=true;
})(navigator.userAgent||navigator.vendor||window.opera);
return check;
};
var extend=function extend(dest, src){
for (var key in src){
if(src.hasOwnProperty(key)){
dest[key]=src[key];
}}
return dest;
};
var safariCssSizeWorkaround=function safariCssSizeWorkaround(canvas){
if(isIOS()){
var width=canvas.style.width;
var height=canvas.style.height;
canvas.style.width=parseInt(width) + 1 + 'px';
canvas.style.height=parseInt(height) + 'px';
setTimeout(function (){
canvas.style.width=width;
canvas.style.height=height;
}, 100);
}
window.canvas=canvas;
};
var frameDataFromPose=function (){
var piOver180=Math.PI / 180.0;
var rad45=Math.PI * 0.25;
function mat4_perspectiveFromFieldOfView(out, fov, near, far){
var upTan=Math.tan(fov ? fov.upDegrees * piOver180:rad45),
downTan=Math.tan(fov ? fov.downDegrees * piOver180:rad45),
leftTan=Math.tan(fov ? fov.leftDegrees * piOver180:rad45),
rightTan=Math.tan(fov ? fov.rightDegrees * piOver180:rad45),
xScale=2.0 / (leftTan + rightTan),
yScale=2.0 / (upTan + downTan);
out[0]=xScale;
out[1]=0.0;
out[2]=0.0;
out[3]=0.0;
out[4]=0.0;
out[5]=yScale;
out[6]=0.0;
out[7]=0.0;
out[8]=-((leftTan - rightTan) * xScale * 0.5);
out[9]=(upTan - downTan) * yScale * 0.5;
out[10]=far / (near - far);
out[11]=-1.0;
out[12]=0.0;
out[13]=0.0;
out[14]=far * near / (near - far);
out[15]=0.0;
return out;
}
function mat4_fromRotationTranslation(out, q, v){
var x=q[0],
y=q[1],
z=q[2],
w=q[3],
x2=x + x,
y2=y + y,
z2=z + z,
xx=x * x2,
xy=x * y2,
xz=x * z2,
yy=y * y2,
yz=y * z2,
zz=z * z2,
wx=w * x2,
wy=w * y2,
wz=w * z2;
out[0]=1 - (yy + zz);
out[1]=xy + wz;
out[2]=xz - wy;
out[3]=0;
out[4]=xy - wz;
out[5]=1 - (xx + zz);
out[6]=yz + wx;
out[7]=0;
out[8]=xz + wy;
out[9]=yz - wx;
out[10]=1 - (xx + yy);
out[11]=0;
out[12]=v[0];
out[13]=v[1];
out[14]=v[2];
out[15]=1;
return out;
}
function mat4_translate(out, a, v){
var x=v[0],
y=v[1],
z=v[2],
a00,
a01,
a02,
a03,
a10,
a11,
a12,
a13,
a20,
a21,
a22,
a23;
if(a===out){
out[12]=a[0] * x + a[4] * y + a[8] * z + a[12];
out[13]=a[1] * x + a[5] * y + a[9] * z + a[13];
out[14]=a[2] * x + a[6] * y + a[10] * z + a[14];
out[15]=a[3] * x + a[7] * y + a[11] * z + a[15];
}else{
a00=a[0];a01=a[1];a02=a[2];a03=a[3];
a10=a[4];a11=a[5];a12=a[6];a13=a[7];
a20=a[8];a21=a[9];a22=a[10];a23=a[11];
out[0]=a00;out[1]=a01;out[2]=a02;out[3]=a03;
out[4]=a10;out[5]=a11;out[6]=a12;out[7]=a13;
out[8]=a20;out[9]=a21;out[10]=a22;out[11]=a23;
out[12]=a00 * x + a10 * y + a20 * z + a[12];
out[13]=a01 * x + a11 * y + a21 * z + a[13];
out[14]=a02 * x + a12 * y + a22 * z + a[14];
out[15]=a03 * x + a13 * y + a23 * z + a[15];
}
return out;
}
function mat4_invert(out, a){
var a00=a[0],
a01=a[1],
a02=a[2],
a03=a[3],
a10=a[4],
a11=a[5],
a12=a[6],
a13=a[7],
a20=a[8],
a21=a[9],
a22=a[10],
a23=a[11],
a30=a[12],
a31=a[13],
a32=a[14],
a33=a[15],
b00=a00 * a11 - a01 * a10,
b01=a00 * a12 - a02 * a10,
b02=a00 * a13 - a03 * a10,
b03=a01 * a12 - a02 * a11,
b04=a01 * a13 - a03 * a11,
b05=a02 * a13 - a03 * a12,
b06=a20 * a31 - a21 * a30,
b07=a20 * a32 - a22 * a30,
b08=a20 * a33 - a23 * a30,
b09=a21 * a32 - a22 * a31,
b10=a21 * a33 - a23 * a31,
b11=a22 * a33 - a23 * a32,
det=b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
if(!det){
return null;
}
det=1.0 / det;
out[0]=(a11 * b11 - a12 * b10 + a13 * b09) * det;
out[1]=(a02 * b10 - a01 * b11 - a03 * b09) * det;
out[2]=(a31 * b05 - a32 * b04 + a33 * b03) * det;
out[3]=(a22 * b04 - a21 * b05 - a23 * b03) * det;
out[4]=(a12 * b08 - a10 * b11 - a13 * b07) * det;
out[5]=(a00 * b11 - a02 * b08 + a03 * b07) * det;
out[6]=(a32 * b02 - a30 * b05 - a33 * b01) * det;
out[7]=(a20 * b05 - a22 * b02 + a23 * b01) * det;
out[8]=(a10 * b10 - a11 * b08 + a13 * b06) * det;
out[9]=(a01 * b08 - a00 * b10 - a03 * b06) * det;
out[10]=(a30 * b04 - a31 * b02 + a33 * b00) * det;
out[11]=(a21 * b02 - a20 * b04 - a23 * b00) * det;
out[12]=(a11 * b07 - a10 * b09 - a12 * b06) * det;
out[13]=(a00 * b09 - a01 * b07 + a02 * b06) * det;
out[14]=(a31 * b01 - a30 * b03 - a32 * b00) * det;
out[15]=(a20 * b03 - a21 * b01 + a22 * b00) * det;
return out;
}
var defaultOrientation=new Float32Array([0, 0, 0, 1]);
var defaultPosition=new Float32Array([0, 0, 0]);
function updateEyeMatrices(projection, view, pose, fov, offset, vrDisplay){
mat4_perspectiveFromFieldOfView(projection, fov||null, vrDisplay.depthNear, vrDisplay.depthFar);
var orientation=pose.orientation||defaultOrientation;
var position=pose.position||defaultPosition;
mat4_fromRotationTranslation(view, orientation, position);
if(offset) mat4_translate(view, view, offset);
mat4_invert(view, view);
}
return function (frameData, pose, vrDisplay){
if(!frameData||!pose) return false;
frameData.pose=pose;
frameData.timestamp=pose.timestamp;
updateEyeMatrices(frameData.leftProjectionMatrix, frameData.leftViewMatrix, pose, vrDisplay._getFieldOfView("left"), vrDisplay._getEyeOffset("left"), vrDisplay);
updateEyeMatrices(frameData.rightProjectionMatrix, frameData.rightViewMatrix, pose, vrDisplay._getFieldOfView("right"), vrDisplay._getEyeOffset("right"), vrDisplay);
return true;
};}();
var isInsideCrossOriginIFrame=function isInsideCrossOriginIFrame(){
var isFramed=window.self!==window.top;
var refOrigin=getOriginFromUrl(document.referrer);
var thisOrigin=getOriginFromUrl(window.location.href);
return isFramed&&refOrigin!==thisOrigin;
};
var getOriginFromUrl=function getOriginFromUrl(url){
var domainIdx;
var protoSepIdx=url.indexOf("://");
if(protoSepIdx!==-1){
domainIdx=protoSepIdx + 3;
}else{
domainIdx=0;
}
var domainEndIdx=url.indexOf('/', domainIdx);
if(domainEndIdx===-1){
domainEndIdx=url.length;
}
return url.substring(0, domainEndIdx);
};
var getQuaternionAngle=function getQuaternionAngle(quat){
if(quat.w > 1){
console.warn('getQuaternionAngle: w > 1');
return 0;
}
var angle=2 * Math.acos(quat.w);
return angle;
};
var warnOnce=function (){
var observedWarnings={};
return function (key, message){
if(observedWarnings[key]===undefined){
console.warn('webvr-polyfill: ' + message);
observedWarnings[key]=true;
}};}();
var deprecateWarning=function deprecateWarning(deprecated, suggested){
var alternative=suggested ? 'Please use ' + suggested + ' instead.':'';
warnOnce(deprecated, deprecated + ' has been deprecated. ' + 'This may not work on native WebVR displays. ' + alternative);
};
function WGLUPreserveGLState(gl, bindings, callback){
if(!bindings){
callback(gl);
return;
}
var boundValues=[];
var activeTexture=null;
for (var i=0; i < bindings.length; ++i){
var binding=bindings[i];
switch (binding){
case gl.TEXTURE_BINDING_2D:
case gl.TEXTURE_BINDING_CUBE_MAP:
var textureUnit=bindings[++i];
if(textureUnit < gl.TEXTURE0||textureUnit > gl.TEXTURE31){
console.error("TEXTURE_BINDING_2D or TEXTURE_BINDING_CUBE_MAP must be followed by a valid texture unit");
boundValues.push(null, null);
break;
}
if(!activeTexture){
activeTexture=gl.getParameter(gl.ACTIVE_TEXTURE);
}
gl.activeTexture(textureUnit);
boundValues.push(gl.getParameter(binding), null);
break;
case gl.ACTIVE_TEXTURE:
activeTexture=gl.getParameter(gl.ACTIVE_TEXTURE);
boundValues.push(null);
break;
default:
boundValues.push(gl.getParameter(binding));
break;
}}
callback(gl);
for (var i=0; i < bindings.length; ++i){
var binding=bindings[i];
var boundValue=boundValues[i];
switch (binding){
case gl.ACTIVE_TEXTURE:
break;
case gl.ARRAY_BUFFER_BINDING:
gl.bindBuffer(gl.ARRAY_BUFFER, boundValue);
break;
case gl.COLOR_CLEAR_VALUE:
gl.clearColor(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);
break;
case gl.COLOR_WRITEMASK:
gl.colorMask(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);
break;
case gl.CURRENT_PROGRAM:
gl.useProgram(boundValue);
break;
case gl.ELEMENT_ARRAY_BUFFER_BINDING:
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, boundValue);
break;
case gl.FRAMEBUFFER_BINDING:
gl.bindFramebuffer(gl.FRAMEBUFFER, boundValue);
break;
case gl.RENDERBUFFER_BINDING:
gl.bindRenderbuffer(gl.RENDERBUFFER, boundValue);
break;
case gl.TEXTURE_BINDING_2D:
var textureUnit=bindings[++i];
if(textureUnit < gl.TEXTURE0||textureUnit > gl.TEXTURE31)
break;
gl.activeTexture(textureUnit);
gl.bindTexture(gl.TEXTURE_2D, boundValue);
break;
case gl.TEXTURE_BINDING_CUBE_MAP:
var textureUnit=bindings[++i];
if(textureUnit < gl.TEXTURE0||textureUnit > gl.TEXTURE31)
break;
gl.activeTexture(textureUnit);
gl.bindTexture(gl.TEXTURE_CUBE_MAP, boundValue);
break;
case gl.VIEWPORT:
gl.viewport(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);
break;
case gl.BLEND:
case gl.CULL_FACE:
case gl.DEPTH_TEST:
case gl.SCISSOR_TEST:
case gl.STENCIL_TEST:
if(boundValue){
gl.enable(binding);
}else{
gl.disable(binding);
}
break;
default:
console.log("No GL restore behavior for 0x" + binding.toString(16));
break;
}
if(activeTexture){
gl.activeTexture(activeTexture);
}}
}
var glPreserveState=WGLUPreserveGLState;
var distortionVS=['attribute vec2 position;', 'attribute vec3 texCoord;', 'varying vec2 vTexCoord;', 'uniform vec4 viewportOffsetScale[2];', 'void main(){', '  vec4 viewport=viewportOffsetScale[int(texCoord.z)];', '  vTexCoord=(texCoord.xy * viewport.zw) + viewport.xy;', '  gl_Position=vec4(position, 1.0, 1.0);', '}'].join('\n');
var distortionFS=['precision mediump float;', 'uniform sampler2D diffuse;', 'varying vec2 vTexCoord;', 'void main(){', '  gl_FragColor=texture2D(diffuse, vTexCoord);', '}'].join('\n');
function CardboardDistorter(gl, cardboardUI, bufferScale, dirtySubmitFrameBindings){
this.gl=gl;
this.cardboardUI=cardboardUI;
this.bufferScale=bufferScale;
this.dirtySubmitFrameBindings=dirtySubmitFrameBindings;
this.ctxAttribs=gl.getContextAttributes();
this.meshWidth=20;
this.meshHeight=20;
this.bufferWidth=gl.drawingBufferWidth;
this.bufferHeight=gl.drawingBufferHeight;
this.realBindFramebuffer=gl.bindFramebuffer;
this.realEnable=gl.enable;
this.realDisable=gl.disable;
this.realColorMask=gl.colorMask;
this.realClearColor=gl.clearColor;
this.realViewport=gl.viewport;
if(!isIOS()){
this.realCanvasWidth=Object.getOwnPropertyDescriptor(gl.canvas.__proto__, 'width');
this.realCanvasHeight=Object.getOwnPropertyDescriptor(gl.canvas.__proto__, 'height');
}
this.isPatched=false;
this.lastBoundFramebuffer=null;
this.cullFace=false;
this.depthTest=false;
this.blend=false;
this.scissorTest=false;
this.stencilTest=false;
this.viewport=[0, 0, 0, 0];
this.colorMask=[true, true, true, true];
this.clearColor=[0, 0, 0, 0];
this.attribs={
position: 0,
texCoord: 1
};
this.program=linkProgram(gl, distortionVS, distortionFS, this.attribs);
this.uniforms=getProgramUniforms(gl, this.program);
this.viewportOffsetScale=new Float32Array(8);
this.setTextureBounds();
this.vertexBuffer=gl.createBuffer();
this.indexBuffer=gl.createBuffer();
this.indexCount=0;
this.renderTarget=gl.createTexture();
this.framebuffer=gl.createFramebuffer();
this.depthStencilBuffer=null;
this.depthBuffer=null;
this.stencilBuffer=null;
if(this.ctxAttribs.depth&&this.ctxAttribs.stencil){
this.depthStencilBuffer=gl.createRenderbuffer();
}else if(this.ctxAttribs.depth){
this.depthBuffer=gl.createRenderbuffer();
}else if(this.ctxAttribs.stencil){
this.stencilBuffer=gl.createRenderbuffer();
}
this.patch();
this.onResize();
}
CardboardDistorter.prototype.destroy=function (){
var gl=this.gl;
this.unpatch();
gl.deleteProgram(this.program);
gl.deleteBuffer(this.vertexBuffer);
gl.deleteBuffer(this.indexBuffer);
gl.deleteTexture(this.renderTarget);
gl.deleteFramebuffer(this.framebuffer);
if(this.depthStencilBuffer){
gl.deleteRenderbuffer(this.depthStencilBuffer);
}
if(this.depthBuffer){
gl.deleteRenderbuffer(this.depthBuffer);
}
if(this.stencilBuffer){
gl.deleteRenderbuffer(this.stencilBuffer);
}
if(this.cardboardUI){
this.cardboardUI.destroy();
}};
CardboardDistorter.prototype.onResize=function (){
var gl=this.gl;
var self=this;
var glState=[gl.RENDERBUFFER_BINDING, gl.TEXTURE_BINDING_2D, gl.TEXTURE0];
glPreserveState(gl, glState, function (gl){
self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, null);
if(self.scissorTest){
self.realDisable.call(gl, gl.SCISSOR_TEST);
}
self.realColorMask.call(gl, true, true, true, true);
self.realViewport.call(gl, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
self.realClearColor.call(gl, 0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, self.framebuffer);
gl.bindTexture(gl.TEXTURE_2D, self.renderTarget);
gl.texImage2D(gl.TEXTURE_2D, 0, self.ctxAttribs.alpha ? gl.RGBA:gl.RGB, self.bufferWidth, self.bufferHeight, 0, self.ctxAttribs.alpha ? gl.RGBA:gl.RGB, gl.UNSIGNED_BYTE, null);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, self.renderTarget, 0);
if(self.ctxAttribs.depth&&self.ctxAttribs.stencil){
gl.bindRenderbuffer(gl.RENDERBUFFER, self.depthStencilBuffer);
gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, self.bufferWidth, self.bufferHeight);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, self.depthStencilBuffer);
}else if(self.ctxAttribs.depth){
gl.bindRenderbuffer(gl.RENDERBUFFER, self.depthBuffer);
gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, self.bufferWidth, self.bufferHeight);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, self.depthBuffer);
}else if(self.ctxAttribs.stencil){
gl.bindRenderbuffer(gl.RENDERBUFFER, self.stencilBuffer);
gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, self.bufferWidth, self.bufferHeight);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, self.stencilBuffer);
}
if(!gl.checkFramebufferStatus(gl.FRAMEBUFFER)===gl.FRAMEBUFFER_COMPLETE){
console.error('Framebuffer incomplete!');
}
self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, self.lastBoundFramebuffer);
if(self.scissorTest){
self.realEnable.call(gl, gl.SCISSOR_TEST);
}
self.realColorMask.apply(gl, self.colorMask);
self.realViewport.apply(gl, self.viewport);
self.realClearColor.apply(gl, self.clearColor);
});
if(this.cardboardUI){
this.cardboardUI.onResize();
}};
CardboardDistorter.prototype.patch=function (){
if(this.isPatched){
return;
}
var self=this;
var canvas=this.gl.canvas;
var gl=this.gl;
if(!isIOS()){
canvas.width=getScreenWidth() * this.bufferScale;
canvas.height=getScreenHeight() * this.bufferScale;
Object.defineProperty(canvas, 'width', {
configurable: true,
enumerable: true,
get: function get(){
return self.bufferWidth;
},
set: function set(value){
self.bufferWidth=value;
self.realCanvasWidth.set.call(canvas, value);
self.onResize();
}});
Object.defineProperty(canvas, 'height', {
configurable: true,
enumerable: true,
get: function get(){
return self.bufferHeight;
},
set: function set(value){
self.bufferHeight=value;
self.realCanvasHeight.set.call(canvas, value);
self.onResize();
}});
}
this.lastBoundFramebuffer=gl.getParameter(gl.FRAMEBUFFER_BINDING);
if(this.lastBoundFramebuffer==null){
this.lastBoundFramebuffer=this.framebuffer;
this.gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
}
this.gl.bindFramebuffer=function (target, framebuffer){
self.lastBoundFramebuffer=framebuffer ? framebuffer:self.framebuffer;
self.realBindFramebuffer.call(gl, target, self.lastBoundFramebuffer);
};
this.cullFace=gl.getParameter(gl.CULL_FACE);
this.depthTest=gl.getParameter(gl.DEPTH_TEST);
this.blend=gl.getParameter(gl.BLEND);
this.scissorTest=gl.getParameter(gl.SCISSOR_TEST);
this.stencilTest=gl.getParameter(gl.STENCIL_TEST);
gl.enable=function (pname){
switch (pname){
case gl.CULL_FACE:
self.cullFace=true;break;
case gl.DEPTH_TEST:
self.depthTest=true;break;
case gl.BLEND:
self.blend=true;break;
case gl.SCISSOR_TEST:
self.scissorTest=true;break;
case gl.STENCIL_TEST:
self.stencilTest=true;break;
}
self.realEnable.call(gl, pname);
};
gl.disable=function (pname){
switch (pname){
case gl.CULL_FACE:
self.cullFace=false;break;
case gl.DEPTH_TEST:
self.depthTest=false;break;
case gl.BLEND:
self.blend=false;break;
case gl.SCISSOR_TEST:
self.scissorTest=false;break;
case gl.STENCIL_TEST:
self.stencilTest=false;break;
}
self.realDisable.call(gl, pname);
};
this.colorMask=gl.getParameter(gl.COLOR_WRITEMASK);
gl.colorMask=function (r, g, b, a){
self.colorMask[0]=r;
self.colorMask[1]=g;
self.colorMask[2]=b;
self.colorMask[3]=a;
self.realColorMask.call(gl, r, g, b, a);
};
this.clearColor=gl.getParameter(gl.COLOR_CLEAR_VALUE);
gl.clearColor=function (r, g, b, a){
self.clearColor[0]=r;
self.clearColor[1]=g;
self.clearColor[2]=b;
self.clearColor[3]=a;
self.realClearColor.call(gl, r, g, b, a);
};
this.viewport=gl.getParameter(gl.VIEWPORT);
gl.viewport=function (x, y, w, h){
self.viewport[0]=x;
self.viewport[1]=y;
self.viewport[2]=w;
self.viewport[3]=h;
self.realViewport.call(gl, x, y, w, h);
};
this.isPatched=true;
safariCssSizeWorkaround(canvas);
};
CardboardDistorter.prototype.unpatch=function (){
if(!this.isPatched){
return;
}
var gl=this.gl;
var canvas=this.gl.canvas;
if(!isIOS()){
Object.defineProperty(canvas, 'width', this.realCanvasWidth);
Object.defineProperty(canvas, 'height', this.realCanvasHeight);
}
canvas.width=this.bufferWidth;
canvas.height=this.bufferHeight;
gl.bindFramebuffer=this.realBindFramebuffer;
gl.enable=this.realEnable;
gl.disable=this.realDisable;
gl.colorMask=this.realColorMask;
gl.clearColor=this.realClearColor;
gl.viewport=this.realViewport;
if(this.lastBoundFramebuffer==this.framebuffer){
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
}
this.isPatched=false;
setTimeout(function (){
safariCssSizeWorkaround(canvas);
}, 1);
};
CardboardDistorter.prototype.setTextureBounds=function (leftBounds, rightBounds){
if(!leftBounds){
leftBounds=[0, 0, 0.5, 1];
}
if(!rightBounds){
rightBounds=[0.5, 0, 0.5, 1];
}
this.viewportOffsetScale[0]=leftBounds[0];
this.viewportOffsetScale[1]=leftBounds[1];
this.viewportOffsetScale[2]=leftBounds[2];
this.viewportOffsetScale[3]=leftBounds[3];
this.viewportOffsetScale[4]=rightBounds[0];
this.viewportOffsetScale[5]=rightBounds[1];
this.viewportOffsetScale[6]=rightBounds[2];
this.viewportOffsetScale[7]=rightBounds[3];
};
CardboardDistorter.prototype.submitFrame=function (){
var gl=this.gl;
var self=this;
var glState=[];
if(!this.dirtySubmitFrameBindings){
glState.push(gl.CURRENT_PROGRAM, gl.ARRAY_BUFFER_BINDING, gl.ELEMENT_ARRAY_BUFFER_BINDING, gl.TEXTURE_BINDING_2D, gl.TEXTURE0);
}
glPreserveState(gl, glState, function (gl){
self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, null);
if(self.cullFace){
self.realDisable.call(gl, gl.CULL_FACE);
}
if(self.depthTest){
self.realDisable.call(gl, gl.DEPTH_TEST);
}
if(self.blend){
self.realDisable.call(gl, gl.BLEND);
}
if(self.scissorTest){
self.realDisable.call(gl, gl.SCISSOR_TEST);
}
if(self.stencilTest){
self.realDisable.call(gl, gl.STENCIL_TEST);
}
self.realColorMask.call(gl, true, true, true, true);
self.realViewport.call(gl, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
if(self.ctxAttribs.alpha||isIOS()){
self.realClearColor.call(gl, 0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
}
gl.useProgram(self.program);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, self.indexBuffer);
gl.bindBuffer(gl.ARRAY_BUFFER, self.vertexBuffer);
gl.enableVertexAttribArray(self.attribs.position);
gl.enableVertexAttribArray(self.attribs.texCoord);
gl.vertexAttribPointer(self.attribs.position, 2, gl.FLOAT, false, 20, 0);
gl.vertexAttribPointer(self.attribs.texCoord, 3, gl.FLOAT, false, 20, 8);
gl.activeTexture(gl.TEXTURE0);
gl.uniform1i(self.uniforms.diffuse, 0);
gl.bindTexture(gl.TEXTURE_2D, self.renderTarget);
gl.uniform4fv(self.uniforms.viewportOffsetScale, self.viewportOffsetScale);
gl.drawElements(gl.TRIANGLES, self.indexCount, gl.UNSIGNED_SHORT, 0);
if(self.cardboardUI){
self.cardboardUI.renderNoState();
}
self.realBindFramebuffer.call(self.gl, gl.FRAMEBUFFER, self.framebuffer);
if(!self.ctxAttribs.preserveDrawingBuffer){
self.realClearColor.call(gl, 0, 0, 0, 0);
gl.clear(gl.COLOR_BUFFER_BIT);
}
if(!self.dirtySubmitFrameBindings){
self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, self.lastBoundFramebuffer);
}
if(self.cullFace){
self.realEnable.call(gl, gl.CULL_FACE);
}
if(self.depthTest){
self.realEnable.call(gl, gl.DEPTH_TEST);
}
if(self.blend){
self.realEnable.call(gl, gl.BLEND);
}
if(self.scissorTest){
self.realEnable.call(gl, gl.SCISSOR_TEST);
}
if(self.stencilTest){
self.realEnable.call(gl, gl.STENCIL_TEST);
}
self.realColorMask.apply(gl, self.colorMask);
self.realViewport.apply(gl, self.viewport);
if(self.ctxAttribs.alpha||!self.ctxAttribs.preserveDrawingBuffer){
self.realClearColor.apply(gl, self.clearColor);
}});
if(isIOS()){
var canvas=gl.canvas;
if(canvas.width!=self.bufferWidth||canvas.height!=self.bufferHeight){
self.bufferWidth=canvas.width;
self.bufferHeight=canvas.height;
self.onResize();
}}
};
CardboardDistorter.prototype.updateDeviceInfo=function (deviceInfo){
var gl=this.gl;
var self=this;
var glState=[gl.ARRAY_BUFFER_BINDING, gl.ELEMENT_ARRAY_BUFFER_BINDING];
glPreserveState(gl, glState, function (gl){
var vertices=self.computeMeshVertices_(self.meshWidth, self.meshHeight, deviceInfo);
gl.bindBuffer(gl.ARRAY_BUFFER, self.vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
if(!self.indexCount){
var indices=self.computeMeshIndices_(self.meshWidth, self.meshHeight);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, self.indexBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
self.indexCount=indices.length;
}});
};
CardboardDistorter.prototype.computeMeshVertices_=function (width, height, deviceInfo){
var vertices=new Float32Array(2 * width * height * 5);
var lensFrustum=deviceInfo.getLeftEyeVisibleTanAngles();
var noLensFrustum=deviceInfo.getLeftEyeNoLensTanAngles();
var viewport=deviceInfo.getLeftEyeVisibleScreenRect(noLensFrustum);
var vidx=0;
for (var e=0; e < 2; e++){
for (var j=0; j < height; j++){
for (var i=0; i < width; i++, vidx++){
var u=i / (width - 1);
var v=j / (height - 1);
var s=u;
var t=v;
var x=lerp(lensFrustum[0], lensFrustum[2], u);
var y=lerp(lensFrustum[3], lensFrustum[1], v);
var d=Math.sqrt(x * x + y * y);
var r=deviceInfo.distortion.distortInverse(d);
var p=x * r / d;
var q=y * r / d;
u=(p - noLensFrustum[0]) / (noLensFrustum[2] - noLensFrustum[0]);
v=(q - noLensFrustum[3]) / (noLensFrustum[1] - noLensFrustum[3]);
u=(viewport.x + u * viewport.width - 0.5) * 2.0;
v=(viewport.y + v * viewport.height - 0.5) * 2.0;
vertices[vidx * 5 + 0]=u;
vertices[vidx * 5 + 1]=v;
vertices[vidx * 5 + 2]=s;
vertices[vidx * 5 + 3]=t;
vertices[vidx * 5 + 4]=e;
}}
var w=lensFrustum[2] - lensFrustum[0];
lensFrustum[0]=-(w + lensFrustum[0]);
lensFrustum[2]=w - lensFrustum[2];
w=noLensFrustum[2] - noLensFrustum[0];
noLensFrustum[0]=-(w + noLensFrustum[0]);
noLensFrustum[2]=w - noLensFrustum[2];
viewport.x=1 - (viewport.x + viewport.width);
}
return vertices;
};
CardboardDistorter.prototype.computeMeshIndices_=function (width, height){
var indices=new Uint16Array(2 * (width - 1) * (height - 1) * 6);
var halfwidth=width / 2;
var halfheight=height / 2;
var vidx=0;
var iidx=0;
for (var e=0; e < 2; e++){
for (var j=0; j < height; j++){
for (var i=0; i < width; i++, vidx++){
if(i==0||j==0) continue;
if(i <=halfwidth==j <=halfheight){
indices[iidx++]=vidx;
indices[iidx++]=vidx - width - 1;
indices[iidx++]=vidx - width;
indices[iidx++]=vidx - width - 1;
indices[iidx++]=vidx;
indices[iidx++]=vidx - 1;
}else{
indices[iidx++]=vidx - 1;
indices[iidx++]=vidx - width;
indices[iidx++]=vidx;
indices[iidx++]=vidx - width;
indices[iidx++]=vidx - 1;
indices[iidx++]=vidx - width - 1;
}}
}}
return indices;
};
CardboardDistorter.prototype.getOwnPropertyDescriptor_=function (proto, attrName){
var descriptor=Object.getOwnPropertyDescriptor(proto, attrName);
if(descriptor.get===undefined||descriptor.set===undefined){
descriptor.configurable=true;
descriptor.enumerable=true;
descriptor.get=function (){
return this.getAttribute(attrName);
};
descriptor.set=function (val){
this.setAttribute(attrName, val);
};}
return descriptor;
};
var uiVS=['attribute vec2 position;', 'uniform mat4 projectionMat;', 'void main(){', '  gl_Position=projectionMat * vec4(position, -1.0, 1.0);', '}'].join('\n');
var uiFS=['precision mediump float;', 'uniform vec4 color;', 'void main(){', '  gl_FragColor=color;', '}'].join('\n');
var DEG2RAD=Math.PI / 180.0;
var kAnglePerGearSection=60;
var kOuterRimEndAngle=12;
var kInnerRimBeginAngle=20;
var kOuterRadius=1;
var kMiddleRadius=0.75;
var kInnerRadius=0.3125;
var kCenterLineThicknessDp=4;
var kButtonWidthDp=28;
var kTouchSlopFactor=1.5;
function CardboardUI(gl){
this.gl=gl;
this.attribs={
position: 0
};
this.program=linkProgram(gl, uiVS, uiFS, this.attribs);
this.uniforms=getProgramUniforms(gl, this.program);
this.vertexBuffer=gl.createBuffer();
this.gearOffset=0;
this.gearVertexCount=0;
this.arrowOffset=0;
this.arrowVertexCount=0;
this.projMat=new Float32Array(16);
this.listener=null;
this.onResize();
}
CardboardUI.prototype.destroy=function (){
var gl=this.gl;
if(this.listener){
gl.canvas.removeEventListener('click', this.listener, false);
}
gl.deleteProgram(this.program);
gl.deleteBuffer(this.vertexBuffer);
};
CardboardUI.prototype.listen=function (optionsCallback, backCallback){
var canvas=this.gl.canvas;
this.listener=function (event){
var midline=canvas.clientWidth / 2;
var buttonSize=kButtonWidthDp * kTouchSlopFactor;
if(event.clientX > midline - buttonSize&&event.clientX < midline + buttonSize&&event.clientY > canvas.clientHeight - buttonSize){
optionsCallback(event);
}
else if(event.clientX < buttonSize&&event.clientY < buttonSize){
backCallback(event);
}};
canvas.addEventListener('click', this.listener, false);
};
CardboardUI.prototype.onResize=function (){
var gl=this.gl;
var self=this;
var glState=[gl.ARRAY_BUFFER_BINDING];
glPreserveState(gl, glState, function (gl){
var vertices=[];
var midline=gl.drawingBufferWidth / 2;
var physicalPixels=Math.max(screen.width, screen.height) * window.devicePixelRatio;
var scalingRatio=gl.drawingBufferWidth / physicalPixels;
var dps=scalingRatio * window.devicePixelRatio;
var lineWidth=kCenterLineThicknessDp * dps / 2;
var buttonSize=kButtonWidthDp * kTouchSlopFactor * dps;
var buttonScale=kButtonWidthDp * dps / 2;
var buttonBorder=(kButtonWidthDp * kTouchSlopFactor - kButtonWidthDp) * dps;
vertices.push(midline - lineWidth, buttonSize);
vertices.push(midline - lineWidth, gl.drawingBufferHeight);
vertices.push(midline + lineWidth, buttonSize);
vertices.push(midline + lineWidth, gl.drawingBufferHeight);
self.gearOffset=vertices.length / 2;
function addGearSegment(theta, r){
var angle=(90 - theta) * DEG2RAD;
var x=Math.cos(angle);
var y=Math.sin(angle);
vertices.push(kInnerRadius * x * buttonScale + midline, kInnerRadius * y * buttonScale + buttonScale);
vertices.push(r * x * buttonScale + midline, r * y * buttonScale + buttonScale);
}
for (var i=0; i <=6; i++){
var segmentTheta=i * kAnglePerGearSection;
addGearSegment(segmentTheta, kOuterRadius);
addGearSegment(segmentTheta + kOuterRimEndAngle, kOuterRadius);
addGearSegment(segmentTheta + kInnerRimBeginAngle, kMiddleRadius);
addGearSegment(segmentTheta + (kAnglePerGearSection - kInnerRimBeginAngle), kMiddleRadius);
addGearSegment(segmentTheta + (kAnglePerGearSection - kOuterRimEndAngle), kOuterRadius);
}
self.gearVertexCount=vertices.length / 2 - self.gearOffset;
self.arrowOffset=vertices.length / 2;
function addArrowVertex(x, y){
vertices.push(buttonBorder + x, gl.drawingBufferHeight - buttonBorder - y);
}
var angledLineWidth=lineWidth / Math.sin(45 * DEG2RAD);
addArrowVertex(0, buttonScale);
addArrowVertex(buttonScale, 0);
addArrowVertex(buttonScale + angledLineWidth, angledLineWidth);
addArrowVertex(angledLineWidth, buttonScale + angledLineWidth);
addArrowVertex(angledLineWidth, buttonScale - angledLineWidth);
addArrowVertex(0, buttonScale);
addArrowVertex(buttonScale, buttonScale * 2);
addArrowVertex(buttonScale + angledLineWidth, buttonScale * 2 - angledLineWidth);
addArrowVertex(angledLineWidth, buttonScale - angledLineWidth);
addArrowVertex(0, buttonScale);
addArrowVertex(angledLineWidth, buttonScale - lineWidth);
addArrowVertex(kButtonWidthDp * dps, buttonScale - lineWidth);
addArrowVertex(angledLineWidth, buttonScale + lineWidth);
addArrowVertex(kButtonWidthDp * dps, buttonScale + lineWidth);
self.arrowVertexCount=vertices.length / 2 - self.arrowOffset;
gl.bindBuffer(gl.ARRAY_BUFFER, self.vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
});
};
CardboardUI.prototype.render=function (){
var gl=this.gl;
var self=this;
var glState=[gl.CULL_FACE, gl.DEPTH_TEST, gl.BLEND, gl.SCISSOR_TEST, gl.STENCIL_TEST, gl.COLOR_WRITEMASK, gl.VIEWPORT, gl.CURRENT_PROGRAM, gl.ARRAY_BUFFER_BINDING];
glPreserveState(gl, glState, function (gl){
gl.disable(gl.CULL_FACE);
gl.disable(gl.DEPTH_TEST);
gl.disable(gl.BLEND);
gl.disable(gl.SCISSOR_TEST);
gl.disable(gl.STENCIL_TEST);
gl.colorMask(true, true, true, true);
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
self.renderNoState();
});
};
CardboardUI.prototype.renderNoState=function (){
var gl=this.gl;
gl.useProgram(this.program);
gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
gl.enableVertexAttribArray(this.attribs.position);
gl.vertexAttribPointer(this.attribs.position, 2, gl.FLOAT, false, 8, 0);
gl.uniform4f(this.uniforms.color, 1.0, 1.0, 1.0, 1.0);
orthoMatrix(this.projMat, 0, gl.drawingBufferWidth, 0, gl.drawingBufferHeight, 0.1, 1024.0);
gl.uniformMatrix4fv(this.uniforms.projectionMat, false, this.projMat);
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
gl.drawArrays(gl.TRIANGLE_STRIP, this.gearOffset, this.gearVertexCount);
gl.drawArrays(gl.TRIANGLE_STRIP, this.arrowOffset, this.arrowVertexCount);
};
function Distortion(coefficients){
this.coefficients=coefficients;
}
Distortion.prototype.distortInverse=function (radius){
var r0=0;
var r1=1;
var dr0=radius - this.distort(r0);
while (Math.abs(r1 - r0) > 0.0001){
var dr1=radius - this.distort(r1);
var r2=r1 - dr1 * ((r1 - r0) / (dr1 - dr0));
r0=r1;
r1=r2;
dr0=dr1;
}
return r1;
};
Distortion.prototype.distort=function (radius){
var r2=radius * radius;
var ret=0;
for (var i=0; i < this.coefficients.length; i++){
ret=r2 * (ret + this.coefficients[i]);
}
return (ret + 1) * radius;
};
var degToRad=Math.PI / 180;
var radToDeg=180 / Math.PI;
var Vector3=function Vector3(x, y, z){
this.x=x||0;
this.y=y||0;
this.z=z||0;
};
Vector3.prototype={
constructor: Vector3,
set: function set(x, y, z){
this.x=x;
this.y=y;
this.z=z;
return this;
},
copy: function copy(v){
this.x=v.x;
this.y=v.y;
this.z=v.z;
return this;
},
length: function length(){
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
},
normalize: function normalize(){
var scalar=this.length();
if(scalar!==0){
var invScalar=1 / scalar;
this.multiplyScalar(invScalar);
}else{
this.x=0;
this.y=0;
this.z=0;
}
return this;
},
multiplyScalar: function multiplyScalar(scalar){
this.x *=scalar;
this.y *=scalar;
this.z *=scalar;
},
applyQuaternion: function applyQuaternion(q){
var x=this.x;
var y=this.y;
var z=this.z;
var qx=q.x;
var qy=q.y;
var qz=q.z;
var qw=q.w;
var ix=qw * x + qy * z - qz * y;
var iy=qw * y + qz * x - qx * z;
var iz=qw * z + qx * y - qy * x;
var iw=-qx * x - qy * y - qz * z;
this.x=ix * qw + iw * -qx + iy * -qz - iz * -qy;
this.y=iy * qw + iw * -qy + iz * -qx - ix * -qz;
this.z=iz * qw + iw * -qz + ix * -qy - iy * -qx;
return this;
},
dot: function dot(v){
return this.x * v.x + this.y * v.y + this.z * v.z;
},
crossVectors: function crossVectors(a, b){
var ax=a.x,
ay=a.y,
az=a.z;
var bx=b.x,
by=b.y,
bz=b.z;
this.x=ay * bz - az * by;
this.y=az * bx - ax * bz;
this.z=ax * by - ay * bx;
return this;
}};
var Quaternion=function Quaternion(x, y, z, w){
this.x=x||0;
this.y=y||0;
this.z=z||0;
this.w=w!==undefined ? w:1;
};
Quaternion.prototype={
constructor: Quaternion,
set: function set(x, y, z, w){
this.x=x;
this.y=y;
this.z=z;
this.w=w;
return this;
},
copy: function copy(quaternion){
this.x=quaternion.x;
this.y=quaternion.y;
this.z=quaternion.z;
this.w=quaternion.w;
return this;
},
setFromEulerXYZ: function setFromEulerXYZ(x, y, z){
var c1=Math.cos(x / 2);
var c2=Math.cos(y / 2);
var c3=Math.cos(z / 2);
var s1=Math.sin(x / 2);
var s2=Math.sin(y / 2);
var s3=Math.sin(z / 2);
this.x=s1 * c2 * c3 + c1 * s2 * s3;
this.y=c1 * s2 * c3 - s1 * c2 * s3;
this.z=c1 * c2 * s3 + s1 * s2 * c3;
this.w=c1 * c2 * c3 - s1 * s2 * s3;
return this;
},
setFromEulerYXZ: function setFromEulerYXZ(x, y, z){
var c1=Math.cos(x / 2);
var c2=Math.cos(y / 2);
var c3=Math.cos(z / 2);
var s1=Math.sin(x / 2);
var s2=Math.sin(y / 2);
var s3=Math.sin(z / 2);
this.x=s1 * c2 * c3 + c1 * s2 * s3;
this.y=c1 * s2 * c3 - s1 * c2 * s3;
this.z=c1 * c2 * s3 - s1 * s2 * c3;
this.w=c1 * c2 * c3 + s1 * s2 * s3;
return this;
},
setFromAxisAngle: function setFromAxisAngle(axis, angle){
var halfAngle=angle / 2,
s=Math.sin(halfAngle);
this.x=axis.x * s;
this.y=axis.y * s;
this.z=axis.z * s;
this.w=Math.cos(halfAngle);
return this;
},
multiply: function multiply(q){
return this.multiplyQuaternions(this, q);
},
multiplyQuaternions: function multiplyQuaternions(a, b){
var qax=a.x,
qay=a.y,
qaz=a.z,
qaw=a.w;
var qbx=b.x,
qby=b.y,
qbz=b.z,
qbw=b.w;
this.x=qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
this.y=qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
this.z=qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
this.w=qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
return this;
},
inverse: function inverse(){
this.x *=-1;
this.y *=-1;
this.z *=-1;
this.normalize();
return this;
},
normalize: function normalize(){
var l=Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);
if(l===0){
this.x=0;
this.y=0;
this.z=0;
this.w=1;
}else{
l=1 / l;
this.x=this.x * l;
this.y=this.y * l;
this.z=this.z * l;
this.w=this.w * l;
}
return this;
},
slerp: function slerp(qb, t){
if(t===0) return this;
if(t===1) return this.copy(qb);
var x=this.x,
y=this.y,
z=this.z,
w=this.w;
var cosHalfTheta=w * qb.w + x * qb.x + y * qb.y + z * qb.z;
if(cosHalfTheta < 0){
this.w=-qb.w;
this.x=-qb.x;
this.y=-qb.y;
this.z=-qb.z;
cosHalfTheta=-cosHalfTheta;
}else{
this.copy(qb);
}
if(cosHalfTheta >=1.0){
this.w=w;
this.x=x;
this.y=y;
this.z=z;
return this;
}
var halfTheta=Math.acos(cosHalfTheta);
var sinHalfTheta=Math.sqrt(1.0 - cosHalfTheta * cosHalfTheta);
if(Math.abs(sinHalfTheta) < 0.001){
this.w=0.5 * (w + this.w);
this.x=0.5 * (x + this.x);
this.y=0.5 * (y + this.y);
this.z=0.5 * (z + this.z);
return this;
}
var ratioA=Math.sin((1 - t) * halfTheta) / sinHalfTheta,
ratioB=Math.sin(t * halfTheta) / sinHalfTheta;
this.w=w * ratioA + this.w * ratioB;
this.x=x * ratioA + this.x * ratioB;
this.y=y * ratioA + this.y * ratioB;
this.z=z * ratioA + this.z * ratioB;
return this;
},
setFromUnitVectors: function (){
var v1, r;
var EPS=0.000001;
return function (vFrom, vTo){
if(v1===undefined) v1=new Vector3();
r=vFrom.dot(vTo) + 1;
if(r < EPS){
r=0;
if(Math.abs(vFrom.x) > Math.abs(vFrom.z)){
v1.set(-vFrom.y, vFrom.x, 0);
}else{
v1.set(0, -vFrom.z, vFrom.y);
}}else{
v1.crossVectors(vFrom, vTo);
}
this.x=v1.x;
this.y=v1.y;
this.z=v1.z;
this.w=r;
this.normalize();
return this;
};}()
};
function Device(params){
this.width=params.width||getScreenWidth();
this.height=params.height||getScreenHeight();
this.widthMeters=params.widthMeters;
this.heightMeters=params.heightMeters;
this.bevelMeters=params.bevelMeters;
}
var DEFAULT_ANDROID=new Device({
widthMeters: 0.110,
heightMeters: 0.062,
bevelMeters: 0.004
});
var DEFAULT_IOS=new Device({
widthMeters: 0.1038,
heightMeters: 0.0584,
bevelMeters: 0.004
});
var Viewers={
CardboardV1: new CardboardViewer({
id: 'CardboardV1',
label: 'Cardboard I/O 2014',
fov: 40,
interLensDistance: 0.060,
baselineLensDistance: 0.035,
screenLensDistance: 0.042,
distortionCoefficients: [0.441, 0.156],
inverseCoefficients: [-0.4410035, 0.42756155, -0.4804439, 0.5460139, -0.58821183, 0.5733938, -0.48303202, 0.33299083, -0.17573841, 0.0651772, -0.01488963, 0.001559834]
}),
CardboardV2: new CardboardViewer({
id: 'CardboardV2',
label: 'Cardboard I/O 2015',
fov: 60,
interLensDistance: 0.064,
baselineLensDistance: 0.035,
screenLensDistance: 0.039,
distortionCoefficients: [0.34, 0.55],
inverseCoefficients: [-0.33836704, -0.18162185, 0.862655, -1.2462051, 1.0560602, -0.58208317, 0.21609078, -0.05444823, 0.009177956, -9.904169E-4, 6.183535E-5, -1.6981803E-6]
})
};
function DeviceInfo(deviceParams, additionalViewers){
this.viewer=Viewers.CardboardV2;
this.updateDeviceParams(deviceParams);
this.distortion=new Distortion(this.viewer.distortionCoefficients);
for (var i=0; i < additionalViewers.length; i++){
var viewer=additionalViewers[i];
Viewers[viewer.id]=new CardboardViewer(viewer);
}}
DeviceInfo.prototype.updateDeviceParams=function (deviceParams){
this.device=this.determineDevice_(deviceParams)||this.device;
};
DeviceInfo.prototype.getDevice=function (){
return this.device;
};
DeviceInfo.prototype.setViewer=function (viewer){
this.viewer=viewer;
this.distortion=new Distortion(this.viewer.distortionCoefficients);
};
DeviceInfo.prototype.determineDevice_=function (deviceParams){
if(!deviceParams){
if(isIOS()){
console.warn('Using fallback iOS device measurements.');
return DEFAULT_IOS;
}else{
console.warn('Using fallback Android device measurements.');
return DEFAULT_ANDROID;
}}
var METERS_PER_INCH=0.0254;
var metersPerPixelX=METERS_PER_INCH / deviceParams.xdpi;
var metersPerPixelY=METERS_PER_INCH / deviceParams.ydpi;
var width=getScreenWidth();
var height=getScreenHeight();
return new Device({
widthMeters: metersPerPixelX * width,
heightMeters: metersPerPixelY * height,
bevelMeters: deviceParams.bevelMm * 0.001
});
};
DeviceInfo.prototype.getDistortedFieldOfViewLeftEye=function (){
var viewer=this.viewer;
var device=this.device;
var distortion=this.distortion;
var eyeToScreenDistance=viewer.screenLensDistance;
var outerDist=(device.widthMeters - viewer.interLensDistance) / 2;
var innerDist=viewer.interLensDistance / 2;
var bottomDist=viewer.baselineLensDistance - device.bevelMeters;
var topDist=device.heightMeters - bottomDist;
var outerAngle=radToDeg * Math.atan(distortion.distort(outerDist / eyeToScreenDistance));
var innerAngle=radToDeg * Math.atan(distortion.distort(innerDist / eyeToScreenDistance));
var bottomAngle=radToDeg * Math.atan(distortion.distort(bottomDist / eyeToScreenDistance));
var topAngle=radToDeg * Math.atan(distortion.distort(topDist / eyeToScreenDistance));
return {
leftDegrees: Math.min(outerAngle, viewer.fov),
rightDegrees: Math.min(innerAngle, viewer.fov),
downDegrees: Math.min(bottomAngle, viewer.fov),
upDegrees: Math.min(topAngle, viewer.fov)
};};
DeviceInfo.prototype.getLeftEyeVisibleTanAngles=function (){
var viewer=this.viewer;
var device=this.device;
var distortion=this.distortion;
var fovLeft=Math.tan(-degToRad * viewer.fov);
var fovTop=Math.tan(degToRad * viewer.fov);
var fovRight=Math.tan(degToRad * viewer.fov);
var fovBottom=Math.tan(-degToRad * viewer.fov);
var halfWidth=device.widthMeters / 4;
var halfHeight=device.heightMeters / 2;
var verticalLensOffset=viewer.baselineLensDistance - device.bevelMeters - halfHeight;
var centerX=viewer.interLensDistance / 2 - halfWidth;
var centerY=-verticalLensOffset;
var centerZ=viewer.screenLensDistance;
var screenLeft=distortion.distort((centerX - halfWidth) / centerZ);
var screenTop=distortion.distort((centerY + halfHeight) / centerZ);
var screenRight=distortion.distort((centerX + halfWidth) / centerZ);
var screenBottom=distortion.distort((centerY - halfHeight) / centerZ);
var result=new Float32Array(4);
result[0]=Math.max(fovLeft, screenLeft);
result[1]=Math.min(fovTop, screenTop);
result[2]=Math.min(fovRight, screenRight);
result[3]=Math.max(fovBottom, screenBottom);
return result;
};
DeviceInfo.prototype.getLeftEyeNoLensTanAngles=function (){
var viewer=this.viewer;
var device=this.device;
var distortion=this.distortion;
var result=new Float32Array(4);
var fovLeft=distortion.distortInverse(Math.tan(-degToRad * viewer.fov));
var fovTop=distortion.distortInverse(Math.tan(degToRad * viewer.fov));
var fovRight=distortion.distortInverse(Math.tan(degToRad * viewer.fov));
var fovBottom=distortion.distortInverse(Math.tan(-degToRad * viewer.fov));
var halfWidth=device.widthMeters / 4;
var halfHeight=device.heightMeters / 2;
var verticalLensOffset=viewer.baselineLensDistance - device.bevelMeters - halfHeight;
var centerX=viewer.interLensDistance / 2 - halfWidth;
var centerY=-verticalLensOffset;
var centerZ=viewer.screenLensDistance;
var screenLeft=(centerX - halfWidth) / centerZ;
var screenTop=(centerY + halfHeight) / centerZ;
var screenRight=(centerX + halfWidth) / centerZ;
var screenBottom=(centerY - halfHeight) / centerZ;
result[0]=Math.max(fovLeft, screenLeft);
result[1]=Math.min(fovTop, screenTop);
result[2]=Math.min(fovRight, screenRight);
result[3]=Math.max(fovBottom, screenBottom);
return result;
};
DeviceInfo.prototype.getLeftEyeVisibleScreenRect=function (undistortedFrustum){
var viewer=this.viewer;
var device=this.device;
var dist=viewer.screenLensDistance;
var eyeX=(device.widthMeters - viewer.interLensDistance) / 2;
var eyeY=viewer.baselineLensDistance - device.bevelMeters;
var left=(undistortedFrustum[0] * dist + eyeX) / device.widthMeters;
var top=(undistortedFrustum[1] * dist + eyeY) / device.heightMeters;
var right=(undistortedFrustum[2] * dist + eyeX) / device.widthMeters;
var bottom=(undistortedFrustum[3] * dist + eyeY) / device.heightMeters;
return {
x: left,
y: bottom,
width: right - left,
height: top - bottom
};};
DeviceInfo.prototype.getFieldOfViewLeftEye=function (opt_isUndistorted){
return opt_isUndistorted ? this.getUndistortedFieldOfViewLeftEye():this.getDistortedFieldOfViewLeftEye();
};
DeviceInfo.prototype.getFieldOfViewRightEye=function (opt_isUndistorted){
var fov=this.getFieldOfViewLeftEye(opt_isUndistorted);
return {
leftDegrees: fov.rightDegrees,
rightDegrees: fov.leftDegrees,
upDegrees: fov.upDegrees,
downDegrees: fov.downDegrees
};};
DeviceInfo.prototype.getUndistortedFieldOfViewLeftEye=function (){
var p=this.getUndistortedParams_();
return {
leftDegrees: radToDeg * Math.atan(p.outerDist),
rightDegrees: radToDeg * Math.atan(p.innerDist),
downDegrees: radToDeg * Math.atan(p.bottomDist),
upDegrees: radToDeg * Math.atan(p.topDist)
};};
DeviceInfo.prototype.getUndistortedViewportLeftEye=function (){
var p=this.getUndistortedParams_();
var viewer=this.viewer;
var device=this.device;
var eyeToScreenDistance=viewer.screenLensDistance;
var screenWidth=device.widthMeters / eyeToScreenDistance;
var screenHeight=device.heightMeters / eyeToScreenDistance;
var xPxPerTanAngle=device.width / screenWidth;
var yPxPerTanAngle=device.height / screenHeight;
var x=Math.round((p.eyePosX - p.outerDist) * xPxPerTanAngle);
var y=Math.round((p.eyePosY - p.bottomDist) * yPxPerTanAngle);
return {
x: x,
y: y,
width: Math.round((p.eyePosX + p.innerDist) * xPxPerTanAngle) - x,
height: Math.round((p.eyePosY + p.topDist) * yPxPerTanAngle) - y
};};
DeviceInfo.prototype.getUndistortedParams_=function (){
var viewer=this.viewer;
var device=this.device;
var distortion=this.distortion;
var eyeToScreenDistance=viewer.screenLensDistance;
var halfLensDistance=viewer.interLensDistance / 2 / eyeToScreenDistance;
var screenWidth=device.widthMeters / eyeToScreenDistance;
var screenHeight=device.heightMeters / eyeToScreenDistance;
var eyePosX=screenWidth / 2 - halfLensDistance;
var eyePosY=(viewer.baselineLensDistance - device.bevelMeters) / eyeToScreenDistance;
var maxFov=viewer.fov;
var viewerMax=distortion.distortInverse(Math.tan(degToRad * maxFov));
var outerDist=Math.min(eyePosX, viewerMax);
var innerDist=Math.min(halfLensDistance, viewerMax);
var bottomDist=Math.min(eyePosY, viewerMax);
var topDist=Math.min(screenHeight - eyePosY, viewerMax);
return {
outerDist: outerDist,
innerDist: innerDist,
topDist: topDist,
bottomDist: bottomDist,
eyePosX: eyePosX,
eyePosY: eyePosY
};};
function CardboardViewer(params){
this.id=params.id;
this.label=params.label;
this.fov=params.fov;
this.interLensDistance=params.interLensDistance;
this.baselineLensDistance=params.baselineLensDistance;
this.screenLensDistance=params.screenLensDistance;
this.distortionCoefficients=params.distortionCoefficients;
this.inverseCoefficients=params.inverseCoefficients;
}
DeviceInfo.Viewers=Viewers;
var format=1;
var last_updated="2018-02-20T22:55:10Z";
var devices=[{"type":"android","rules":[{"mdmh":"asusASUS_Z00AD/*"},{"ua":"ASUS_Z00AD"}],"dpi":[403,404.6],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"Google/*/Pixel XL/*"},{"ua":"Pixel XL"}],"dpi":[537.9,533],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"Google/*/Pixel/*"},{"ua":"Pixel"}],"dpi":[432.6,436.7],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"HTC/*/HTC6435LVW/*"},{"ua":"HTC6435LVW"}],"dpi":[449.7,443.3],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"HTC/*/HTC One XL/*"},{"ua":"HTC One XL"}],"dpi":[315.3,314.6],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"htc/*/Nexus 9/*"},{"ua":"Nexus 9"}],"dpi":289,"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"HTC/*/HTC One M9/*"},{"ua":"HTC One M9"}],"dpi":[442.5,443.3],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"HTC/*/HTC One_M8/*"},{"ua":"HTC One_M8"}],"dpi":[449.7,447.4],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"HTC/*/HTC One/*"},{"ua":"HTC One"}],"dpi":472.8,"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"Huawei/*/Nexus 6P/*"},{"ua":"Nexus 6P"}],"dpi":[515.1,518],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"LENOVO/*/Lenovo PB2-690Y/*"},{"ua":"Lenovo PB2-690Y"}],"dpi":[457.2,454.713],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"LGE/*/Nexus 5X/*"},{"ua":"Nexus 5X"}],"dpi":[422,419.9],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"LGE/*/LGMS345/*"},{"ua":"LGMS345"}],"dpi":[221.7,219.1],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"LGE/*/LG-D800/*"},{"ua":"LG-D800"}],"dpi":[422,424.1],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"LGE/*/LG-D850/*"},{"ua":"LG-D850"}],"dpi":[537.9,541.9],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"LGE/*/VS985 4G/*"},{"ua":"VS985 4G"}],"dpi":[537.9,535.6],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"LGE/*/Nexus 5/*"},{"ua":"Nexus 5 B"}],"dpi":[442.4,444.8],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"LGE/*/Nexus 4/*"},{"ua":"Nexus 4"}],"dpi":[319.8,318.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"LGE/*/LG-P769/*"},{"ua":"LG-P769"}],"dpi":[240.6,247.5],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"LGE/*/LGMS323/*"},{"ua":"LGMS323"}],"dpi":[206.6,204.6],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"LGE/*/LGLS996/*"},{"ua":"LGLS996"}],"dpi":[403.4,401.5],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"Micromax/*/4560MMX/*"},{"ua":"4560MMX"}],"dpi":[240,219.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"Micromax/*/A250/*"},{"ua":"Micromax A250"}],"dpi":[480,446.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"Micromax/*/Micromax AQ4501/*"},{"ua":"Micromax AQ4501"}],"dpi":240,"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"motorola/*/G5/*"},{"ua":"Moto G (5) Plus"}],"dpi":[403.4,403],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"motorola/*/DROID RAZR/*"},{"ua":"DROID RAZR"}],"dpi":[368.1,256.7],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"motorola/*/XT830C/*"},{"ua":"XT830C"}],"dpi":[254,255.9],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"motorola/*/XT1021/*"},{"ua":"XT1021"}],"dpi":[254,256.7],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"motorola/*/XT1023/*"},{"ua":"XT1023"}],"dpi":[254,256.7],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"motorola/*/XT1028/*"},{"ua":"XT1028"}],"dpi":[326.6,327.6],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"motorola/*/XT1034/*"},{"ua":"XT1034"}],"dpi":[326.6,328.4],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"motorola/*/XT1053/*"},{"ua":"XT1053"}],"dpi":[315.3,316.1],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"motorola/*/XT1562/*"},{"ua":"XT1562"}],"dpi":[403.4,402.7],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"motorola/*/Nexus 6/*"},{"ua":"Nexus 6 B"}],"dpi":[494.3,489.7],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"motorola/*/XT1063/*"},{"ua":"XT1063"}],"dpi":[295,296.6],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"motorola/*/XT1064/*"},{"ua":"XT1064"}],"dpi":[295,295.6],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"motorola/*/XT1092/*"},{"ua":"XT1092"}],"dpi":[422,424.1],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"motorola/*/XT1095/*"},{"ua":"XT1095"}],"dpi":[422,423.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"motorola/*/G4/*"},{"ua":"Moto G (4)"}],"dpi":401,"bw":4,"ac":1000},{"type":"android","rules":[{"mdmh":"OnePlus/*/A0001/*"},{"ua":"A0001"}],"dpi":[403.4,401],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"OnePlus/*/ONE E1005/*"},{"ua":"ONE E1005"}],"dpi":[442.4,441.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"OnePlus/*/ONE A2005/*"},{"ua":"ONE A2005"}],"dpi":[391.9,405.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"OnePlus/*/ONEPLUS A5000/*"},{"ua":"ONEPLUS A5000 "}],"dpi":[403.411,399.737],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"OnePlus/*/ONE A5010/*"},{"ua":"ONEPLUS A5010"}],"dpi":[403,400],"bw":2,"ac":1000},{"type":"android","rules":[{"mdmh":"OPPO/*/X909/*"},{"ua":"X909"}],"dpi":[442.4,444.1],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/GT-I9082/*"},{"ua":"GT-I9082"}],"dpi":[184.7,185.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G360P/*"},{"ua":"SM-G360P"}],"dpi":[196.7,205.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/Nexus S/*"},{"ua":"Nexus S"}],"dpi":[234.5,229.8],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/GT-I9300/*"},{"ua":"GT-I9300"}],"dpi":[304.8,303.9],"bw":5,"ac":500},{"type":"android","rules":[{"mdmh":"samsung/*/SM-T230NU/*"},{"ua":"SM-T230NU"}],"dpi":216,"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"samsung/*/SGH-T399/*"},{"ua":"SGH-T399"}],"dpi":[217.7,231.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SGH-M919/*"},{"ua":"SGH-M919"}],"dpi":[440.8,437.7],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-N9005/*"},{"ua":"SM-N9005"}],"dpi":[386.4,387],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"samsung/*/SAMSUNG-SM-N900A/*"},{"ua":"SAMSUNG-SM-N900A"}],"dpi":[386.4,387.7],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/GT-I9500/*"},{"ua":"GT-I9500"}],"dpi":[442.5,443.3],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"samsung/*/GT-I9505/*"},{"ua":"GT-I9505"}],"dpi":439.4,"bw":4,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G900F/*"},{"ua":"SM-G900F"}],"dpi":[415.6,431.6],"bw":5,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G900M/*"},{"ua":"SM-G900M"}],"dpi":[415.6,431.6],"bw":5,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G800F/*"},{"ua":"SM-G800F"}],"dpi":326.8,"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G906S/*"},{"ua":"SM-G906S"}],"dpi":[562.7,572.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/GT-I9300/*"},{"ua":"GT-I9300"}],"dpi":[306.7,304.8],"bw":5,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-T535/*"},{"ua":"SM-T535"}],"dpi":[142.6,136.4],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"samsung/*/SM-N920C/*"},{"ua":"SM-N920C"}],"dpi":[515.1,518.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-N920P/*"},{"ua":"SM-N920P"}],"dpi":[386.3655,390.144],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-N920W8/*"},{"ua":"SM-N920W8"}],"dpi":[515.1,518.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/GT-I9300I/*"},{"ua":"GT-I9300I"}],"dpi":[304.8,305.8],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/GT-I9195/*"},{"ua":"GT-I9195"}],"dpi":[249.4,256.7],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"samsung/*/SPH-L520/*"},{"ua":"SPH-L520"}],"dpi":[249.4,255.9],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SAMSUNG-SGH-I717/*"},{"ua":"SAMSUNG-SGH-I717"}],"dpi":285.8,"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SPH-D710/*"},{"ua":"SPH-D710"}],"dpi":[217.7,204.2],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/GT-N7100/*"},{"ua":"GT-N7100"}],"dpi":265.1,"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SCH-I605/*"},{"ua":"SCH-I605"}],"dpi":265.1,"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/Galaxy Nexus/*"},{"ua":"Galaxy Nexus"}],"dpi":[315.3,314.2],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-N910H/*"},{"ua":"SM-N910H"}],"dpi":[515.1,518],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-N910C/*"},{"ua":"SM-N910C"}],"dpi":[515.2,520.2],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G130M/*"},{"ua":"SM-G130M"}],"dpi":[165.9,164.8],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G928I/*"},{"ua":"SM-G928I"}],"dpi":[515.1,518.4],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G920F/*"},{"ua":"SM-G920F"}],"dpi":580.6,"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G920P/*"},{"ua":"SM-G920P"}],"dpi":[522.5,577],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G925F/*"},{"ua":"SM-G925F"}],"dpi":580.6,"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G925V/*"},{"ua":"SM-G925V"}],"dpi":[522.5,576.6],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G930F/*"},{"ua":"SM-G930F"}],"dpi":576.6,"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G935F/*"},{"ua":"SM-G935F"}],"dpi":533,"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G950F/*"},{"ua":"SM-G950F"}],"dpi":[562.707,565.293],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"samsung/*/SM-G955U/*"},{"ua":"SM-G955U"}],"dpi":[522.514,525.762],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"Sony/*/C6903/*"},{"ua":"C6903"}],"dpi":[442.5,443.3],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"Sony/*/D6653/*"},{"ua":"D6653"}],"dpi":[428.6,427.6],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"Sony/*/E6653/*"},{"ua":"E6653"}],"dpi":[428.6,425.7],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"Sony/*/E6853/*"},{"ua":"E6853"}],"dpi":[403.4,401.9],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"Sony/*/SGP321/*"},{"ua":"SGP321"}],"dpi":[224.7,224.1],"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"TCT/*/ALCATEL ONE TOUCH Fierce/*"},{"ua":"ALCATEL ONE TOUCH Fierce"}],"dpi":[240,247.5],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"THL/*/thl 5000/*"},{"ua":"thl 5000"}],"dpi":[480,443.3],"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"Fly/*/IQ4412/*"},{"ua":"IQ4412"}],"dpi":307.9,"bw":3,"ac":1000},{"type":"android","rules":[{"mdmh":"ZTE/*/ZTE Blade L2/*"},{"ua":"ZTE Blade L2"}],"dpi":240,"bw":3,"ac":500},{"type":"android","rules":[{"mdmh":"BENEVE/*/VR518/*"},{"ua":"VR518"}],"dpi":480,"bw":3,"ac":500},{"type":"ios","rules":[{"res":[640,960]}],"dpi":[325.1,328.4],"bw":4,"ac":1000},{"type":"ios","rules":[{"res":[640,1136]}],"dpi":[317.1,320.2],"bw":3,"ac":1000},{"type":"ios","rules":[{"res":[750,1334]}],"dpi":326.4,"bw":4,"ac":1000},{"type":"ios","rules":[{"res":[1242,2208]}],"dpi":[453.6,458.4],"bw":4,"ac":1000},{"type":"ios","rules":[{"res":[1125,2001]}],"dpi":[410.9,415.4],"bw":4,"ac":1000},{"type":"ios","rules":[{"res":[1125,2436]}],"dpi":458,"bw":4,"ac":1000}];
var DPDB_CACHE={
format: format,
last_updated: last_updated,
devices: devices
};
function Dpdb(url, onDeviceParamsUpdated){
this.dpdb=DPDB_CACHE;
this.recalculateDeviceParams_();
if(url){
this.onDeviceParamsUpdated=onDeviceParamsUpdated;
var xhr=new XMLHttpRequest();
var obj=this;
xhr.open('GET', url, true);
xhr.addEventListener('load', function (){
obj.loading=false;
if(xhr.status >=200&&xhr.status <=299){
obj.dpdb=JSON.parse(xhr.response);
obj.recalculateDeviceParams_();
}else{
console.error('Error loading online DPDB!');
}});
xhr.send();
}}
Dpdb.prototype.getDeviceParams=function (){
return this.deviceParams;
};
Dpdb.prototype.recalculateDeviceParams_=function (){
var newDeviceParams=this.calcDeviceParams_();
if(newDeviceParams){
this.deviceParams=newDeviceParams;
if(this.onDeviceParamsUpdated){
this.onDeviceParamsUpdated(this.deviceParams);
}}else{
console.error('Failed to recalculate device parameters.');
}};
Dpdb.prototype.calcDeviceParams_=function (){
var db=this.dpdb;
if(!db){
console.error('DPDB not available.');
return null;
}
if(db.format!=1){
console.error('DPDB has unexpected format version.');
return null;
}
if(!db.devices||!db.devices.length){
console.error('DPDB does not have a devices section.');
return null;
}
var userAgent=navigator.userAgent||navigator.vendor||window.opera;
var width=getScreenWidth();
var height=getScreenHeight();
if(!db.devices){
console.error('DPDB has no devices section.');
return null;
}
for (var i=0; i < db.devices.length; i++){
var device=db.devices[i];
if(!device.rules){
console.warn('Device[' + i + '] has no rules section.');
continue;
}
if(device.type!='ios'&&device.type!='android'){
console.warn('Device[' + i + '] has invalid type.');
continue;
}
if(isIOS()!=(device.type=='ios')) continue;
var matched=false;
for (var j=0; j < device.rules.length; j++){
var rule=device.rules[j];
if(this.matchRule_(rule, userAgent, width, height)){
matched=true;
break;
}}
if(!matched) continue;
var xdpi=device.dpi[0]||device.dpi;
var ydpi=device.dpi[1]||device.dpi;
return new DeviceParams({ xdpi: xdpi, ydpi: ydpi, bevelMm: device.bw });
}
console.warn('No DPDB device match.');
return null;
};
Dpdb.prototype.matchRule_=function (rule, ua, screenWidth, screenHeight){
if(!rule.ua&&!rule.res) return false;
if(rule.ua&&ua.indexOf(rule.ua) < 0) return false;
if(rule.res){
if(!rule.res[0]||!rule.res[1]) return false;
var resX=rule.res[0];
var resY=rule.res[1];
if(Math.min(screenWidth, screenHeight)!=Math.min(resX, resY)||Math.max(screenWidth, screenHeight)!=Math.max(resX, resY)){
return false;
}}
return true;
};
function DeviceParams(params){
this.xdpi=params.xdpi;
this.ydpi=params.ydpi;
this.bevelMm=params.bevelMm;
}
function SensorSample(sample, timestampS){
this.set(sample, timestampS);
}
SensorSample.prototype.set=function (sample, timestampS){
this.sample=sample;
this.timestampS=timestampS;
};
SensorSample.prototype.copy=function (sensorSample){
this.set(sensorSample.sample, sensorSample.timestampS);
};
function ComplementaryFilter(kFilter, isDebug){
this.kFilter=kFilter;
this.isDebug=isDebug;
this.currentAccelMeasurement=new SensorSample();
this.currentGyroMeasurement=new SensorSample();
this.previousGyroMeasurement=new SensorSample();
if(isIOS()){
this.filterQ=new Quaternion(-1, 0, 0, 1);
}else{
this.filterQ=new Quaternion(1, 0, 0, 1);
}
this.previousFilterQ=new Quaternion();
this.previousFilterQ.copy(this.filterQ);
this.accelQ=new Quaternion();
this.isOrientationInitialized=false;
this.estimatedGravity=new Vector3();
this.measuredGravity=new Vector3();
this.gyroIntegralQ=new Quaternion();
}
ComplementaryFilter.prototype.addAccelMeasurement=function (vector, timestampS){
this.currentAccelMeasurement.set(vector, timestampS);
};
ComplementaryFilter.prototype.addGyroMeasurement=function (vector, timestampS){
this.currentGyroMeasurement.set(vector, timestampS);
var deltaT=timestampS - this.previousGyroMeasurement.timestampS;
if(isTimestampDeltaValid(deltaT)){
this.run_();
}
this.previousGyroMeasurement.copy(this.currentGyroMeasurement);
};
ComplementaryFilter.prototype.run_=function (){
if(!this.isOrientationInitialized){
this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample);
this.previousFilterQ.copy(this.accelQ);
this.isOrientationInitialized=true;
return;
}
var deltaT=this.currentGyroMeasurement.timestampS - this.previousGyroMeasurement.timestampS;
var gyroDeltaQ=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);
this.gyroIntegralQ.multiply(gyroDeltaQ);
this.filterQ.copy(this.previousFilterQ);
this.filterQ.multiply(gyroDeltaQ);
var invFilterQ=new Quaternion();
invFilterQ.copy(this.filterQ);
invFilterQ.inverse();
this.estimatedGravity.set(0, 0, -1);
this.estimatedGravity.applyQuaternion(invFilterQ);
this.estimatedGravity.normalize();
this.measuredGravity.copy(this.currentAccelMeasurement.sample);
this.measuredGravity.normalize();
var deltaQ=new Quaternion();
deltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);
deltaQ.inverse();
if(this.isDebug){
console.log('Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)', radToDeg * getQuaternionAngle(deltaQ), this.estimatedGravity.x.toFixed(1), this.estimatedGravity.y.toFixed(1), this.estimatedGravity.z.toFixed(1), this.measuredGravity.x.toFixed(1), this.measuredGravity.y.toFixed(1), this.measuredGravity.z.toFixed(1));
}
var targetQ=new Quaternion();
targetQ.copy(this.filterQ);
targetQ.multiply(deltaQ);
this.filterQ.slerp(targetQ, 1 - this.kFilter);
this.previousFilterQ.copy(this.filterQ);
};
ComplementaryFilter.prototype.getOrientation=function (){
return this.filterQ;
};
ComplementaryFilter.prototype.accelToQuaternion_=function (accel){
var normAccel=new Vector3();
normAccel.copy(accel);
normAccel.normalize();
var quat=new Quaternion();
quat.setFromUnitVectors(new Vector3(0, 0, -1), normAccel);
quat.inverse();
return quat;
};
ComplementaryFilter.prototype.gyroToQuaternionDelta_=function (gyro, dt){
var quat=new Quaternion();
var axis=new Vector3();
axis.copy(gyro);
axis.normalize();
quat.setFromAxisAngle(axis, gyro.length() * dt);
return quat;
};
function PosePredictor(predictionTimeS, isDebug){
this.predictionTimeS=predictionTimeS;
this.isDebug=isDebug;
this.previousQ=new Quaternion();
this.previousTimestampS=null;
this.deltaQ=new Quaternion();
this.outQ=new Quaternion();
}
PosePredictor.prototype.getPrediction=function (currentQ, gyro, timestampS){
if(!this.previousTimestampS){
this.previousQ.copy(currentQ);
this.previousTimestampS=timestampS;
return currentQ;
}
var axis=new Vector3();
axis.copy(gyro);
axis.normalize();
var angularSpeed=gyro.length();
if(angularSpeed < degToRad * 20){
if(this.isDebug){
console.log('Moving slowly, at %s deg/s: no prediction', (radToDeg * angularSpeed).toFixed(1));
}
this.outQ.copy(currentQ);
this.previousQ.copy(currentQ);
return this.outQ;
}
var predictAngle=angularSpeed * this.predictionTimeS;
this.deltaQ.setFromAxisAngle(axis, predictAngle);
this.outQ.copy(this.previousQ);
this.outQ.multiply(this.deltaQ);
this.previousQ.copy(currentQ);
this.previousTimestampS=timestampS;
return this.outQ;
};
function FusionPoseSensor(kFilter, predictionTime, yawOnly, isDebug){
this.yawOnly=yawOnly;
this.accelerometer=new Vector3();
this.gyroscope=new Vector3();
this.filter=new ComplementaryFilter(kFilter, isDebug);
this.posePredictor=new PosePredictor(predictionTime, isDebug);
this.isFirefoxAndroid=isFirefoxAndroid();
this.isIOS=isIOS();
var chromeVersion=getChromeVersion();
this.isDeviceMotionInRadians = !this.isIOS&&chromeVersion&&chromeVersion < 66;
this.isWithoutDeviceMotion=isChromeWithoutDeviceMotion();
this.filterToWorldQ=new Quaternion();
if(isIOS()){
this.filterToWorldQ.setFromAxisAngle(new Vector3(1, 0, 0), Math.PI / 2);
}else{
this.filterToWorldQ.setFromAxisAngle(new Vector3(1, 0, 0), -Math.PI / 2);
}
this.inverseWorldToScreenQ=new Quaternion();
this.worldToScreenQ=new Quaternion();
this.originalPoseAdjustQ=new Quaternion();
this.originalPoseAdjustQ.setFromAxisAngle(new Vector3(0, 0, 1), -window.orientation * Math.PI / 180);
this.setScreenTransform_();
if(isLandscapeMode()){
this.filterToWorldQ.multiply(this.inverseWorldToScreenQ);
}
this.resetQ=new Quaternion();
this.orientationOut_=new Float32Array(4);
this.start();
}
FusionPoseSensor.prototype.getPosition=function (){
return null;
};
FusionPoseSensor.prototype.getOrientation=function (){
var orientation=void 0;
if(this.isWithoutDeviceMotion&&this._deviceOrientationQ){
this.deviceOrientationFixQ=this.deviceOrientationFixQ||function (){
var z=new Quaternion().setFromAxisAngle(new Vector3(0, 0, -1), 0);
var y=new Quaternion();
if(window.orientation===-90){
y.setFromAxisAngle(new Vector3(0, 1, 0), Math.PI / -2);
}else{
y.setFromAxisAngle(new Vector3(0, 1, 0), Math.PI / 2);
}
return z.multiply(y);
}();
this.deviceOrientationFilterToWorldQ=this.deviceOrientationFilterToWorldQ||function (){
var q=new Quaternion();
q.setFromAxisAngle(new Vector3(1, 0, 0), -Math.PI / 2);
return q;
}();
orientation=this._deviceOrientationQ;
var out=new Quaternion();
out.copy(orientation);
out.multiply(this.deviceOrientationFilterToWorldQ);
out.multiply(this.resetQ);
out.multiply(this.worldToScreenQ);
out.multiplyQuaternions(this.deviceOrientationFixQ, out);
if(this.yawOnly){
out.x=0;
out.z=0;
out.normalize();
}
this.orientationOut_[0]=out.x;
this.orientationOut_[1]=out.y;
this.orientationOut_[2]=out.z;
this.orientationOut_[3]=out.w;
return this.orientationOut_;
}else{
var filterOrientation=this.filter.getOrientation();
orientation=this.posePredictor.getPrediction(filterOrientation, this.gyroscope, this.previousTimestampS);
}
var out=new Quaternion();
out.copy(this.filterToWorldQ);
out.multiply(this.resetQ);
out.multiply(orientation);
out.multiply(this.worldToScreenQ);
if(this.yawOnly){
out.x=0;
out.z=0;
out.normalize();
}
this.orientationOut_[0]=out.x;
this.orientationOut_[1]=out.y;
this.orientationOut_[2]=out.z;
this.orientationOut_[3]=out.w;
return this.orientationOut_;
};
FusionPoseSensor.prototype.resetPose=function (){
this.resetQ.copy(this.filter.getOrientation());
this.resetQ.x=0;
this.resetQ.y=0;
this.resetQ.z *=-1;
this.resetQ.normalize();
if(isLandscapeMode()){
this.resetQ.multiply(this.inverseWorldToScreenQ);
}
this.resetQ.multiply(this.originalPoseAdjustQ);
};
FusionPoseSensor.prototype.onDeviceOrientation_=function (e){
this._deviceOrientationQ=this._deviceOrientationQ||new Quaternion();
var alpha=e.alpha,
beta=e.beta,
gamma=e.gamma;
alpha=(alpha||0) * Math.PI / 180;
beta=(beta||0) * Math.PI / 180;
gamma=(gamma||0) * Math.PI / 180;
this._deviceOrientationQ.setFromEulerYXZ(beta, alpha, -gamma);
};
FusionPoseSensor.prototype.onDeviceMotion_=function (deviceMotion){
this.updateDeviceMotion_(deviceMotion);
};
FusionPoseSensor.prototype.updateDeviceMotion_=function (deviceMotion){
var accGravity=deviceMotion.accelerationIncludingGravity;
var rotRate=deviceMotion.rotationRate;
var timestampS=deviceMotion.timeStamp / 1000;
var deltaS=timestampS - this.previousTimestampS;
if(deltaS < 0){
warnOnce('fusion-pose-sensor:invalid:non-monotonic', 'Invalid timestamps detected: non-monotonic timestamp from devicemotion');
this.previousTimestampS=timestampS;
return;
}else if(deltaS <=MIN_TIMESTEP||deltaS > MAX_TIMESTEP){
warnOnce('fusion-pose-sensor:invalid:outside-threshold', 'Invalid timestamps detected: Timestamp from devicemotion outside expected range.');
this.previousTimestampS=timestampS;
return;
}
this.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z);
if(isR7()){
this.gyroscope.set(-rotRate.beta, rotRate.alpha, rotRate.gamma);
}else{
this.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma);
}
if(!this.isDeviceMotionInRadians){
this.gyroscope.multiplyScalar(Math.PI / 180);
}
this.filter.addAccelMeasurement(this.accelerometer, timestampS);
this.filter.addGyroMeasurement(this.gyroscope, timestampS);
this.previousTimestampS=timestampS;
};
FusionPoseSensor.prototype.onOrientationChange_=function (screenOrientation){
this.setScreenTransform_();
};
FusionPoseSensor.prototype.onMessage_=function (event){
var message=event.data;
if(!message||!message.type){
return;
}
var type=message.type.toLowerCase();
if(type!=='devicemotion'){
return;
}
this.updateDeviceMotion_(message.deviceMotionEvent);
};
FusionPoseSensor.prototype.setScreenTransform_=function (){
this.worldToScreenQ.set(0, 0, 0, 1);
switch (window.orientation){
case 0:
break;
case 90:
this.worldToScreenQ.setFromAxisAngle(new Vector3(0, 0, 1), -Math.PI / 2);
break;
case -90:
this.worldToScreenQ.setFromAxisAngle(new Vector3(0, 0, 1), Math.PI / 2);
break;
}
this.inverseWorldToScreenQ.copy(this.worldToScreenQ);
this.inverseWorldToScreenQ.inverse();
};
FusionPoseSensor.prototype.start=function (){
this.onDeviceMotionCallback_=this.onDeviceMotion_.bind(this);
this.onOrientationChangeCallback_=this.onOrientationChange_.bind(this);
this.onMessageCallback_=this.onMessage_.bind(this);
this.onDeviceOrientationCallback_=this.onDeviceOrientation_.bind(this);
if(isIOS()&&isInsideCrossOriginIFrame()){
window.addEventListener('message', this.onMessageCallback_);
}
window.addEventListener('orientationchange', this.onOrientationChangeCallback_);
if(this.isWithoutDeviceMotion){
window.addEventListener('deviceorientation', this.onDeviceOrientationCallback_);
}else{
window.addEventListener('devicemotion', this.onDeviceMotionCallback_);
}};
FusionPoseSensor.prototype.stop=function (){
window.removeEventListener('devicemotion', this.onDeviceMotionCallback_);
window.removeEventListener('deviceorientation', this.onDeviceOrientationCallback_);
window.removeEventListener('orientationchange', this.onOrientationChangeCallback_);
window.removeEventListener('message', this.onMessageCallback_);
};
var SENSOR_FREQUENCY=60;
var X_AXIS=new Vector3(1, 0, 0);
var Z_AXIS=new Vector3(0, 0, 1);
var orientation={};
if(screen.orientation){
orientation=screen.orientation;
}else if(screen.msOrientation){
orientation=screen.msOrientation;
}else{
Object.defineProperty(orientation, 'angle', {
get: function get$$1(){
return window.orientation||0;
}});
}
var SENSOR_TO_VR=new Quaternion();
SENSOR_TO_VR.setFromAxisAngle(X_AXIS, -Math.PI / 2);
SENSOR_TO_VR.multiply(new Quaternion().setFromAxisAngle(Z_AXIS, Math.PI / 2));
var PoseSensor=function (){
function PoseSensor(config){
classCallCheck(this, PoseSensor);
this.config=config;
this.sensor=null;
this.fusionSensor=null;
this._out=new Float32Array(4);
this.api=null;
this.errors=[];
this._sensorQ=new Quaternion();
this._worldToScreenQ=new Quaternion();
this._outQ=new Quaternion();
this._onSensorRead=this._onSensorRead.bind(this);
this._onSensorError=this._onSensorError.bind(this);
this._onOrientationChange=this._onOrientationChange.bind(this);
this._onOrientationChange();
this.init();
}
createClass(PoseSensor, [{
key: 'init',
value: function init(){
var sensor=null;
try {
sensor=new RelativeOrientationSensor({ frequency: SENSOR_FREQUENCY });
sensor.addEventListener('error', this._onSensorError);
} catch (error){
this.errors.push(error);
if(error.name==='SecurityError'){
console.error('Cannot construct sensors due to the Feature Policy');
console.warn('Attempting to fall back using "devicemotion"; however this will ' + 'fail in the future without correct permissions.');
this.useDeviceMotion();
}else if(error.name==='ReferenceError'){
this.useDeviceMotion();
}else{
console.error(error);
}}
if(sensor){
this.api='sensor';
this.sensor=sensor;
this.sensor.addEventListener('reading', this._onSensorRead);
this.sensor.start();
}
window.addEventListener('orientationchange', this._onOrientationChange);
}}, {
key: 'useDeviceMotion',
value: function useDeviceMotion(){
this.api='devicemotion';
this.fusionSensor=new FusionPoseSensor(this.config.K_FILTER, this.config.PREDICTION_TIME_S, this.config.YAW_ONLY, this.config.DEBUG);
if(this.sensor){
this.sensor.removeEventListener('reading', this._onSensorRead);
this.sensor.removeEventListener('error', this._onSensorError);
this.sensor=null;
}}
}, {
key: 'getOrientation',
value: function getOrientation(){
if(this.fusionSensor){
return this.fusionSensor.getOrientation();
}
if(!this.sensor||!this.sensor.quaternion){
this._out[0]=this._out[1]=this._out[2]=0;
this._out[3]=1;
return this._out;
}
var q=this.sensor.quaternion;
this._sensorQ.set(q[0], q[1], q[2], q[3]);
var out=this._outQ;
out.copy(SENSOR_TO_VR);
out.multiply(this._sensorQ);
out.multiply(this._worldToScreenQ);
if(this.config.YAW_ONLY){
out.x=out.z=0;
out.normalize();
}
this._out[0]=out.x;
this._out[1]=out.y;
this._out[2]=out.z;
this._out[3]=out.w;
return this._out;
}}, {
key: '_onSensorError',
value: function _onSensorError(event){
this.errors.push(event.error);
if(event.error.name==='NotAllowedError'){
console.error('Permission to access sensor was denied');
}else if(event.error.name==='NotReadableError'){
console.error('Sensor could not be read');
}else{
console.error(event.error);
}
this.useDeviceMotion();
}}, {
key: '_onSensorRead',
value: function _onSensorRead(){}}, {
key: '_onOrientationChange',
value: function _onOrientationChange(){
var angle=-orientation.angle * Math.PI / 180;
this._worldToScreenQ.setFromAxisAngle(Z_AXIS, angle);
}}]);
return PoseSensor;
}();
var rotateInstructionsAsset='PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE5OHB4IiBoZWlnaHQ9IjI0MHB4IiB2aWV3Qm94PSIwIDAgMTk4IDI0MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4zICgxMjA4MSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+dHJhbnNpdGlvbjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgogICAgICAgIDxnIGlkPSJ0cmFuc2l0aW9uIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KICAgICAgICAgICAgPGcgaWQ9IkltcG9ydGVkLUxheWVycy1Db3B5LTQtKy1JbXBvcnRlZC1MYXllcnMtQ29weS0rLUltcG9ydGVkLUxheWVycy1Db3B5LTItQ29weSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iSW1wb3J0ZWQtTGF5ZXJzLUNvcHktNCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDEwNy4wMDAwMDApIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ5LjYyNSwyLjUyNyBDMTQ5LjYyNSwyLjUyNyAxNTUuODA1LDYuMDk2IDE1Ni4zNjIsNi40MTggTDE1Ni4zNjIsNy4zMDQgQzE1Ni4zNjIsNy40ODEgMTU2LjM3NSw3LjY2NCAxNTYuNCw3Ljg1MyBDMTU2LjQxLDcuOTM0IDE1Ni40Miw4LjAxNSAxNTYuNDI3LDguMDk1IEMxNTYuNTY3LDkuNTEgMTU3LjQwMSwxMS4wOTMgMTU4LjUzMiwxMi4wOTQgTDE2NC4yNTIsMTcuMTU2IEwxNjQuMzMzLDE3LjA2NiBDMTY0LjMzMywxNy4wNjYgMTY4LjcxNSwxNC41MzYgMTY5LjU2OCwxNC4wNDIgQzE3MS4wMjUsMTQuODgzIDE5NS41MzgsMjkuMDM1IDE5NS41MzgsMjkuMDM1IEwxOTUuNTM4LDgzLjAzNiBDMTk1LjUzOCw4My44MDcgMTk1LjE1Miw4NC4yNTMgMTk0LjU5LDg0LjI1MyBDMTk0LjM1Nyw4NC4yNTMgMTk0LjA5NSw4NC4xNzcgMTkzLjgxOCw4NC4wMTcgTDE2OS44NTEsNzAuMTc5IEwxNjkuODM3LDcwLjIwMyBMMTQyLjUxNSw4NS45NzggTDE0MS42NjUsODQuNjU1IEMxMzYuOTM0LDgzLjEyNiAxMzEuOTE3LDgxLjkxNSAxMjYuNzE0LDgxLjA0NSBDMTI2LjcwOSw4MS4wNiAxMjYuNzA3LDgxLjA2OSAxMjYuNzA3LDgxLjA2OSBMMTIxLjY0LDk4LjAzIEwxMTMuNzQ5LDEwMi41ODYgTDExMy43MTIsMTAyLjUyMyBMMTEzLjcxMiwxMzAuMTEzIEMxMTMuNzEyLDEzMC44ODUgMTEzLjMyNiwxMzEuMzMgMTEyLjc2NCwxMzEuMzMgQzExMi41MzIsMTMxLjMzIDExMi4yNjksMTMxLjI1NCAxMTEuOTkyLDEzMS4wOTQgTDY5LjUxOSwxMDYuNTcyIEM2OC41NjksMTA2LjAyMyA2Ny43OTksMTA0LjY5NSA2Ny43OTksMTAzLjYwNSBMNjcuNzk5LDEwMi41NyBMNjcuNzc4LDEwMi42MTcgQzY3LjI3LDEwMi4zOTMgNjYuNjQ4LDEwMi4yNDkgNjUuOTYyLDEwMi4yMTggQzY1Ljg3NSwxMDIuMjE0IDY1Ljc4OCwxMDIuMjEyIDY1LjcwMSwxMDIuMjEyIEM2NS42MDYsMTAyLjIxMiA2NS41MTEsMTAyLjIxNSA2NS40MTYsMTAyLjIxOSBDNjUuMTk1LDEwMi4yMjkgNjQuOTc0LDEwMi4yMzUgNjQuNzU0LDEwMi4yMzUgQzY0LjMzMSwxMDIuMjM1IDYzLjkxMSwxMDIuMjE2IDYzLjQ5OCwxMDIuMTc4IEM2MS44NDMsMTAyLjAyNSA2MC4yOTgsMTAxLjU3OCA1OS4wOTQsMTAwLjg4MiBMMTIuNTE4LDczLjk5MiBMMTIuNTIzLDc0LjAwNCBMMi4yNDUsNTUuMjU0IEMxLjI0NCw1My40MjcgMi4wMDQsNTEuMDM4IDMuOTQzLDQ5LjkxOCBMNTkuOTU0LDE3LjU3MyBDNjAuNjI2LDE3LjE4NSA2MS4zNSwxNy4wMDEgNjIuMDUzLDE3LjAwMSBDNjMuMzc5LDE3LjAwMSA2NC42MjUsMTcuNjYgNjUuMjgsMTguODU0IEw2NS4yODUsMTguODUxIEw2NS41MTIsMTkuMjY0IEw2NS41MDYsMTkuMjY4IEM2NS45MDksMjAuMDAzIDY2LjQwNSwyMC42OCA2Ni45ODMsMjEuMjg2IEw2Ny4yNiwyMS41NTYgQzY5LjE3NCwyMy40MDYgNzEuNzI4LDI0LjM1NyA3NC4zNzMsMjQuMzU3IEM3Ni4zMjIsMjQuMzU3IDc4LjMyMSwyMy44NCA4MC4xNDgsMjIuNzg1IEM4MC4xNjEsMjIuNzg1IDg3LjQ2NywxOC41NjYgODcuNDY3LDE4LjU2NiBDODguMTM5LDE4LjE3OCA4OC44NjMsMTcuOTk0IDg5LjU2NiwxNy45OTQgQzkwLjg5MiwxNy45OTQgOTIuMTM4LDE4LjY1MiA5Mi43OTIsMTkuODQ3IEw5Ni4wNDIsMjUuNzc1IEw5Ni4wNjQsMjUuNzU3IEwxMDIuODQ5LDI5LjY3NCBMMTAyLjc0NCwyOS40OTIgTDE0OS42MjUsMi41MjcgTTE0OS42MjUsMC44OTIgQzE0OS4zNDMsMC44OTIgMTQ5LjA2MiwwLjk2NSAxNDguODEsMS4xMSBMMTAyLjY0MSwyNy42NjYgTDk3LjIzMSwyNC41NDIgTDk0LjIyNiwxOS4wNjEgQzkzLjMxMywxNy4zOTQgOTEuNTI3LDE2LjM1OSA4OS41NjYsMTYuMzU4IEM4OC41NTUsMTYuMzU4IDg3LjU0NiwxNi42MzIgODYuNjQ5LDE3LjE1IEM4My44NzgsMTguNzUgNzkuNjg3LDIxLjE2OSA3OS4zNzQsMjEuMzQ1IEM3OS4zNTksMjEuMzUzIDc5LjM0NSwyMS4zNjEgNzkuMzMsMjEuMzY5IEM3Ny43OTgsMjIuMjU0IDc2LjA4NCwyMi43MjIgNzQuMzczLDIyLjcyMiBDNzIuMDgxLDIyLjcyMiA2OS45NTksMjEuODkgNjguMzk3LDIwLjM4IEw2OC4xNDUsMjAuMTM1IEM2Ny43MDYsMTkuNjcyIDY3LjMyMywxOS4xNTYgNjcuMDA2LDE4LjYwMSBDNjYuOTg4LDE4LjU1OSA2Ni45NjgsMTguNTE5IDY2Ljk0NiwxOC40NzkgTDY2LjcxOSwxOC4wNjUgQzY2LjY5LDE4LjAxMiA2Ni42NTgsMTcuOTYgNjYuNjI0LDE3LjkxMSBDNjUuNjg2LDE2LjMzNyA2My45NTEsMTUuMzY2IDYyLjA1MywxNS4zNjYgQzYxLjA0MiwxNS4zNjYgNjAuMDMzLDE1LjY0IDU5LjEzNiwxNi4xNTggTDMuMTI1LDQ4LjUwMiBDMC40MjYsNTAuMDYxIC0wLjYxMyw1My40NDIgMC44MTEsNTYuMDQgTDExLjA4OSw3NC43OSBDMTEuMjY2LDc1LjExMyAxMS41MzcsNzUuMzUzIDExLjg1LDc1LjQ5NCBMNTguMjc2LDEwMi4yOTggQzU5LjY3OSwxMDMuMTA4IDYxLjQzMywxMDMuNjMgNjMuMzQ4LDEwMy44MDYgQzYzLjgxMiwxMDMuODQ4IDY0LjI4NSwxMDMuODcgNjQuNzU0LDEwMy44NyBDNjUsMTAzLjg3IDY1LjI0OSwxMDMuODY0IDY1LjQ5NCwxMDMuODUyIEM2NS41NjMsMTAzLjg0OSA2NS42MzIsMTAzLjg0NyA2NS43MDEsMTAzLjg0NyBDNjUuNzY0LDEwMy44NDcgNjUuODI4LDEwMy44NDkgNjUuODksMTAzLjg1MiBDNjUuOTg2LDEwMy44NTYgNjYuMDgsMTAzLjg2MyA2Ni4xNzMsMTAzLjg3NCBDNjYuMjgyLDEwNS40NjcgNjcuMzMyLDEwNy4xOTcgNjguNzAyLDEwNy45ODggTDExMS4xNzQsMTMyLjUxIEMxMTEuNjk4LDEzMi44MTIgMTEyLjIzMiwxMzIuOTY1IDExMi43NjQsMTMyLjk2NSBDMTE0LjI2MSwxMzIuOTY1IDExNS4zNDcsMTMxLjc2NSAxMTUuMzQ3LDEzMC4xMTMgTDExNS4zNDcsMTAzLjU1MSBMMTIyLjQ1OCw5OS40NDYgQzEyMi44MTksOTkuMjM3IDEyMy4wODcsOTguODk4IDEyMy4yMDcsOTguNDk4IEwxMjcuODY1LDgyLjkwNSBDMTMyLjI3OSw4My43MDIgMTM2LjU1Nyw4NC43NTMgMTQwLjYwNyw4Ni4wMzMgTDE0MS4xNCw4Ni44NjIgQzE0MS40NTEsODcuMzQ2IDE0MS45NzcsODcuNjEzIDE0Mi41MTYsODcuNjEzIEMxNDIuNzk0LDg3LjYxMyAxNDMuMDc2LDg3LjU0MiAxNDMuMzMzLDg3LjM5MyBMMTY5Ljg2NSw3Mi4wNzYgTDE5Myw4NS40MzMgQzE5My41MjMsODUuNzM1IDE5NC4wNTgsODUuODg4IDE5NC41OSw4NS44ODggQzE5Ni4wODcsODUuODg4IDE5Ny4xNzMsODQuNjg5IDE5Ny4xNzMsODMuMDM2IEwxOTcuMTczLDI5LjAzNSBDMTk3LjE3MywyOC40NTEgMTk2Ljg2MSwyNy45MTEgMTk2LjM1NSwyNy42MTkgQzE5Ni4zNTUsMjcuNjE5IDE3MS44NDMsMTMuNDY3IDE3MC4zODUsMTIuNjI2IEMxNzAuMTMyLDEyLjQ4IDE2OS44NSwxMi40MDcgMTY5LjU2OCwxMi40MDcgQzE2OS4yODUsMTIuNDA3IDE2OS4wMDIsMTIuNDgxIDE2OC43NDksMTIuNjI3IEMxNjguMTQzLDEyLjk3OCAxNjUuNzU2LDE0LjM1NyAxNjQuNDI0LDE1LjEyNSBMMTU5LjYxNSwxMC44NyBDMTU4Ljc5NiwxMC4xNDUgMTU4LjE1NCw4LjkzNyAxNTguMDU0LDcuOTM0IEMxNTguMDQ1LDcuODM3IDE1OC4wMzQsNy43MzkgMTU4LjAyMSw3LjY0IEMxNTguMDA1LDcuNTIzIDE1Ny45OTgsNy40MSAxNTcuOTk4LDcuMzA0IEwxNTcuOTk4LDYuNDE4IEMxNTcuOTk4LDUuODM0IDE1Ny42ODYsNS4yOTUgMTU3LjE4MSw1LjAwMiBDMTU2LjYyNCw0LjY4IDE1MC40NDIsMS4xMTEgMTUwLjQ0MiwxLjExMSBDMTUwLjE4OSwwLjk2NSAxNDkuOTA3LDAuODkyIDE0OS42MjUsMC44OTIiIGlkPSJGaWxsLTEiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTYuMDI3LDI1LjYzNiBMMTQyLjYwMyw1Mi41MjcgQzE0My44MDcsNTMuMjIyIDE0NC41ODIsNTQuMTE0IDE0NC44NDUsNTUuMDY4IEwxNDQuODM1LDU1LjA3NSBMNjMuNDYxLDEwMi4wNTcgTDYzLjQ2LDEwMi4wNTcgQzYxLjgwNiwxMDEuOTA1IDYwLjI2MSwxMDEuNDU3IDU5LjA1NywxMDAuNzYyIEwxMi40ODEsNzMuODcxIEw5Ni4wMjcsMjUuNjM2IiBpZD0iRmlsbC0yIiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYzLjQ2MSwxMDIuMTc0IEM2My40NTMsMTAyLjE3NCA2My40NDYsMTAyLjE3NCA2My40MzksMTAyLjE3MiBDNjEuNzQ2LDEwMi4wMTYgNjAuMjExLDEwMS41NjMgNTguOTk4LDEwMC44NjMgTDEyLjQyMiw3My45NzMgQzEyLjM4Niw3My45NTIgMTIuMzY0LDczLjkxNCAxMi4zNjQsNzMuODcxIEMxMi4zNjQsNzMuODMgMTIuMzg2LDczLjc5MSAxMi40MjIsNzMuNzcgTDk1Ljk2OCwyNS41MzUgQzk2LjAwNCwyNS41MTQgOTYuMDQ5LDI1LjUxNCA5Ni4wODUsMjUuNTM1IEwxNDIuNjYxLDUyLjQyNiBDMTQzLjg4OCw1My4xMzQgMTQ0LjY4Miw1NC4wMzggMTQ0Ljk1Nyw1NS4wMzcgQzE0NC45Nyw1NS4wODMgMTQ0Ljk1Myw1NS4xMzMgMTQ0LjkxNSw1NS4xNjEgQzE0NC45MTEsNTUuMTY1IDE0NC44OTgsNTUuMTc0IDE0NC44OTQsNTUuMTc3IEw2My41MTksMTAyLjE1OCBDNjMuNTAxLDEwMi4xNjkgNjMuNDgxLDEwMi4xNzQgNjMuNDYxLDEwMi4xNzQgTDYzLjQ2MSwxMDIuMTc0IFogTTEyLjcxNCw3My44NzEgTDU5LjExNSwxMDAuNjYxIEM2MC4yOTMsMTAxLjM0MSA2MS43ODYsMTAxLjc4MiA2My40MzUsMTAxLjkzNyBMMTQ0LjcwNyw1NS4wMTUgQzE0NC40MjgsNTQuMTA4IDE0My42ODIsNTMuMjg1IDE0Mi41NDQsNTIuNjI4IEw5Ni4wMjcsMjUuNzcxIEwxMi43MTQsNzMuODcxIEwxMi43MTQsNzMuODcxIFoiIGlkPSJGaWxsLTMiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ4LjMyNyw1OC40NzEgQzE0OC4xNDUsNTguNDggMTQ3Ljk2Miw1OC40OCAxNDcuNzgxLDU4LjQ3MiBDMTQ1Ljg4Nyw1OC4zODkgMTQ0LjQ3OSw1Ny40MzQgMTQ0LjYzNiw1Ni4zNCBDMTQ0LjY4OSw1NS45NjcgMTQ0LjY2NCw1NS41OTcgMTQ0LjU2NCw1NS4yMzUgTDYzLjQ2MSwxMDIuMDU3IEM2NC4wODksMTAyLjExNSA2NC43MzMsMTAyLjEzIDY1LjM3OSwxMDIuMDk5IEM2NS41NjEsMTAyLjA5IDY1Ljc0MywxMDIuMDkgNjUuOTI1LDEwMi4wOTggQzY3LjgxOSwxMDIuMTgxIDY5LjIyNywxMDMuMTM2IDY5LjA3LDEwNC4yMyBMMTQ4LjMyNyw1OC40NzEiIGlkPSJGaWxsLTQiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjkuMDcsMTA0LjM0NyBDNjkuMDQ4LDEwNC4zNDcgNjkuMDI1LDEwNC4zNCA2OS4wMDUsMTA0LjMyNyBDNjguOTY4LDEwNC4zMDEgNjguOTQ4LDEwNC4yNTcgNjguOTU1LDEwNC4yMTMgQzY5LDEwMy44OTYgNjguODk4LDEwMy41NzYgNjguNjU4LDEwMy4yODggQzY4LjE1MywxMDIuNjc4IDY3LjEwMywxMDIuMjY2IDY1LjkyLDEwMi4yMTQgQzY1Ljc0MiwxMDIuMjA2IDY1LjU2MywxMDIuMjA3IDY1LjM4NSwxMDIuMjE1IEM2NC43NDIsMTAyLjI0NiA2NC4wODcsMTAyLjIzMiA2My40NSwxMDIuMTc0IEM2My4zOTksMTAyLjE2OSA2My4zNTgsMTAyLjEzMiA2My4zNDcsMTAyLjA4MiBDNjMuMzM2LDEwMi4wMzMgNjMuMzU4LDEwMS45ODEgNjMuNDAyLDEwMS45NTYgTDE0NC41MDYsNTUuMTM0IEMxNDQuNTM3LDU1LjExNiAxNDQuNTc1LDU1LjExMyAxNDQuNjA5LDU1LjEyNyBDMTQ0LjY0Miw1NS4xNDEgMTQ0LjY2OCw1NS4xNyAxNDQuNjc3LDU1LjIwNCBDMTQ0Ljc4MSw1NS41ODUgMTQ0LjgwNiw1NS45NzIgMTQ0Ljc1MSw1Ni4zNTcgQzE0NC43MDYsNTYuNjczIDE0NC44MDgsNTYuOTk0IDE0NS4wNDcsNTcuMjgyIEMxNDUuNTUzLDU3Ljg5MiAxNDYuNjAyLDU4LjMwMyAxNDcuNzg2LDU4LjM1NSBDMTQ3Ljk2NCw1OC4zNjMgMTQ4LjE0Myw1OC4zNjMgMTQ4LjMyMSw1OC4zNTQgQzE0OC4zNzcsNTguMzUyIDE0OC40MjQsNTguMzg3IDE0OC40MzksNTguNDM4IEMxNDguNDU0LDU4LjQ5IDE0OC40MzIsNTguNTQ1IDE0OC4zODUsNTguNTcyIEw2OS4xMjksMTA0LjMzMSBDNjkuMTExLDEwNC4zNDIgNjkuMDksMTA0LjM0NyA2OS4wNywxMDQuMzQ3IEw2OS4wNywxMDQuMzQ3IFogTTY1LjY2NSwxMDEuOTc1IEM2NS43NTQsMTAxLjk3NSA2NS44NDIsMTAxLjk3NyA2NS45MywxMDEuOTgxIEM2Ny4xOTYsMTAyLjAzNyA2OC4yODMsMTAyLjQ2OSA2OC44MzgsMTAzLjEzOSBDNjkuMDY1LDEwMy40MTMgNjkuMTg4LDEwMy43MTQgNjkuMTk4LDEwNC4wMjEgTDE0Ny44ODMsNTguNTkyIEMxNDcuODQ3LDU4LjU5MiAxNDcuODExLDU4LjU5MSAxNDcuNzc2LDU4LjU4OSBDMTQ2LjUwOSw1OC41MzMgMTQ1LjQyMiw1OC4xIDE0NC44NjcsNTcuNDMxIEMxNDQuNTg1LDU3LjA5MSAxNDQuNDY1LDU2LjcwNyAxNDQuNTIsNTYuMzI0IEMxNDQuNTYzLDU2LjAyMSAxNDQuNTUyLDU1LjcxNiAxNDQuNDg4LDU1LjQxNCBMNjMuODQ2LDEwMS45NyBDNjQuMzUzLDEwMi4wMDIgNjQuODY3LDEwMi4wMDYgNjUuMzc0LDEwMS45ODIgQzY1LjQ3MSwxMDEuOTc3IDY1LjU2OCwxMDEuOTc1IDY1LjY2NSwxMDEuOTc1IEw2NS42NjUsMTAxLjk3NSBaIiBpZD0iRmlsbC01IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTIuMjA4LDU1LjEzNCBDMS4yMDcsNTMuMzA3IDEuOTY3LDUwLjkxNyAzLjkwNiw0OS43OTcgTDU5LjkxNywxNy40NTMgQzYxLjg1NiwxNi4zMzMgNjQuMjQxLDE2LjkwNyA2NS4yNDMsMTguNzM0IEw2NS40NzUsMTkuMTQ0IEM2NS44NzIsMTkuODgyIDY2LjM2OCwyMC41NiA2Ni45NDUsMjEuMTY1IEw2Ny4yMjMsMjEuNDM1IEM3MC41NDgsMjQuNjQ5IDc1LjgwNiwyNS4xNTEgODAuMTExLDIyLjY2NSBMODcuNDMsMTguNDQ1IEM4OS4zNywxNy4zMjYgOTEuNzU0LDE3Ljg5OSA5Mi43NTUsMTkuNzI3IEw5Ni4wMDUsMjUuNjU1IEwxMi40ODYsNzMuODg0IEwyLjIwOCw1NS4xMzQgWiIgaWQ9IkZpbGwtNiIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMi40ODYsNzQuMDAxIEMxMi40NzYsNzQuMDAxIDEyLjQ2NSw3My45OTkgMTIuNDU1LDczLjk5NiBDMTIuNDI0LDczLjk4OCAxMi4zOTksNzMuOTY3IDEyLjM4NCw3My45NCBMMi4xMDYsNTUuMTkgQzEuMDc1LDUzLjMxIDEuODU3LDUwLjg0NSAzLjg0OCw0OS42OTYgTDU5Ljg1OCwxNy4zNTIgQzYwLjUyNSwxNi45NjcgNjEuMjcxLDE2Ljc2NCA2Mi4wMTYsMTYuNzY0IEM2My40MzEsMTYuNzY0IDY0LjY2NiwxNy40NjYgNjUuMzI3LDE4LjY0NiBDNjUuMzM3LDE4LjY1NCA2NS4zNDUsMTguNjYzIDY1LjM1MSwxOC42NzQgTDY1LjU3OCwxOS4wODggQzY1LjU4NCwxOS4xIDY1LjU4OSwxOS4xMTIgNjUuNTkxLDE5LjEyNiBDNjUuOTg1LDE5LjgzOCA2Ni40NjksMjAuNDk3IDY3LjAzLDIxLjA4NSBMNjcuMzA1LDIxLjM1MSBDNjkuMTUxLDIzLjEzNyA3MS42NDksMjQuMTIgNzQuMzM2LDI0LjEyIEM3Ni4zMTMsMjQuMTIgNzguMjksMjMuNTgyIDgwLjA1MywyMi41NjMgQzgwLjA2NCwyMi41NTcgODAuMDc2LDIyLjU1MyA4MC4wODgsMjIuNTUgTDg3LjM3MiwxOC4zNDQgQzg4LjAzOCwxNy45NTkgODguNzg0LDE3Ljc1NiA4OS41MjksMTcuNzU2IEM5MC45NTYsMTcuNzU2IDkyLjIwMSwxOC40NzIgOTIuODU4LDE5LjY3IEw5Ni4xMDcsMjUuNTk5IEM5Ni4xMzgsMjUuNjU0IDk2LjExOCwyNS43MjQgOTYuMDYzLDI1Ljc1NiBMMTIuNTQ1LDczLjk4NSBDMTIuNTI2LDczLjk5NiAxMi41MDYsNzQuMDAxIDEyLjQ4Niw3NC4wMDEgTDEyLjQ4Niw3NC4wMDEgWiBNNjIuMDE2LDE2Ljk5NyBDNjEuMzEyLDE2Ljk5NyA2MC42MDYsMTcuMTkgNTkuOTc1LDE3LjU1NCBMMy45NjUsNDkuODk5IEMyLjA4Myw1MC45ODUgMS4zNDEsNTMuMzA4IDIuMzEsNTUuMDc4IEwxMi41MzEsNzMuNzIzIEw5NS44NDgsMjUuNjExIEw5Mi42NTMsMTkuNzgyIEM5Mi4wMzgsMTguNjYgOTAuODcsMTcuOTkgODkuNTI5LDE3Ljk5IEM4OC44MjUsMTcuOTkgODguMTE5LDE4LjE4MiA4Ny40ODksMTguNTQ3IEw4MC4xNzIsMjIuNzcyIEM4MC4xNjEsMjIuNzc4IDgwLjE0OSwyMi43ODIgODAuMTM3LDIyLjc4NSBDNzguMzQ2LDIzLjgxMSA3Ni4zNDEsMjQuMzU0IDc0LjMzNiwyNC4zNTQgQzcxLjU4OCwyNC4zNTQgNjkuMDMzLDIzLjM0NyA2Ny4xNDIsMjEuNTE5IEw2Ni44NjQsMjEuMjQ5IEM2Ni4yNzcsMjAuNjM0IDY1Ljc3NCwxOS45NDcgNjUuMzY3LDE5LjIwMyBDNjUuMzYsMTkuMTkyIDY1LjM1NiwxOS4xNzkgNjUuMzU0LDE5LjE2NiBMNjUuMTYzLDE4LjgxOSBDNjUuMTU0LDE4LjgxMSA2NS4xNDYsMTguODAxIDY1LjE0LDE4Ljc5IEM2NC41MjUsMTcuNjY3IDYzLjM1NywxNi45OTcgNjIuMDE2LDE2Ljk5NyBMNjIuMDE2LDE2Ljk5NyBaIiBpZD0iRmlsbC03IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQyLjQzNCw0OC44MDggTDQyLjQzNCw0OC44MDggQzM5LjkyNCw0OC44MDcgMzcuNzM3LDQ3LjU1IDM2LjU4Miw0NS40NDMgQzM0Ljc3MSw0Mi4xMzkgMzYuMTQ0LDM3LjgwOSAzOS42NDEsMzUuNzg5IEw1MS45MzIsMjguNjkxIEM1My4xMDMsMjguMDE1IDU0LjQxMywyNy42NTggNTUuNzIxLDI3LjY1OCBDNTguMjMxLDI3LjY1OCA2MC40MTgsMjguOTE2IDYxLjU3MywzMS4wMjMgQzYzLjM4NCwzNC4zMjcgNjIuMDEyLDM4LjY1NyA1OC41MTQsNDAuNjc3IEw0Ni4yMjMsNDcuNzc1IEM0NS4wNTMsNDguNDUgNDMuNzQyLDQ4LjgwOCA0Mi40MzQsNDguODA4IEw0Mi40MzQsNDguODA4IFogTTU1LjcyMSwyOC4xMjUgQzU0LjQ5NSwyOC4xMjUgNTMuMjY1LDI4LjQ2MSA1Mi4xNjYsMjkuMDk2IEwzOS44NzUsMzYuMTk0IEMzNi41OTYsMzguMDg3IDM1LjMwMiw0Mi4xMzYgMzYuOTkyLDQ1LjIxOCBDMzguMDYzLDQ3LjE3MyA0MC4wOTgsNDguMzQgNDIuNDM0LDQ4LjM0IEM0My42NjEsNDguMzQgNDQuODksNDguMDA1IDQ1Ljk5LDQ3LjM3IEw1OC4yODEsNDAuMjcyIEM2MS41NiwzOC4zNzkgNjIuODUzLDM0LjMzIDYxLjE2NCwzMS4yNDggQzYwLjA5MiwyOS4yOTMgNTguMDU4LDI4LjEyNSA1NS43MjEsMjguMTI1IEw1NS43MjEsMjguMTI1IFoiIGlkPSJGaWxsLTgiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ5LjU4OCwyLjQwNyBDMTQ5LjU4OCwyLjQwNyAxNTUuNzY4LDUuOTc1IDE1Ni4zMjUsNi4yOTcgTDE1Ni4zMjUsNy4xODQgQzE1Ni4zMjUsNy4zNiAxNTYuMzM4LDcuNTQ0IDE1Ni4zNjIsNy43MzMgQzE1Ni4zNzMsNy44MTQgMTU2LjM4Miw3Ljg5NCAxNTYuMzksNy45NzUgQzE1Ni41Myw5LjM5IDE1Ny4zNjMsMTAuOTczIDE1OC40OTUsMTEuOTc0IEwxNjUuODkxLDE4LjUxOSBDMTY2LjA2OCwxOC42NzUgMTY2LjI0OSwxOC44MTQgMTY2LjQzMiwxOC45MzQgQzE2OC4wMTEsMTkuOTc0IDE2OS4zODIsMTkuNCAxNjkuNDk0LDE3LjY1MiBDMTY5LjU0MywxNi44NjggMTY5LjU1MSwxNi4wNTcgMTY5LjUxNywxNS4yMjMgTDE2OS41MTQsMTUuMDYzIEwxNjkuNTE0LDEzLjkxMiBDMTcwLjc4LDE0LjY0MiAxOTUuNTAxLDI4LjkxNSAxOTUuNTAxLDI4LjkxNSBMMTk1LjUwMSw4Mi45MTUgQzE5NS41MDEsODQuMDA1IDE5NC43MzEsODQuNDQ1IDE5My43ODEsODMuODk3IEwxNTEuMzA4LDU5LjM3NCBDMTUwLjM1OCw1OC44MjYgMTQ5LjU4OCw1Ny40OTcgMTQ5LjU4OCw1Ni40MDggTDE0OS41ODgsMjIuMzc1IiBpZD0iRmlsbC05IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE5NC41NTMsODQuMjUgQzE5NC4yOTYsODQuMjUgMTk0LjAxMyw4NC4xNjUgMTkzLjcyMiw4My45OTcgTDE1MS4yNSw1OS40NzYgQzE1MC4yNjksNTguOTA5IDE0OS40NzEsNTcuNTMzIDE0OS40NzEsNTYuNDA4IEwxNDkuNDcxLDIyLjM3NSBMMTQ5LjcwNSwyMi4zNzUgTDE0OS43MDUsNTYuNDA4IEMxNDkuNzA1LDU3LjQ1OSAxNTAuNDUsNTguNzQ0IDE1MS4zNjYsNTkuMjc0IEwxOTMuODM5LDgzLjc5NSBDMTk0LjI2Myw4NC4wNCAxOTQuNjU1LDg0LjA4MyAxOTQuOTQyLDgzLjkxNyBDMTk1LjIyNyw4My43NTMgMTk1LjM4NCw4My4zOTcgMTk1LjM4NCw4Mi45MTUgTDE5NS4zODQsMjguOTgyIEMxOTQuMTAyLDI4LjI0MiAxNzIuMTA0LDE1LjU0MiAxNjkuNjMxLDE0LjExNCBMMTY5LjYzNCwxNS4yMiBDMTY5LjY2OCwxNi4wNTIgMTY5LjY2LDE2Ljg3NCAxNjkuNjEsMTcuNjU5IEMxNjkuNTU2LDE4LjUwMyAxNjkuMjE0LDE5LjEyMyAxNjguNjQ3LDE5LjQwNSBDMTY4LjAyOCwxOS43MTQgMTY3LjE5NywxOS41NzggMTY2LjM2NywxOS4wMzIgQzE2Ni4xODEsMTguOTA5IDE2NS45OTUsMTguNzY2IDE2NS44MTQsMTguNjA2IEwxNTguNDE3LDEyLjA2MiBDMTU3LjI1OSwxMS4wMzYgMTU2LjQxOCw5LjQzNyAxNTYuMjc0LDcuOTg2IEMxNTYuMjY2LDcuOTA3IDE1Ni4yNTcsNy44MjcgMTU2LjI0Nyw3Ljc0OCBDMTU2LjIyMSw3LjU1NSAxNTYuMjA5LDcuMzY1IDE1Ni4yMDksNy4xODQgTDE1Ni4yMDksNi4zNjQgQzE1NS4zNzUsNS44ODMgMTQ5LjUyOSwyLjUwOCAxNDkuNTI5LDIuNTA4IEwxNDkuNjQ2LDIuMzA2IEMxNDkuNjQ2LDIuMzA2IDE1NS44MjcsNS44NzQgMTU2LjM4NCw2LjE5NiBMMTU2LjQ0Miw2LjIzIEwxNTYuNDQyLDcuMTg0IEMxNTYuNDQyLDcuMzU1IDE1Ni40NTQsNy41MzUgMTU2LjQ3OCw3LjcxNyBDMTU2LjQ4OSw3LjggMTU2LjQ5OSw3Ljg4MiAxNTYuNTA3LDcuOTYzIEMxNTYuNjQ1LDkuMzU4IDE1Ny40NTUsMTAuODk4IDE1OC41NzIsMTEuODg2IEwxNjUuOTY5LDE4LjQzMSBDMTY2LjE0MiwxOC41ODQgMTY2LjMxOSwxOC43MiAxNjYuNDk2LDE4LjgzNyBDMTY3LjI1NCwxOS4zMzYgMTY4LDE5LjQ2NyAxNjguNTQzLDE5LjE5NiBDMTY5LjAzMywxOC45NTMgMTY5LjMyOSwxOC40MDEgMTY5LjM3NywxNy42NDUgQzE2OS40MjcsMTYuODY3IDE2OS40MzQsMTYuMDU0IDE2OS40MDEsMTUuMjI4IEwxNjkuMzk3LDE1LjA2NSBMMTY5LjM5NywxMy43MSBMMTY5LjU3MiwxMy44MSBDMTcwLjgzOSwxNC41NDEgMTk1LjU1OSwyOC44MTQgMTk1LjU1OSwyOC44MTQgTDE5NS42MTgsMjguODQ3IEwxOTUuNjE4LDgyLjkxNSBDMTk1LjYxOCw4My40ODQgMTk1LjQyLDgzLjkxMSAxOTUuMDU5LDg0LjExOSBDMTk0LjkwOCw4NC4yMDYgMTk0LjczNyw4NC4yNSAxOTQuNTUzLDg0LjI1IiBpZD0iRmlsbC0xMCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNDUuNjg1LDU2LjE2MSBMMTY5LjgsNzAuMDgzIEwxNDMuODIyLDg1LjA4MSBMMTQyLjM2LDg0Ljc3NCBDMTM1LjgyNiw4Mi42MDQgMTI4LjczMiw4MS4wNDYgMTIxLjM0MSw4MC4xNTggQzExNi45NzYsNzkuNjM0IDExMi42NzgsODEuMjU0IDExMS43NDMsODMuNzc4IEMxMTEuNTA2LDg0LjQxNCAxMTEuNTAzLDg1LjA3MSAxMTEuNzMyLDg1LjcwNiBDMTEzLjI3LDg5Ljk3MyAxMTUuOTY4LDk0LjA2OSAxMTkuNzI3LDk3Ljg0MSBMMTIwLjI1OSw5OC42ODYgQzEyMC4yNiw5OC42ODUgOTQuMjgyLDExMy42ODMgOTQuMjgyLDExMy42ODMgTDcwLjE2Nyw5OS43NjEgTDE0NS42ODUsNTYuMTYxIiBpZD0iRmlsbC0xMSIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik05NC4yODIsMTEzLjgxOCBMOTQuMjIzLDExMy43ODUgTDY5LjkzMyw5OS43NjEgTDcwLjEwOCw5OS42NiBMMTQ1LjY4NSw1Ni4wMjYgTDE0NS43NDMsNTYuMDU5IEwxNzAuMDMzLDcwLjA4MyBMMTQzLjg0Miw4NS4yMDUgTDE0My43OTcsODUuMTk1IEMxNDMuNzcyLDg1LjE5IDE0Mi4zMzYsODQuODg4IDE0Mi4zMzYsODQuODg4IEMxMzUuNzg3LDgyLjcxNCAxMjguNzIzLDgxLjE2MyAxMjEuMzI3LDgwLjI3NCBDMTIwLjc4OCw4MC4yMDkgMTIwLjIzNiw4MC4xNzcgMTE5LjY4OSw4MC4xNzcgQzExNS45MzEsODAuMTc3IDExMi42MzUsODEuNzA4IDExMS44NTIsODMuODE5IEMxMTEuNjI0LDg0LjQzMiAxMTEuNjIxLDg1LjA1MyAxMTEuODQyLDg1LjY2NyBDMTEzLjM3Nyw4OS45MjUgMTE2LjA1OCw5My45OTMgMTE5LjgxLDk3Ljc1OCBMMTE5LjgyNiw5Ny43NzkgTDEyMC4zNTIsOTguNjE0IEMxMjAuMzU0LDk4LjYxNyAxMjAuMzU2LDk4LjYyIDEyMC4zNTgsOTguNjI0IEwxMjAuNDIyLDk4LjcyNiBMMTIwLjMxNyw5OC43ODcgQzEyMC4yNjQsOTguODE4IDk0LjU5OSwxMTMuNjM1IDk0LjM0LDExMy43ODUgTDk0LjI4MiwxMTMuODE4IEw5NC4yODIsMTEzLjgxOCBaIE03MC40MDEsOTkuNzYxIEw5NC4yODIsMTEzLjU0OSBMMTE5LjA4NCw5OS4yMjkgQzExOS42Myw5OC45MTQgMTE5LjkzLDk4Ljc0IDEyMC4xMDEsOTguNjU0IEwxMTkuNjM1LDk3LjkxNCBDMTE1Ljg2NCw5NC4xMjcgMTEzLjE2OCw5MC4wMzMgMTExLjYyMiw4NS43NDYgQzExMS4zODIsODUuMDc5IDExMS4zODYsODQuNDA0IDExMS42MzMsODMuNzM4IEMxMTIuNDQ4LDgxLjUzOSAxMTUuODM2LDc5Ljk0MyAxMTkuNjg5LDc5Ljk0MyBDMTIwLjI0Niw3OS45NDMgMTIwLjgwNiw3OS45NzYgMTIxLjM1NSw4MC4wNDIgQzEyOC43NjcsODAuOTMzIDEzNS44NDYsODIuNDg3IDE0Mi4zOTYsODQuNjYzIEMxNDMuMjMyLDg0LjgzOCAxNDMuNjExLDg0LjkxNyAxNDMuNzg2LDg0Ljk2NyBMMTY5LjU2Niw3MC4wODMgTDE0NS42ODUsNTYuMjk1IEw3MC40MDEsOTkuNzYxIEw3MC40MDEsOTkuNzYxIFoiIGlkPSJGaWxsLTEyIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2Ny4yMywxOC45NzkgTDE2Ny4yMyw2OS44NSBMMTM5LjkwOSw4NS42MjMgTDEzMy40NDgsNzEuNDU2IEMxMzIuNTM4LDY5LjQ2IDEzMC4wMiw2OS43MTggMTI3LjgyNCw3Mi4wMyBDMTI2Ljc2OSw3My4xNCAxMjUuOTMxLDc0LjU4NSAxMjUuNDk0LDc2LjA0OCBMMTE5LjAzNCw5Ny42NzYgTDkxLjcxMiwxMTMuNDUgTDkxLjcxMiw2Mi41NzkgTDE2Ny4yMywxOC45NzkiIGlkPSJGaWxsLTEzIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTkxLjcxMiwxMTMuNTY3IEM5MS42OTIsMTEzLjU2NyA5MS42NzIsMTEzLjU2MSA5MS42NTMsMTEzLjU1MSBDOTEuNjE4LDExMy41MyA5MS41OTUsMTEzLjQ5MiA5MS41OTUsMTEzLjQ1IEw5MS41OTUsNjIuNTc5IEM5MS41OTUsNjIuNTM3IDkxLjYxOCw2Mi40OTkgOTEuNjUzLDYyLjQ3OCBMMTY3LjE3MiwxOC44NzggQzE2Ny4yMDgsMTguODU3IDE2Ny4yNTIsMTguODU3IDE2Ny4yODgsMTguODc4IEMxNjcuMzI0LDE4Ljg5OSAxNjcuMzQ3LDE4LjkzNyAxNjcuMzQ3LDE4Ljk3OSBMMTY3LjM0Nyw2OS44NSBDMTY3LjM0Nyw2OS44OTEgMTY3LjMyNCw2OS45MyAxNjcuMjg4LDY5Ljk1IEwxMzkuOTY3LDg1LjcyNSBDMTM5LjkzOSw4NS43NDEgMTM5LjkwNSw4NS43NDUgMTM5Ljg3Myw4NS43MzUgQzEzOS44NDIsODUuNzI1IDEzOS44MTYsODUuNzAyIDEzOS44MDIsODUuNjcyIEwxMzMuMzQyLDcxLjUwNCBDMTMyLjk2Nyw3MC42ODIgMTMyLjI4LDcwLjIyOSAxMzEuNDA4LDcwLjIyOSBDMTMwLjMxOSw3MC4yMjkgMTI5LjA0NCw3MC45MTUgMTI3LjkwOCw3Mi4xMSBDMTI2Ljg3NCw3My4yIDEyNi4wMzQsNzQuNjQ3IDEyNS42MDYsNzYuMDgyIEwxMTkuMTQ2LDk3LjcwOSBDMTE5LjEzNyw5Ny43MzggMTE5LjExOCw5Ny43NjIgMTE5LjA5Miw5Ny43NzcgTDkxLjc3LDExMy41NTEgQzkxLjc1MiwxMTMuNTYxIDkxLjczMiwxMTMuNTY3IDkxLjcxMiwxMTMuNTY3IEw5MS43MTIsMTEzLjU2NyBaIE05MS44MjksNjIuNjQ3IEw5MS44MjksMTEzLjI0OCBMMTE4LjkzNSw5Ny41OTggTDEyNS4zODIsNzYuMDE1IEMxMjUuODI3LDc0LjUyNSAxMjYuNjY0LDczLjA4MSAxMjcuNzM5LDcxLjk1IEMxMjguOTE5LDcwLjcwOCAxMzAuMjU2LDY5Ljk5NiAxMzEuNDA4LDY5Ljk5NiBDMTMyLjM3Nyw2OS45OTYgMTMzLjEzOSw3MC40OTcgMTMzLjU1NCw3MS40MDcgTDEzOS45NjEsODUuNDU4IEwxNjcuMTEzLDY5Ljc4MiBMMTY3LjExMywxOS4xODEgTDkxLjgyOSw2Mi42NDcgTDkxLjgyOSw2Mi42NDcgWiIgaWQ9IkZpbGwtMTQiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTY4LjU0MywxOS4yMTMgTDE2OC41NDMsNzAuMDgzIEwxNDEuMjIxLDg1Ljg1NyBMMTM0Ljc2MSw3MS42ODkgQzEzMy44NTEsNjkuNjk0IDEzMS4zMzMsNjkuOTUxIDEyOS4xMzcsNzIuMjYzIEMxMjguMDgyLDczLjM3NCAxMjcuMjQ0LDc0LjgxOSAxMjYuODA3LDc2LjI4MiBMMTIwLjM0Niw5Ny45MDkgTDkzLjAyNSwxMTMuNjgzIEw5My4wMjUsNjIuODEzIEwxNjguNTQzLDE5LjIxMyIgaWQ9IkZpbGwtMTUiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTMuMDI1LDExMy44IEM5My4wMDUsMTEzLjggOTIuOTg0LDExMy43OTUgOTIuOTY2LDExMy43ODUgQzkyLjkzMSwxMTMuNzY0IDkyLjkwOCwxMTMuNzI1IDkyLjkwOCwxMTMuNjg0IEw5Mi45MDgsNjIuODEzIEM5Mi45MDgsNjIuNzcxIDkyLjkzMSw2Mi43MzMgOTIuOTY2LDYyLjcxMiBMMTY4LjQ4NCwxOS4xMTIgQzE2OC41MiwxOS4wOSAxNjguNTY1LDE5LjA5IDE2OC42MDEsMTkuMTEyIEMxNjguNjM3LDE5LjEzMiAxNjguNjYsMTkuMTcxIDE2OC42NiwxOS4yMTIgTDE2OC42Niw3MC4wODMgQzE2OC42Niw3MC4xMjUgMTY4LjYzNyw3MC4xNjQgMTY4LjYwMSw3MC4xODQgTDE0MS4yOCw4NS45NTggQzE0MS4yNTEsODUuOTc1IDE0MS4yMTcsODUuOTc5IDE0MS4xODYsODUuOTY4IEMxNDEuMTU0LDg1Ljk1OCAxNDEuMTI5LDg1LjkzNiAxNDEuMTE1LDg1LjkwNiBMMTM0LjY1NSw3MS43MzggQzEzNC4yOCw3MC45MTUgMTMzLjU5Myw3MC40NjMgMTMyLjcyLDcwLjQ2MyBDMTMxLjYzMiw3MC40NjMgMTMwLjM1Nyw3MS4xNDggMTI5LjIyMSw3Mi4zNDQgQzEyOC4xODYsNzMuNDMzIDEyNy4zNDcsNzQuODgxIDEyNi45MTksNzYuMzE1IEwxMjAuNDU4LDk3Ljk0MyBDMTIwLjQ1LDk3Ljk3MiAxMjAuNDMxLDk3Ljk5NiAxMjAuNDA1LDk4LjAxIEw5My4wODMsMTEzLjc4NSBDOTMuMDY1LDExMy43OTUgOTMuMDQ1LDExMy44IDkzLjAyNSwxMTMuOCBMOTMuMDI1LDExMy44IFogTTkzLjE0Miw2Mi44ODEgTDkzLjE0MiwxMTMuNDgxIEwxMjAuMjQ4LDk3LjgzMiBMMTI2LjY5NSw3Ni4yNDggQzEyNy4xNCw3NC43NTggMTI3Ljk3Nyw3My4zMTUgMTI5LjA1Miw3Mi4xODMgQzEzMC4yMzEsNzAuOTQyIDEzMS41NjgsNzAuMjI5IDEzMi43Miw3MC4yMjkgQzEzMy42ODksNzAuMjI5IDEzNC40NTIsNzAuNzMxIDEzNC44NjcsNzEuNjQxIEwxNDEuMjc0LDg1LjY5MiBMMTY4LjQyNiw3MC4wMTYgTDE2OC40MjYsMTkuNDE1IEw5My4xNDIsNjIuODgxIEw5My4xNDIsNjIuODgxIFoiIGlkPSJGaWxsLTE2IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2OS44LDcwLjA4MyBMMTQyLjQ3OCw4NS44NTcgTDEzNi4wMTgsNzEuNjg5IEMxMzUuMTA4LDY5LjY5NCAxMzIuNTksNjkuOTUxIDEzMC4zOTMsNzIuMjYzIEMxMjkuMzM5LDczLjM3NCAxMjguNSw3NC44MTkgMTI4LjA2NCw3Ni4yODIgTDEyMS42MDMsOTcuOTA5IEw5NC4yODIsMTEzLjY4MyBMOTQuMjgyLDYyLjgxMyBMMTY5LjgsMTkuMjEzIEwxNjkuOCw3MC4wODMgWiIgaWQ9IkZpbGwtMTciIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTQuMjgyLDExMy45MTcgQzk0LjI0MSwxMTMuOTE3IDk0LjIwMSwxMTMuOTA3IDk0LjE2NSwxMTMuODg2IEM5NC4wOTMsMTEzLjg0NSA5NC4wNDgsMTEzLjc2NyA5NC4wNDgsMTEzLjY4NCBMOTQuMDQ4LDYyLjgxMyBDOTQuMDQ4LDYyLjczIDk0LjA5Myw2Mi42NTIgOTQuMTY1LDYyLjYxMSBMMTY5LjY4MywxOS4wMSBDMTY5Ljc1NSwxOC45NjkgMTY5Ljg0NCwxOC45NjkgMTY5LjkxNywxOS4wMSBDMTY5Ljk4OSwxOS4wNTIgMTcwLjAzMywxOS4xMjkgMTcwLjAzMywxOS4yMTIgTDE3MC4wMzMsNzAuMDgzIEMxNzAuMDMzLDcwLjE2NiAxNjkuOTg5LDcwLjI0NCAxNjkuOTE3LDcwLjI4NSBMMTQyLjU5NSw4Ni4wNiBDMTQyLjUzOCw4Ni4wOTIgMTQyLjQ2OSw4Ni4xIDE0Mi40MDcsODYuMDggQzE0Mi4zNDQsODYuMDYgMTQyLjI5Myw4Ni4wMTQgMTQyLjI2Niw4NS45NTQgTDEzNS44MDUsNzEuNzg2IEMxMzUuNDQ1LDcwLjk5NyAxMzQuODEzLDcwLjU4IDEzMy45NzcsNzAuNTggQzEzMi45MjEsNzAuNTggMTMxLjY3Niw3MS4yNTIgMTMwLjU2Miw3Mi40MjQgQzEyOS41NCw3My41MDEgMTI4LjcxMSw3NC45MzEgMTI4LjI4Nyw3Ni4zNDggTDEyMS44MjcsOTcuOTc2IEMxMjEuODEsOTguMDM0IDEyMS43NzEsOTguMDgyIDEyMS43Miw5OC4xMTIgTDk0LjM5OCwxMTMuODg2IEM5NC4zNjIsMTEzLjkwNyA5NC4zMjIsMTEzLjkxNyA5NC4yODIsMTEzLjkxNyBMOTQuMjgyLDExMy45MTcgWiBNOTQuNTE1LDYyLjk0OCBMOTQuNTE1LDExMy4yNzkgTDEyMS40MDYsOTcuNzU0IEwxMjcuODQsNzYuMjE1IEMxMjguMjksNzQuNzA4IDEyOS4xMzcsNzMuMjQ3IDEzMC4yMjQsNzIuMTAzIEMxMzEuNDI1LDcwLjgzOCAxMzIuNzkzLDcwLjExMiAxMzMuOTc3LDcwLjExMiBDMTM0Ljk5NSw3MC4xMTIgMTM1Ljc5NSw3MC42MzggMTM2LjIzLDcxLjU5MiBMMTQyLjU4NCw4NS41MjYgTDE2OS41NjYsNjkuOTQ4IEwxNjkuNTY2LDE5LjYxNyBMOTQuNTE1LDYyLjk0OCBMOTQuNTE1LDYyLjk0OCBaIiBpZD0iRmlsbC0xOCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDkuODk0LDkyLjk0MyBMMTA5Ljg5NCw5Mi45NDMgQzEwOC4xMiw5Mi45NDMgMTA2LjY1Myw5Mi4yMTggMTA1LjY1LDkwLjgyMyBDMTA1LjU4Myw5MC43MzEgMTA1LjU5Myw5MC42MSAxMDUuNjczLDkwLjUyOSBDMTA1Ljc1Myw5MC40NDggMTA1Ljg4LDkwLjQ0IDEwNS45NzQsOTAuNTA2IEMxMDYuNzU0LDkxLjA1MyAxMDcuNjc5LDkxLjMzMyAxMDguNzI0LDkxLjMzMyBDMTEwLjA0Nyw5MS4zMzMgMTExLjQ3OCw5MC44OTQgMTEyLjk4LDkwLjAyNyBDMTE4LjI5MSw4Ni45NiAxMjIuNjExLDc5LjUwOSAxMjIuNjExLDczLjQxNiBDMTIyLjYxMSw3MS40ODkgMTIyLjE2OSw2OS44NTYgMTIxLjMzMyw2OC42OTIgQzEyMS4yNjYsNjguNiAxMjEuMjc2LDY4LjQ3MyAxMjEuMzU2LDY4LjM5MiBDMTIxLjQzNiw2OC4zMTEgMTIxLjU2Myw2OC4yOTkgMTIxLjY1Niw2OC4zNjUgQzEyMy4zMjcsNjkuNTM3IDEyNC4yNDcsNzEuNzQ2IDEyNC4yNDcsNzQuNTg0IEMxMjQuMjQ3LDgwLjgyNiAxMTkuODIxLDg4LjQ0NyAxMTQuMzgyLDkxLjU4NyBDMTEyLjgwOCw5Mi40OTUgMTExLjI5OCw5Mi45NDMgMTA5Ljg5NCw5Mi45NDMgTDEwOS44OTQsOTIuOTQzIFogTTEwNi45MjUsOTEuNDAxIEMxMDcuNzM4LDkyLjA1MiAxMDguNzQ1LDkyLjI3OCAxMDkuODkzLDkyLjI3OCBMMTA5Ljg5NCw5Mi4yNzggQzExMS4yMTUsOTIuMjc4IDExMi42NDcsOTEuOTUxIDExNC4xNDgsOTEuMDg0IEMxMTkuNDU5LDg4LjAxNyAxMjMuNzgsODAuNjIxIDEyMy43OCw3NC41MjggQzEyMy43OCw3Mi41NDkgMTIzLjMxNyw3MC45MjkgMTIyLjQ1NCw2OS43NjcgQzEyMi44NjUsNzAuODAyIDEyMy4wNzksNzIuMDQyIDEyMy4wNzksNzMuNDAyIEMxMjMuMDc5LDc5LjY0NSAxMTguNjUzLDg3LjI4NSAxMTMuMjE0LDkwLjQyNSBDMTExLjY0LDkxLjMzNCAxMTAuMTMsOTEuNzQyIDEwOC43MjQsOTEuNzQyIEMxMDguMDgzLDkxLjc0MiAxMDcuNDgxLDkxLjU5MyAxMDYuOTI1LDkxLjQwMSBMMTA2LjkyNSw5MS40MDEgWiIgaWQ9IkZpbGwtMTkiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjA5Nyw5MC4yMyBDMTE4LjQ4MSw4Ny4xMjIgMTIyLjg0NSw3OS41OTQgMTIyLjg0NSw3My40MTYgQzEyMi44NDUsNzEuMzY1IDEyMi4zNjIsNjkuNzI0IDEyMS41MjIsNjguNTU2IEMxMTkuNzM4LDY3LjMwNCAxMTcuMTQ4LDY3LjM2MiAxMTQuMjY1LDY5LjAyNiBDMTA4Ljg4MSw3Mi4xMzQgMTA0LjUxNyw3OS42NjIgMTA0LjUxNyw4NS44NCBDMTA0LjUxNyw4Ny44OTEgMTA1LDg5LjUzMiAxMDUuODQsOTAuNyBDMTA3LjYyNCw5MS45NTIgMTEwLjIxNCw5MS44OTQgMTEzLjA5Nyw5MC4yMyIgaWQ9IkZpbGwtMjAiIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTA4LjcyNCw5MS42MTQgTDEwOC43MjQsOTEuNjE0IEMxMDcuNTgyLDkxLjYxNCAxMDYuNTY2LDkxLjQwMSAxMDUuNzA1LDkwLjc5NyBDMTA1LjY4NCw5MC43ODMgMTA1LjY2NSw5MC44MTEgMTA1LjY1LDkwLjc5IEMxMDQuNzU2LDg5LjU0NiAxMDQuMjgzLDg3Ljg0MiAxMDQuMjgzLDg1LjgxNyBDMTA0LjI4Myw3OS41NzUgMTA4LjcwOSw3MS45NTMgMTE0LjE0OCw2OC44MTIgQzExNS43MjIsNjcuOTA0IDExNy4yMzIsNjcuNDQ5IDExOC42MzgsNjcuNDQ5IEMxMTkuNzgsNjcuNDQ5IDEyMC43OTYsNjcuNzU4IDEyMS42NTYsNjguMzYyIEMxMjEuNjc4LDY4LjM3NyAxMjEuNjk3LDY4LjM5NyAxMjEuNzEyLDY4LjQxOCBDMTIyLjYwNiw2OS42NjIgMTIzLjA3OSw3MS4zOSAxMjMuMDc5LDczLjQxNSBDMTIzLjA3OSw3OS42NTggMTE4LjY1Myw4Ny4xOTggMTEzLjIxNCw5MC4zMzggQzExMS42NCw5MS4yNDcgMTEwLjEzLDkxLjYxNCAxMDguNzI0LDkxLjYxNCBMMTA4LjcyNCw5MS42MTQgWiBNMTA2LjAwNiw5MC41MDUgQzEwNi43OCw5MS4wMzcgMTA3LjY5NCw5MS4yODEgMTA4LjcyNCw5MS4yODEgQzExMC4wNDcsOTEuMjgxIDExMS40NzgsOTAuODY4IDExMi45OCw5MC4wMDEgQzExOC4yOTEsODYuOTM1IDEyMi42MTEsNzkuNDk2IDEyMi42MTEsNzMuNDAzIEMxMjIuNjExLDcxLjQ5NCAxMjIuMTc3LDY5Ljg4IDEyMS4zNTYsNjguNzE4IEMxMjAuNTgyLDY4LjE4NSAxMTkuNjY4LDY3LjkxOSAxMTguNjM4LDY3LjkxOSBDMTE3LjMxNSw2Ny45MTkgMTE1Ljg4Myw2OC4zNiAxMTQuMzgyLDY5LjIyNyBDMTA5LjA3MSw3Mi4yOTMgMTA0Ljc1MSw3OS43MzMgMTA0Ljc1MSw4NS44MjYgQzEwNC43NTEsODcuNzM1IDEwNS4xODUsODkuMzQzIDEwNi4wMDYsOTAuNTA1IEwxMDYuMDA2LDkwLjUwNSBaIiBpZD0iRmlsbC0yMSIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNDkuMzE4LDcuMjYyIEwxMzkuMzM0LDE2LjE0IEwxNTUuMjI3LDI3LjE3MSBMMTYwLjgxNiwyMS4wNTkgTDE0OS4zMTgsNy4yNjIiIGlkPSJGaWxsLTIyIiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2OS42NzYsMTMuODQgTDE1OS45MjgsMTkuNDY3IEMxNTYuMjg2LDIxLjU3IDE1MC40LDIxLjU4IDE0Ni43ODEsMTkuNDkxIEMxNDMuMTYxLDE3LjQwMiAxNDMuMTgsMTQuMDAzIDE0Ni44MjIsMTEuOSBMMTU2LjMxNyw2LjI5MiBMMTQ5LjU4OCwyLjQwNyBMNjcuNzUyLDQ5LjQ3OCBMMTEzLjY3NSw3NS45OTIgTDExNi43NTYsNzQuMjEzIEMxMTcuMzg3LDczLjg0OCAxMTcuNjI1LDczLjMxNSAxMTcuMzc0LDcyLjgyMyBDMTE1LjAxNyw2OC4xOTEgMTE0Ljc4MSw2My4yNzcgMTE2LjY5MSw1OC41NjEgQzEyMi4zMjksNDQuNjQxIDE0MS4yLDMzLjc0NiAxNjUuMzA5LDMwLjQ5MSBDMTczLjQ3OCwyOS4zODggMTgxLjk4OSwyOS41MjQgMTkwLjAxMywzMC44ODUgQzE5MC44NjUsMzEuMDMgMTkxLjc4OSwzMC44OTMgMTkyLjQyLDMwLjUyOCBMMTk1LjUwMSwyOC43NSBMMTY5LjY3NiwxMy44NCIgaWQ9IkZpbGwtMjMiIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjY3NSw3Ni40NTkgQzExMy41OTQsNzYuNDU5IDExMy41MTQsNzYuNDM4IDExMy40NDIsNzYuMzk3IEw2Ny41MTgsNDkuODgyIEM2Ny4zNzQsNDkuNzk5IDY3LjI4NCw0OS42NDUgNjcuMjg1LDQ5LjQ3OCBDNjcuMjg1LDQ5LjMxMSA2Ny4zNzQsNDkuMTU3IDY3LjUxOSw0OS4wNzMgTDE0OS4zNTUsMi4wMDIgQzE0OS40OTksMS45MTkgMTQ5LjY3NywxLjkxOSAxNDkuODIxLDIuMDAyIEwxNTYuNTUsNS44ODcgQzE1Ni43NzQsNi4wMTcgMTU2Ljg1LDYuMzAyIDE1Ni43MjIsNi41MjYgQzE1Ni41OTIsNi43NDkgMTU2LjMwNyw2LjgyNiAxNTYuMDgzLDYuNjk2IEwxNDkuNTg3LDIuOTQ2IEw2OC42ODcsNDkuNDc5IEwxMTMuNjc1LDc1LjQ1MiBMMTE2LjUyMyw3My44MDggQzExNi43MTUsNzMuNjk3IDExNy4xNDMsNzMuMzk5IDExNi45NTgsNzMuMDM1IEMxMTQuNTQyLDY4LjI4NyAxMTQuMyw2My4yMjEgMTE2LjI1OCw1OC4zODUgQzExOS4wNjQsNTEuNDU4IDEyNS4xNDMsNDUuMTQzIDEzMy44NCw0MC4xMjIgQzE0Mi40OTcsMzUuMTI0IDE1My4zNTgsMzEuNjMzIDE2NS4yNDcsMzAuMDI4IEMxNzMuNDQ1LDI4LjkyMSAxODIuMDM3LDI5LjA1OCAxOTAuMDkxLDMwLjQyNSBDMTkwLjgzLDMwLjU1IDE5MS42NTIsMzAuNDMyIDE5Mi4xODYsMzAuMTI0IEwxOTQuNTY3LDI4Ljc1IEwxNjkuNDQyLDE0LjI0NCBDMTY5LjIxOSwxNC4xMTUgMTY5LjE0MiwxMy44MjkgMTY5LjI3MSwxMy42MDYgQzE2OS40LDEzLjM4MiAxNjkuNjg1LDEzLjMwNiAxNjkuOTA5LDEzLjQzNSBMMTk1LjczNCwyOC4zNDUgQzE5NS44NzksMjguNDI4IDE5NS45NjgsMjguNTgzIDE5NS45NjgsMjguNzUgQzE5NS45NjgsMjguOTE2IDE5NS44NzksMjkuMDcxIDE5NS43MzQsMjkuMTU0IEwxOTIuNjUzLDMwLjkzMyBDMTkxLjkzMiwzMS4zNSAxOTAuODksMzEuNTA4IDE4OS45MzUsMzEuMzQ2IEMxODEuOTcyLDI5Ljk5NSAxNzMuNDc4LDI5Ljg2IDE2NS4zNzIsMzAuOTU0IEMxNTMuNjAyLDMyLjU0MyAxNDIuODYsMzUuOTkzIDEzNC4zMDcsNDAuOTMxIEMxMjUuNzkzLDQ1Ljg0NyAxMTkuODUxLDUyLjAwNCAxMTcuMTI0LDU4LjczNiBDMTE1LjI3LDYzLjMxNCAxMTUuNTAxLDY4LjExMiAxMTcuNzksNzIuNjExIEMxMTguMTYsNzMuMzM2IDExNy44NDUsNzQuMTI0IDExNi45OSw3NC42MTcgTDExMy45MDksNzYuMzk3IEMxMTMuODM2LDc2LjQzOCAxMTMuNzU2LDc2LjQ1OSAxMTMuNjc1LDc2LjQ1OSIgaWQ9IkZpbGwtMjQiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUzLjMxNiwyMS4yNzkgQzE1MC45MDMsMjEuMjc5IDE0OC40OTUsMjAuNzUxIDE0Ni42NjQsMTkuNjkzIEMxNDQuODQ2LDE4LjY0NCAxNDMuODQ0LDE3LjIzMiAxNDMuODQ0LDE1LjcxOCBDMTQzLjg0NCwxNC4xOTEgMTQ0Ljg2LDEyLjc2MyAxNDYuNzA1LDExLjY5OCBMMTU2LjE5OCw2LjA5MSBDMTU2LjMwOSw2LjAyNSAxNTYuNDUyLDYuMDYyIDE1Ni41MTgsNi4xNzMgQzE1Ni41ODMsNi4yODQgMTU2LjU0Nyw2LjQyNyAxNTYuNDM2LDYuNDkzIEwxNDYuOTQsMTIuMTAyIEMxNDUuMjQ0LDEzLjA4MSAxNDQuMzEyLDE0LjM2NSAxNDQuMzEyLDE1LjcxOCBDMTQ0LjMxMiwxNy4wNTggMTQ1LjIzLDE4LjMyNiAxNDYuODk3LDE5LjI4OSBDMTUwLjQ0NiwyMS4zMzggMTU2LjI0LDIxLjMyNyAxNTkuODExLDE5LjI2NSBMMTY5LjU1OSwxMy42MzcgQzE2OS42NywxMy41NzMgMTY5LjgxMywxMy42MTEgMTY5Ljg3OCwxMy43MjMgQzE2OS45NDMsMTMuODM0IDE2OS45MDQsMTMuOTc3IDE2OS43OTMsMTQuMDQyIEwxNjAuMDQ1LDE5LjY3IEMxNTguMTg3LDIwLjc0MiAxNTUuNzQ5LDIxLjI3OSAxNTMuMzE2LDIxLjI3OSIgaWQ9IkZpbGwtMjUiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjY3NSw3NS45OTIgTDY3Ljc2Miw0OS40ODQiIGlkPSJGaWxsLTI2IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTExMy42NzUsNzYuMzQyIEMxMTMuNjE1LDc2LjM0MiAxMTMuNTU1LDc2LjMyNyAxMTMuNSw3Ni4yOTUgTDY3LjU4Nyw0OS43ODcgQzY3LjQxOSw0OS42OSA2Ny4zNjIsNDkuNDc2IDY3LjQ1OSw0OS4zMDkgQzY3LjU1Niw0OS4xNDEgNjcuNzcsNDkuMDgzIDY3LjkzNyw0OS4xOCBMMTEzLjg1LDc1LjY4OCBDMTE0LjAxOCw3NS43ODUgMTE0LjA3NSw3NiAxMTMuOTc4LDc2LjE2NyBDMTEzLjkxNCw3Ni4yNzkgMTEzLjc5Niw3Ni4zNDIgMTEzLjY3NSw3Ni4zNDIiIGlkPSJGaWxsLTI3IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY3Ljc2Miw0OS40ODQgTDY3Ljc2MiwxMDMuNDg1IEM2Ny43NjIsMTA0LjU3NSA2OC41MzIsMTA1LjkwMyA2OS40ODIsMTA2LjQ1MiBMMTExLjk1NSwxMzAuOTczIEMxMTIuOTA1LDEzMS41MjIgMTEzLjY3NSwxMzEuMDgzIDExMy42NzUsMTI5Ljk5MyBMMTEzLjY3NSw3NS45OTIiIGlkPSJGaWxsLTI4IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTExMi43MjcsMTMxLjU2MSBDMTEyLjQzLDEzMS41NjEgMTEyLjEwNywxMzEuNDY2IDExMS43OCwxMzEuMjc2IEw2OS4zMDcsMTA2Ljc1NSBDNjguMjQ0LDEwNi4xNDIgNjcuNDEyLDEwNC43MDUgNjcuNDEyLDEwMy40ODUgTDY3LjQxMiw0OS40ODQgQzY3LjQxMiw0OS4yOSA2Ny41NjksNDkuMTM0IDY3Ljc2Miw0OS4xMzQgQzY3Ljk1Niw0OS4xMzQgNjguMTEzLDQ5LjI5IDY4LjExMyw0OS40ODQgTDY4LjExMywxMDMuNDg1IEM2OC4xMTMsMTA0LjQ0NSA2OC44MiwxMDUuNjY1IDY5LjY1NywxMDYuMTQ4IEwxMTIuMTMsMTMwLjY3IEMxMTIuNDc0LDEzMC44NjggMTEyLjc5MSwxMzAuOTEzIDExMywxMzAuNzkyIEMxMTMuMjA2LDEzMC42NzMgMTEzLjMyNSwxMzAuMzgxIDExMy4zMjUsMTI5Ljk5MyBMMTEzLjMyNSw3NS45OTIgQzExMy4zMjUsNzUuNzk4IDExMy40ODIsNzUuNjQxIDExMy42NzUsNzUuNjQxIEMxMTMuODY5LDc1LjY0MSAxMTQuMDI1LDc1Ljc5OCAxMTQuMDI1LDc1Ljk5MiBMMTE0LjAyNSwxMjkuOTkzIEMxMTQuMDI1LDEzMC42NDggMTEzLjc4NiwxMzEuMTQ3IDExMy4zNSwxMzEuMzk5IEMxMTMuMTYyLDEzMS41MDcgMTEyLjk1MiwxMzEuNTYxIDExMi43MjcsMTMxLjU2MSIgaWQ9IkZpbGwtMjkiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEyLjg2LDQwLjUxMiBDMTEyLjg2LDQwLjUxMiAxMTIuODYsNDAuNTEyIDExMi44NTksNDAuNTEyIEMxMTAuNTQxLDQwLjUxMiAxMDguMzYsMzkuOTkgMTA2LjcxNywzOS4wNDEgQzEwNS4wMTIsMzguMDU3IDEwNC4wNzQsMzYuNzI2IDEwNC4wNzQsMzUuMjkyIEMxMDQuMDc0LDMzLjg0NyAxMDUuMDI2LDMyLjUwMSAxMDYuNzU0LDMxLjUwNCBMMTE4Ljc5NSwyNC41NTEgQzEyMC40NjMsMjMuNTg5IDEyMi42NjksMjMuMDU4IDEyNS4wMDcsMjMuMDU4IEMxMjcuMzI1LDIzLjA1OCAxMjkuNTA2LDIzLjU4MSAxMzEuMTUsMjQuNTMgQzEzMi44NTQsMjUuNTE0IDEzMy43OTMsMjYuODQ1IDEzMy43OTMsMjguMjc4IEMxMzMuNzkzLDI5LjcyNCAxMzIuODQxLDMxLjA2OSAxMzEuMTEzLDMyLjA2NyBMMTE5LjA3MSwzOS4wMTkgQzExNy40MDMsMzkuOTgyIDExNS4xOTcsNDAuNTEyIDExMi44Niw0MC41MTIgTDExMi44Niw0MC41MTIgWiBNMTI1LjAwNywyMy43NTkgQzEyMi43OSwyMy43NTkgMTIwLjcwOSwyNC4yNTYgMTE5LjE0NiwyNS4xNTggTDEwNy4xMDQsMzIuMTEgQzEwNS42MDIsMzIuOTc4IDEwNC43NzQsMzQuMTA4IDEwNC43NzQsMzUuMjkyIEMxMDQuNzc0LDM2LjQ2NSAxMDUuNTg5LDM3LjU4MSAxMDcuMDY3LDM4LjQzNCBDMTA4LjYwNSwzOS4zMjMgMTEwLjY2MywzOS44MTIgMTEyLjg1OSwzOS44MTIgTDExMi44NiwzOS44MTIgQzExNS4wNzYsMzkuODEyIDExNy4xNTgsMzkuMzE1IDExOC43MjEsMzguNDEzIEwxMzAuNzYyLDMxLjQ2IEMxMzIuMjY0LDMwLjU5MyAxMzMuMDkyLDI5LjQ2MyAxMzMuMDkyLDI4LjI3OCBDMTMzLjA5MiwyNy4xMDYgMTMyLjI3OCwyNS45OSAxMzAuOCwyNS4xMzYgQzEyOS4yNjEsMjQuMjQ4IDEyNy4yMDQsMjMuNzU5IDEyNS4wMDcsMjMuNzU5IEwxMjUuMDA3LDIzLjc1OSBaIiBpZD0iRmlsbC0zMCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNjUuNjMsMTYuMjE5IEwxNTkuODk2LDE5LjUzIEMxNTYuNzI5LDIxLjM1OCAxNTEuNjEsMjEuMzY3IDE0OC40NjMsMTkuNTUgQzE0NS4zMTYsMTcuNzMzIDE0NS4zMzIsMTQuNzc4IDE0OC40OTksMTIuOTQ5IEwxNTQuMjMzLDkuNjM5IEwxNjUuNjMsMTYuMjE5IiBpZD0iRmlsbC0zMSIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNTQuMjMzLDEwLjQ0OCBMMTY0LjIyOCwxNi4yMTkgTDE1OS41NDYsMTguOTIzIEMxNTguMTEyLDE5Ljc1IDE1Ni4xOTQsMjAuMjA2IDE1NC4xNDcsMjAuMjA2IEMxNTIuMTE4LDIwLjIwNiAxNTAuMjI0LDE5Ljc1NyAxNDguODE0LDE4Ljk0MyBDMTQ3LjUyNCwxOC4xOTkgMTQ2LjgxNCwxNy4yNDkgMTQ2LjgxNCwxNi4yNjkgQzE0Ni44MTQsMTUuMjc4IDE0Ny41MzcsMTQuMzE0IDE0OC44NSwxMy41NTYgTDE1NC4yMzMsMTAuNDQ4IE0xNTQuMjMzLDkuNjM5IEwxNDguNDk5LDEyLjk0OSBDMTQ1LjMzMiwxNC43NzggMTQ1LjMxNiwxNy43MzMgMTQ4LjQ2MywxOS41NSBDMTUwLjAzMSwyMC40NTUgMTUyLjA4NiwyMC45MDcgMTU0LjE0NywyMC45MDcgQzE1Ni4yMjQsMjAuOTA3IDE1OC4zMDYsMjAuNDQ3IDE1OS44OTYsMTkuNTMgTDE2NS42MywxNi4yMTkgTDE1NC4yMzMsOS42MzkiIGlkPSJGaWxsLTMyIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0NS40NDUsNzIuNjY3IEwxNDUuNDQ1LDcyLjY2NyBDMTQzLjY3Miw3Mi42NjcgMTQyLjIwNCw3MS44MTcgMTQxLjIwMiw3MC40MjIgQzE0MS4xMzUsNzAuMzMgMTQxLjE0NSw3MC4xNDcgMTQxLjIyNSw3MC4wNjYgQzE0MS4zMDUsNjkuOTg1IDE0MS40MzIsNjkuOTQ2IDE0MS41MjUsNzAuMDExIEMxNDIuMzA2LDcwLjU1OSAxNDMuMjMxLDcwLjgyMyAxNDQuMjc2LDcwLjgyMiBDMTQ1LjU5OCw3MC44MjIgMTQ3LjAzLDcwLjM3NiAxNDguNTMyLDY5LjUwOSBDMTUzLjg0Miw2Ni40NDMgMTU4LjE2Myw1OC45ODcgMTU4LjE2Myw1Mi44OTQgQzE1OC4xNjMsNTAuOTY3IDE1Ny43MjEsNDkuMzMyIDE1Ni44ODQsNDguMTY4IEMxNTYuODE4LDQ4LjA3NiAxNTYuODI4LDQ3Ljk0OCAxNTYuOTA4LDQ3Ljg2NyBDMTU2Ljk4OCw0Ny43ODYgMTU3LjExNCw0Ny43NzQgMTU3LjIwOCw0Ny44NCBDMTU4Ljg3OCw0OS4wMTIgMTU5Ljc5OCw1MS4yMiAxNTkuNzk4LDU0LjA1OSBDMTU5Ljc5OCw2MC4zMDEgMTU1LjM3Myw2OC4wNDYgMTQ5LjkzMyw3MS4xODYgQzE0OC4zNiw3Mi4wOTQgMTQ2Ljg1LDcyLjY2NyAxNDUuNDQ1LDcyLjY2NyBMMTQ1LjQ0NSw3Mi42NjcgWiBNMTQyLjQ3Niw3MSBDMTQzLjI5LDcxLjY1MSAxNDQuMjk2LDcyLjAwMiAxNDUuNDQ1LDcyLjAwMiBDMTQ2Ljc2Nyw3Mi4wMDIgMTQ4LjE5OCw3MS41NSAxNDkuNyw3MC42ODIgQzE1NS4wMSw2Ny42MTcgMTU5LjMzMSw2MC4xNTkgMTU5LjMzMSw1NC4wNjUgQzE1OS4zMzEsNTIuMDg1IDE1OC44NjgsNTAuNDM1IDE1OC4wMDYsNDkuMjcyIEMxNTguNDE3LDUwLjMwNyAxNTguNjMsNTEuNTMyIDE1OC42Myw1Mi44OTIgQzE1OC42Myw1OS4xMzQgMTU0LjIwNSw2Ni43NjcgMTQ4Ljc2NSw2OS45MDcgQzE0Ny4xOTIsNzAuODE2IDE0NS42ODEsNzEuMjgzIDE0NC4yNzYsNzEuMjgzIEMxNDMuNjM0LDcxLjI4MyAxNDMuMDMzLDcxLjE5MiAxNDIuNDc2LDcxIEwxNDIuNDc2LDcxIFoiIGlkPSJGaWxsLTMzIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0OC42NDgsNjkuNzA0IEMxNTQuMDMyLDY2LjU5NiAxNTguMzk2LDU5LjA2OCAxNTguMzk2LDUyLjg5MSBDMTU4LjM5Niw1MC44MzkgMTU3LjkxMyw0OS4xOTggMTU3LjA3NCw0OC4wMyBDMTU1LjI4OSw0Ni43NzggMTUyLjY5OSw0Ni44MzYgMTQ5LjgxNiw0OC41MDEgQzE0NC40MzMsNTEuNjA5IDE0MC4wNjgsNTkuMTM3IDE0MC4wNjgsNjUuMzE0IEMxNDAuMDY4LDY3LjM2NSAxNDAuNTUyLDY5LjAwNiAxNDEuMzkxLDcwLjE3NCBDMTQzLjE3Niw3MS40MjcgMTQ1Ljc2NSw3MS4zNjkgMTQ4LjY0OCw2OS43MDQiIGlkPSJGaWxsLTM0IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0NC4yNzYsNzEuMjc2IEwxNDQuMjc2LDcxLjI3NiBDMTQzLjEzMyw3MS4yNzYgMTQyLjExOCw3MC45NjkgMTQxLjI1Nyw3MC4zNjUgQzE0MS4yMzYsNzAuMzUxIDE0MS4yMTcsNzAuMzMyIDE0MS4yMDIsNzAuMzExIEMxNDAuMzA3LDY5LjA2NyAxMzkuODM1LDY3LjMzOSAxMzkuODM1LDY1LjMxNCBDMTM5LjgzNSw1OS4wNzMgMTQ0LjI2LDUxLjQzOSAxNDkuNyw0OC4yOTggQzE1MS4yNzMsNDcuMzkgMTUyLjc4NCw0Ni45MjkgMTU0LjE4OSw0Ni45MjkgQzE1NS4zMzIsNDYuOTI5IDE1Ni4zNDcsNDcuMjM2IDE1Ny4yMDgsNDcuODM5IEMxNTcuMjI5LDQ3Ljg1NCAxNTcuMjQ4LDQ3Ljg3MyAxNTcuMjYzLDQ3Ljg5NCBDMTU4LjE1Nyw0OS4xMzggMTU4LjYzLDUwLjg2NSAxNTguNjMsNTIuODkxIEMxNTguNjMsNTkuMTMyIDE1NC4yMDUsNjYuNzY2IDE0OC43NjUsNjkuOTA3IEMxNDcuMTkyLDcwLjgxNSAxNDUuNjgxLDcxLjI3NiAxNDQuMjc2LDcxLjI3NiBMMTQ0LjI3Niw3MS4yNzYgWiBNMTQxLjU1OCw3MC4xMDQgQzE0Mi4zMzEsNzAuNjM3IDE0My4yNDUsNzEuMDA1IDE0NC4yNzYsNzEuMDA1IEMxNDUuNTk4LDcxLjAwNSAxNDcuMDMsNzAuNDY3IDE0OC41MzIsNjkuNiBDMTUzLjg0Miw2Ni41MzQgMTU4LjE2Myw1OS4wMzMgMTU4LjE2Myw1Mi45MzkgQzE1OC4xNjMsNTEuMDMxIDE1Ny43MjksNDkuMzg1IDE1Ni45MDcsNDguMjIzIEMxNTYuMTMzLDQ3LjY5MSAxNTUuMjE5LDQ3LjQwOSAxNTQuMTg5LDQ3LjQwOSBDMTUyLjg2Nyw0Ny40MDkgMTUxLjQzNSw0Ny44NDIgMTQ5LjkzMyw0OC43MDkgQzE0NC42MjMsNTEuNzc1IDE0MC4zMDIsNTkuMjczIDE0MC4zMDIsNjUuMzY2IEMxNDAuMzAyLDY3LjI3NiAxNDAuNzM2LDY4Ljk0MiAxNDEuNTU4LDcwLjEwNCBMMTQxLjU1OCw3MC4xMDQgWiIgaWQ9IkZpbGwtMzUiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUwLjcyLDY1LjM2MSBMMTUwLjM1Nyw2NS4wNjYgQzE1MS4xNDcsNjQuMDkyIDE1MS44NjksNjMuMDQgMTUyLjUwNSw2MS45MzggQzE1My4zMTMsNjAuNTM5IDE1My45NzgsNTkuMDY3IDE1NC40ODIsNTcuNTYzIEwxNTQuOTI1LDU3LjcxMiBDMTU0LjQxMiw1OS4yNDUgMTUzLjczMyw2MC43NDUgMTUyLjkxLDYyLjE3MiBDMTUyLjI2Miw2My4yOTUgMTUxLjUyNSw2NC4zNjggMTUwLjcyLDY1LjM2MSIgaWQ9IkZpbGwtMzYiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE1LjkxNyw4NC41MTQgTDExNS41NTQsODQuMjIgQzExNi4zNDQsODMuMjQ1IDExNy4wNjYsODIuMTk0IDExNy43MDIsODEuMDkyIEMxMTguNTEsNzkuNjkyIDExOS4xNzUsNzguMjIgMTE5LjY3OCw3Ni43MTcgTDEyMC4xMjEsNzYuODY1IEMxMTkuNjA4LDc4LjM5OCAxMTguOTMsNzkuODk5IDExOC4xMDYsODEuMzI2IEMxMTcuNDU4LDgyLjQ0OCAxMTYuNzIyLDgzLjUyMSAxMTUuOTE3LDg0LjUxNCIgaWQ9IkZpbGwtMzciIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE0LDEzMC40NzYgTDExNCwxMzAuMDA4IEwxMTQsNzYuMDUyIEwxMTQsNzUuNTg0IEwxMTQsNzYuMDUyIEwxMTQsMTMwLjAwOCBMMTE0LDEzMC40NzYiIGlkPSJGaWxsLTM4IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBpZD0iSW1wb3J0ZWQtTGF5ZXJzLUNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYyLjAwMDAwMCwgMC4wMDAwMDApIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTkuODIyLDM3LjQ3NCBDMTkuODM5LDM3LjMzOSAxOS43NDcsMzcuMTk0IDE5LjU1NSwzNy4wODIgQzE5LjIyOCwzNi44OTQgMTguNzI5LDM2Ljg3MiAxOC40NDYsMzcuMDM3IEwxMi40MzQsNDAuNTA4IEMxMi4zMDMsNDAuNTg0IDEyLjI0LDQwLjY4NiAxMi4yNDMsNDAuNzkzIEMxMi4yNDUsNDAuOTI1IDEyLjI0NSw0MS4yNTQgMTIuMjQ1LDQxLjM3MSBMMTIuMjQ1LDQxLjQxNCBMMTIuMjM4LDQxLjU0MiBDOC4xNDgsNDMuODg3IDUuNjQ3LDQ1LjMyMSA1LjY0Nyw0NS4zMjEgQzUuNjQ2LDQ1LjMyMSAzLjU3LDQ2LjM2NyAyLjg2LDUwLjUxMyBDMi44Niw1MC41MTMgMS45NDgsNTcuNDc0IDEuOTYyLDcwLjI1OCBDMS45NzcsODIuODI4IDIuNTY4LDg3LjMyOCAzLjEyOSw5MS42MDkgQzMuMzQ5LDkzLjI5MyA2LjEzLDkzLjczNCA2LjEzLDkzLjczNCBDNi40NjEsOTMuNzc0IDYuODI4LDkzLjcwNyA3LjIxLDkzLjQ4NiBMODIuNDgzLDQ5LjkzNSBDODQuMjkxLDQ4Ljg2NiA4NS4xNSw0Ni4yMTYgODUuNTM5LDQzLjY1MSBDODYuNzUyLDM1LjY2MSA4Ny4yMTQsMTAuNjczIDg1LjI2NCwzLjc3MyBDODUuMDY4LDMuMDggODQuNzU0LDIuNjkgODQuMzk2LDIuNDkxIEw4Mi4zMSwxLjcwMSBDODEuNTgzLDEuNzI5IDgwLjg5NCwyLjE2OCA4MC43NzYsMi4yMzYgQzgwLjYzNiwyLjMxNyA0MS44MDcsMjQuNTg1IDIwLjAzMiwzNy4wNzIgTDE5LjgyMiwzNy40NzQiIGlkPSJGaWxsLTEiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNODIuMzExLDEuNzAxIEw4NC4zOTYsMi40OTEgQzg0Ljc1NCwyLjY5IDg1LjA2OCwzLjA4IDg1LjI2NCwzLjc3MyBDODcuMjEzLDEwLjY3MyA4Ni43NTEsMzUuNjYgODUuNTM5LDQzLjY1MSBDODUuMTQ5LDQ2LjIxNiA4NC4yOSw0OC44NjYgODIuNDgzLDQ5LjkzNSBMNy4yMSw5My40ODYgQzYuODk3LDkzLjY2NyA2LjU5NSw5My43NDQgNi4zMTQsOTMuNzQ0IEw2LjEzMSw5My43MzMgQzYuMTMxLDkzLjczNCAzLjM0OSw5My4yOTMgMy4xMjgsOTEuNjA5IEMyLjU2OCw4Ny4zMjcgMS45NzcsODIuODI4IDEuOTYzLDcwLjI1OCBDMS45NDgsNTcuNDc0IDIuODYsNTAuNTEzIDIuODYsNTAuNTEzIEMzLjU3LDQ2LjM2NyA1LjY0Nyw0NS4zMjEgNS42NDcsNDUuMzIxIEM1LjY0Nyw0NS4zMjEgOC4xNDgsNDMuODg3IDEyLjIzOCw0MS41NDIgTDEyLjI0NSw0MS40MTQgTDEyLjI0NSw0MS4zNzEgQzEyLjI0NSw0MS4yNTQgMTIuMjQ1LDQwLjkyNSAxMi4yNDMsNDAuNzkzIEMxMi4yNCw0MC42ODYgMTIuMzAyLDQwLjU4MyAxMi40MzQsNDAuNTA4IEwxOC40NDYsMzcuMDM2IEMxOC41NzQsMzYuOTYyIDE4Ljc0NiwzNi45MjYgMTguOTI3LDM2LjkyNiBDMTkuMTQ1LDM2LjkyNiAxOS4zNzYsMzYuOTc5IDE5LjU1NCwzNy4wODIgQzE5Ljc0NywzNy4xOTQgMTkuODM5LDM3LjM0IDE5LjgyMiwzNy40NzQgTDIwLjAzMywzNy4wNzIgQzQxLjgwNiwyNC41ODUgODAuNjM2LDIuMzE4IDgwLjc3NywyLjIzNiBDODAuODk0LDIuMTY4IDgxLjU4MywxLjcyOSA4Mi4zMTEsMS43MDEgTTgyLjMxMSwwLjcwNCBMODIuMjcyLDAuNzA1IEM4MS42NTQsMC43MjggODAuOTg5LDAuOTQ5IDgwLjI5OCwxLjM2MSBMODAuMjc3LDEuMzczIEM4MC4xMjksMS40NTggNTkuNzY4LDEzLjEzNSAxOS43NTgsMzYuMDc5IEMxOS41LDM1Ljk4MSAxOS4yMTQsMzUuOTI5IDE4LjkyNywzNS45MjkgQzE4LjU2MiwzNS45MjkgMTguMjIzLDM2LjAxMyAxNy45NDcsMzYuMTczIEwxMS45MzUsMzkuNjQ0IEMxMS40OTMsMzkuODk5IDExLjIzNiw0MC4zMzQgMTEuMjQ2LDQwLjgxIEwxMS4yNDcsNDAuOTYgTDUuMTY3LDQ0LjQ0NyBDNC43OTQsNDQuNjQ2IDIuNjI1LDQ1Ljk3OCAxLjg3Nyw1MC4zNDUgTDEuODcxLDUwLjM4NCBDMS44NjIsNTAuNDU0IDAuOTUxLDU3LjU1NyAwLjk2NSw3MC4yNTkgQzAuOTc5LDgyLjg3OSAxLjU2OCw4Ny4zNzUgMi4xMzcsOTEuNzI0IEwyLjEzOSw5MS43MzkgQzIuNDQ3LDk0LjA5NCA1LjYxNCw5NC42NjIgNS45NzUsOTQuNzE5IEw2LjAwOSw5NC43MjMgQzYuMTEsOTQuNzM2IDYuMjEzLDk0Ljc0MiA2LjMxNCw5NC43NDIgQzYuNzksOTQuNzQyIDcuMjYsOTQuNjEgNy43MSw5NC4zNSBMODIuOTgzLDUwLjc5OCBDODQuNzk0LDQ5LjcyNyA4NS45ODIsNDcuMzc1IDg2LjUyNSw0My44MDEgQzg3LjcxMSwzNS45ODcgODguMjU5LDEwLjcwNSA4Ni4yMjQsMy41MDIgQzg1Ljk3MSwyLjYwOSA4NS41MiwxLjk3NSA4NC44ODEsMS42MiBMODQuNzQ5LDEuNTU4IEw4Mi42NjQsMC43NjkgQzgyLjU1MSwwLjcyNSA4Mi40MzEsMC43MDQgODIuMzExLDAuNzA0IiBpZD0iRmlsbC0yIiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY2LjI2NywxMS41NjUgTDY3Ljc2MiwxMS45OTkgTDExLjQyMyw0NC4zMjUiIGlkPSJGaWxsLTMiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuMjAyLDkwLjU0NSBDMTIuMDI5LDkwLjU0NSAxMS44NjIsOTAuNDU1IDExLjc2OSw5MC4yOTUgQzExLjYzMiw5MC4wNTcgMTEuNzEzLDg5Ljc1MiAxMS45NTIsODkuNjE0IEwzMC4zODksNzguOTY5IEMzMC42MjgsNzguODMxIDMwLjkzMyw3OC45MTMgMzEuMDcxLDc5LjE1MiBDMzEuMjA4LDc5LjM5IDMxLjEyNyw3OS42OTYgMzAuODg4LDc5LjgzMyBMMTIuNDUxLDkwLjQ3OCBMMTIuMjAyLDkwLjU0NSIgaWQ9IkZpbGwtNCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy43NjQsNDIuNjU0IEwxMy42NTYsNDIuNTkyIEwxMy43MDIsNDIuNDIxIEwxOC44MzcsMzkuNDU3IEwxOS4wMDcsMzkuNTAyIEwxOC45NjIsMzkuNjczIEwxMy44MjcsNDIuNjM3IEwxMy43NjQsNDIuNjU0IiBpZD0iRmlsbC01IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTguNTIsOTAuMzc1IEw4LjUyLDQ2LjQyMSBMOC41ODMsNDYuMzg1IEw3NS44NCw3LjU1NCBMNzUuODQsNTEuNTA4IEw3NS43NzgsNTEuNTQ0IEw4LjUyLDkwLjM3NSBMOC41Miw5MC4zNzUgWiBNOC43Nyw0Ni41NjQgTDguNzcsODkuOTQ0IEw3NS41OTEsNTEuMzY1IEw3NS41OTEsNy45ODUgTDguNzcsNDYuNTY0IEw4Ljc3LDQ2LjU2NCBaIiBpZD0iRmlsbC02IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTI0Ljk4Niw4My4xODIgQzI0Ljc1Niw4My4zMzEgMjQuMzc0LDgzLjU2NiAyNC4xMzcsODMuNzA1IEwxMi42MzIsOTAuNDA2IEMxMi4zOTUsOTAuNTQ1IDEyLjQyNiw5MC42NTggMTIuNyw5MC42NTggTDEzLjI2NSw5MC42NTggQzEzLjU0LDkwLjY1OCAxMy45NTgsOTAuNTQ1IDE0LjE5NSw5MC40MDYgTDI1LjcsODMuNzA1IEMyNS45MzcsODMuNTY2IDI2LjEyOCw4My40NTIgMjYuMTI1LDgzLjQ0OSBDMjYuMTIyLDgzLjQ0NyAyNi4xMTksODMuMjIgMjYuMTE5LDgyLjk0NiBDMjYuMTE5LDgyLjY3MiAyNS45MzEsODIuNTY5IDI1LjcwMSw4Mi43MTkgTDI0Ljk4Niw4My4xODIiIGlkPSJGaWxsLTciIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTMuMjY2LDkwLjc4MiBMMTIuNyw5MC43ODIgQzEyLjUsOTAuNzgyIDEyLjM4NCw5MC43MjYgMTIuMzU0LDkwLjYxNiBDMTIuMzI0LDkwLjUwNiAxMi4zOTcsOTAuMzk5IDEyLjU2OSw5MC4yOTkgTDI0LjA3NCw4My41OTcgQzI0LjMxLDgzLjQ1OSAyNC42ODksODMuMjI2IDI0LjkxOCw4My4wNzggTDI1LjYzMyw4Mi42MTQgQzI1LjcyMyw4Mi41NTUgMjUuODEzLDgyLjUyNSAyNS44OTksODIuNTI1IEMyNi4wNzEsODIuNTI1IDI2LjI0NCw4Mi42NTUgMjYuMjQ0LDgyLjk0NiBDMjYuMjQ0LDgzLjE2IDI2LjI0NSw4My4zMDkgMjYuMjQ3LDgzLjM4MyBMMjYuMjUzLDgzLjM4NyBMMjYuMjQ5LDgzLjQ1NiBDMjYuMjQ2LDgzLjUzMSAyNi4yNDYsODMuNTMxIDI1Ljc2Myw4My44MTIgTDE0LjI1OCw5MC41MTQgQzE0LDkwLjY2NSAxMy41NjQsOTAuNzgyIDEzLjI2Niw5MC43ODIgTDEzLjI2Niw5MC43ODIgWiBNMTIuNjY2LDkwLjUzMiBMMTIuNyw5MC41MzMgTDEzLjI2Niw5MC41MzMgQzEzLjUxOCw5MC41MzMgMTMuOTE1LDkwLjQyNSAxNC4xMzIsOTAuMjk5IEwyNS42MzcsODMuNTk3IEMyNS44MDUsODMuNDk5IDI1LjkzMSw4My40MjQgMjUuOTk4LDgzLjM4MyBDMjUuOTk0LDgzLjI5OSAyNS45OTQsODMuMTY1IDI1Ljk5NCw4Mi45NDYgTDI1Ljg5OSw4Mi43NzUgTDI1Ljc2OCw4Mi44MjQgTDI1LjA1NCw4My4yODcgQzI0LjgyMiw4My40MzcgMjQuNDM4LDgzLjY3MyAyNC4yLDgzLjgxMiBMMTIuNjk1LDkwLjUxNCBMMTIuNjY2LDkwLjUzMiBMMTIuNjY2LDkwLjUzMiBaIiBpZD0iRmlsbC04IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEzLjI2Niw4OS44NzEgTDEyLjcsODkuODcxIEMxMi41LDg5Ljg3MSAxMi4zODQsODkuODE1IDEyLjM1NCw4OS43MDUgQzEyLjMyNCw4OS41OTUgMTIuMzk3LDg5LjQ4OCAxMi41NjksODkuMzg4IEwyNC4wNzQsODIuNjg2IEMyNC4zMzIsODIuNTM1IDI0Ljc2OCw4Mi40MTggMjUuMDY3LDgyLjQxOCBMMjUuNjMyLDgyLjQxOCBDMjUuODMyLDgyLjQxOCAyNS45NDgsODIuNDc0IDI1Ljk3OCw4Mi41ODQgQzI2LjAwOCw4Mi42OTQgMjUuOTM1LDgyLjgwMSAyNS43NjMsODIuOTAxIEwxNC4yNTgsODkuNjAzIEMxNCw4OS43NTQgMTMuNTY0LDg5Ljg3MSAxMy4yNjYsODkuODcxIEwxMy4yNjYsODkuODcxIFogTTEyLjY2Niw4OS42MjEgTDEyLjcsODkuNjIyIEwxMy4yNjYsODkuNjIyIEMxMy41MTgsODkuNjIyIDEzLjkxNSw4OS41MTUgMTQuMTMyLDg5LjM4OCBMMjUuNjM3LDgyLjY4NiBMMjUuNjY3LDgyLjY2OCBMMjUuNjMyLDgyLjY2NyBMMjUuMDY3LDgyLjY2NyBDMjQuODE1LDgyLjY2NyAyNC40MTgsODIuNzc1IDI0LjIsODIuOTAxIEwxMi42OTUsODkuNjAzIEwxMi42NjYsODkuNjIxIEwxMi42NjYsODkuNjIxIFoiIGlkPSJGaWxsLTkiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuMzcsOTAuODAxIEwxMi4zNyw4OS41NTQgTDEyLjM3LDkwLjgwMSIgaWQ9IkZpbGwtMTAiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNi4xMyw5My45MDEgQzUuMzc5LDkzLjgwOCA0LjgxNiw5My4xNjQgNC42OTEsOTIuNTI1IEMzLjg2LDg4LjI4NyAzLjU0LDgzLjc0MyAzLjUyNiw3MS4xNzMgQzMuNTExLDU4LjM4OSA0LjQyMyw1MS40MjggNC40MjMsNTEuNDI4IEM1LjEzNCw0Ny4yODIgNy4yMSw0Ni4yMzYgNy4yMSw0Ni4yMzYgQzcuMjEsNDYuMjM2IDgxLjY2NywzLjI1IDgyLjA2OSwzLjAxNyBDODIuMjkyLDIuODg4IDg0LjU1NiwxLjQzMyA4NS4yNjQsMy45NCBDODcuMjE0LDEwLjg0IDg2Ljc1MiwzNS44MjcgODUuNTM5LDQzLjgxOCBDODUuMTUsNDYuMzgzIDg0LjI5MSw0OS4wMzMgODIuNDgzLDUwLjEwMSBMNy4yMSw5My42NTMgQzYuODI4LDkzLjg3NCA2LjQ2MSw5My45NDEgNi4xMyw5My45MDEgQzYuMTMsOTMuOTAxIDMuMzQ5LDkzLjQ2IDMuMTI5LDkxLjc3NiBDMi41NjgsODcuNDk1IDEuOTc3LDgyLjk5NSAxLjk2Miw3MC40MjUgQzEuOTQ4LDU3LjY0MSAyLjg2LDUwLjY4IDIuODYsNTAuNjggQzMuNTcsNDYuNTM0IDUuNjQ3LDQ1LjQ4OSA1LjY0Nyw0NS40ODkgQzUuNjQ2LDQ1LjQ4OSA4LjA2NSw0NC4wOTIgMTIuMjQ1LDQxLjY3OSBMMTMuMTE2LDQxLjU2IEwxOS43MTUsMzcuNzMgTDE5Ljc2MSwzNy4yNjkgTDYuMTMsOTMuOTAxIiBpZD0iRmlsbC0xMSIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LjMxNyw5NC4xNjEgTDYuMTAyLDk0LjE0OCBMNi4xMDEsOTQuMTQ4IEw1Ljg1Nyw5NC4xMDEgQzUuMTM4LDkzLjk0NSAzLjA4NSw5My4zNjUgMi44ODEsOTEuODA5IEMyLjMxMyw4Ny40NjkgMS43MjcsODIuOTk2IDEuNzEzLDcwLjQyNSBDMS42OTksNTcuNzcxIDIuNjA0LDUwLjcxOCAyLjYxMyw1MC42NDggQzMuMzM4LDQ2LjQxNyA1LjQ0NSw0NS4zMSA1LjUzNSw0NS4yNjYgTDEyLjE2Myw0MS40MzkgTDEzLjAzMyw0MS4zMiBMMTkuNDc5LDM3LjU3OCBMMTkuNTEzLDM3LjI0NCBDMTkuNTI2LDM3LjEwNyAxOS42NDcsMzcuMDA4IDE5Ljc4NiwzNy4wMjEgQzE5LjkyMiwzNy4wMzQgMjAuMDIzLDM3LjE1NiAyMC4wMDksMzcuMjkzIEwxOS45NSwzNy44ODIgTDEzLjE5OCw0MS44MDEgTDEyLjMyOCw0MS45MTkgTDUuNzcyLDQ1LjcwNCBDNS43NDEsNDUuNzIgMy43ODIsNDYuNzcyIDMuMTA2LDUwLjcyMiBDMy4wOTksNTAuNzgyIDIuMTk4LDU3LjgwOCAyLjIxMiw3MC40MjQgQzIuMjI2LDgyLjk2MyAyLjgwOSw4Ny40MiAzLjM3Myw5MS43MjkgQzMuNDY0LDkyLjQyIDQuMDYyLDkyLjg4MyA0LjY4Miw5My4xODEgQzQuNTY2LDkyLjk4NCA0LjQ4Niw5Mi43NzYgNC40NDYsOTIuNTcyIEMzLjY2NSw4OC41ODggMy4yOTEsODQuMzcgMy4yNzYsNzEuMTczIEMzLjI2Miw1OC41MiA0LjE2Nyw1MS40NjYgNC4xNzYsNTEuMzk2IEM0LjkwMSw0Ny4xNjUgNy4wMDgsNDYuMDU5IDcuMDk4LDQ2LjAxNCBDNy4wOTQsNDYuMDE1IDgxLjU0MiwzLjAzNCA4MS45NDQsMi44MDIgTDgxLjk3MiwyLjc4NSBDODIuODc2LDIuMjQ3IDgzLjY5MiwyLjA5NyA4NC4zMzIsMi4zNTIgQzg0Ljg4NywyLjU3MyA4NS4yODEsMy4wODUgODUuNTA0LDMuODcyIEM4Ny41MTgsMTEgODYuOTY0LDM2LjA5MSA4NS43ODUsNDMuODU1IEM4NS4yNzgsNDcuMTk2IDg0LjIxLDQ5LjM3IDgyLjYxLDUwLjMxNyBMNy4zMzUsOTMuODY5IEM2Ljk5OSw5NC4wNjMgNi42NTgsOTQuMTYxIDYuMzE3LDk0LjE2MSBMNi4zMTcsOTQuMTYxIFogTTYuMTcsOTMuNjU0IEM2LjQ2Myw5My42OSA2Ljc3NCw5My42MTcgNy4wODUsOTMuNDM3IEw4Mi4zNTgsNDkuODg2IEM4NC4xODEsNDguODA4IDg0Ljk2LDQ1Ljk3MSA4NS4yOTIsNDMuNzggQzg2LjQ2NiwzNi4wNDkgODcuMDIzLDExLjA4NSA4NS4wMjQsNC4wMDggQzg0Ljg0NiwzLjM3NyA4NC41NTEsMi45NzYgODQuMTQ4LDIuODE2IEM4My42NjQsMi42MjMgODIuOTgyLDIuNzY0IDgyLjIyNywzLjIxMyBMODIuMTkzLDMuMjM0IEM4MS43OTEsMy40NjYgNy4zMzUsNDYuNDUyIDcuMzM1LDQ2LjQ1MiBDNy4zMDQsNDYuNDY5IDUuMzQ2LDQ3LjUyMSA0LjY2OSw1MS40NzEgQzQuNjYyLDUxLjUzIDMuNzYxLDU4LjU1NiAzLjc3NSw3MS4xNzMgQzMuNzksODQuMzI4IDQuMTYxLDg4LjUyNCA0LjkzNiw5Mi40NzYgQzUuMDI2LDkyLjkzNyA1LjQxMiw5My40NTkgNS45NzMsOTMuNjE1IEM2LjA4Nyw5My42NCA2LjE1OCw5My42NTIgNi4xNjksOTMuNjU0IEw2LjE3LDkzLjY1NCBMNi4xNyw5My42NTQgWiIgaWQ9IkZpbGwtMTIiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy4zMTcsNjguOTgyIEM3LjgwNiw2OC43MDEgOC4yMDIsNjguOTI2IDguMjAyLDY5LjQ4NyBDOC4yMDIsNzAuMDQ3IDcuODA2LDcwLjczIDcuMzE3LDcxLjAxMiBDNi44MjksNzEuMjk0IDYuNDMzLDcxLjA2OSA2LjQzMyw3MC41MDggQzYuNDMzLDY5Ljk0OCA2LjgyOSw2OS4yNjUgNy4zMTcsNjguOTgyIiBpZD0iRmlsbC0xMyIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LjkyLDcxLjEzMyBDNi42MzEsNzEuMTMzIDYuNDMzLDcwLjkwNSA2LjQzMyw3MC41MDggQzYuNDMzLDY5Ljk0OCA2LjgyOSw2OS4yNjUgNy4zMTcsNjguOTgyIEM3LjQ2LDY4LjkgNy41OTUsNjguODYxIDcuNzE0LDY4Ljg2MSBDOC4wMDMsNjguODYxIDguMjAyLDY5LjA5IDguMjAyLDY5LjQ4NyBDOC4yMDIsNzAuMDQ3IDcuODA2LDcwLjczIDcuMzE3LDcxLjAxMiBDNy4xNzQsNzEuMDk0IDcuMDM5LDcxLjEzMyA2LjkyLDcxLjEzMyBNNy43MTQsNjguNjc0IEM3LjU1Nyw2OC42NzQgNy4zOTIsNjguNzIzIDcuMjI0LDY4LjgyMSBDNi42NzYsNjkuMTM4IDYuMjQ2LDY5Ljg3OSA2LjI0Niw3MC41MDggQzYuMjQ2LDcwLjk5NCA2LjUxNyw3MS4zMiA2LjkyLDcxLjMyIEM3LjA3OCw3MS4zMiA3LjI0Myw3MS4yNzEgNy40MTEsNzEuMTc0IEM3Ljk1OSw3MC44NTcgOC4zODksNzAuMTE3IDguMzg5LDY5LjQ4NyBDOC4zODksNjkuMDAxIDguMTE3LDY4LjY3NCA3LjcxNCw2OC42NzQiIGlkPSJGaWxsLTE0IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYuOTIsNzAuOTQ3IEM2LjY0OSw3MC45NDcgNi42MjEsNzAuNjQgNi42MjEsNzAuNTA4IEM2LjYyMSw3MC4wMTcgNi45ODIsNjkuMzkyIDcuNDExLDY5LjE0NSBDNy41MjEsNjkuMDgyIDcuNjI1LDY5LjA0OSA3LjcxNCw2OS4wNDkgQzcuOTg2LDY5LjA0OSA4LjAxNSw2OS4zNTUgOC4wMTUsNjkuNDg3IEM4LjAxNSw2OS45NzggNy42NTIsNzAuNjAzIDcuMjI0LDcwLjg1MSBDNy4xMTUsNzAuOTE0IDcuMDEsNzAuOTQ3IDYuOTIsNzAuOTQ3IE03LjcxNCw2OC44NjEgQzcuNTk1LDY4Ljg2MSA3LjQ2LDY4LjkgNy4zMTcsNjguOTgyIEM2LjgyOSw2OS4yNjUgNi40MzMsNjkuOTQ4IDYuNDMzLDcwLjUwOCBDNi40MzMsNzAuOTA1IDYuNjMxLDcxLjEzMyA2LjkyLDcxLjEzMyBDNy4wMzksNzEuMTMzIDcuMTc0LDcxLjA5NCA3LjMxNyw3MS4wMTIgQzcuODA2LDcwLjczIDguMjAyLDcwLjA0NyA4LjIwMiw2OS40ODcgQzguMjAyLDY5LjA5IDguMDAzLDY4Ljg2MSA3LjcxNCw2OC44NjEiIGlkPSJGaWxsLTE1IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTcuNDQ0LDg1LjM1IEM3LjcwOCw4NS4xOTggNy45MjEsODUuMzE5IDcuOTIxLDg1LjYyMiBDNy45MjEsODUuOTI1IDcuNzA4LDg2LjI5MiA3LjQ0NCw4Ni40NDQgQzcuMTgxLDg2LjU5NyA2Ljk2Nyw4Ni40NzUgNi45NjcsODYuMTczIEM2Ljk2Nyw4NS44NzEgNy4xODEsODUuNTAyIDcuNDQ0LDg1LjM1IiBpZD0iRmlsbC0xNiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik03LjIzLDg2LjUxIEM3LjA3NCw4Ni41MSA2Ljk2Nyw4Ni4zODcgNi45NjcsODYuMTczIEM2Ljk2Nyw4NS44NzEgNy4xODEsODUuNTAyIDcuNDQ0LDg1LjM1IEM3LjUyMSw4NS4zMDUgNy41OTQsODUuMjg0IDcuNjU4LDg1LjI4NCBDNy44MTQsODUuMjg0IDcuOTIxLDg1LjQwOCA3LjkyMSw4NS42MjIgQzcuOTIxLDg1LjkyNSA3LjcwOCw4Ni4yOTIgNy40NDQsODYuNDQ0IEM3LjM2Nyw4Ni40ODkgNy4yOTQsODYuNTEgNy4yMyw4Ni41MSBNNy42NTgsODUuMDk4IEM3LjU1OCw4NS4wOTggNy40NTUsODUuMTI3IDcuMzUxLDg1LjE4OCBDNy4wMzEsODUuMzczIDYuNzgxLDg1LjgwNiA2Ljc4MSw4Ni4xNzMgQzYuNzgxLDg2LjQ4MiA2Ljk2Niw4Ni42OTcgNy4yMyw4Ni42OTcgQzcuMzMsODYuNjk3IDcuNDMzLDg2LjY2NiA3LjUzOCw4Ni42MDcgQzcuODU4LDg2LjQyMiA4LjEwOCw4NS45ODkgOC4xMDgsODUuNjIyIEM4LjEwOCw4NS4zMTMgNy45MjMsODUuMDk4IDcuNjU4LDg1LjA5OCIgaWQ9IkZpbGwtMTciIGZpbGw9IiM4MDk3QTIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy4yMyw4Ni4zMjIgTDcuMTU0LDg2LjE3MyBDNy4xNTQsODUuOTM4IDcuMzMzLDg1LjYyOSA3LjUzOCw4NS41MTIgTDcuNjU4LDg1LjQ3MSBMNy43MzQsODUuNjIyIEM3LjczNCw4NS44NTYgNy41NTUsODYuMTY0IDcuMzUxLDg2LjI4MiBMNy4yMyw4Ni4zMjIgTTcuNjU4LDg1LjI4NCBDNy41OTQsODUuMjg0IDcuNTIxLDg1LjMwNSA3LjQ0NCw4NS4zNSBDNy4xODEsODUuNTAyIDYuOTY3LDg1Ljg3MSA2Ljk2Nyw4Ni4xNzMgQzYuOTY3LDg2LjM4NyA3LjA3NCw4Ni41MSA3LjIzLDg2LjUxIEM3LjI5NCw4Ni41MSA3LjM2Nyw4Ni40ODkgNy40NDQsODYuNDQ0IEM3LjcwOCw4Ni4yOTIgNy45MjEsODUuOTI1IDcuOTIxLDg1LjYyMiBDNy45MjEsODUuNDA4IDcuODE0LDg1LjI4NCA3LjY1OCw4NS4yODQiIGlkPSJGaWxsLTE4IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTc3LjI3OCw3Ljc2OSBMNzcuMjc4LDUxLjQzNiBMMTAuMjA4LDkwLjE2IEwxMC4yMDgsNDYuNDkzIEw3Ny4yNzgsNy43NjkiIGlkPSJGaWxsLTE5IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEwLjA4Myw5MC4zNzUgTDEwLjA4Myw0Ni40MjEgTDEwLjE0Niw0Ni4zODUgTDc3LjQwMyw3LjU1NCBMNzcuNDAzLDUxLjUwOCBMNzcuMzQxLDUxLjU0NCBMMTAuMDgzLDkwLjM3NSBMMTAuMDgzLDkwLjM3NSBaIE0xMC4zMzMsNDYuNTY0IEwxMC4zMzMsODkuOTQ0IEw3Ny4xNTQsNTEuMzY1IEw3Ny4xNTQsNy45ODUgTDEwLjMzMyw0Ni41NjQgTDEwLjMzMyw0Ni41NjQgWiIgaWQ9IkZpbGwtMjAiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMjUuNzM3LDg4LjY0NyBMMTE4LjA5OCw5MS45ODEgTDExOC4wOTgsODQgTDEwNi42MzksODguNzEzIEwxMDYuNjM5LDk2Ljk4MiBMOTksMTAwLjMxNSBMMTEyLjM2OSwxMDMuOTYxIEwxMjUuNzM3LDg4LjY0NyIgaWQ9IkltcG9ydGVkLUxheWVycy1Db3B5LTIiIGZpbGw9IiM0NTVBNjQiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+';
function RotateInstructions(){
this.loadIcon_();
var overlay=document.createElement('div');
var s=overlay.style;
s.position='fixed';
s.top=0;
s.right=0;
s.bottom=0;
s.left=0;
s.backgroundColor='gray';
s.fontFamily='sans-serif';
s.zIndex=1000000;
var img=document.createElement('img');
img.src=this.icon;
var s=img.style;
s.marginLeft='25%';
s.marginTop='25%';
s.width='50%';
overlay.appendChild(img);
var text=document.createElement('div');
var s=text.style;
s.textAlign='center';
s.fontSize='16px';
s.lineHeight='24px';
s.margin='24px 25%';
s.width='50%';
text.innerHTML='Place your phone into your Cardboard viewer.';
overlay.appendChild(text);
var snackbar=document.createElement('div');
var s=snackbar.style;
s.backgroundColor='#CFD8DC';
s.position='fixed';
s.bottom=0;
s.width='100%';
s.height='48px';
s.padding='14px 24px';
s.boxSizing='border-box';
s.color='#656A6B';
overlay.appendChild(snackbar);
var snackbarText=document.createElement('div');
snackbarText.style.float='left';
snackbarText.innerHTML='No Cardboard viewer?';
var snackbarButton=document.createElement('a');
snackbarButton.href='https://www.google.com/get/cardboard/get-cardboard/';
snackbarButton.innerHTML='get one';
snackbarButton.target='_blank';
var s=snackbarButton.style;
s.float='right';
s.fontWeight=600;
s.textTransform='uppercase';
s.borderLeft='1px solid gray';
s.paddingLeft='24px';
s.textDecoration='none';
s.color='#656A6B';
snackbar.appendChild(snackbarText);
snackbar.appendChild(snackbarButton);
this.overlay=overlay;
this.text=text;
this.hide();
}
RotateInstructions.prototype.show=function (parent){
if(!parent&&!this.overlay.parentElement){
document.body.appendChild(this.overlay);
}else if(parent){
if(this.overlay.parentElement&&this.overlay.parentElement!=parent) this.overlay.parentElement.removeChild(this.overlay);
parent.appendChild(this.overlay);
}
this.overlay.style.display='block';
var img=this.overlay.querySelector('img');
var s=img.style;
if(isLandscapeMode()){
s.width='20%';
s.marginLeft='40%';
s.marginTop='3%';
}else{
s.width='50%';
s.marginLeft='25%';
s.marginTop='25%';
}};
RotateInstructions.prototype.hide=function (){
this.overlay.style.display='none';
};
RotateInstructions.prototype.showTemporarily=function (ms, parent){
this.show(parent);
this.timer=setTimeout(this.hide.bind(this), ms);
};
RotateInstructions.prototype.disableShowTemporarily=function (){
clearTimeout(this.timer);
};
RotateInstructions.prototype.update=function (){
this.disableShowTemporarily();
if(!isLandscapeMode()&&isMobile()){
this.show();
}else{
this.hide();
}};
RotateInstructions.prototype.loadIcon_=function (){
this.icon=base64('image/svg+xml', rotateInstructionsAsset);
};
var DEFAULT_VIEWER='CardboardV1';
var VIEWER_KEY='WEBVR_CARDBOARD_VIEWER';
var CLASS_NAME='webvr-polyfill-viewer-selector';
function ViewerSelector(defaultViewer){
try {
this.selectedKey=localStorage.getItem(VIEWER_KEY);
} catch (error){
console.error('Failed to load viewer profile: %s', error);
}
if(!this.selectedKey){
this.selectedKey=defaultViewer||DEFAULT_VIEWER;
}
this.dialog=this.createDialog_(DeviceInfo.Viewers);
this.root=null;
this.onChangeCallbacks_=[];
}
ViewerSelector.prototype.show=function (root){
this.root=root;
root.appendChild(this.dialog);
var selected=this.dialog.querySelector('#' + this.selectedKey);
selected.checked=true;
this.dialog.style.display='block';
};
ViewerSelector.prototype.hide=function (){
if(this.root&&this.root.contains(this.dialog)){
this.root.removeChild(this.dialog);
}
this.dialog.style.display='none';
};
ViewerSelector.prototype.getCurrentViewer=function (){
return DeviceInfo.Viewers[this.selectedKey];
};
ViewerSelector.prototype.getSelectedKey_=function (){
var input=this.dialog.querySelector('input[name=field]:checked');
if(input){
return input.id;
}
return null;
};
ViewerSelector.prototype.onChange=function (cb){
this.onChangeCallbacks_.push(cb);
};
ViewerSelector.prototype.fireOnChange_=function (viewer){
for (var i=0; i < this.onChangeCallbacks_.length; i++){
this.onChangeCallbacks_[i](viewer);
}};
ViewerSelector.prototype.onSave_=function (){
this.selectedKey=this.getSelectedKey_();
if(!this.selectedKey||!DeviceInfo.Viewers[this.selectedKey]){
console.error('ViewerSelector.onSave_: this should never happen!');
return;
}
this.fireOnChange_(DeviceInfo.Viewers[this.selectedKey]);
try {
localStorage.setItem(VIEWER_KEY, this.selectedKey);
} catch (error){
console.error('Failed to save viewer profile: %s', error);
}
this.hide();
};
ViewerSelector.prototype.createDialog_=function (options){
var container=document.createElement('div');
container.classList.add(CLASS_NAME);
container.style.display='none';
var overlay=document.createElement('div');
var s=overlay.style;
s.position='fixed';
s.left=0;
s.top=0;
s.width='100%';
s.height='100%';
s.background='rgba(0, 0, 0, 0.3)';
overlay.addEventListener('click', this.hide.bind(this));
var width=280;
var dialog=document.createElement('div');
var s=dialog.style;
s.boxSizing='border-box';
s.position='fixed';
s.top='24px';
s.left='50%';
s.marginLeft=-width / 2 + 'px';
s.width=width + 'px';
s.padding='24px';
s.overflow='hidden';
s.background='#fafafa';
s.fontFamily="'Roboto', sans-serif";
s.boxShadow='0px 5px 20px #666';
dialog.appendChild(this.createH1_('Select your viewer'));
for (var id in options){
dialog.appendChild(this.createChoice_(id, options[id].label));
}
dialog.appendChild(this.createButton_('Save', this.onSave_.bind(this)));
container.appendChild(overlay);
container.appendChild(dialog);
return container;
};
ViewerSelector.prototype.createH1_=function (name){
var h1=document.createElement('h1');
var s=h1.style;
s.color='black';
s.fontSize='20px';
s.fontWeight='bold';
s.marginTop=0;
s.marginBottom='24px';
h1.innerHTML=name;
return h1;
};
ViewerSelector.prototype.createChoice_=function (id, name){
var div=document.createElement('div');
div.style.marginTop='8px';
div.style.color='black';
var input=document.createElement('input');
input.style.fontSize='30px';
input.setAttribute('id', id);
input.setAttribute('type', 'radio');
input.setAttribute('value', id);
input.setAttribute('name', 'field');
var label=document.createElement('label');
label.style.marginLeft='4px';
label.setAttribute('for', id);
label.innerHTML=name;
div.appendChild(input);
div.appendChild(label);
return div;
};
ViewerSelector.prototype.createButton_=function (label, onclick){
var button=document.createElement('button');
button.innerHTML=label;
var s=button.style;
s.float='right';
s.textTransform='uppercase';
s.color='#1094f7';
s.fontSize='14px';
s.letterSpacing=0;
s.border=0;
s.background='none';
s.marginTop='16px';
button.addEventListener('click', onclick);
return button;
};
var commonjsGlobal$$1=typeof window!=='undefined' ? window:typeof commonjsGlobal$1!=='undefined' ? commonjsGlobal$1:typeof self!=='undefined' ? self:{};
function unwrapExports$$1 (x){
return x&&x.__esModule ? x['default']:x;
}
function createCommonjsModule$$1(fn, module){
return module={ exports: {}}, fn(module, module.exports), module.exports;
}
var NoSleep=createCommonjsModule$$1(function (module, exports){
(function webpackUniversalModuleDefinition(root, factory){
module.exports=factory();
})(commonjsGlobal$$1, function(){
return          (function(modules){
var installedModules={};
function __webpack_require__(moduleId){
if(installedModules[moduleId]){
return installedModules[moduleId].exports;
}
var module=installedModules[moduleId]={
i: moduleId,
l: false,
exports: {}};
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
module.l=true;
return module.exports;
}
__webpack_require__.m=modules;
__webpack_require__.c=installedModules;
__webpack_require__.d=function(exports, name, getter){
if(!__webpack_require__.o(exports, name)){
Object.defineProperty(exports, name, {
configurable: false,
enumerable: true,
get: getter
});
}};
__webpack_require__.n=function(module){
var getter=module&&module.__esModule ?
function getDefault(){ return module['default']; } :
function getModuleExports(){ return module; };
__webpack_require__.d(getter, 'a', getter);
return getter;
};
__webpack_require__.o=function(object, property){ return Object.prototype.hasOwnProperty.call(object, property); };
__webpack_require__.p="";
return __webpack_require__(__webpack_require__.s=0);
})
([
(function(module, exports, __webpack_require__){
var _createClass=function (){ function defineProperties(target, props){ for (var i=0; i < props.length; i++){ var descriptor=props[i]; descriptor.enumerable=descriptor.enumerable||false; descriptor.configurable=true; if("value" in descriptor) descriptor.writable=true; Object.defineProperty(target, descriptor.key, descriptor); }} return function (Constructor, protoProps, staticProps){ if(protoProps) defineProperties(Constructor.prototype, protoProps); if(staticProps) defineProperties(Constructor, staticProps); return Constructor; };}();
function _classCallCheck(instance, Constructor){ if(!(instance instanceof Constructor)){ throw new TypeError("Cannot call a class as a function"); }}
var mediaFile=__webpack_require__(1);
var oldIOS=typeof navigator!=='undefined'&&parseFloat(('' + (/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0, ''])[1]).replace('undefined', '3_2').replace('_', '.').replace('_', '')) < 10&&!window.MSStream;
var NoSleep=function (){
function NoSleep(){
_classCallCheck(this, NoSleep);
if(oldIOS){
this.noSleepTimer=null;
}else{
this.noSleepVideo=document.createElement('video');
this.noSleepVideo.setAttribute('playsinline', '');
this.noSleepVideo.setAttribute('src', mediaFile);
this.noSleepVideo.addEventListener('timeupdate', function (e){
if(this.noSleepVideo.currentTime > 0.5){
this.noSleepVideo.currentTime=Math.random();
}}.bind(this));
}}
_createClass(NoSleep, [{
key: 'enable',
value: function enable(){
if(oldIOS){
this.disable();
this.noSleepTimer=window.setInterval(function (){
window.location.href='/';
window.setTimeout(window.stop, 0);
}, 15000);
}else{
this.noSleepVideo.play();
}}
}, {
key: 'disable',
value: function disable(){
if(oldIOS){
if(this.noSleepTimer){
window.clearInterval(this.noSleepTimer);
this.noSleepTimer=null;
}}else{
this.noSleepVideo.pause();
}}
}]);
return NoSleep;
}();
module.exports=NoSleep;
}),
(function(module, exports, __webpack_require__){
module.exports='data:video/mp4;base64,AAAAIGZ0eXBtcDQyAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAACKBtZGF0AAAC8wYF///v3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE0MiByMjQ3OSBkZDc5YTYxIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTEgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MToweDExMSBtZT1oZXggc3VibWU9MiBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MCA4eDhkY3Q9MCBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0wIHRocmVhZHM9NiBsb29rYWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdlaWdodHA9MSBrZXlpbnQ9MzAwIGtleWludF9taW49MzAgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD0xMCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIwLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IHZidl9tYXhyYXRlPTIwMDAwIHZidl9idWZzaXplPTI1MDAwIGNyZl9tYXg9MC4wIG5hbF9ocmQ9bm9uZSBmaWxsZXI9MCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAOWWIhAA3//p+C7v8tDDSTjf97w55i3SbRPO4ZY+hkjD5hbkAkL3zpJ6h/LR1CAABzgB1kqqzUorlhQAAAAxBmiQYhn/+qZYADLgAAAAJQZ5CQhX/AAj5IQADQGgcIQADQGgcAAAACQGeYUQn/wALKCEAA0BoHAAAAAkBnmNEJ/8ACykhAANAaBwhAANAaBwAAAANQZpoNExDP/6plgAMuSEAA0BoHAAAAAtBnoZFESwr/wAI+SEAA0BoHCEAA0BoHAAAAAkBnqVEJ/8ACykhAANAaBwAAAAJAZ6nRCf/AAsoIQADQGgcIQADQGgcAAAADUGarDRMQz/+qZYADLghAANAaBwAAAALQZ7KRRUsK/8ACPkhAANAaBwAAAAJAZ7pRCf/AAsoIQADQGgcIQADQGgcAAAACQGe60Qn/wALKCEAA0BoHAAAAA1BmvA0TEM//qmWAAy5IQADQGgcIQADQGgcAAAAC0GfDkUVLCv/AAj5IQADQGgcAAAACQGfLUQn/wALKSEAA0BoHCEAA0BoHAAAAAkBny9EJ/8ACyghAANAaBwAAAANQZs0NExDP/6plgAMuCEAA0BoHAAAAAtBn1JFFSwr/wAI+SEAA0BoHCEAA0BoHAAAAAkBn3FEJ/8ACyghAANAaBwAAAAJAZ9zRCf/AAsoIQADQGgcIQADQGgcAAAADUGbeDRMQz/+qZYADLkhAANAaBwAAAALQZ+WRRUsK/8ACPghAANAaBwhAANAaBwAAAAJAZ+1RCf/AAspIQADQGgcAAAACQGft0Qn/wALKSEAA0BoHCEAA0BoHAAAAA1Bm7w0TEM//qmWAAy4IQADQGgcAAAAC0Gf2kUVLCv/AAj5IQADQGgcAAAACQGf+UQn/wALKCEAA0BoHCEAA0BoHAAAAAkBn/tEJ/8ACykhAANAaBwAAAANQZvgNExDP/6plgAMuSEAA0BoHCEAA0BoHAAAAAtBnh5FFSwr/wAI+CEAA0BoHAAAAAkBnj1EJ/8ACyghAANAaBwhAANAaBwAAAAJAZ4/RCf/AAspIQADQGgcAAAADUGaJDRMQz/+qZYADLghAANAaBwAAAALQZ5CRRUsK/8ACPkhAANAaBwhAANAaBwAAAAJAZ5hRCf/AAsoIQADQGgcAAAACQGeY0Qn/wALKSEAA0BoHCEAA0BoHAAAAA1Bmmg0TEM//qmWAAy5IQADQGgcAAAAC0GehkUVLCv/AAj5IQADQGgcIQADQGgcAAAACQGepUQn/wALKSEAA0BoHAAAAAkBnqdEJ/8ACyghAANAaBwAAAANQZqsNExDP/6plgAMuCEAA0BoHCEAA0BoHAAAAAtBnspFFSwr/wAI+SEAA0BoHAAAAAkBnulEJ/8ACyghAANAaBwhAANAaBwAAAAJAZ7rRCf/AAsoIQADQGgcAAAADUGa8DRMQz/+qZYADLkhAANAaBwhAANAaBwAAAALQZ8ORRUsK/8ACPkhAANAaBwAAAAJAZ8tRCf/AAspIQADQGgcIQADQGgcAAAACQGfL0Qn/wALKCEAA0BoHAAAAA1BmzQ0TEM//qmWAAy4IQADQGgcAAAAC0GfUkUVLCv/AAj5IQADQGgcIQADQGgcAAAACQGfcUQn/wALKCEAA0BoHAAAAAkBn3NEJ/8ACyghAANAaBwhAANAaBwAAAANQZt4NExC//6plgAMuSEAA0BoHAAAAAtBn5ZFFSwr/wAI+CEAA0BoHCEAA0BoHAAAAAkBn7VEJ/8ACykhAANAaBwAAAAJAZ+3RCf/AAspIQADQGgcAAAADUGbuzRMQn/+nhAAYsAhAANAaBwhAANAaBwAAAAJQZ/aQhP/AAspIQADQGgcAAAACQGf+UQn/wALKCEAA0BoHCEAA0BoHCEAA0BoHCEAA0BoHCEAA0BoHCEAA0BoHAAACiFtb292AAAAbG12aGQAAAAA1YCCX9WAgl8AAAPoAAAH/AABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAGGlvZHMAAAAAEICAgAcAT////v7/AAAF+XRyYWsAAABcdGtoZAAAAAPVgIJf1YCCXwAAAAEAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAygAAAMoAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAB9AAABdwAAEAAAAABXFtZGlhAAAAIG1kaGQAAAAA1YCCX9WAgl8AAV+QAAK/IFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAUcbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAAE3HN0YmwAAACYc3RzZAAAAAAAAAABAAAAiGF2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAygDKAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAAyYXZjQwFNQCj/4QAbZ01AKOyho3ySTUBAQFAAAAMAEAAr8gDxgxlgAQAEaO+G8gAAABhzdHRzAAAAAAAAAAEAAAA8AAALuAAAABRzdHNzAAAAAAAAAAEAAAABAAAB8GN0dHMAAAAAAAAAPAAAAAEAABdwAAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAAC7gAAAAAQAAF3AAAAABAAAAAAAAABxzdHNjAAAAAAAAAAEAAAABAAAAAQAAAAEAAAEEc3RzegAAAAAAAAAAAAAAPAAAAzQAAAAQAAAADQAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAANAAAADQAAAQBzdGNvAAAAAAAAADwAAAAwAAADZAAAA3QAAAONAAADoAAAA7kAAAPQAAAD6wAAA/4AAAQXAAAELgAABEMAAARcAAAEbwAABIwAAAShAAAEugAABM0AAATkAAAE/wAABRIAAAUrAAAFQgAABV0AAAVwAAAFiQAABaAAAAW1AAAFzgAABeEAAAX+AAAGEwAABiwAAAY/AAAGVgAABnEAAAaEAAAGnQAABrQAAAbPAAAG4gAABvUAAAcSAAAHJwAAB0AAAAdTAAAHcAAAB4UAAAeeAAAHsQAAB8gAAAfjAAAH9gAACA8AAAgmAAAIQQAACFQAAAhnAAAIhAAACJcAAAMsdHJhawAAAFx0a2hkAAAAA9WAgl/VgIJfAAAAAgAAAAAAAAf8AAAAAAAAAAAAAAABAQAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAACsm1kaWEAAAAgbWRoZAAAAADVgIJf1YCCXwAArEQAAWAAVcQAAAAAACdoZGxyAAAAAAAAAABzb3VuAAAAAAAAAAAAAAAAU3RlcmVvAAAAAmNtaW5mAAAAEHNtaGQAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAidzdGJsAAAAZ3N0c2QAAAAAAAAAAQAAAFdtcDRhAAAAAAAAAAEAAAAAAAAAAAACABAAAAAArEQAAAAAADNlc2RzAAAAAAOAgIAiAAIABICAgBRAFQAAAAADDUAAAAAABYCAgAISEAaAgIABAgAAABhzdHRzAAAAAAAAAAEAAABYAAAEAAAAABxzdHNjAAAAAAAAAAEAAAABAAAAAQAAAAEAAAAUc3RzegAAAAAAAAAGAAAAWAAAAXBzdGNvAAAAAAAAAFgAAAOBAAADhwAAA5oAAAOtAAADswAAA8oAAAPfAAAD5QAAA/gAAAQLAAAEEQAABCgAAAQ9AAAEUAAABFYAAARpAAAEgAAABIYAAASbAAAErgAABLQAAATHAAAE3gAABPMAAAT5AAAFDAAABR8AAAUlAAAFPAAABVEAAAVXAAAFagAABX0AAAWDAAAFmgAABa8AAAXCAAAFyAAABdsAAAXyAAAF+AAABg0AAAYgAAAGJgAABjkAAAZQAAAGZQAABmsAAAZ+AAAGkQAABpcAAAauAAAGwwAABskAAAbcAAAG7wAABwYAAAcMAAAHIQAABzQAAAc6AAAHTQAAB2QAAAdqAAAHfwAAB5IAAAeYAAAHqwAAB8IAAAfXAAAH3QAAB/AAAAgDAAAICQAACCAAAAg1AAAIOwAACE4AAAhhAAAIeAAACH4AAAiRAAAIpAAACKoAAAiwAAAItgAACLwAAAjCAAAAFnVkdGEAAAAObmFtZVN0ZXJlbwAAAHB1ZHRhAAAAaG1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAAO2lsc3QAAAAzqXRvbwAAACtkYXRhAAAAAQAAAABIYW5kQnJha2UgMC4xMC4yIDIwMTUwNjExMDA=';
})
]);
});
});
var NoSleep$1=unwrapExports$$1(NoSleep);
var nextDisplayId=1000;
var defaultLeftBounds=[0, 0, 0.5, 1];
var defaultRightBounds=[0.5, 0, 0.5, 1];
var raf=window.requestAnimationFrame;
var caf=window.cancelAnimationFrame;
function VRFrameData(){
this.leftProjectionMatrix=new Float32Array(16);
this.leftViewMatrix=new Float32Array(16);
this.rightProjectionMatrix=new Float32Array(16);
this.rightViewMatrix=new Float32Array(16);
this.pose=null;
}
function VRDisplayCapabilities(config){
Object.defineProperties(this, {
hasPosition: {
writable: false, enumerable: true, value: config.hasPosition
},
hasExternalDisplay: {
writable: false, enumerable: true, value: config.hasExternalDisplay
},
canPresent: {
writable: false, enumerable: true, value: config.canPresent
},
maxLayers: {
writable: false, enumerable: true, value: config.maxLayers
},
hasOrientation: {
enumerable: true, get: function get(){
deprecateWarning('VRDisplayCapabilities.prototype.hasOrientation', 'VRDisplay.prototype.getFrameData');
return config.hasOrientation;
}}
});
}
function VRDisplay(config){
config=config||{};
var USE_WAKELOCK='wakelock' in config ? config.wakelock:true;
this.isPolyfilled=true;
this.displayId=nextDisplayId++;
this.displayName='';
this.depthNear=0.01;
this.depthFar=10000.0;
this.isPresenting=false;
Object.defineProperty(this, 'isConnected', {
get: function get(){
deprecateWarning('VRDisplay.prototype.isConnected', 'VRDisplayCapabilities.prototype.hasExternalDisplay');
return false;
}});
this.capabilities=new VRDisplayCapabilities({
hasPosition: false,
hasOrientation: false,
hasExternalDisplay: false,
canPresent: false,
maxLayers: 1
});
this.stageParameters=null;
this.waitingForPresent_=false;
this.layer_=null;
this.originalParent_=null;
this.fullscreenElement_=null;
this.fullscreenWrapper_=null;
this.fullscreenElementCachedStyle_=null;
this.fullscreenEventTarget_=null;
this.fullscreenChangeHandler_=null;
this.fullscreenErrorHandler_=null;
if(USE_WAKELOCK&&isMobile()){
this.wakelock_=new NoSleep$1();
}}
VRDisplay.prototype.getFrameData=function (frameData){
return frameDataFromPose(frameData, this._getPose(), this);
};
VRDisplay.prototype.getPose=function (){
deprecateWarning('VRDisplay.prototype.getPose', 'VRDisplay.prototype.getFrameData');
return this._getPose();
};
VRDisplay.prototype.resetPose=function (){
deprecateWarning('VRDisplay.prototype.resetPose');
return this._resetPose();
};
VRDisplay.prototype.getImmediatePose=function (){
deprecateWarning('VRDisplay.prototype.getImmediatePose', 'VRDisplay.prototype.getFrameData');
return this._getPose();
};
VRDisplay.prototype.requestAnimationFrame=function (callback){
return raf(callback);
};
VRDisplay.prototype.cancelAnimationFrame=function (id){
return caf(id);
};
VRDisplay.prototype.wrapForFullscreen=function (element){
if(isIOS()){
return element;
}
if(!this.fullscreenWrapper_){
this.fullscreenWrapper_=document.createElement('div');
var cssProperties=['height: ' + Math.min(screen.height, screen.width) + 'px !important', 'top: 0 !important', 'left: 0 !important', 'right: 0 !important', 'border: 0', 'margin: 0', 'padding: 0', 'z-index: 999999 !important', 'position: fixed'];
this.fullscreenWrapper_.setAttribute('style', cssProperties.join('; ') + ';');
this.fullscreenWrapper_.classList.add('webvr-polyfill-fullscreen-wrapper');
}
if(this.fullscreenElement_==element){
return this.fullscreenWrapper_;
}
if(this.fullscreenElement_){
if(this.originalParent_){
this.originalParent_.appendChild(this.fullscreenElement_);
}else{
this.fullscreenElement_.parentElement.removeChild(this.fullscreenElement_);
}}
this.fullscreenElement_=element;
this.originalParent_=element.parentElement;
if(!this.originalParent_){
document.body.appendChild(element);
}
if(!this.fullscreenWrapper_.parentElement){
var parent=this.fullscreenElement_.parentElement;
parent.insertBefore(this.fullscreenWrapper_, this.fullscreenElement_);
parent.removeChild(this.fullscreenElement_);
}
this.fullscreenWrapper_.insertBefore(this.fullscreenElement_, this.fullscreenWrapper_.firstChild);
this.fullscreenElementCachedStyle_=this.fullscreenElement_.getAttribute('style');
var self=this;
function applyFullscreenElementStyle(){
if(!self.fullscreenElement_){
return;
}
var cssProperties=['position: absolute', 'top: 0', 'left: 0', 'width: ' + Math.max(screen.width, screen.height) + 'px', 'height: ' + Math.min(screen.height, screen.width) + 'px', 'border: 0', 'margin: 0', 'padding: 0'];
self.fullscreenElement_.setAttribute('style', cssProperties.join('; ') + ';');
}
applyFullscreenElementStyle();
return this.fullscreenWrapper_;
};
VRDisplay.prototype.removeFullscreenWrapper=function (){
if(!this.fullscreenElement_){
return;
}
var element=this.fullscreenElement_;
if(this.fullscreenElementCachedStyle_){
element.setAttribute('style', this.fullscreenElementCachedStyle_);
}else{
element.removeAttribute('style');
}
this.fullscreenElement_=null;
this.fullscreenElementCachedStyle_=null;
var parent=this.fullscreenWrapper_.parentElement;
this.fullscreenWrapper_.removeChild(element);
if(this.originalParent_===parent){
parent.insertBefore(element, this.fullscreenWrapper_);
}
else if(this.originalParent_){
this.originalParent_.appendChild(element);
}
parent.removeChild(this.fullscreenWrapper_);
return element;
};
VRDisplay.prototype.requestPresent=function (layers){
var wasPresenting=this.isPresenting;
var self=this;
if(!(layers instanceof Array)){
deprecateWarning('VRDisplay.prototype.requestPresent with non-array argument', 'an array of VRLayers as the first argument');
layers=[layers];
}
return new Promise(function (resolve, reject){
if(!self.capabilities.canPresent){
reject(new Error('VRDisplay is not capable of presenting.'));
return;
}
if(layers.length==0||layers.length > self.capabilities.maxLayers){
reject(new Error('Invalid number of layers.'));
return;
}
var incomingLayer=layers[0];
if(!incomingLayer.source){
resolve();
return;
}
var leftBounds=incomingLayer.leftBounds||defaultLeftBounds;
var rightBounds=incomingLayer.rightBounds||defaultRightBounds;
if(wasPresenting){
var layer=self.layer_;
if(layer.source!==incomingLayer.source){
layer.source=incomingLayer.source;
}
for (var i=0; i < 4; i++){
layer.leftBounds[i]=leftBounds[i];
layer.rightBounds[i]=rightBounds[i];
}
self.wrapForFullscreen(self.layer_.source);
self.updatePresent_();
resolve();
return;
}
self.layer_={
predistorted: incomingLayer.predistorted,
source: incomingLayer.source,
leftBounds: leftBounds.slice(0),
rightBounds: rightBounds.slice(0)
};
self.waitingForPresent_=false;
if(self.layer_&&self.layer_.source){
var fullscreenElement=self.wrapForFullscreen(self.layer_.source);
var onFullscreenChange=function onFullscreenChange(){
var actualFullscreenElement=getFullscreenElement();
self.isPresenting=fullscreenElement===actualFullscreenElement;
if(self.isPresenting){
if(screen.orientation&&screen.orientation.lock){
screen.orientation.lock('landscape-primary').catch(function (error){
console.error('screen.orientation.lock() failed due to', error.message);
});
}
self.waitingForPresent_=false;
self.beginPresent_();
resolve();
}else{
if(screen.orientation&&screen.orientation.unlock){
screen.orientation.unlock();
}
self.removeFullscreenWrapper();
self.disableWakeLock();
self.endPresent_();
self.removeFullscreenListeners_();
}
self.fireVRDisplayPresentChange_();
};
var onFullscreenError=function onFullscreenError(){
if(!self.waitingForPresent_){
return;
}
self.removeFullscreenWrapper();
self.removeFullscreenListeners_();
self.disableWakeLock();
self.waitingForPresent_=false;
self.isPresenting=false;
reject(new Error('Unable to present.'));
};
self.addFullscreenListeners_(fullscreenElement, onFullscreenChange, onFullscreenError);
if(requestFullscreen(fullscreenElement)){
self.enableWakeLock();
self.waitingForPresent_=true;
}else if(isIOS()||isWebViewAndroid()){
self.enableWakeLock();
self.isPresenting=true;
self.beginPresent_();
self.fireVRDisplayPresentChange_();
resolve();
}}
if(!self.waitingForPresent_&&!isIOS()){
exitFullscreen();
reject(new Error('Unable to present.'));
}});
};
VRDisplay.prototype.exitPresent=function (){
var wasPresenting=this.isPresenting;
var self=this;
this.isPresenting=false;
this.layer_=null;
this.disableWakeLock();
return new Promise(function (resolve, reject){
if(wasPresenting){
if(!exitFullscreen()&&isIOS()){
self.endPresent_();
self.fireVRDisplayPresentChange_();
}
if(isWebViewAndroid()){
self.removeFullscreenWrapper();
self.removeFullscreenListeners_();
self.endPresent_();
self.fireVRDisplayPresentChange_();
}
resolve();
}else{
reject(new Error('Was not presenting to VRDisplay.'));
}});
};
VRDisplay.prototype.getLayers=function (){
if(this.layer_){
return [this.layer_];
}
return [];
};
VRDisplay.prototype.fireVRDisplayPresentChange_=function (){
var event=new CustomEvent('vrdisplaypresentchange', { detail: { display: this }});
window.dispatchEvent(event);
};
VRDisplay.prototype.fireVRDisplayConnect_=function (){
var event=new CustomEvent('vrdisplayconnect', { detail: { display: this }});
window.dispatchEvent(event);
};
VRDisplay.prototype.addFullscreenListeners_=function (element, changeHandler, errorHandler){
this.removeFullscreenListeners_();
this.fullscreenEventTarget_=element;
this.fullscreenChangeHandler_=changeHandler;
this.fullscreenErrorHandler_=errorHandler;
if(changeHandler){
if(document.fullscreenEnabled){
element.addEventListener('fullscreenchange', changeHandler, false);
}else if(document.webkitFullscreenEnabled){
element.addEventListener('webkitfullscreenchange', changeHandler, false);
}else if(document.mozFullScreenEnabled){
document.addEventListener('mozfullscreenchange', changeHandler, false);
}else if(document.msFullscreenEnabled){
element.addEventListener('msfullscreenchange', changeHandler, false);
}}
if(errorHandler){
if(document.fullscreenEnabled){
element.addEventListener('fullscreenerror', errorHandler, false);
}else if(document.webkitFullscreenEnabled){
element.addEventListener('webkitfullscreenerror', errorHandler, false);
}else if(document.mozFullScreenEnabled){
document.addEventListener('mozfullscreenerror', errorHandler, false);
}else if(document.msFullscreenEnabled){
element.addEventListener('msfullscreenerror', errorHandler, false);
}}
};
VRDisplay.prototype.removeFullscreenListeners_=function (){
if(!this.fullscreenEventTarget_) return;
var element=this.fullscreenEventTarget_;
if(this.fullscreenChangeHandler_){
var changeHandler=this.fullscreenChangeHandler_;
element.removeEventListener('fullscreenchange', changeHandler, false);
element.removeEventListener('webkitfullscreenchange', changeHandler, false);
document.removeEventListener('mozfullscreenchange', changeHandler, false);
element.removeEventListener('msfullscreenchange', changeHandler, false);
}
if(this.fullscreenErrorHandler_){
var errorHandler=this.fullscreenErrorHandler_;
element.removeEventListener('fullscreenerror', errorHandler, false);
element.removeEventListener('webkitfullscreenerror', errorHandler, false);
document.removeEventListener('mozfullscreenerror', errorHandler, false);
element.removeEventListener('msfullscreenerror', errorHandler, false);
}
this.fullscreenEventTarget_=null;
this.fullscreenChangeHandler_=null;
this.fullscreenErrorHandler_=null;
};
VRDisplay.prototype.enableWakeLock=function (){
if(this.wakelock_){
this.wakelock_.enable();
}};
VRDisplay.prototype.disableWakeLock=function (){
if(this.wakelock_){
this.wakelock_.disable();
}};
VRDisplay.prototype.beginPresent_=function (){
};
VRDisplay.prototype.endPresent_=function (){
};
VRDisplay.prototype.submitFrame=function (pose){
};
VRDisplay.prototype.getEyeParameters=function (whichEye){
return null;
};
var config={
ADDITIONAL_VIEWERS: [],
DEFAULT_VIEWER: '',
MOBILE_WAKE_LOCK: true,
DEBUG: false,
DPDB_URL: 'https://dpdb.webvr.rocks/dpdb.json',
K_FILTER: 0.98,
PREDICTION_TIME_S: 0.040,
CARDBOARD_UI_DISABLED: false,
ROTATE_INSTRUCTIONS_DISABLED: false,
YAW_ONLY: false,
BUFFER_SCALE: 0.5,
DIRTY_SUBMIT_FRAME_BINDINGS: false
};
var Eye={
LEFT: 'left',
RIGHT: 'right'
};
function CardboardVRDisplay(config$$1){
var defaults=extend({}, config);
config$$1=extend(defaults, config$$1||{});
VRDisplay.call(this, {
wakelock: config$$1.MOBILE_WAKE_LOCK
});
this.config=config$$1;
this.displayName='Cardboard VRDisplay';
this.capabilities=new VRDisplayCapabilities({
hasPosition: false,
hasOrientation: true,
hasExternalDisplay: false,
canPresent: true,
maxLayers: 1
});
this.stageParameters=null;
this.bufferScale_=this.config.BUFFER_SCALE;
this.poseSensor_=new PoseSensor(this.config);
this.distorter_=null;
this.cardboardUI_=null;
this.dpdb_=new Dpdb(this.config.DPDB_URL, this.onDeviceParamsUpdated_.bind(this));
this.deviceInfo_=new DeviceInfo(this.dpdb_.getDeviceParams(), config$$1.ADDITIONAL_VIEWERS);
this.viewerSelector_=new ViewerSelector(config$$1.DEFAULT_VIEWER);
this.viewerSelector_.onChange(this.onViewerChanged_.bind(this));
this.deviceInfo_.setViewer(this.viewerSelector_.getCurrentViewer());
if(!this.config.ROTATE_INSTRUCTIONS_DISABLED){
this.rotateInstructions_=new RotateInstructions();
}
if(isIOS()){
window.addEventListener('resize', this.onResize_.bind(this));
}}
CardboardVRDisplay.prototype=Object.create(VRDisplay.prototype);
CardboardVRDisplay.prototype._getPose=function (){
return {
position: null,
orientation: this.poseSensor_.getOrientation(),
linearVelocity: null,
linearAcceleration: null,
angularVelocity: null,
angularAcceleration: null
};};
CardboardVRDisplay.prototype._resetPose=function (){
if(this.poseSensor_.resetPose){
this.poseSensor_.resetPose();
}};
CardboardVRDisplay.prototype._getFieldOfView=function (whichEye){
var fieldOfView;
if(whichEye==Eye.LEFT){
fieldOfView=this.deviceInfo_.getFieldOfViewLeftEye();
}else if(whichEye==Eye.RIGHT){
fieldOfView=this.deviceInfo_.getFieldOfViewRightEye();
}else{
console.error('Invalid eye provided: %s', whichEye);
return null;
}
return fieldOfView;
};
CardboardVRDisplay.prototype._getEyeOffset=function (whichEye){
var offset;
if(whichEye==Eye.LEFT){
offset=[-this.deviceInfo_.viewer.interLensDistance * 0.5, 0.0, 0.0];
}else if(whichEye==Eye.RIGHT){
offset=[this.deviceInfo_.viewer.interLensDistance * 0.5, 0.0, 0.0];
}else{
console.error('Invalid eye provided: %s', whichEye);
return null;
}
return offset;
};
CardboardVRDisplay.prototype.getEyeParameters=function (whichEye){
var offset=this._getEyeOffset(whichEye);
var fieldOfView=this._getFieldOfView(whichEye);
var eyeParams={
offset: offset,
renderWidth: this.deviceInfo_.device.width * 0.5 * this.bufferScale_,
renderHeight: this.deviceInfo_.device.height * this.bufferScale_
};
Object.defineProperty(eyeParams, 'fieldOfView', {
enumerable: true,
get: function get(){
deprecateWarning('VRFieldOfView', 'VRFrameData\'s projection matrices');
return fieldOfView;
}});
return eyeParams;
};
CardboardVRDisplay.prototype.onDeviceParamsUpdated_=function (newParams){
if(this.config.DEBUG){
console.log('DPDB reported that device params were updated.');
}
this.deviceInfo_.updateDeviceParams(newParams);
if(this.distorter_){
this.distorter_.updateDeviceInfo(this.deviceInfo_);
}};
CardboardVRDisplay.prototype.updateBounds_=function (){
if(this.layer_&&this.distorter_&&(this.layer_.leftBounds||this.layer_.rightBounds)){
this.distorter_.setTextureBounds(this.layer_.leftBounds, this.layer_.rightBounds);
}};
CardboardVRDisplay.prototype.beginPresent_=function (){
var gl=this.layer_.source.getContext('webgl');
if(!gl) gl=this.layer_.source.getContext('experimental-webgl');
if(!gl) gl=this.layer_.source.getContext('webgl2');
if(!gl) return;
if(this.layer_.predistorted){
if(!this.config.CARDBOARD_UI_DISABLED){
gl.canvas.width=getScreenWidth() * this.bufferScale_;
gl.canvas.height=getScreenHeight() * this.bufferScale_;
this.cardboardUI_=new CardboardUI(gl);
}}else{
if(!this.config.CARDBOARD_UI_DISABLED){
this.cardboardUI_=new CardboardUI(gl);
}
this.distorter_=new CardboardDistorter(gl, this.cardboardUI_, this.config.BUFFER_SCALE, this.config.DIRTY_SUBMIT_FRAME_BINDINGS);
this.distorter_.updateDeviceInfo(this.deviceInfo_);
}
if(this.cardboardUI_){
this.cardboardUI_.listen(function (e){
this.viewerSelector_.show(this.layer_.source.parentElement);
e.stopPropagation();
e.preventDefault();
}.bind(this), function (e){
this.exitPresent();
e.stopPropagation();
e.preventDefault();
}.bind(this));
}
if(this.rotateInstructions_){
if(isLandscapeMode()&&isMobile()){
this.rotateInstructions_.showTemporarily(3000, this.layer_.source.parentElement);
}else{
this.rotateInstructions_.update();
}}
this.orientationHandler=this.onOrientationChange_.bind(this);
window.addEventListener('orientationchange', this.orientationHandler);
this.vrdisplaypresentchangeHandler=this.updateBounds_.bind(this);
window.addEventListener('vrdisplaypresentchange', this.vrdisplaypresentchangeHandler);
this.fireVRDisplayDeviceParamsChange_();
};
CardboardVRDisplay.prototype.endPresent_=function (){
if(this.distorter_){
this.distorter_.destroy();
this.distorter_=null;
}
if(this.cardboardUI_){
this.cardboardUI_.destroy();
this.cardboardUI_=null;
}
if(this.rotateInstructions_){
this.rotateInstructions_.hide();
}
this.viewerSelector_.hide();
window.removeEventListener('orientationchange', this.orientationHandler);
window.removeEventListener('vrdisplaypresentchange', this.vrdisplaypresentchangeHandler);
};
CardboardVRDisplay.prototype.updatePresent_=function (){
this.endPresent_();
this.beginPresent_();
};
CardboardVRDisplay.prototype.submitFrame=function (pose){
if(this.distorter_){
this.updateBounds_();
this.distorter_.submitFrame();
}else if(this.cardboardUI_&&this.layer_){
var canvas=this.layer_.source.getContext('webgl').canvas;
if(canvas.width!=this.lastWidth||canvas.height!=this.lastHeight){
this.cardboardUI_.onResize();
}
this.lastWidth=canvas.width;
this.lastHeight=canvas.height;
this.cardboardUI_.render();
}};
CardboardVRDisplay.prototype.onOrientationChange_=function (e){
this.viewerSelector_.hide();
if(this.rotateInstructions_){
this.rotateInstructions_.update();
}
this.onResize_();
};
CardboardVRDisplay.prototype.onResize_=function (e){
if(this.layer_){
var gl=this.layer_.source.getContext('webgl');
var cssProperties=['position: absolute', 'top: 0', 'left: 0',
'width: 100vw', 'height: 100vh', 'border: 0', 'margin: 0',
'padding: 0px', 'box-sizing: content-box'];
gl.canvas.setAttribute('style', cssProperties.join('; ') + ';');
safariCssSizeWorkaround(gl.canvas);
}};
CardboardVRDisplay.prototype.onViewerChanged_=function (viewer){
this.deviceInfo_.setViewer(viewer);
if(this.distorter_){
this.distorter_.updateDeviceInfo(this.deviceInfo_);
}
this.fireVRDisplayDeviceParamsChange_();
};
CardboardVRDisplay.prototype.fireVRDisplayDeviceParamsChange_=function (){
var event=new CustomEvent('vrdisplaydeviceparamschange', {
detail: {
vrdisplay: this,
deviceInfo: this.deviceInfo_
}});
window.dispatchEvent(event);
};
CardboardVRDisplay.VRFrameData=VRFrameData;
CardboardVRDisplay.VRDisplay=VRDisplay;
return CardboardVRDisplay;
})));
});
var CardboardVRDisplay=unwrapExports(cardboardVrDisplay);
var version="0.10.6";
var DefaultConfig={
ADDITIONAL_VIEWERS: [],
DEFAULT_VIEWER: '',
PROVIDE_MOBILE_VRDISPLAY: true,
GET_VR_DISPLAYS_TIMEOUT: 1000,
MOBILE_WAKE_LOCK: true,
DEBUG: false,
DPDB_URL: 'https://dpdb.webvr.rocks/dpdb.json',
K_FILTER: 0.98,
PREDICTION_TIME_S: 0.040,
TOUCH_PANNER_DISABLED: true,
CARDBOARD_UI_DISABLED: false,
ROTATE_INSTRUCTIONS_DISABLED: false,
YAW_ONLY: false,
BUFFER_SCALE: 0.5,
DIRTY_SUBMIT_FRAME_BINDINGS: false
};
function WebVRPolyfill(config){
this.config=extend(extend({}, DefaultConfig), config);
this.polyfillDisplays=[];
this.enabled=false;
this.hasNative='getVRDisplays' in navigator;
this.native={};
this.native.getVRDisplays=navigator.getVRDisplays;
this.native.VRFrameData=window.VRFrameData;
this.native.VRDisplay=window.VRDisplay;
if(!this.hasNative||this.config.PROVIDE_MOBILE_VRDISPLAY&&isMobile()){
this.enable();
this.getVRDisplays().then(function (displays){
if(displays&&displays[0]&&displays[0].fireVRDisplayConnect_){
displays[0].fireVRDisplayConnect_();
}});
}}
WebVRPolyfill.prototype.getPolyfillDisplays=function (){
if(this._polyfillDisplaysPopulated){
return this.polyfillDisplays;
}
if(isMobile()){
var vrDisplay=new CardboardVRDisplay({
ADDITIONAL_VIEWERS: this.config.ADDITIONAL_VIEWERS,
DEFAULT_VIEWER: this.config.DEFAULT_VIEWER,
MOBILE_WAKE_LOCK: this.config.MOBILE_WAKE_LOCK,
DEBUG: this.config.DEBUG,
DPDB_URL: this.config.DPDB_URL,
CARDBOARD_UI_DISABLED: this.config.CARDBOARD_UI_DISABLED,
K_FILTER: this.config.K_FILTER,
PREDICTION_TIME_S: this.config.PREDICTION_TIME_S,
TOUCH_PANNER_DISABLED: this.config.TOUCH_PANNER_DISABLED,
ROTATE_INSTRUCTIONS_DISABLED: this.config.ROTATE_INSTRUCTIONS_DISABLED,
YAW_ONLY: this.config.YAW_ONLY,
BUFFER_SCALE: this.config.BUFFER_SCALE,
DIRTY_SUBMIT_FRAME_BINDINGS: this.config.DIRTY_SUBMIT_FRAME_BINDINGS
});
this.polyfillDisplays.push(vrDisplay);
}
this._polyfillDisplaysPopulated=true;
return this.polyfillDisplays;
};
WebVRPolyfill.prototype.enable=function (){
this.enabled=true;
if(this.hasNative&&this.native.VRFrameData){
var NativeVRFrameData=this.native.VRFrameData;
var nativeFrameData=new this.native.VRFrameData();
var nativeGetFrameData=this.native.VRDisplay.prototype.getFrameData;
window.VRDisplay.prototype.getFrameData=function (frameData){
if(frameData instanceof NativeVRFrameData){
nativeGetFrameData.call(this, frameData);
return;
}
nativeGetFrameData.call(this, nativeFrameData);
frameData.pose=nativeFrameData.pose;
copyArray(nativeFrameData.leftProjectionMatrix, frameData.leftProjectionMatrix);
copyArray(nativeFrameData.rightProjectionMatrix, frameData.rightProjectionMatrix);
copyArray(nativeFrameData.leftViewMatrix, frameData.leftViewMatrix);
copyArray(nativeFrameData.rightViewMatrix, frameData.rightViewMatrix);
};}
navigator.getVRDisplays=this.getVRDisplays.bind(this);
window.VRDisplay=CardboardVRDisplay.VRDisplay;
window.VRFrameData=CardboardVRDisplay.VRFrameData;
};
WebVRPolyfill.prototype.getVRDisplays=function (){
var _this=this;
var config=this.config;
if(!this.hasNative){
return Promise.resolve(this.getPolyfillDisplays());
}
var timeoutId;
var vrDisplaysNative=this.native.getVRDisplays.call(navigator);
var timeoutPromise=new Promise(function (resolve){
timeoutId=setTimeout(function (){
console.warn('Native WebVR implementation detected, but `getVRDisplays()` failed to resolve. Falling back to polyfill.');
resolve([]);
}, config.GET_VR_DISPLAYS_TIMEOUT);
});
return race([vrDisplaysNative, timeoutPromise]).then(function (nativeDisplays){
clearTimeout(timeoutId);
return nativeDisplays.length > 0 ? nativeDisplays:_this.getPolyfillDisplays();
});
};
WebVRPolyfill.version=version;
WebVRPolyfill.VRFrameData=CardboardVRDisplay.VRFrameData;
WebVRPolyfill.VRDisplay=CardboardVRDisplay.VRDisplay;
var webvrPolyfill=Object.freeze({
default: WebVRPolyfill
});
var require$$0=(webvrPolyfill&&WebVRPolyfill)||webvrPolyfill;
if(typeof commonjsGlobal$1!=='undefined'&&commonjsGlobal$1.window){
if(!commonjsGlobal$1.document){
commonjsGlobal$1.document=commonjsGlobal$1.window.document;
}
if(!commonjsGlobal$1.navigator){
commonjsGlobal$1.navigator=commonjsGlobal$1.window.navigator;
}}
var src=require$$0;
return src;
})));
});
var WebVRPolyfill=unwrapExports(webvrPolyfill);
if(Number.EPSILON===undefined){
Number.EPSILON=Math.pow(2, - 52);
}
if(Number.isInteger===undefined){
Number.isInteger=function(value){
return typeof value==='number'&&isFinite(value)&&Math.floor(value)===value;
};}
if(Math.sign===undefined){
Math.sign=function(x){
return(x < 0) ? - 1:(x > 0) ? 1:+ x;
};}
if('name' in Function.prototype===false){
Object.defineProperty(Function.prototype, 'name', {
get: function (){
return this.toString().match(/^\s*function\s*([^\(\s]*)/)[ 1 ];
}});
}
if(Object.assign===undefined){
(function (){
Object.assign=function(target){
if(target===undefined||target===null){
throw new TypeError('Cannot convert undefined or null to object');
}
var output=Object(target);
for(var index=1; index < arguments.length; index ++){
var source=arguments[ index ];
if(source!==undefined&&source!==null){
for(var nextKey in source){
if(Object.prototype.hasOwnProperty.call(source, nextKey) ){
output[ nextKey ]=source[ nextKey ];
}}
}}
return output;
};})();
}
/**
* https://github.com/mrdoob/eventdispatcher.js/
*/
function EventDispatcher(){}
Object.assign(EventDispatcher.prototype, {
addEventListener: function(type, listener){
if(this._listeners===undefined) this._listeners={};
var listeners=this._listeners;
if(listeners[ type ]===undefined){
listeners[ type ]=[];
}
if(listeners[ type ].indexOf(listener)===- 1){
listeners[ type ].push(listener);
}},
hasEventListener: function(type, listener){
if(this._listeners===undefined) return false;
var listeners=this._listeners;
return listeners[ type ]!==undefined&&listeners[ type ].indexOf(listener)!==- 1;
},
removeEventListener: function(type, listener){
if(this._listeners===undefined) return;
var listeners=this._listeners;
var listenerArray=listeners[ type ];
if(listenerArray!==undefined){
var index=listenerArray.indexOf(listener);
if(index!==- 1){
listenerArray.splice(index, 1);
}}
},
dispatchEvent: function(event){
if(this._listeners===undefined) return;
var listeners=this._listeners;
var listenerArray=listeners[ event.type ];
if(listenerArray!==undefined){
event.target=this;
var array=listenerArray.slice(0);
for(var i=0, l=array.length; i < l; i ++){
array[ i ].call(this, event);
}}
}});
var REVISION='93';
var MOUSE={ LEFT: 0, MIDDLE: 1, RIGHT: 2 };
var CullFaceNone=0;
var CullFaceBack=1;
var CullFaceFront=2;
var PCFShadowMap=1;
var PCFSoftShadowMap=2;
var FrontSide=0;
var BackSide=1;
var DoubleSide=2;
var FlatShading=1;
var NoColors=0;
var FaceColors=1;
var VertexColors=2;
var NoBlending=0;
var NormalBlending=1;
var AdditiveBlending=2;
var SubtractiveBlending=3;
var MultiplyBlending=4;
var CustomBlending=5;
var AddEquation=100;
var SubtractEquation=101;
var ReverseSubtractEquation=102;
var MinEquation=103;
var MaxEquation=104;
var ZeroFactor=200;
var OneFactor=201;
var SrcColorFactor=202;
var OneMinusSrcColorFactor=203;
var SrcAlphaFactor=204;
var OneMinusSrcAlphaFactor=205;
var DstAlphaFactor=206;
var OneMinusDstAlphaFactor=207;
var DstColorFactor=208;
var OneMinusDstColorFactor=209;
var SrcAlphaSaturateFactor=210;
var NeverDepth=0;
var AlwaysDepth=1;
var LessDepth=2;
var LessEqualDepth=3;
var EqualDepth=4;
var GreaterEqualDepth=5;
var GreaterDepth=6;
var NotEqualDepth=7;
var MultiplyOperation=0;
var MixOperation=1;
var AddOperation=2;
var NoToneMapping=0;
var LinearToneMapping=1;
var ReinhardToneMapping=2;
var Uncharted2ToneMapping=3;
var CineonToneMapping=4;
var UVMapping=300;
var CubeReflectionMapping=301;
var CubeRefractionMapping=302;
var EquirectangularReflectionMapping=303;
var EquirectangularRefractionMapping=304;
var SphericalReflectionMapping=305;
var CubeUVReflectionMapping=306;
var CubeUVRefractionMapping=307;
var RepeatWrapping=1000;
var ClampToEdgeWrapping=1001;
var MirroredRepeatWrapping=1002;
var NearestFilter=1003;
var NearestMipMapNearestFilter=1004;
var NearestMipMapLinearFilter=1005;
var LinearFilter=1006;
var LinearMipMapNearestFilter=1007;
var LinearMipMapLinearFilter=1008;
var UnsignedByteType=1009;
var ByteType=1010;
var ShortType=1011;
var UnsignedShortType=1012;
var IntType=1013;
var UnsignedIntType=1014;
var FloatType=1015;
var HalfFloatType=1016;
var UnsignedShort4444Type=1017;
var UnsignedShort5551Type=1018;
var UnsignedShort565Type=1019;
var UnsignedInt248Type=1020;
var AlphaFormat=1021;
var RGBFormat=1022;
var RGBAFormat=1023;
var LuminanceFormat=1024;
var LuminanceAlphaFormat=1025;
var DepthFormat=1026;
var DepthStencilFormat=1027;
var RGB_S3TC_DXT1_Format=33776;
var RGBA_S3TC_DXT1_Format=33777;
var RGBA_S3TC_DXT3_Format=33778;
var RGBA_S3TC_DXT5_Format=33779;
var RGB_PVRTC_4BPPV1_Format=35840;
var RGB_PVRTC_2BPPV1_Format=35841;
var RGBA_PVRTC_4BPPV1_Format=35842;
var RGBA_PVRTC_2BPPV1_Format=35843;
var RGB_ETC1_Format=36196;
var RGBA_ASTC_4x4_Format=37808;
var RGBA_ASTC_5x4_Format=37809;
var RGBA_ASTC_5x5_Format=37810;
var RGBA_ASTC_6x5_Format=37811;
var RGBA_ASTC_6x6_Format=37812;
var RGBA_ASTC_8x5_Format=37813;
var RGBA_ASTC_8x6_Format=37814;
var RGBA_ASTC_8x8_Format=37815;
var RGBA_ASTC_10x5_Format=37816;
var RGBA_ASTC_10x6_Format=37817;
var RGBA_ASTC_10x8_Format=37818;
var RGBA_ASTC_10x10_Format=37819;
var RGBA_ASTC_12x10_Format=37820;
var RGBA_ASTC_12x12_Format=37821;
var LoopOnce=2200;
var LoopRepeat=2201;
var LoopPingPong=2202;
var InterpolateDiscrete=2300;
var InterpolateLinear=2301;
var InterpolateSmooth=2302;
var ZeroCurvatureEnding=2400;
var ZeroSlopeEnding=2401;
var WrapAroundEnding=2402;
var TrianglesDrawMode=0;
var TriangleStripDrawMode=1;
var TriangleFanDrawMode=2;
var LinearEncoding=3000;
var sRGBEncoding=3001;
var GammaEncoding=3007;
var RGBEEncoding=3002;
var RGBM7Encoding=3004;
var RGBM16Encoding=3005;
var RGBDEncoding=3006;
var BasicDepthPacking=3200;
var RGBADepthPacking=3201;
var _Math={
DEG2RAD: Math.PI / 180,
RAD2DEG: 180 / Math.PI,
generateUUID:(function (){
var lut=[];
for(var i=0; i < 256; i ++){
lut[ i ]=(i < 16 ? '0':'') +(i).toString(16);
}
return function generateUUID(){
var d0=Math.random() * 0xffffffff | 0;
var d1=Math.random() * 0xffffffff | 0;
var d2=Math.random() * 0xffffffff | 0;
var d3=Math.random() * 0xffffffff | 0;
var uuid=lut[ d0 & 0xff ] + lut[ d0 >> 8 & 0xff ] + lut[ d0 >> 16 & 0xff ] + lut[ d0 >> 24 & 0xff ] + '-' +
lut[ d1 & 0xff ] + lut[ d1 >> 8 & 0xff ] + '-' + lut[ d1 >> 16 & 0x0f | 0x40 ] + lut[ d1 >> 24 & 0xff ] + '-' +
lut[ d2 & 0x3f | 0x80 ] + lut[ d2 >> 8 & 0xff ] + '-' + lut[ d2 >> 16 & 0xff ] + lut[ d2 >> 24 & 0xff ] +
lut[ d3 & 0xff ] + lut[ d3 >> 8 & 0xff ] + lut[ d3 >> 16 & 0xff ] + lut[ d3 >> 24 & 0xff ];
return uuid.toUpperCase();
};})(),
clamp: function(value, min, max){
return Math.max(min, Math.min(max, value) );
},
euclideanModulo: function(n, m){
return(( n % m) + m) % m;
},
mapLinear: function(x, a1, a2, b1, b2){
return b1 +(x - a1) *(b2 - b1) /(a2 - a1);
},
lerp: function(x, y, t){
return(1 - t) * x + t * y;
},
smoothstep: function(x, min, max){
if(x <=min) return 0;
if(x >=max) return 1;
x=(x - min) /(max - min);
return x * x *(3 - 2 * x);
},
smootherstep: function(x, min, max){
if(x <=min) return 0;
if(x >=max) return 1;
x=(x - min) /(max - min);
return x * x * x *(x *(x * 6 - 15) + 10);
},
randInt: function(low, high){
return low + Math.floor(Math.random() *(high - low + 1) );
},
randFloat: function(low, high){
return low + Math.random() *(high - low);
},
randFloatSpread: function(range){
return range *(0.5 - Math.random());
},
degToRad: function(degrees){
return degrees * _Math.DEG2RAD;
},
radToDeg: function(radians){
return radians * _Math.RAD2DEG;
},
isPowerOfTwo: function(value){
return(value &(value - 1) )===0&&value!==0;
},
ceilPowerOfTwo: function(value){
return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2) );
},
floorPowerOfTwo: function(value){
return Math.pow(2, Math.floor(Math.log(value) / Math.LN2) );
}};
function Vector2(x, y){
this.x=x||0;
this.y=y||0;
}
Object.defineProperties(Vector2.prototype, {
"width": {
get: function (){
return this.x;
},
set: function(value){
this.x=value;
}},
"height": {
get: function (){
return this.y;
},
set: function(value){
this.y=value;
}}
});
Object.assign(Vector2.prototype, {
isVector2: true,
set: function(x, y){
this.x=x;
this.y=y;
return this;
},
setScalar: function(scalar){
this.x=scalar;
this.y=scalar;
return this;
},
setX: function(x){
this.x=x;
return this;
},
setY: function(y){
this.y=y;
return this;
},
setComponent: function(index, value){
switch(index){
case 0: this.x=value; break;
case 1: this.y=value; break;
default: throw new Error('index is out of range: ' + index);
}
return this;
},
getComponent: function(index){
switch(index){
case 0: return this.x;
case 1: return this.y;
default: throw new Error('index is out of range: ' + index);
}},
clone: function (){
return new this.constructor(this.x, this.y);
},
copy: function(v){
this.x=v.x;
this.y=v.y;
return this;
},
add: function(v, w){
if(w!==undefined){
console.warn('THREE.Vector2: .add() now only accepts one argument. Use .addVectors(a, b) instead.');
return this.addVectors(v, w);
}
this.x +=v.x;
this.y +=v.y;
return this;
},
addScalar: function(s){
this.x +=s;
this.y +=s;
return this;
},
addVectors: function(a, b){
this.x=a.x + b.x;
this.y=a.y + b.y;
return this;
},
addScaledVector: function(v, s){
this.x +=v.x * s;
this.y +=v.y * s;
return this;
},
sub: function(v, w){
if(w!==undefined){
console.warn('THREE.Vector2: .sub() now only accepts one argument. Use .subVectors(a, b) instead.');
return this.subVectors(v, w);
}
this.x -=v.x;
this.y -=v.y;
return this;
},
subScalar: function(s){
this.x -=s;
this.y -=s;
return this;
},
subVectors: function(a, b){
this.x=a.x - b.x;
this.y=a.y - b.y;
return this;
},
multiply: function(v){
this.x *=v.x;
this.y *=v.y;
return this;
},
multiplyScalar: function(scalar){
this.x *=scalar;
this.y *=scalar;
return this;
},
divide: function(v){
this.x /=v.x;
this.y /=v.y;
return this;
},
divideScalar: function(scalar){
return this.multiplyScalar(1 / scalar);
},
applyMatrix3: function(m){
var x=this.x, y=this.y;
var e=m.elements;
this.x=e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];
this.y=e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];
return this;
},
min: function(v){
this.x=Math.min(this.x, v.x);
this.y=Math.min(this.y, v.y);
return this;
},
max: function(v){
this.x=Math.max(this.x, v.x);
this.y=Math.max(this.y, v.y);
return this;
},
clamp: function(min, max){
this.x=Math.max(min.x, Math.min(max.x, this.x) );
this.y=Math.max(min.y, Math.min(max.y, this.y) );
return this;
},
clampScalar: function (){
var min=new Vector2();
var max=new Vector2();
return function clampScalar(minVal, maxVal){
min.set(minVal, minVal);
max.set(maxVal, maxVal);
return this.clamp(min, max);
};}(),
clampLength: function(min, max){
var length=this.length();
return this.divideScalar(length||1).multiplyScalar(Math.max(min, Math.min(max, length) ));
},
floor: function (){
this.x=Math.floor(this.x);
this.y=Math.floor(this.y);
return this;
},
ceil: function (){
this.x=Math.ceil(this.x);
this.y=Math.ceil(this.y);
return this;
},
round: function (){
this.x=Math.round(this.x);
this.y=Math.round(this.y);
return this;
},
roundToZero: function (){
this.x=(this.x < 0) ? Math.ceil(this.x):Math.floor(this.x);
this.y=(this.y < 0) ? Math.ceil(this.y):Math.floor(this.y);
return this;
},
negate: function (){
this.x=- this.x;
this.y=- this.y;
return this;
},
dot: function(v){
return this.x * v.x + this.y * v.y;
},
lengthSq: function (){
return this.x * this.x + this.y * this.y;
},
length: function (){
return Math.sqrt(this.x * this.x + this.y * this.y);
},
manhattanLength: function (){
return Math.abs(this.x) + Math.abs(this.y);
},
normalize: function (){
return this.divideScalar(this.length()||1);
},
angle: function (){
var angle=Math.atan2(this.y, this.x);
if(angle < 0) angle +=2 * Math.PI;
return angle;
},
distanceTo: function(v){
return Math.sqrt(this.distanceToSquared(v) );
},
distanceToSquared: function(v){
var dx=this.x - v.x, dy=this.y - v.y;
return dx * dx + dy * dy;
},
manhattanDistanceTo: function(v){
return Math.abs(this.x - v.x) + Math.abs(this.y - v.y);
},
setLength: function(length){
return this.normalize().multiplyScalar(length);
},
lerp: function(v, alpha){
this.x +=(v.x - this.x) * alpha;
this.y +=(v.y - this.y) * alpha;
return this;
},
lerpVectors: function(v1, v2, alpha){
return this.subVectors(v2, v1).multiplyScalar(alpha).add(v1);
},
equals: function(v){
return(( v.x===this.x)&&(v.y===this.y) );
},
fromArray: function(array, offset){
if(offset===undefined) offset=0;
this.x=array[ offset ];
this.y=array[ offset + 1 ];
return this;
},
toArray: function(array, offset){
if(array===undefined) array=[];
if(offset===undefined) offset=0;
array[ offset ]=this.x;
array[ offset + 1 ]=this.y;
return array;
},
fromBufferAttribute: function(attribute, index, offset){
if(offset!==undefined){
console.warn('THREE.Vector2: offset has been removed from .fromBufferAttribute().');
}
this.x=attribute.getX(index);
this.y=attribute.getY(index);
return this;
},
rotateAround: function(center, angle){
var c=Math.cos(angle), s=Math.sin(angle);
var x=this.x - center.x;
var y=this.y - center.y;
this.x=x * c - y * s + center.x;
this.y=x * s + y * c + center.y;
return this;
}});
function Matrix4(){
this.elements=[
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
];
if(arguments.length > 0){
console.error('THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.');
}}
Object.assign(Matrix4.prototype, {
isMatrix4: true,
set: function(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44){
var te=this.elements;
te[ 0 ]=n11; te[ 4 ]=n12; te[ 8 ]=n13; te[ 12 ]=n14;
te[ 1 ]=n21; te[ 5 ]=n22; te[ 9 ]=n23; te[ 13 ]=n24;
te[ 2 ]=n31; te[ 6 ]=n32; te[ 10 ]=n33; te[ 14 ]=n34;
te[ 3 ]=n41; te[ 7 ]=n42; te[ 11 ]=n43; te[ 15 ]=n44;
return this;
},
identity: function (){
this.set(1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
return this;
},
clone: function (){
return new Matrix4().fromArray(this.elements);
},
copy: function(m){
var te=this.elements;
var me=m.elements;
te[ 0 ]=me[ 0 ]; te[ 1 ]=me[ 1 ]; te[ 2 ]=me[ 2 ]; te[ 3 ]=me[ 3 ];
te[ 4 ]=me[ 4 ]; te[ 5 ]=me[ 5 ]; te[ 6 ]=me[ 6 ]; te[ 7 ]=me[ 7 ];
te[ 8 ]=me[ 8 ]; te[ 9 ]=me[ 9 ]; te[ 10 ]=me[ 10 ]; te[ 11 ]=me[ 11 ];
te[ 12 ]=me[ 12 ]; te[ 13 ]=me[ 13 ]; te[ 14 ]=me[ 14 ]; te[ 15 ]=me[ 15 ];
return this;
},
copyPosition: function(m){
var te=this.elements, me=m.elements;
te[ 12 ]=me[ 12 ];
te[ 13 ]=me[ 13 ];
te[ 14 ]=me[ 14 ];
return this;
},
extractBasis: function(xAxis, yAxis, zAxis){
xAxis.setFromMatrixColumn(this, 0);
yAxis.setFromMatrixColumn(this, 1);
zAxis.setFromMatrixColumn(this, 2);
return this;
},
makeBasis: function(xAxis, yAxis, zAxis){
this.set(xAxis.x, yAxis.x, zAxis.x, 0,
xAxis.y, yAxis.y, zAxis.y, 0,
xAxis.z, yAxis.z, zAxis.z, 0,
0, 0, 0, 1
);
return this;
},
extractRotation: function (){
var v1=new Vector3();
return function extractRotation(m){
var te=this.elements;
var me=m.elements;
var scaleX=1 / v1.setFromMatrixColumn(m, 0).length();
var scaleY=1 / v1.setFromMatrixColumn(m, 1).length();
var scaleZ=1 / v1.setFromMatrixColumn(m, 2).length();
te[ 0 ]=me[ 0 ] * scaleX;
te[ 1 ]=me[ 1 ] * scaleX;
te[ 2 ]=me[ 2 ] * scaleX;
te[ 3 ]=0;
te[ 4 ]=me[ 4 ] * scaleY;
te[ 5 ]=me[ 5 ] * scaleY;
te[ 6 ]=me[ 6 ] * scaleY;
te[ 7 ]=0;
te[ 8 ]=me[ 8 ] * scaleZ;
te[ 9 ]=me[ 9 ] * scaleZ;
te[ 10 ]=me[ 10 ] * scaleZ;
te[ 11 ]=0;
te[ 12 ]=0;
te[ 13 ]=0;
te[ 14 ]=0;
te[ 15 ]=1;
return this;
};}(),
makeRotationFromEuler: function(euler){
if(!(euler&&euler.isEuler) ){
console.error('THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.');
}
var te=this.elements;
var x=euler.x, y=euler.y, z=euler.z;
var a=Math.cos(x), b=Math.sin(x);
var c=Math.cos(y), d=Math.sin(y);
var e=Math.cos(z), f=Math.sin(z);
if(euler.order==='XYZ'){
var ae=a * e, af=a * f, be=b * e, bf=b * f;
te[ 0 ]=c * e;
te[ 4 ]=- c * f;
te[ 8 ]=d;
te[ 1 ]=af + be * d;
te[ 5 ]=ae - bf * d;
te[ 9 ]=- b * c;
te[ 2 ]=bf - ae * d;
te[ 6 ]=be + af * d;
te[ 10 ]=a * c;
}else if(euler.order==='YXZ'){
var ce=c * e, cf=c * f, de=d * e, df=d * f;
te[ 0 ]=ce + df * b;
te[ 4 ]=de * b - cf;
te[ 8 ]=a * d;
te[ 1 ]=a * f;
te[ 5 ]=a * e;
te[ 9 ]=- b;
te[ 2 ]=cf * b - de;
te[ 6 ]=df + ce * b;
te[ 10 ]=a * c;
}else if(euler.order==='ZXY'){
var ce=c * e, cf=c * f, de=d * e, df=d * f;
te[ 0 ]=ce - df * b;
te[ 4 ]=- a * f;
te[ 8 ]=de + cf * b;
te[ 1 ]=cf + de * b;
te[ 5 ]=a * e;
te[ 9 ]=df - ce * b;
te[ 2 ]=- a * d;
te[ 6 ]=b;
te[ 10 ]=a * c;
}else if(euler.order==='ZYX'){
var ae=a * e, af=a * f, be=b * e, bf=b * f;
te[ 0 ]=c * e;
te[ 4 ]=be * d - af;
te[ 8 ]=ae * d + bf;
te[ 1 ]=c * f;
te[ 5 ]=bf * d + ae;
te[ 9 ]=af * d - be;
te[ 2 ]=- d;
te[ 6 ]=b * c;
te[ 10 ]=a * c;
}else if(euler.order==='YZX'){
var ac=a * c, ad=a * d, bc=b * c, bd=b * d;
te[ 0 ]=c * e;
te[ 4 ]=bd - ac * f;
te[ 8 ]=bc * f + ad;
te[ 1 ]=f;
te[ 5 ]=a * e;
te[ 9 ]=- b * e;
te[ 2 ]=- d * e;
te[ 6 ]=ad * f + bc;
te[ 10 ]=ac - bd * f;
}else if(euler.order==='XZY'){
var ac=a * c, ad=a * d, bc=b * c, bd=b * d;
te[ 0 ]=c * e;
te[ 4 ]=- f;
te[ 8 ]=d * e;
te[ 1 ]=ac * f + bd;
te[ 5 ]=a * e;
te[ 9 ]=ad * f - bc;
te[ 2 ]=bc * f - ad;
te[ 6 ]=b * e;
te[ 10 ]=bd * f + ac;
}
te[ 3 ]=0;
te[ 7 ]=0;
te[ 11 ]=0;
te[ 12 ]=0;
te[ 13 ]=0;
te[ 14 ]=0;
te[ 15 ]=1;
return this;
},
makeRotationFromQuaternion: function (){
var zero=new Vector3(0, 0, 0);
var one=new Vector3(1, 1, 1);
return function makeRotationFromQuaternion(q){
return this.compose(zero, q, one);
};}(),
lookAt: function (){
var x=new Vector3();
var y=new Vector3();
var z=new Vector3();
return function lookAt(eye, target, up){
var te=this.elements;
z.subVectors(eye, target);
if(z.lengthSq()===0){
z.z=1;
}
z.normalize();
x.crossVectors(up, z);
if(x.lengthSq()===0){
if(Math.abs(up.z)===1){
z.x +=0.0001;
}else{
z.z +=0.0001;
}
z.normalize();
x.crossVectors(up, z);
}
x.normalize();
y.crossVectors(z, x);
te[ 0 ]=x.x; te[ 4 ]=y.x; te[ 8 ]=z.x;
te[ 1 ]=x.y; te[ 5 ]=y.y; te[ 9 ]=z.y;
te[ 2 ]=x.z; te[ 6 ]=y.z; te[ 10 ]=z.z;
return this;
};}(),
multiply: function(m, n){
if(n!==undefined){
console.warn('THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices(a, b) instead.');
return this.multiplyMatrices(m, n);
}
return this.multiplyMatrices(this, m);
},
premultiply: function(m){
return this.multiplyMatrices(m, this);
},
multiplyMatrices: function(a, b){
var ae=a.elements;
var be=b.elements;
var te=this.elements;
var a11=ae[ 0 ], a12=ae[ 4 ], a13=ae[ 8 ], a14=ae[ 12 ];
var a21=ae[ 1 ], a22=ae[ 5 ], a23=ae[ 9 ], a24=ae[ 13 ];
var a31=ae[ 2 ], a32=ae[ 6 ], a33=ae[ 10 ], a34=ae[ 14 ];
var a41=ae[ 3 ], a42=ae[ 7 ], a43=ae[ 11 ], a44=ae[ 15 ];
var b11=be[ 0 ], b12=be[ 4 ], b13=be[ 8 ], b14=be[ 12 ];
var b21=be[ 1 ], b22=be[ 5 ], b23=be[ 9 ], b24=be[ 13 ];
var b31=be[ 2 ], b32=be[ 6 ], b33=be[ 10 ], b34=be[ 14 ];
var b41=be[ 3 ], b42=be[ 7 ], b43=be[ 11 ], b44=be[ 15 ];
te[ 0 ]=a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
te[ 4 ]=a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
te[ 8 ]=a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
te[ 12 ]=a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;
te[ 1 ]=a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
te[ 5 ]=a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
te[ 9 ]=a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
te[ 13 ]=a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;
te[ 2 ]=a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
te[ 6 ]=a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
te[ 10 ]=a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
te[ 14 ]=a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;
te[ 3 ]=a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
te[ 7 ]=a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
te[ 11 ]=a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
te[ 15 ]=a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
return this;
},
multiplyScalar: function(s){
var te=this.elements;
te[ 0 ] *=s; te[ 4 ] *=s; te[ 8 ] *=s; te[ 12 ] *=s;
te[ 1 ] *=s; te[ 5 ] *=s; te[ 9 ] *=s; te[ 13 ] *=s;
te[ 2 ] *=s; te[ 6 ] *=s; te[ 10 ] *=s; te[ 14 ] *=s;
te[ 3 ] *=s; te[ 7 ] *=s; te[ 11 ] *=s; te[ 15 ] *=s;
return this;
},
applyToBufferAttribute: function (){
var v1=new Vector3();
return function applyToBufferAttribute(attribute){
for(var i=0, l=attribute.count; i < l; i ++){
v1.x=attribute.getX(i);
v1.y=attribute.getY(i);
v1.z=attribute.getZ(i);
v1.applyMatrix4(this);
attribute.setXYZ(i, v1.x, v1.y, v1.z);
}
return attribute;
};}(),
determinant: function (){
var te=this.elements;
var n11=te[ 0 ], n12=te[ 4 ], n13=te[ 8 ], n14=te[ 12 ];
var n21=te[ 1 ], n22=te[ 5 ], n23=te[ 9 ], n24=te[ 13 ];
var n31=te[ 2 ], n32=te[ 6 ], n33=te[ 10 ], n34=te[ 14 ];
var n41=te[ 3 ], n42=te[ 7 ], n43=te[ 11 ], n44=te[ 15 ];
return (
n41 * (
+ n14 * n23 * n32
- n13 * n24 * n32
- n14 * n22 * n33
+ n12 * n24 * n33
+ n13 * n22 * n34
- n12 * n23 * n34
) +
n42 * (
+ n11 * n23 * n34
- n11 * n24 * n33
+ n14 * n21 * n33
- n13 * n21 * n34
+ n13 * n24 * n31
- n14 * n23 * n31
) +
n43 * (
+ n11 * n24 * n32
- n11 * n22 * n34
- n14 * n21 * n32
+ n12 * n21 * n34
+ n14 * n22 * n31
- n12 * n24 * n31
) +
n44 * (
- n13 * n22 * n31
- n11 * n23 * n32
+ n11 * n22 * n33
+ n13 * n21 * n32
- n12 * n21 * n33
+ n12 * n23 * n31
)
);
},
transpose: function (){
var te=this.elements;
var tmp;
tmp=te[ 1 ]; te[ 1 ]=te[ 4 ]; te[ 4 ]=tmp;
tmp=te[ 2 ]; te[ 2 ]=te[ 8 ]; te[ 8 ]=tmp;
tmp=te[ 6 ]; te[ 6 ]=te[ 9 ]; te[ 9 ]=tmp;
tmp=te[ 3 ]; te[ 3 ]=te[ 12 ]; te[ 12 ]=tmp;
tmp=te[ 7 ]; te[ 7 ]=te[ 13 ]; te[ 13 ]=tmp;
tmp=te[ 11 ]; te[ 11 ]=te[ 14 ]; te[ 14 ]=tmp;
return this;
},
setPosition: function(v){
var te=this.elements;
te[ 12 ]=v.x;
te[ 13 ]=v.y;
te[ 14 ]=v.z;
return this;
},
getInverse: function(m, throwOnDegenerate){
var te=this.elements,
me=m.elements,
n11=me[ 0 ], n21=me[ 1 ], n31=me[ 2 ], n41=me[ 3 ],
n12=me[ 4 ], n22=me[ 5 ], n32=me[ 6 ], n42=me[ 7 ],
n13=me[ 8 ], n23=me[ 9 ], n33=me[ 10 ], n43=me[ 11 ],
n14=me[ 12 ], n24=me[ 13 ], n34=me[ 14 ], n44=me[ 15 ],
t11=n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,
t12=n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,
t13=n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,
t14=n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;
var det=n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;
if(det===0){
var msg="THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0";
if(throwOnDegenerate===true){
throw new Error(msg);
}else{
console.warn(msg);
}
return this.identity();
}
var detInv=1 / det;
te[ 0 ]=t11 * detInv;
te[ 1 ]=(n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv;
te[ 2 ]=(n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv;
te[ 3 ]=(n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv;
te[ 4 ]=t12 * detInv;
te[ 5 ]=(n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv;
te[ 6 ]=(n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv;
te[ 7 ]=(n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv;
te[ 8 ]=t13 * detInv;
te[ 9 ]=(n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv;
te[ 10 ]=(n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv;
te[ 11 ]=(n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv;
te[ 12 ]=t14 * detInv;
te[ 13 ]=(n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv;
te[ 14 ]=(n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv;
te[ 15 ]=(n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv;
return this;
},
scale: function(v){
var te=this.elements;
var x=v.x, y=v.y, z=v.z;
te[ 0 ] *=x; te[ 4 ] *=y; te[ 8 ] *=z;
te[ 1 ] *=x; te[ 5 ] *=y; te[ 9 ] *=z;
te[ 2 ] *=x; te[ 6 ] *=y; te[ 10 ] *=z;
te[ 3 ] *=x; te[ 7 ] *=y; te[ 11 ] *=z;
return this;
},
getMaxScaleOnAxis: function (){
var te=this.elements;
var scaleXSq=te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];
var scaleYSq=te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];
var scaleZSq=te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];
return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq) );
},
makeTranslation: function(x, y, z){
this.set(1, 0, 0, x,
0, 1, 0, y,
0, 0, 1, z,
0, 0, 0, 1
);
return this;
},
makeRotationX: function(theta){
var c=Math.cos(theta), s=Math.sin(theta);
this.set(1, 0, 0, 0,
0, c, - s, 0,
0, s, c, 0,
0, 0, 0, 1
);
return this;
},
makeRotationY: function(theta){
var c=Math.cos(theta), s=Math.sin(theta);
this.set(c, 0, s, 0,
0, 1, 0, 0,
- s, 0, c, 0,
0, 0, 0, 1
);
return this;
},
makeRotationZ: function(theta){
var c=Math.cos(theta), s=Math.sin(theta);
this.set(c, - s, 0, 0,
s, c, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
return this;
},
makeRotationAxis: function(axis, angle){
var c=Math.cos(angle);
var s=Math.sin(angle);
var t=1 - c;
var x=axis.x, y=axis.y, z=axis.z;
var tx=t * x, ty=t * y;
this.set(tx * x + c, tx * y - s * z, tx * z + s * y, 0,
tx * y + s * z, ty * y + c, ty * z - s * x, 0,
tx * z - s * y, ty * z + s * x, t * z * z + c, 0,
0, 0, 0, 1
);
return this;
},
makeScale: function(x, y, z){
this.set(x, 0, 0, 0,
0, y, 0, 0,
0, 0, z, 0,
0, 0, 0, 1
);
return this;
},
makeShear: function(x, y, z){
this.set(1, y, z, 0,
x, 1, z, 0,
x, y, 1, 0,
0, 0, 0, 1
);
return this;
},
compose: function(position, quaternion, scale){
var te=this.elements;
var x=quaternion._x, y=quaternion._y, z=quaternion._z, w=quaternion._w;
var x2=x + x,	y2=y + y, z2=z + z;
var xx=x * x2, xy=x * y2, xz=x * z2;
var yy=y * y2, yz=y * z2, zz=z * z2;
var wx=w * x2, wy=w * y2, wz=w * z2;
var sx=scale.x, sy=scale.y, sz=scale.z;
te[ 0 ]=(1 -(yy + zz) ) * sx;
te[ 1 ]=(xy + wz) * sx;
te[ 2 ]=(xz - wy) * sx;
te[ 3 ]=0;
te[ 4 ]=(xy - wz) * sy;
te[ 5 ]=(1 -(xx + zz) ) * sy;
te[ 6 ]=(yz + wx) * sy;
te[ 7 ]=0;
te[ 8 ]=(xz + wy) * sz;
te[ 9 ]=(yz - wx) * sz;
te[ 10 ]=(1 -(xx + yy) ) * sz;
te[ 11 ]=0;
te[ 12 ]=position.x;
te[ 13 ]=position.y;
te[ 14 ]=position.z;
te[ 15 ]=1;
return this;
},
decompose: function (){
var vector=new Vector3();
var matrix=new Matrix4();
return function decompose(position, quaternion, scale){
var te=this.elements;
var sx=vector.set(te[ 0 ], te[ 1 ], te[ 2 ]).length();
var sy=vector.set(te[ 4 ], te[ 5 ], te[ 6 ]).length();
var sz=vector.set(te[ 8 ], te[ 9 ], te[ 10 ]).length();
var det=this.determinant();
if(det < 0) sx=- sx;
position.x=te[ 12 ];
position.y=te[ 13 ];
position.z=te[ 14 ];
matrix.copy(this);
var invSX=1 / sx;
var invSY=1 / sy;
var invSZ=1 / sz;
matrix.elements[ 0 ] *=invSX;
matrix.elements[ 1 ] *=invSX;
matrix.elements[ 2 ] *=invSX;
matrix.elements[ 4 ] *=invSY;
matrix.elements[ 5 ] *=invSY;
matrix.elements[ 6 ] *=invSY;
matrix.elements[ 8 ] *=invSZ;
matrix.elements[ 9 ] *=invSZ;
matrix.elements[ 10 ] *=invSZ;
quaternion.setFromRotationMatrix(matrix);
scale.x=sx;
scale.y=sy;
scale.z=sz;
return this;
};}(),
makePerspective: function(left, right, top, bottom, near, far){
if(far===undefined){
console.warn('THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.');
}
var te=this.elements;
var x=2 * near /(right - left);
var y=2 * near /(top - bottom);
var a=(right + left) /(right - left);
var b=(top + bottom) /(top - bottom);
var c=-(far + near) /(far - near);
var d=- 2 * far * near /(far - near);
te[ 0 ]=x;	te[ 4 ]=0;	te[ 8 ]=a;	te[ 12 ]=0;
te[ 1 ]=0;	te[ 5 ]=y;	te[ 9 ]=b;	te[ 13 ]=0;
te[ 2 ]=0;	te[ 6 ]=0;	te[ 10 ]=c;	te[ 14 ]=d;
te[ 3 ]=0;	te[ 7 ]=0;	te[ 11 ]=- 1;	te[ 15 ]=0;
return this;
},
makeOrthographic: function(left, right, top, bottom, near, far){
var te=this.elements;
var w=1.0 /(right - left);
var h=1.0 /(top - bottom);
var p=1.0 /(far - near);
var x=(right + left) * w;
var y=(top + bottom) * h;
var z=(far + near) * p;
te[ 0 ]=2 * w;	te[ 4 ]=0;	te[ 8 ]=0;	te[ 12 ]=- x;
te[ 1 ]=0;	te[ 5 ]=2 * h;	te[ 9 ]=0;	te[ 13 ]=- y;
te[ 2 ]=0;	te[ 6 ]=0;	te[ 10 ]=- 2 * p;	te[ 14 ]=- z;
te[ 3 ]=0;	te[ 7 ]=0;	te[ 11 ]=0;	te[ 15 ]=1;
return this;
},
equals: function(matrix){
var te=this.elements;
var me=matrix.elements;
for(var i=0; i < 16; i ++){
if(te[ i ]!==me[ i ]) return false;
}
return true;
},
fromArray: function(array, offset){
if(offset===undefined) offset=0;
for(var i=0; i < 16; i ++){
this.elements[ i ]=array[ i + offset ];
}
return this;
},
toArray: function(array, offset){
if(array===undefined) array=[];
if(offset===undefined) offset=0;
var te=this.elements;
array[ offset ]=te[ 0 ];
array[ offset + 1 ]=te[ 1 ];
array[ offset + 2 ]=te[ 2 ];
array[ offset + 3 ]=te[ 3 ];
array[ offset + 4 ]=te[ 4 ];
array[ offset + 5 ]=te[ 5 ];
array[ offset + 6 ]=te[ 6 ];
array[ offset + 7 ]=te[ 7 ];
array[ offset + 8 ]=te[ 8 ];
array[ offset + 9 ]=te[ 9 ];
array[ offset + 10 ]=te[ 10 ];
array[ offset + 11 ]=te[ 11 ];
array[ offset + 12 ]=te[ 12 ];
array[ offset + 13 ]=te[ 13 ];
array[ offset + 14 ]=te[ 14 ];
array[ offset + 15 ]=te[ 15 ];
return array;
}});
function Quaternion(x, y, z, w){
this._x=x||0;
this._y=y||0;
this._z=z||0;
this._w=(w!==undefined) ? w:1;
}
Object.assign(Quaternion, {
slerp: function(qa, qb, qm, t){
return qm.copy(qa).slerp(qb, t);
},
slerpFlat: function(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t){
var x0=src0[ srcOffset0 + 0 ],
y0=src0[ srcOffset0 + 1 ],
z0=src0[ srcOffset0 + 2 ],
w0=src0[ srcOffset0 + 3 ],
x1=src1[ srcOffset1 + 0 ],
y1=src1[ srcOffset1 + 1 ],
z1=src1[ srcOffset1 + 2 ],
w1=src1[ srcOffset1 + 3 ];
if(w0!==w1||x0!==x1||y0!==y1||z0!==z1){
var s=1 - t,
cos=x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,
dir=(cos >=0 ? 1:- 1),
sqrSin=1 - cos * cos;
if(sqrSin > Number.EPSILON){
var sin=Math.sqrt(sqrSin),
len=Math.atan2(sin, cos * dir);
s=Math.sin(s * len) / sin;
t=Math.sin(t * len) / sin;
}
var tDir=t * dir;
x0=x0 * s + x1 * tDir;
y0=y0 * s + y1 * tDir;
z0=z0 * s + z1 * tDir;
w0=w0 * s + w1 * tDir;
if(s===1 - t){
var f=1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);
x0 *=f;
y0 *=f;
z0 *=f;
w0 *=f;
}}
dst[ dstOffset ]=x0;
dst[ dstOffset + 1 ]=y0;
dst[ dstOffset + 2 ]=z0;
dst[ dstOffset + 3 ]=w0;
}});
Object.defineProperties(Quaternion.prototype, {
x: {
get: function (){
return this._x;
},
set: function(value){
this._x=value;
this.onChangeCallback();
}},
y: {
get: function (){
return this._y;
},
set: function(value){
this._y=value;
this.onChangeCallback();
}},
z: {
get: function (){
return this._z;
},
set: function(value){
this._z=value;
this.onChangeCallback();
}},
w: {
get: function (){
return this._w;
},
set: function(value){
this._w=value;
this.onChangeCallback();
}}
});
Object.assign(Quaternion.prototype, {
set: function(x, y, z, w){
this._x=x;
this._y=y;
this._z=z;
this._w=w;
this.onChangeCallback();
return this;
},
clone: function (){
return new this.constructor(this._x, this._y, this._z, this._w);
},
copy: function(quaternion){
this._x=quaternion.x;
this._y=quaternion.y;
this._z=quaternion.z;
this._w=quaternion.w;
this.onChangeCallback();
return this;
},
setFromEuler: function(euler, update){
if(!(euler&&euler.isEuler) ){
throw new Error('THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.');
}
var x=euler._x, y=euler._y, z=euler._z, order=euler.order;
var cos=Math.cos;
var sin=Math.sin;
var c1=cos(x / 2);
var c2=cos(y / 2);
var c3=cos(z / 2);
var s1=sin(x / 2);
var s2=sin(y / 2);
var s3=sin(z / 2);
if(order==='XYZ'){
this._x=s1 * c2 * c3 + c1 * s2 * s3;
this._y=c1 * s2 * c3 - s1 * c2 * s3;
this._z=c1 * c2 * s3 + s1 * s2 * c3;
this._w=c1 * c2 * c3 - s1 * s2 * s3;
}else if(order==='YXZ'){
this._x=s1 * c2 * c3 + c1 * s2 * s3;
this._y=c1 * s2 * c3 - s1 * c2 * s3;
this._z=c1 * c2 * s3 - s1 * s2 * c3;
this._w=c1 * c2 * c3 + s1 * s2 * s3;
}else if(order==='ZXY'){
this._x=s1 * c2 * c3 - c1 * s2 * s3;
this._y=c1 * s2 * c3 + s1 * c2 * s3;
this._z=c1 * c2 * s3 + s1 * s2 * c3;
this._w=c1 * c2 * c3 - s1 * s2 * s3;
}else if(order==='ZYX'){
this._x=s1 * c2 * c3 - c1 * s2 * s3;
this._y=c1 * s2 * c3 + s1 * c2 * s3;
this._z=c1 * c2 * s3 - s1 * s2 * c3;
this._w=c1 * c2 * c3 + s1 * s2 * s3;
}else if(order==='YZX'){
this._x=s1 * c2 * c3 + c1 * s2 * s3;
this._y=c1 * s2 * c3 + s1 * c2 * s3;
this._z=c1 * c2 * s3 - s1 * s2 * c3;
this._w=c1 * c2 * c3 - s1 * s2 * s3;
}else if(order==='XZY'){
this._x=s1 * c2 * c3 - c1 * s2 * s3;
this._y=c1 * s2 * c3 - s1 * c2 * s3;
this._z=c1 * c2 * s3 + s1 * s2 * c3;
this._w=c1 * c2 * c3 + s1 * s2 * s3;
}
if(update!==false) this.onChangeCallback();
return this;
},
setFromAxisAngle: function(axis, angle){
var halfAngle=angle / 2, s=Math.sin(halfAngle);
this._x=axis.x * s;
this._y=axis.y * s;
this._z=axis.z * s;
this._w=Math.cos(halfAngle);
this.onChangeCallback();
return this;
},
setFromRotationMatrix: function(m){
var te=m.elements,
m11=te[ 0 ], m12=te[ 4 ], m13=te[ 8 ],
m21=te[ 1 ], m22=te[ 5 ], m23=te[ 9 ],
m31=te[ 2 ], m32=te[ 6 ], m33=te[ 10 ],
trace=m11 + m22 + m33,
s;
if(trace > 0){
s=0.5 / Math.sqrt(trace + 1.0);
this._w=0.25 / s;
this._x=(m32 - m23) * s;
this._y=(m13 - m31) * s;
this._z=(m21 - m12) * s;
}else if(m11 > m22&&m11 > m33){
s=2.0 * Math.sqrt(1.0 + m11 - m22 - m33);
this._w=(m32 - m23) / s;
this._x=0.25 * s;
this._y=(m12 + m21) / s;
this._z=(m13 + m31) / s;
}else if(m22 > m33){
s=2.0 * Math.sqrt(1.0 + m22 - m11 - m33);
this._w=(m13 - m31) / s;
this._x=(m12 + m21) / s;
this._y=0.25 * s;
this._z=(m23 + m32) / s;
}else{
s=2.0 * Math.sqrt(1.0 + m33 - m11 - m22);
this._w=(m21 - m12) / s;
this._x=(m13 + m31) / s;
this._y=(m23 + m32) / s;
this._z=0.25 * s;
}
this.onChangeCallback();
return this;
},
setFromUnitVectors: function (){
var v1=new Vector3();
var r;
var EPS=0.000001;
return function setFromUnitVectors(vFrom, vTo){
if(v1===undefined) v1=new Vector3();
r=vFrom.dot(vTo) + 1;
if(r < EPS){
r=0;
if(Math.abs(vFrom.x) > Math.abs(vFrom.z) ){
v1.set(- vFrom.y, vFrom.x, 0);
}else{
v1.set(0, - vFrom.z, vFrom.y);
}}else{
v1.crossVectors(vFrom, vTo);
}
this._x=v1.x;
this._y=v1.y;
this._z=v1.z;
this._w=r;
return this.normalize();
};}(),
inverse: function (){
return this.conjugate();
},
conjugate: function (){
this._x *=- 1;
this._y *=- 1;
this._z *=- 1;
this.onChangeCallback();
return this;
},
dot: function(v){
return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
},
lengthSq: function (){
return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
},
length: function (){
return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);
},
normalize: function (){
var l=this.length();
if(l===0){
this._x=0;
this._y=0;
this._z=0;
this._w=1;
}else{
l=1 / l;
this._x=this._x * l;
this._y=this._y * l;
this._z=this._z * l;
this._w=this._w * l;
}
this.onChangeCallback();
return this;
},
multiply: function(q, p){
if(p!==undefined){
console.warn('THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions(a, b) instead.');
return this.multiplyQuaternions(q, p);
}
return this.multiplyQuaternions(this, q);
},
premultiply: function(q){
return this.multiplyQuaternions(q, this);
},
multiplyQuaternions: function(a, b){
var qax=a._x, qay=a._y, qaz=a._z, qaw=a._w;
var qbx=b._x, qby=b._y, qbz=b._z, qbw=b._w;
this._x=qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
this._y=qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
this._z=qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
this._w=qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
this.onChangeCallback();
return this;
},
slerp: function(qb, t){
if(t===0) return this;
if(t===1) return this.copy(qb);
var x=this._x, y=this._y, z=this._z, w=this._w;
var cosHalfTheta=w * qb._w + x * qb._x + y * qb._y + z * qb._z;
if(cosHalfTheta < 0){
this._w=- qb._w;
this._x=- qb._x;
this._y=- qb._y;
this._z=- qb._z;
cosHalfTheta=- cosHalfTheta;
}else{
this.copy(qb);
}
if(cosHalfTheta >=1.0){
this._w=w;
this._x=x;
this._y=y;
this._z=z;
return this;
}
var sinHalfTheta=Math.sqrt(1.0 - cosHalfTheta * cosHalfTheta);
if(Math.abs(sinHalfTheta) < 0.001){
this._w=0.5 *(w + this._w);
this._x=0.5 *(x + this._x);
this._y=0.5 *(y + this._y);
this._z=0.5 *(z + this._z);
return this;
}
var halfTheta=Math.atan2(sinHalfTheta, cosHalfTheta);
var ratioA=Math.sin(( 1 - t) * halfTheta) / sinHalfTheta,
ratioB=Math.sin(t * halfTheta) / sinHalfTheta;
this._w=(w * ratioA + this._w * ratioB);
this._x=(x * ratioA + this._x * ratioB);
this._y=(y * ratioA + this._y * ratioB);
this._z=(z * ratioA + this._z * ratioB);
this.onChangeCallback();
return this;
},
equals: function(quaternion){
return(quaternion._x===this._x)&&(quaternion._y===this._y)&&(quaternion._z===this._z)&&(quaternion._w===this._w);
},
fromArray: function(array, offset){
if(offset===undefined) offset=0;
this._x=array[ offset ];
this._y=array[ offset + 1 ];
this._z=array[ offset + 2 ];
this._w=array[ offset + 3 ];
this.onChangeCallback();
return this;
},
toArray: function(array, offset){
if(array===undefined) array=[];
if(offset===undefined) offset=0;
array[ offset ]=this._x;
array[ offset + 1 ]=this._y;
array[ offset + 2 ]=this._z;
array[ offset + 3 ]=this._w;
return array;
},
onChange: function(callback){
this.onChangeCallback=callback;
return this;
},
onChangeCallback: function (){}});
function Vector3(x, y, z){
this.x=x||0;
this.y=y||0;
this.z=z||0;
}
Object.assign(Vector3.prototype, {
isVector3: true,
set: function(x, y, z){
this.x=x;
this.y=y;
this.z=z;
return this;
},
setScalar: function(scalar){
this.x=scalar;
this.y=scalar;
this.z=scalar;
return this;
},
setX: function(x){
this.x=x;
return this;
},
setY: function(y){
this.y=y;
return this;
},
setZ: function(z){
this.z=z;
return this;
},
setComponent: function(index, value){
switch(index){
case 0: this.x=value; break;
case 1: this.y=value; break;
case 2: this.z=value; break;
default: throw new Error('index is out of range: ' + index);
}
return this;
},
getComponent: function(index){
switch(index){
case 0: return this.x;
case 1: return this.y;
case 2: return this.z;
default: throw new Error('index is out of range: ' + index);
}},
clone: function (){
return new this.constructor(this.x, this.y, this.z);
},
copy: function(v){
this.x=v.x;
this.y=v.y;
this.z=v.z;
return this;
},
add: function(v, w){
if(w!==undefined){
console.warn('THREE.Vector3: .add() now only accepts one argument. Use .addVectors(a, b) instead.');
return this.addVectors(v, w);
}
this.x +=v.x;
this.y +=v.y;
this.z +=v.z;
return this;
},
addScalar: function(s){
this.x +=s;
this.y +=s;
this.z +=s;
return this;
},
addVectors: function(a, b){
this.x=a.x + b.x;
this.y=a.y + b.y;
this.z=a.z + b.z;
return this;
},
addScaledVector: function(v, s){
this.x +=v.x * s;
this.y +=v.y * s;
this.z +=v.z * s;
return this;
},
sub: function(v, w){
if(w!==undefined){
console.warn('THREE.Vector3: .sub() now only accepts one argument. Use .subVectors(a, b) instead.');
return this.subVectors(v, w);
}
this.x -=v.x;
this.y -=v.y;
this.z -=v.z;
return this;
},
subScalar: function(s){
this.x -=s;
this.y -=s;
this.z -=s;
return this;
},
subVectors: function(a, b){
this.x=a.x - b.x;
this.y=a.y - b.y;
this.z=a.z - b.z;
return this;
},
multiply: function(v, w){
if(w!==undefined){
console.warn('THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors(a, b) instead.');
return this.multiplyVectors(v, w);
}
this.x *=v.x;
this.y *=v.y;
this.z *=v.z;
return this;
},
multiplyScalar: function(scalar){
this.x *=scalar;
this.y *=scalar;
this.z *=scalar;
return this;
},
multiplyVectors: function(a, b){
this.x=a.x * b.x;
this.y=a.y * b.y;
this.z=a.z * b.z;
return this;
},
applyEuler: function (){
var quaternion=new Quaternion();
return function applyEuler(euler){
if(!(euler&&euler.isEuler) ){
console.error('THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.');
}
return this.applyQuaternion(quaternion.setFromEuler(euler) );
};}(),
applyAxisAngle: function (){
var quaternion=new Quaternion();
return function applyAxisAngle(axis, angle){
return this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle) );
};}(),
applyMatrix3: function(m){
var x=this.x, y=this.y, z=this.z;
var e=m.elements;
this.x=e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;
this.y=e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;
this.z=e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;
return this;
},
applyMatrix4: function(m){
var x=this.x, y=this.y, z=this.z;
var e=m.elements;
var w=1 /(e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ]);
this.x=(e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ]) * w;
this.y=(e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ]) * w;
this.z=(e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ]) * w;
return this;
},
applyQuaternion: function(q){
var x=this.x, y=this.y, z=this.z;
var qx=q.x, qy=q.y, qz=q.z, qw=q.w;
var ix=qw * x + qy * z - qz * y;
var iy=qw * y + qz * x - qx * z;
var iz=qw * z + qx * y - qy * x;
var iw=- qx * x - qy * y - qz * z;
this.x=ix * qw + iw * - qx + iy * - qz - iz * - qy;
this.y=iy * qw + iw * - qy + iz * - qx - ix * - qz;
this.z=iz * qw + iw * - qz + ix * - qy - iy * - qx;
return this;
},
project: function (){
var matrix=new Matrix4();
return function project(camera){
matrix.multiplyMatrices(camera.projectionMatrix, matrix.getInverse(camera.matrixWorld) );
return this.applyMatrix4(matrix);
};}(),
unproject: function (){
var matrix=new Matrix4();
return function unproject(camera){
matrix.multiplyMatrices(camera.matrixWorld, matrix.getInverse(camera.projectionMatrix) );
return this.applyMatrix4(matrix);
};}(),
transformDirection: function(m){
var x=this.x, y=this.y, z=this.z;
var e=m.elements;
this.x=e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;
this.y=e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;
this.z=e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;
return this.normalize();
},
divide: function(v){
this.x /=v.x;
this.y /=v.y;
this.z /=v.z;
return this;
},
divideScalar: function(scalar){
return this.multiplyScalar(1 / scalar);
},
min: function(v){
this.x=Math.min(this.x, v.x);
this.y=Math.min(this.y, v.y);
this.z=Math.min(this.z, v.z);
return this;
},
max: function(v){
this.x=Math.max(this.x, v.x);
this.y=Math.max(this.y, v.y);
this.z=Math.max(this.z, v.z);
return this;
},
clamp: function(min, max){
this.x=Math.max(min.x, Math.min(max.x, this.x) );
this.y=Math.max(min.y, Math.min(max.y, this.y) );
this.z=Math.max(min.z, Math.min(max.z, this.z) );
return this;
},
clampScalar: function (){
var min=new Vector3();
var max=new Vector3();
return function clampScalar(minVal, maxVal){
min.set(minVal, minVal, minVal);
max.set(maxVal, maxVal, maxVal);
return this.clamp(min, max);
};}(),
clampLength: function(min, max){
var length=this.length();
return this.divideScalar(length||1).multiplyScalar(Math.max(min, Math.min(max, length) ));
},
floor: function (){
this.x=Math.floor(this.x);
this.y=Math.floor(this.y);
this.z=Math.floor(this.z);
return this;
},
ceil: function (){
this.x=Math.ceil(this.x);
this.y=Math.ceil(this.y);
this.z=Math.ceil(this.z);
return this;
},
round: function (){
this.x=Math.round(this.x);
this.y=Math.round(this.y);
this.z=Math.round(this.z);
return this;
},
roundToZero: function (){
this.x=(this.x < 0) ? Math.ceil(this.x):Math.floor(this.x);
this.y=(this.y < 0) ? Math.ceil(this.y):Math.floor(this.y);
this.z=(this.z < 0) ? Math.ceil(this.z):Math.floor(this.z);
return this;
},
negate: function (){
this.x=- this.x;
this.y=- this.y;
this.z=- this.z;
return this;
},
dot: function(v){
return this.x * v.x + this.y * v.y + this.z * v.z;
},
lengthSq: function (){
return this.x * this.x + this.y * this.y + this.z * this.z;
},
length: function (){
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
},
manhattanLength: function (){
return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z);
},
normalize: function (){
return this.divideScalar(this.length()||1);
},
setLength: function(length){
return this.normalize().multiplyScalar(length);
},
lerp: function(v, alpha){
this.x +=(v.x - this.x) * alpha;
this.y +=(v.y - this.y) * alpha;
this.z +=(v.z - this.z) * alpha;
return this;
},
lerpVectors: function(v1, v2, alpha){
return this.subVectors(v2, v1).multiplyScalar(alpha).add(v1);
},
cross: function(v, w){
if(w!==undefined){
console.warn('THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors(a, b) instead.');
return this.crossVectors(v, w);
}
return this.crossVectors(this, v);
},
crossVectors: function(a, b){
var ax=a.x, ay=a.y, az=a.z;
var bx=b.x, by=b.y, bz=b.z;
this.x=ay * bz - az * by;
this.y=az * bx - ax * bz;
this.z=ax * by - ay * bx;
return this;
},
projectOnVector: function(vector){
var scalar=vector.dot(this) / vector.lengthSq();
return this.copy(vector).multiplyScalar(scalar);
},
projectOnPlane: function (){
var v1=new Vector3();
return function projectOnPlane(planeNormal){
v1.copy(this).projectOnVector(planeNormal);
return this.sub(v1);
};}(),
reflect: function (){
var v1=new Vector3();
return function reflect(normal){
return this.sub(v1.copy(normal).multiplyScalar(2 * this.dot(normal) ));
};}(),
angleTo: function(v){
var theta=this.dot(v) /(Math.sqrt(this.lengthSq() * v.lengthSq()) );
return Math.acos(_Math.clamp(theta, - 1, 1) );
},
distanceTo: function(v){
return Math.sqrt(this.distanceToSquared(v) );
},
distanceToSquared: function(v){
var dx=this.x - v.x, dy=this.y - v.y, dz=this.z - v.z;
return dx * dx + dy * dy + dz * dz;
},
manhattanDistanceTo: function(v){
return Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + Math.abs(this.z - v.z);
},
setFromSpherical: function(s){
var sinPhiRadius=Math.sin(s.phi) * s.radius;
this.x=sinPhiRadius * Math.sin(s.theta);
this.y=Math.cos(s.phi) * s.radius;
this.z=sinPhiRadius * Math.cos(s.theta);
return this;
},
setFromCylindrical: function(c){
this.x=c.radius * Math.sin(c.theta);
this.y=c.y;
this.z=c.radius * Math.cos(c.theta);
return this;
},
setFromMatrixPosition: function(m){
var e=m.elements;
this.x=e[ 12 ];
this.y=e[ 13 ];
this.z=e[ 14 ];
return this;
},
setFromMatrixScale: function(m){
var sx=this.setFromMatrixColumn(m, 0).length();
var sy=this.setFromMatrixColumn(m, 1).length();
var sz=this.setFromMatrixColumn(m, 2).length();
this.x=sx;
this.y=sy;
this.z=sz;
return this;
},
setFromMatrixColumn: function(m, index){
return this.fromArray(m.elements, index * 4);
},
equals: function(v){
return(( v.x===this.x)&&(v.y===this.y)&&(v.z===this.z) );
},
fromArray: function(array, offset){
if(offset===undefined) offset=0;
this.x=array[ offset ];
this.y=array[ offset + 1 ];
this.z=array[ offset + 2 ];
return this;
},
toArray: function(array, offset){
if(array===undefined) array=[];
if(offset===undefined) offset=0;
array[ offset ]=this.x;
array[ offset + 1 ]=this.y;
array[ offset + 2 ]=this.z;
return array;
},
fromBufferAttribute: function(attribute, index, offset){
if(offset!==undefined){
console.warn('THREE.Vector3: offset has been removed from .fromBufferAttribute().');
}
this.x=attribute.getX(index);
this.y=attribute.getY(index);
this.z=attribute.getZ(index);
return this;
}});
function Matrix3(){
this.elements=[
1, 0, 0,
0, 1, 0,
0, 0, 1
];
if(arguments.length > 0){
console.error('THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.');
}}
Object.assign(Matrix3.prototype, {
isMatrix3: true,
set: function(n11, n12, n13, n21, n22, n23, n31, n32, n33){
var te=this.elements;
te[ 0 ]=n11; te[ 1 ]=n21; te[ 2 ]=n31;
te[ 3 ]=n12; te[ 4 ]=n22; te[ 5 ]=n32;
te[ 6 ]=n13; te[ 7 ]=n23; te[ 8 ]=n33;
return this;
},
identity: function (){
this.set(1, 0, 0,
0, 1, 0,
0, 0, 1
);
return this;
},
clone: function (){
return new this.constructor().fromArray(this.elements);
},
copy: function(m){
var te=this.elements;
var me=m.elements;
te[ 0 ]=me[ 0 ]; te[ 1 ]=me[ 1 ]; te[ 2 ]=me[ 2 ];
te[ 3 ]=me[ 3 ]; te[ 4 ]=me[ 4 ]; te[ 5 ]=me[ 5 ];
te[ 6 ]=me[ 6 ]; te[ 7 ]=me[ 7 ]; te[ 8 ]=me[ 8 ];
return this;
},
setFromMatrix4: function(m){
var me=m.elements;
this.set(me[ 0 ], me[ 4 ], me[ 8 ],
me[ 1 ], me[ 5 ], me[ 9 ],
me[ 2 ], me[ 6 ], me[ 10 ]
);
return this;
},
applyToBufferAttribute: function (){
var v1=new Vector3();
return function applyToBufferAttribute(attribute){
for(var i=0, l=attribute.count; i < l; i ++){
v1.x=attribute.getX(i);
v1.y=attribute.getY(i);
v1.z=attribute.getZ(i);
v1.applyMatrix3(this);
attribute.setXYZ(i, v1.x, v1.y, v1.z);
}
return attribute;
};}(),
multiply: function(m){
return this.multiplyMatrices(this, m);
},
premultiply: function(m){
return this.multiplyMatrices(m, this);
},
multiplyMatrices: function(a, b){
var ae=a.elements;
var be=b.elements;
var te=this.elements;
var a11=ae[ 0 ], a12=ae[ 3 ], a13=ae[ 6 ];
var a21=ae[ 1 ], a22=ae[ 4 ], a23=ae[ 7 ];
var a31=ae[ 2 ], a32=ae[ 5 ], a33=ae[ 8 ];
var b11=be[ 0 ], b12=be[ 3 ], b13=be[ 6 ];
var b21=be[ 1 ], b22=be[ 4 ], b23=be[ 7 ];
var b31=be[ 2 ], b32=be[ 5 ], b33=be[ 8 ];
te[ 0 ]=a11 * b11 + a12 * b21 + a13 * b31;
te[ 3 ]=a11 * b12 + a12 * b22 + a13 * b32;
te[ 6 ]=a11 * b13 + a12 * b23 + a13 * b33;
te[ 1 ]=a21 * b11 + a22 * b21 + a23 * b31;
te[ 4 ]=a21 * b12 + a22 * b22 + a23 * b32;
te[ 7 ]=a21 * b13 + a22 * b23 + a23 * b33;
te[ 2 ]=a31 * b11 + a32 * b21 + a33 * b31;
te[ 5 ]=a31 * b12 + a32 * b22 + a33 * b32;
te[ 8 ]=a31 * b13 + a32 * b23 + a33 * b33;
return this;
},
multiplyScalar: function(s){
var te=this.elements;
te[ 0 ] *=s; te[ 3 ] *=s; te[ 6 ] *=s;
te[ 1 ] *=s; te[ 4 ] *=s; te[ 7 ] *=s;
te[ 2 ] *=s; te[ 5 ] *=s; te[ 8 ] *=s;
return this;
},
determinant: function (){
var te=this.elements;
var a=te[ 0 ], b=te[ 1 ], c=te[ 2 ],
d=te[ 3 ], e=te[ 4 ], f=te[ 5 ],
g=te[ 6 ], h=te[ 7 ], i=te[ 8 ];
return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;
},
getInverse: function(matrix, throwOnDegenerate){
if(matrix&&matrix.isMatrix4){
console.error("THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.");
}
var me=matrix.elements,
te=this.elements,
n11=me[ 0 ], n21=me[ 1 ], n31=me[ 2 ],
n12=me[ 3 ], n22=me[ 4 ], n32=me[ 5 ],
n13=me[ 6 ], n23=me[ 7 ], n33=me[ 8 ],
t11=n33 * n22 - n32 * n23,
t12=n32 * n13 - n33 * n12,
t13=n23 * n12 - n22 * n13,
det=n11 * t11 + n21 * t12 + n31 * t13;
if(det===0){
var msg="THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0";
if(throwOnDegenerate===true){
throw new Error(msg);
}else{
console.warn(msg);
}
return this.identity();
}
var detInv=1 / det;
te[ 0 ]=t11 * detInv;
te[ 1 ]=(n31 * n23 - n33 * n21) * detInv;
te[ 2 ]=(n32 * n21 - n31 * n22) * detInv;
te[ 3 ]=t12 * detInv;
te[ 4 ]=(n33 * n11 - n31 * n13) * detInv;
te[ 5 ]=(n31 * n12 - n32 * n11) * detInv;
te[ 6 ]=t13 * detInv;
te[ 7 ]=(n21 * n13 - n23 * n11) * detInv;
te[ 8 ]=(n22 * n11 - n21 * n12) * detInv;
return this;
},
transpose: function (){
var tmp, m=this.elements;
tmp=m[ 1 ]; m[ 1 ]=m[ 3 ]; m[ 3 ]=tmp;
tmp=m[ 2 ]; m[ 2 ]=m[ 6 ]; m[ 6 ]=tmp;
tmp=m[ 5 ]; m[ 5 ]=m[ 7 ]; m[ 7 ]=tmp;
return this;
},
getNormalMatrix: function(matrix4){
return this.setFromMatrix4(matrix4).getInverse(this).transpose();
},
transposeIntoArray: function(r){
var m=this.elements;
r[ 0 ]=m[ 0 ];
r[ 1 ]=m[ 3 ];
r[ 2 ]=m[ 6 ];
r[ 3 ]=m[ 1 ];
r[ 4 ]=m[ 4 ];
r[ 5 ]=m[ 7 ];
r[ 6 ]=m[ 2 ];
r[ 7 ]=m[ 5 ];
r[ 8 ]=m[ 8 ];
return this;
},
setUvTransform: function(tx, ty, sx, sy, rotation, cx, cy){
var c=Math.cos(rotation);
var s=Math.sin(rotation);
this.set(sx * c, sx * s, - sx *(c * cx + s * cy) + cx + tx,
- sy * s, sy * c, - sy *(- s * cx + c * cy) + cy + ty,
0, 0, 1
);
},
scale: function(sx, sy){
var te=this.elements;
te[ 0 ] *=sx; te[ 3 ] *=sx; te[ 6 ] *=sx;
te[ 1 ] *=sy; te[ 4 ] *=sy; te[ 7 ] *=sy;
return this;
},
rotate: function(theta){
var c=Math.cos(theta);
var s=Math.sin(theta);
var te=this.elements;
var a11=te[ 0 ], a12=te[ 3 ], a13=te[ 6 ];
var a21=te[ 1 ], a22=te[ 4 ], a23=te[ 7 ];
te[ 0 ]=c * a11 + s * a21;
te[ 3 ]=c * a12 + s * a22;
te[ 6 ]=c * a13 + s * a23;
te[ 1 ]=- s * a11 + c * a21;
te[ 4 ]=- s * a12 + c * a22;
te[ 7 ]=- s * a13 + c * a23;
return this;
},
translate: function(tx, ty){
var te=this.elements;
te[ 0 ] +=tx * te[ 2 ]; te[ 3 ] +=tx * te[ 5 ]; te[ 6 ] +=tx * te[ 8 ];
te[ 1 ] +=ty * te[ 2 ]; te[ 4 ] +=ty * te[ 5 ]; te[ 7 ] +=ty * te[ 8 ];
return this;
},
equals: function(matrix){
var te=this.elements;
var me=matrix.elements;
for(var i=0; i < 9; i ++){
if(te[ i ]!==me[ i ]) return false;
}
return true;
},
fromArray: function(array, offset){
if(offset===undefined) offset=0;
for(var i=0; i < 9; i ++){
this.elements[ i ]=array[ i + offset ];
}
return this;
},
toArray: function(array, offset){
if(array===undefined) array=[];
if(offset===undefined) offset=0;
var te=this.elements;
array[ offset ]=te[ 0 ];
array[ offset + 1 ]=te[ 1 ];
array[ offset + 2 ]=te[ 2 ];
array[ offset + 3 ]=te[ 3 ];
array[ offset + 4 ]=te[ 4 ];
array[ offset + 5 ]=te[ 5 ];
array[ offset + 6 ]=te[ 6 ];
array[ offset + 7 ]=te[ 7 ];
array[ offset + 8 ]=te[ 8 ];
return array;
}});
var textureId=0;
function Texture(image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding){
Object.defineProperty(this, 'id', { value: textureId ++ });
this.uuid=_Math.generateUUID();
this.name='';
this.image=image!==undefined ? image:Texture.DEFAULT_IMAGE;
this.mipmaps=[];
this.mapping=mapping!==undefined ? mapping:Texture.DEFAULT_MAPPING;
this.wrapS=wrapS!==undefined ? wrapS:ClampToEdgeWrapping;
this.wrapT=wrapT!==undefined ? wrapT:ClampToEdgeWrapping;
this.magFilter=magFilter!==undefined ? magFilter:LinearFilter;
this.minFilter=minFilter!==undefined ? minFilter:LinearMipMapLinearFilter;
this.anisotropy=anisotropy!==undefined ? anisotropy:1;
this.format=format!==undefined ? format:RGBAFormat;
this.type=type!==undefined ? type:UnsignedByteType;
this.offset=new Vector2(0, 0);
this.repeat=new Vector2(1, 1);
this.center=new Vector2(0, 0);
this.rotation=0;
this.matrixAutoUpdate=true;
this.matrix=new Matrix3();
this.generateMipmaps=true;
this.premultiplyAlpha=false;
this.flipY=true;
this.unpackAlignment=4;	// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)
this.encoding=encoding!==undefined ? encoding:LinearEncoding;
this.version=0;
this.onUpdate=null;
}
Texture.DEFAULT_IMAGE=undefined;
Texture.DEFAULT_MAPPING=UVMapping;
Texture.prototype=Object.assign(Object.create(EventDispatcher.prototype), {
constructor: Texture,
isTexture: true,
updateMatrix: function (){
this.matrix.setUvTransform(this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y);
},
clone: function (){
return new this.constructor().copy(this);
},
copy: function(source){
this.name=source.name;
this.image=source.image;
this.mipmaps=source.mipmaps.slice(0);
this.mapping=source.mapping;
this.wrapS=source.wrapS;
this.wrapT=source.wrapT;
this.magFilter=source.magFilter;
this.minFilter=source.minFilter;
this.anisotropy=source.anisotropy;
this.format=source.format;
this.type=source.type;
this.offset.copy(source.offset);
this.repeat.copy(source.repeat);
this.center.copy(source.center);
this.rotation=source.rotation;
this.matrixAutoUpdate=source.matrixAutoUpdate;
this.matrix.copy(source.matrix);
this.generateMipmaps=source.generateMipmaps;
this.premultiplyAlpha=source.premultiplyAlpha;
this.flipY=source.flipY;
this.unpackAlignment=source.unpackAlignment;
this.encoding=source.encoding;
return this;
},
toJSON: function(meta){
var isRootObject=(meta===undefined||typeof meta==='string');
if(! isRootObject&&meta.textures[ this.uuid ]!==undefined){
return meta.textures[ this.uuid ];
}
function getDataURL(image){
var canvas;
if(image instanceof HTMLCanvasElement){
canvas=image;
}else{
canvas=document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
canvas.width=image.width;
canvas.height=image.height;
var context=canvas.getContext('2d');
if(image instanceof ImageData){
context.putImageData(image, 0, 0);
}else{
context.drawImage(image, 0, 0, image.width, image.height);
}}
if(canvas.width > 2048||canvas.height > 2048){
return canvas.toDataURL('image/jpeg', 0.6);
}else{
return canvas.toDataURL('image/png');
}}
var output={
metadata: {
version: 4.5,
type: 'Texture',
generator: 'Texture.toJSON'
},
uuid: this.uuid,
name: this.name,
mapping: this.mapping,
repeat: [ this.repeat.x, this.repeat.y ],
offset: [ this.offset.x, this.offset.y ],
center: [ this.center.x, this.center.y ],
rotation: this.rotation,
wrap: [ this.wrapS, this.wrapT ],
format: this.format,
minFilter: this.minFilter,
magFilter: this.magFilter,
anisotropy: this.anisotropy,
flipY: this.flipY
};
if(this.image!==undefined){
var image=this.image;
if(image.uuid===undefined){
image.uuid=_Math.generateUUID();
}
if(! isRootObject&&meta.images[ image.uuid ]===undefined){
meta.images[ image.uuid ]={
uuid: image.uuid,
url: getDataURL(image)
};}
output.image=image.uuid;
}
if(! isRootObject){
meta.textures[ this.uuid ]=output;
}
return output;
},
dispose: function (){
this.dispatchEvent({ type: 'dispose' });
},
transformUv: function(uv){
if(this.mapping!==UVMapping) return;
uv.applyMatrix3(this.matrix);
if(uv.x < 0||uv.x > 1){
switch(this.wrapS){
case RepeatWrapping:
uv.x=uv.x - Math.floor(uv.x);
break;
case ClampToEdgeWrapping:
uv.x=uv.x < 0 ? 0:1;
break;
case MirroredRepeatWrapping:
if(Math.abs(Math.floor(uv.x) % 2)===1){
uv.x=Math.ceil(uv.x) - uv.x;
}else{
uv.x=uv.x - Math.floor(uv.x);
}
break;
}}
if(uv.y < 0||uv.y > 1){
switch(this.wrapT){
case RepeatWrapping:
uv.y=uv.y - Math.floor(uv.y);
break;
case ClampToEdgeWrapping:
uv.y=uv.y < 0 ? 0:1;
break;
case MirroredRepeatWrapping:
if(Math.abs(Math.floor(uv.y) % 2)===1){
uv.y=Math.ceil(uv.y) - uv.y;
}else{
uv.y=uv.y - Math.floor(uv.y);
}
break;
}}
if(this.flipY){
uv.y=1 - uv.y;
}}
});
Object.defineProperty(Texture.prototype, "needsUpdate", {
set: function(value){
if(value===true) this.version ++;
}});
function Vector4(x, y, z, w){
this.x=x||0;
this.y=y||0;
this.z=z||0;
this.w=(w!==undefined) ? w:1;
}
Object.assign(Vector4.prototype, {
isVector4: true,
set: function(x, y, z, w){
this.x=x;
this.y=y;
this.z=z;
this.w=w;
return this;
},
setScalar: function(scalar){
this.x=scalar;
this.y=scalar;
this.z=scalar;
this.w=scalar;
return this;
},
setX: function(x){
this.x=x;
return this;
},
setY: function(y){
this.y=y;
return this;
},
setZ: function(z){
this.z=z;
return this;
},
setW: function(w){
this.w=w;
return this;
},
setComponent: function(index, value){
switch(index){
case 0: this.x=value; break;
case 1: this.y=value; break;
case 2: this.z=value; break;
case 3: this.w=value; break;
default: throw new Error('index is out of range: ' + index);
}
return this;
},
getComponent: function(index){
switch(index){
case 0: return this.x;
case 1: return this.y;
case 2: return this.z;
case 3: return this.w;
default: throw new Error('index is out of range: ' + index);
}},
clone: function (){
return new this.constructor(this.x, this.y, this.z, this.w);
},
copy: function(v){
this.x=v.x;
this.y=v.y;
this.z=v.z;
this.w=(v.w!==undefined) ? v.w:1;
return this;
},
add: function(v, w){
if(w!==undefined){
console.warn('THREE.Vector4: .add() now only accepts one argument. Use .addVectors(a, b) instead.');
return this.addVectors(v, w);
}
this.x +=v.x;
this.y +=v.y;
this.z +=v.z;
this.w +=v.w;
return this;
},
addScalar: function(s){
this.x +=s;
this.y +=s;
this.z +=s;
this.w +=s;
return this;
},
addVectors: function(a, b){
this.x=a.x + b.x;
this.y=a.y + b.y;
this.z=a.z + b.z;
this.w=a.w + b.w;
return this;
},
addScaledVector: function(v, s){
this.x +=v.x * s;
this.y +=v.y * s;
this.z +=v.z * s;
this.w +=v.w * s;
return this;
},
sub: function(v, w){
if(w!==undefined){
console.warn('THREE.Vector4: .sub() now only accepts one argument. Use .subVectors(a, b) instead.');
return this.subVectors(v, w);
}
this.x -=v.x;
this.y -=v.y;
this.z -=v.z;
this.w -=v.w;
return this;
},
subScalar: function(s){
this.x -=s;
this.y -=s;
this.z -=s;
this.w -=s;
return this;
},
subVectors: function(a, b){
this.x=a.x - b.x;
this.y=a.y - b.y;
this.z=a.z - b.z;
this.w=a.w - b.w;
return this;
},
multiplyScalar: function(scalar){
this.x *=scalar;
this.y *=scalar;
this.z *=scalar;
this.w *=scalar;
return this;
},
applyMatrix4: function(m){
var x=this.x, y=this.y, z=this.z, w=this.w;
var e=m.elements;
this.x=e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;
this.y=e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;
this.z=e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;
this.w=e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;
return this;
},
divideScalar: function(scalar){
return this.multiplyScalar(1 / scalar);
},
setAxisAngleFromQuaternion: function(q){
this.w=2 * Math.acos(q.w);
var s=Math.sqrt(1 - q.w * q.w);
if(s < 0.0001){
this.x=1;
this.y=0;
this.z=0;
}else{
this.x=q.x / s;
this.y=q.y / s;
this.z=q.z / s;
}
return this;
},
setAxisAngleFromRotationMatrix: function(m){
var angle, x, y, z,
epsilon=0.01,
epsilon2=0.1,
te=m.elements,
m11=te[ 0 ], m12=te[ 4 ], m13=te[ 8 ],
m21=te[ 1 ], m22=te[ 5 ], m23=te[ 9 ],
m31=te[ 2 ], m32=te[ 6 ], m33=te[ 10 ];
if(( Math.abs(m12 - m21) < epsilon) &&
(Math.abs(m13 - m31) < epsilon) &&
(Math.abs(m23 - m32) < epsilon) ){
if(( Math.abs(m12 + m21) < epsilon2) &&
(Math.abs(m13 + m31) < epsilon2) &&
(Math.abs(m23 + m32) < epsilon2) &&
(Math.abs(m11 + m22 + m33 - 3) < epsilon2) ){
this.set(1, 0, 0, 0);
return this;
}
angle=Math.PI;
var xx=(m11 + 1) / 2;
var yy=(m22 + 1) / 2;
var zz=(m33 + 1) / 2;
var xy=(m12 + m21) / 4;
var xz=(m13 + m31) / 4;
var yz=(m23 + m32) / 4;
if(( xx > yy)&&(xx > zz) ){
if(xx < epsilon){
x=0;
y=0.707106781;
z=0.707106781;
}else{
x=Math.sqrt(xx);
y=xy / x;
z=xz / x;
}}else if(yy > zz){
if(yy < epsilon){
x=0.707106781;
y=0;
z=0.707106781;
}else{
y=Math.sqrt(yy);
x=xy / y;
z=yz / y;
}}else{
if(zz < epsilon){
x=0.707106781;
y=0.707106781;
z=0;
}else{
z=Math.sqrt(zz);
x=xz / z;
y=yz / z;
}}
this.set(x, y, z, angle);
return this;
}
var s=Math.sqrt(( m32 - m23) *(m32 - m23) +
(m13 - m31) *(m13 - m31) +
(m21 - m12) *(m21 - m12) );
if(Math.abs(s) < 0.001) s=1;
this.x=(m32 - m23) / s;
this.y=(m13 - m31) / s;
this.z=(m21 - m12) / s;
this.w=Math.acos(( m11 + m22 + m33 - 1) / 2);
return this;
},
min: function(v){
this.x=Math.min(this.x, v.x);
this.y=Math.min(this.y, v.y);
this.z=Math.min(this.z, v.z);
this.w=Math.min(this.w, v.w);
return this;
},
max: function(v){
this.x=Math.max(this.x, v.x);
this.y=Math.max(this.y, v.y);
this.z=Math.max(this.z, v.z);
this.w=Math.max(this.w, v.w);
return this;
},
clamp: function(min, max){
this.x=Math.max(min.x, Math.min(max.x, this.x) );
this.y=Math.max(min.y, Math.min(max.y, this.y) );
this.z=Math.max(min.z, Math.min(max.z, this.z) );
this.w=Math.max(min.w, Math.min(max.w, this.w) );
return this;
},
clampScalar: function (){
var min, max;
return function clampScalar(minVal, maxVal){
if(min===undefined){
min=new Vector4();
max=new Vector4();
}
min.set(minVal, minVal, minVal, minVal);
max.set(maxVal, maxVal, maxVal, maxVal);
return this.clamp(min, max);
};}(),
clampLength: function(min, max){
var length=this.length();
return this.divideScalar(length||1).multiplyScalar(Math.max(min, Math.min(max, length) ));
},
floor: function (){
this.x=Math.floor(this.x);
this.y=Math.floor(this.y);
this.z=Math.floor(this.z);
this.w=Math.floor(this.w);
return this;
},
ceil: function (){
this.x=Math.ceil(this.x);
this.y=Math.ceil(this.y);
this.z=Math.ceil(this.z);
this.w=Math.ceil(this.w);
return this;
},
round: function (){
this.x=Math.round(this.x);
this.y=Math.round(this.y);
this.z=Math.round(this.z);
this.w=Math.round(this.w);
return this;
},
roundToZero: function (){
this.x=(this.x < 0) ? Math.ceil(this.x):Math.floor(this.x);
this.y=(this.y < 0) ? Math.ceil(this.y):Math.floor(this.y);
this.z=(this.z < 0) ? Math.ceil(this.z):Math.floor(this.z);
this.w=(this.w < 0) ? Math.ceil(this.w):Math.floor(this.w);
return this;
},
negate: function (){
this.x=- this.x;
this.y=- this.y;
this.z=- this.z;
this.w=- this.w;
return this;
},
dot: function(v){
return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
},
lengthSq: function (){
return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;
},
length: function (){
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);
},
manhattanLength: function (){
return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w);
},
normalize: function (){
return this.divideScalar(this.length()||1);
},
setLength: function(length){
return this.normalize().multiplyScalar(length);
},
lerp: function(v, alpha){
this.x +=(v.x - this.x) * alpha;
this.y +=(v.y - this.y) * alpha;
this.z +=(v.z - this.z) * alpha;
this.w +=(v.w - this.w) * alpha;
return this;
},
lerpVectors: function(v1, v2, alpha){
return this.subVectors(v2, v1).multiplyScalar(alpha).add(v1);
},
equals: function(v){
return(( v.x===this.x)&&(v.y===this.y)&&(v.z===this.z)&&(v.w===this.w) );
},
fromArray: function(array, offset){
if(offset===undefined) offset=0;
this.x=array[ offset ];
this.y=array[ offset + 1 ];
this.z=array[ offset + 2 ];
this.w=array[ offset + 3 ];
return this;
},
toArray: function(array, offset){
if(array===undefined) array=[];
if(offset===undefined) offset=0;
array[ offset ]=this.x;
array[ offset + 1 ]=this.y;
array[ offset + 2 ]=this.z;
array[ offset + 3 ]=this.w;
return array;
},
fromBufferAttribute: function(attribute, index, offset){
if(offset!==undefined){
console.warn('THREE.Vector4: offset has been removed from .fromBufferAttribute().');
}
this.x=attribute.getX(index);
this.y=attribute.getY(index);
this.z=attribute.getZ(index);
this.w=attribute.getW(index);
return this;
}});
function WebGLRenderTarget(width, height, options){
this.width=width;
this.height=height;
this.scissor=new Vector4(0, 0, width, height);
this.scissorTest=false;
this.viewport=new Vector4(0, 0, width, height);
options=options||{};
if(options.minFilter===undefined) options.minFilter=LinearFilter;
this.texture=new Texture(undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding);
this.texture.generateMipmaps=options.generateMipmaps!==undefined ? options.generateMipmaps:true;
this.depthBuffer=options.depthBuffer!==undefined ? options.depthBuffer:true;
this.stencilBuffer=options.stencilBuffer!==undefined ? options.stencilBuffer:true;
this.depthTexture=options.depthTexture!==undefined ? options.depthTexture:null;
}
WebGLRenderTarget.prototype=Object.assign(Object.create(EventDispatcher.prototype), {
constructor: WebGLRenderTarget,
isWebGLRenderTarget: true,
setSize: function(width, height){
if(this.width!==width||this.height!==height){
this.width=width;
this.height=height;
this.dispose();
}
this.viewport.set(0, 0, width, height);
this.scissor.set(0, 0, width, height);
},
clone: function (){
return new this.constructor().copy(this);
},
copy: function(source){
this.width=source.width;
this.height=source.height;
this.viewport.copy(source.viewport);
this.texture=source.texture.clone();
this.depthBuffer=source.depthBuffer;
this.stencilBuffer=source.stencilBuffer;
this.depthTexture=source.depthTexture;
return this;
},
dispose: function (){
this.dispatchEvent({ type: 'dispose' });
}});
function WebGLRenderTargetCube(width, height, options){
WebGLRenderTarget.call(this, width, height, options);
this.activeCubeFace=0;
this.activeMipMapLevel=0;
}
WebGLRenderTargetCube.prototype=Object.create(WebGLRenderTarget.prototype);
WebGLRenderTargetCube.prototype.constructor=WebGLRenderTargetCube;
WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube=true;
function DataTexture(data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding){
Texture.call(this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding);
this.image={ data: data, width: width, height: height };
this.magFilter=magFilter!==undefined ? magFilter:NearestFilter;
this.minFilter=minFilter!==undefined ? minFilter:NearestFilter;
this.generateMipmaps=false;
this.flipY=false;
this.unpackAlignment=1;
}
DataTexture.prototype=Object.create(Texture.prototype);
DataTexture.prototype.constructor=DataTexture;
DataTexture.prototype.isDataTexture=true;
function Box3(min, max){
this.min=(min!==undefined) ? min:new Vector3( + Infinity, + Infinity, + Infinity);
this.max=(max!==undefined) ? max:new Vector3(- Infinity, - Infinity, - Infinity);
}
Object.assign(Box3.prototype, {
isBox3: true,
set: function(min, max){
this.min.copy(min);
this.max.copy(max);
return this;
},
setFromArray: function(array){
var minX=+ Infinity;
var minY=+ Infinity;
var minZ=+ Infinity;
var maxX=- Infinity;
var maxY=- Infinity;
var maxZ=- Infinity;
for(var i=0, l=array.length; i < l; i +=3){
var x=array[ i ];
var y=array[ i + 1 ];
var z=array[ i + 2 ];
if(x < minX) minX=x;
if(y < minY) minY=y;
if(z < minZ) minZ=z;
if(x > maxX) maxX=x;
if(y > maxY) maxY=y;
if(z > maxZ) maxZ=z;
}
this.min.set(minX, minY, minZ);
this.max.set(maxX, maxY, maxZ);
return this;
},
setFromBufferAttribute: function(attribute){
var minX=+ Infinity;
var minY=+ Infinity;
var minZ=+ Infinity;
var maxX=- Infinity;
var maxY=- Infinity;
var maxZ=- Infinity;
for(var i=0, l=attribute.count; i < l; i ++){
var x=attribute.getX(i);
var y=attribute.getY(i);
var z=attribute.getZ(i);
if(x < minX) minX=x;
if(y < minY) minY=y;
if(z < minZ) minZ=z;
if(x > maxX) maxX=x;
if(y > maxY) maxY=y;
if(z > maxZ) maxZ=z;
}
this.min.set(minX, minY, minZ);
this.max.set(maxX, maxY, maxZ);
return this;
},
setFromPoints: function(points){
this.makeEmpty();
for(var i=0, il=points.length; i < il; i ++){
this.expandByPoint(points[ i ]);
}
return this;
},
setFromCenterAndSize: function (){
var v1=new Vector3();
return function setFromCenterAndSize(center, size){
var halfSize=v1.copy(size).multiplyScalar(0.5);
this.min.copy(center).sub(halfSize);
this.max.copy(center).add(halfSize);
return this;
};}(),
setFromObject: function(object){
this.makeEmpty();
return this.expandByObject(object);
},
clone: function (){
return new this.constructor().copy(this);
},
copy: function(box){
this.min.copy(box.min);
this.max.copy(box.max);
return this;
},
makeEmpty: function (){
this.min.x=this.min.y=this.min.z=+ Infinity;
this.max.x=this.max.y=this.max.z=- Infinity;
return this;
},
isEmpty: function (){
return(this.max.x < this.min.x)||(this.max.y < this.min.y)||(this.max.z < this.min.z);
},
getCenter: function(target){
if(target===undefined){
console.warn('THREE.Box3: .getCenter() target is now required');
target=new Vector3();
}
return this.isEmpty() ? target.set(0, 0, 0):target.addVectors(this.min, this.max).multiplyScalar(0.5);
},
getSize: function(target){
if(target===undefined){
console.warn('THREE.Box3: .getSize() target is now required');
target=new Vector3();
}
return this.isEmpty() ? target.set(0, 0, 0):target.subVectors(this.max, this.min);
},
expandByPoint: function(point){
this.min.min(point);
this.max.max(point);
return this;
},
expandByVector: function(vector){
this.min.sub(vector);
this.max.add(vector);
return this;
},
expandByScalar: function(scalar){
this.min.addScalar(- scalar);
this.max.addScalar(scalar);
return this;
},
expandByObject: function (){
var scope, i, l;
var v1=new Vector3();
function traverse(node){
var geometry=node.geometry;
if(geometry!==undefined){
if(geometry.isGeometry){
var vertices=geometry.vertices;
for(i=0, l=vertices.length; i < l; i ++){
v1.copy(vertices[ i ]);
v1.applyMatrix4(node.matrixWorld);
scope.expandByPoint(v1);
}}else if(geometry.isBufferGeometry){
var attribute=geometry.attributes.position;
if(attribute!==undefined){
for(i=0, l=attribute.count; i < l; i ++){
v1.fromBufferAttribute(attribute, i).applyMatrix4(node.matrixWorld);
scope.expandByPoint(v1);
}}
}}
}
return function expandByObject(object){
scope=this;
object.updateMatrixWorld(true);
object.traverse(traverse);
return this;
};}(),
containsPoint: function(point){
return point.x < this.min.x||point.x > this.max.x ||
point.y < this.min.y||point.y > this.max.y ||
point.z < this.min.z||point.z > this.max.z ? false:true;
},
containsBox: function(box){
return this.min.x <=box.min.x&&box.max.x <=this.max.x &&
this.min.y <=box.min.y&&box.max.y <=this.max.y &&
this.min.z <=box.min.z&&box.max.z <=this.max.z;
},
getParameter: function(point, target){
if(target===undefined){
console.warn('THREE.Box3: .getParameter() target is now required');
target=new Vector3();
}
return target.set((point.x - this.min.x) /(this.max.x - this.min.x),
(point.y - this.min.y) /(this.max.y - this.min.y),
(point.z - this.min.z) /(this.max.z - this.min.z)
);
},
intersectsBox: function(box){
return box.max.x < this.min.x||box.min.x > this.max.x ||
box.max.y < this.min.y||box.min.y > this.max.y ||
box.max.z < this.min.z||box.min.z > this.max.z ? false:true;
},
intersectsSphere:(function (){
var closestPoint=new Vector3();
return function intersectsSphere(sphere){
this.clampPoint(sphere.center, closestPoint);
return closestPoint.distanceToSquared(sphere.center) <=(sphere.radius * sphere.radius);
};})(),
intersectsPlane: function(plane){
var min, max;
if(plane.normal.x > 0){
min=plane.normal.x * this.min.x;
max=plane.normal.x * this.max.x;
}else{
min=plane.normal.x * this.max.x;
max=plane.normal.x * this.min.x;
}
if(plane.normal.y > 0){
min +=plane.normal.y * this.min.y;
max +=plane.normal.y * this.max.y;
}else{
min +=plane.normal.y * this.max.y;
max +=plane.normal.y * this.min.y;
}
if(plane.normal.z > 0){
min +=plane.normal.z * this.min.z;
max +=plane.normal.z * this.max.z;
}else{
min +=plane.normal.z * this.max.z;
max +=plane.normal.z * this.min.z;
}
return(min <=plane.constant&&max >=plane.constant);
},
intersectsTriangle:(function (){
var v0=new Vector3();
var v1=new Vector3();
var v2=new Vector3();
var f0=new Vector3();
var f1=new Vector3();
var f2=new Vector3();
var testAxis=new Vector3();
var center=new Vector3();
var extents=new Vector3();
var triangleNormal=new Vector3();
function satForAxes(axes){
var i, j;
for(i=0, j=axes.length - 3; i <=j; i +=3){
testAxis.fromArray(axes, i);
var r=extents.x * Math.abs(testAxis.x) + extents.y * Math.abs(testAxis.y) + extents.z * Math.abs(testAxis.z);
var p0=v0.dot(testAxis);
var p1=v1.dot(testAxis);
var p2=v2.dot(testAxis);
if(Math.max(- Math.max(p0, p1, p2), Math.min(p0, p1, p2) ) > r){
return false;
}}
return true;
}
return function intersectsTriangle(triangle){
if(this.isEmpty()){
return false;
}
this.getCenter(center);
extents.subVectors(this.max, center);
v0.subVectors(triangle.a, center);
v1.subVectors(triangle.b, center);
v2.subVectors(triangle.c, center);
f0.subVectors(v1, v0);
f1.subVectors(v2, v1);
f2.subVectors(v0, v2);
var axes=[
0, - f0.z, f0.y, 0, - f1.z, f1.y, 0, - f2.z, f2.y,
f0.z, 0, - f0.x, f1.z, 0, - f1.x, f2.z, 0, - f2.x,
- f0.y, f0.x, 0, - f1.y, f1.x, 0, - f2.y, f2.x, 0
];
if(! satForAxes(axes) ){
return false;
}
axes=[ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];
if(! satForAxes(axes) ){
return false;
}
triangleNormal.crossVectors(f0, f1);
axes=[ triangleNormal.x, triangleNormal.y, triangleNormal.z ];
return satForAxes(axes);
};})(),
clampPoint: function(point, target){
if(target===undefined){
console.warn('THREE.Box3: .clampPoint() target is now required');
target=new Vector3();
}
return target.copy(point).clamp(this.min, this.max);
},
distanceToPoint: function (){
var v1=new Vector3();
return function distanceToPoint(point){
var clampedPoint=v1.copy(point).clamp(this.min, this.max);
return clampedPoint.sub(point).length();
};}(),
getBoundingSphere: function (){
var v1=new Vector3();
return function getBoundingSphere(target){
if(target===undefined){
console.warn('THREE.Box3: .getBoundingSphere() target is now required');
target=new Sphere();
}
this.getCenter(target.center);
target.radius=this.getSize(v1).length() * 0.5;
return target;
};}(),
intersect: function(box){
this.min.max(box.min);
this.max.min(box.max);
if(this.isEmpty()) this.makeEmpty();
return this;
},
union: function(box){
this.min.min(box.min);
this.max.max(box.max);
return this;
},
applyMatrix4: function(matrix){
if(this.isEmpty()) return this;
var m=matrix.elements;
var xax=m[ 0 ] * this.min.x, xay=m[ 1 ] * this.min.x, xaz=m[ 2 ] * this.min.x;
var xbx=m[ 0 ] * this.max.x, xby=m[ 1 ] * this.max.x, xbz=m[ 2 ] * this.max.x;
var yax=m[ 4 ] * this.min.y, yay=m[ 5 ] * this.min.y, yaz=m[ 6 ] * this.min.y;
var ybx=m[ 4 ] * this.max.y, yby=m[ 5 ] * this.max.y, ybz=m[ 6 ] * this.max.y;
var zax=m[ 8 ] * this.min.z, zay=m[ 9 ] * this.min.z, zaz=m[ 10 ] * this.min.z;
var zbx=m[ 8 ] * this.max.z, zby=m[ 9 ] * this.max.z, zbz=m[ 10 ] * this.max.z;
this.min.x=Math.min(xax, xbx) + Math.min(yax, ybx) + Math.min(zax, zbx) + m[ 12 ];
this.min.y=Math.min(xay, xby) + Math.min(yay, yby) + Math.min(zay, zby) + m[ 13 ];
this.min.z=Math.min(xaz, xbz) + Math.min(yaz, ybz) + Math.min(zaz, zbz) + m[ 14 ];
this.max.x=Math.max(xax, xbx) + Math.max(yax, ybx) + Math.max(zax, zbx) + m[ 12 ];
this.max.y=Math.max(xay, xby) + Math.max(yay, yby) + Math.max(zay, zby) + m[ 13 ];
this.max.z=Math.max(xaz, xbz) + Math.max(yaz, ybz) + Math.max(zaz, zbz) + m[ 14 ];
return this;
},
translate: function(offset){
this.min.add(offset);
this.max.add(offset);
return this;
},
equals: function(box){
return box.min.equals(this.min)&&box.max.equals(this.max);
}});
function Sphere(center, radius){
this.center=(center!==undefined) ? center:new Vector3();
this.radius=(radius!==undefined) ? radius:0;
}
Object.assign(Sphere.prototype, {
set: function(center, radius){
this.center.copy(center);
this.radius=radius;
return this;
},
setFromPoints: function (){
var box=new Box3();
return function setFromPoints(points, optionalCenter){
var center=this.center;
if(optionalCenter!==undefined){
center.copy(optionalCenter);
}else{
box.setFromPoints(points).getCenter(center);
}
var maxRadiusSq=0;
for(var i=0, il=points.length; i < il; i ++){
maxRadiusSq=Math.max(maxRadiusSq, center.distanceToSquared(points[ i ]) );
}
this.radius=Math.sqrt(maxRadiusSq);
return this;
};}(),
clone: function (){
return new this.constructor().copy(this);
},
copy: function(sphere){
this.center.copy(sphere.center);
this.radius=sphere.radius;
return this;
},
empty: function (){
return(this.radius <=0);
},
containsPoint: function(point){
return(point.distanceToSquared(this.center) <=(this.radius * this.radius) );
},
distanceToPoint: function(point){
return(point.distanceTo(this.center) - this.radius);
},
intersectsSphere: function(sphere){
var radiusSum=this.radius + sphere.radius;
return sphere.center.distanceToSquared(this.center) <=(radiusSum * radiusSum);
},
intersectsBox: function(box){
return box.intersectsSphere(this);
},
intersectsPlane: function(plane){
return Math.abs(plane.distanceToPoint(this.center) ) <=this.radius;
},
clampPoint: function(point, target){
var deltaLengthSq=this.center.distanceToSquared(point);
if(target===undefined){
console.warn('THREE.Sphere: .clampPoint() target is now required');
target=new Vector3();
}
target.copy(point);
if(deltaLengthSq >(this.radius * this.radius) ){
target.sub(this.center).normalize();
target.multiplyScalar(this.radius).add(this.center);
}
return target;
},
getBoundingBox: function(target){
if(target===undefined){
console.warn('THREE.Sphere: .getBoundingBox() target is now required');
target=new Box3();
}
target.set(this.center, this.center);
target.expandByScalar(this.radius);
return target;
},
applyMatrix4: function(matrix){
this.center.applyMatrix4(matrix);
this.radius=this.radius * matrix.getMaxScaleOnAxis();
return this;
},
translate: function(offset){
this.center.add(offset);
return this;
},
equals: function(sphere){
return sphere.center.equals(this.center)&&(sphere.radius===this.radius);
}});
function Plane(normal, constant){
this.normal=(normal!==undefined) ? normal:new Vector3(1, 0, 0);
this.constant=(constant!==undefined) ? constant:0;
}
Object.assign(Plane.prototype, {
set: function(normal, constant){
this.normal.copy(normal);
this.constant=constant;
return this;
},
setComponents: function(x, y, z, w){
this.normal.set(x, y, z);
this.constant=w;
return this;
},
setFromNormalAndCoplanarPoint: function(normal, point){
this.normal.copy(normal);
this.constant=- point.dot(this.normal);
return this;
},
setFromCoplanarPoints: function (){
var v1=new Vector3();
var v2=new Vector3();
return function setFromCoplanarPoints(a, b, c){
var normal=v1.subVectors(c, b).cross(v2.subVectors(a, b) ).normalize();
this.setFromNormalAndCoplanarPoint(normal, a);
return this;
};}(),
clone: function (){
return new this.constructor().copy(this);
},
copy: function(plane){
this.normal.copy(plane.normal);
this.constant=plane.constant;
return this;
},
normalize: function (){
var inverseNormalLength=1.0 / this.normal.length();
this.normal.multiplyScalar(inverseNormalLength);
this.constant *=inverseNormalLength;
return this;
},
negate: function (){
this.constant *=- 1;
this.normal.negate();
return this;
},
distanceToPoint: function(point){
return this.normal.dot(point) + this.constant;
},
distanceToSphere: function(sphere){
return this.distanceToPoint(sphere.center) - sphere.radius;
},
projectPoint: function(point, target){
if(target===undefined){
console.warn('THREE.Plane: .projectPoint() target is now required');
target=new Vector3();
}
return target.copy(this.normal).multiplyScalar(- this.distanceToPoint(point) ).add(point);
},
intersectLine: function (){
var v1=new Vector3();
return function intersectLine(line, target){
if(target===undefined){
console.warn('THREE.Plane: .intersectLine() target is now required');
target=new Vector3();
}
var direction=line.delta(v1);
var denominator=this.normal.dot(direction);
if(denominator===0){
if(this.distanceToPoint(line.start)===0){
return target.copy(line.start);
}
return undefined;
}
var t=-(line.start.dot(this.normal) + this.constant) / denominator;
if(t < 0||t > 1){
return undefined;
}
return target.copy(direction).multiplyScalar(t).add(line.start);
};}(),
intersectsLine: function(line){
var startSign=this.distanceToPoint(line.start);
var endSign=this.distanceToPoint(line.end);
return(startSign < 0&&endSign > 0)||(endSign < 0&&startSign > 0);
},
intersectsBox: function(box){
return box.intersectsPlane(this);
},
intersectsSphere: function(sphere){
return sphere.intersectsPlane(this);
},
coplanarPoint: function(target){
if(target===undefined){
console.warn('THREE.Plane: .coplanarPoint() target is now required');
target=new Vector3();
}
return target.copy(this.normal).multiplyScalar(- this.constant);
},
applyMatrix4: function (){
var v1=new Vector3();
var m1=new Matrix3();
return function applyMatrix4(matrix, optionalNormalMatrix){
var normalMatrix=optionalNormalMatrix||m1.getNormalMatrix(matrix);
var referencePoint=this.coplanarPoint(v1).applyMatrix4(matrix);
var normal=this.normal.applyMatrix3(normalMatrix).normalize();
this.constant=- referencePoint.dot(normal);
return this;
};}(),
translate: function(offset){
this.constant -=offset.dot(this.normal);
return this;
},
equals: function(plane){
return plane.normal.equals(this.normal)&&(plane.constant===this.constant);
}});
function Frustum(p0, p1, p2, p3, p4, p5){
this.planes=[
(p0!==undefined) ? p0:new Plane(),
(p1!==undefined) ? p1:new Plane(),
(p2!==undefined) ? p2:new Plane(),
(p3!==undefined) ? p3:new Plane(),
(p4!==undefined) ? p4:new Plane(),
(p5!==undefined) ? p5:new Plane()
];
}
Object.assign(Frustum.prototype, {
set: function(p0, p1, p2, p3, p4, p5){
var planes=this.planes;
planes[ 0 ].copy(p0);
planes[ 1 ].copy(p1);
planes[ 2 ].copy(p2);
planes[ 3 ].copy(p3);
planes[ 4 ].copy(p4);
planes[ 5 ].copy(p5);
return this;
},
clone: function (){
return new this.constructor().copy(this);
},
copy: function(frustum){
var planes=this.planes;
for(var i=0; i < 6; i ++){
planes[ i ].copy(frustum.planes[ i ]);
}
return this;
},
setFromMatrix: function(m){
var planes=this.planes;
var me=m.elements;
var me0=me[ 0 ], me1=me[ 1 ], me2=me[ 2 ], me3=me[ 3 ];
var me4=me[ 4 ], me5=me[ 5 ], me6=me[ 6 ], me7=me[ 7 ];
var me8=me[ 8 ], me9=me[ 9 ], me10=me[ 10 ], me11=me[ 11 ];
var me12=me[ 12 ], me13=me[ 13 ], me14=me[ 14 ], me15=me[ 15 ];
planes[ 0 ].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize();
planes[ 1 ].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize();
planes[ 2 ].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize();
planes[ 3 ].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize();
planes[ 4 ].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize();
planes[ 5 ].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize();
return this;
},
intersectsObject: function (){
var sphere=new Sphere();
return function intersectsObject(object){
var geometry=object.geometry;
if(geometry.boundingSphere===null)
geometry.computeBoundingSphere();
sphere.copy(geometry.boundingSphere)
.applyMatrix4(object.matrixWorld);
return this.intersectsSphere(sphere);
};}(),
intersectsSprite: function (){
var sphere=new Sphere();
return function intersectsSprite(sprite){
sphere.center.set(0, 0, 0);
sphere.radius=0.7071067811865476;
sphere.applyMatrix4(sprite.matrixWorld);
return this.intersectsSphere(sphere);
};}(),
intersectsSphere: function(sphere){
var planes=this.planes;
var center=sphere.center;
var negRadius=- sphere.radius;
for(var i=0; i < 6; i ++){
var distance=planes[ i ].distanceToPoint(center);
if(distance < negRadius){
return false;
}}
return true;
},
intersectsBox: function (){
var p1=new Vector3(),
p2=new Vector3();
return function intersectsBox(box){
var planes=this.planes;
for(var i=0; i < 6; i ++){
var plane=planes[ i ];
p1.x=plane.normal.x > 0 ? box.min.x:box.max.x;
p2.x=plane.normal.x > 0 ? box.max.x:box.min.x;
p1.y=plane.normal.y > 0 ? box.min.y:box.max.y;
p2.y=plane.normal.y > 0 ? box.max.y:box.min.y;
p1.z=plane.normal.z > 0 ? box.min.z:box.max.z;
p2.z=plane.normal.z > 0 ? box.max.z:box.min.z;
var d1=plane.distanceToPoint(p1);
var d2=plane.distanceToPoint(p2);
if(d1 < 0&&d2 < 0){
return false;
}}
return true;
};}(),
containsPoint: function(point){
var planes=this.planes;
for(var i=0; i < 6; i ++){
if(planes[ i ].distanceToPoint(point) < 0){
return false;
}}
return true;
}});
var alphamap_fragment="#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *=texture2D(alphaMap, vUv).g;\n#endif\n";
var alphamap_pars_fragment="#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n";
var alphatest_fragment="#ifdef ALPHATEST\n\tif(diffuseColor.a < ALPHATEST) discard;\n#endif\n";
var aomap_fragment="#ifdef USE_AOMAP\n\tfloat ambientOcclusion=(texture2D(aoMap, vUv2).r - 1.0) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *=ambientOcclusion;\n\t#if defined(USE_ENVMAP)&&defined(PHYSICAL)\n\t\tfloat dotNV=saturate(dot(geometry.normal, geometry.viewDir) );\n\t\treflectedLight.indirectSpecular *=computeSpecularOcclusion(dotNV, ambientOcclusion, material.specularRoughness);\n\t#endif\n#endif\n";
var aomap_pars_fragment="#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif";
var begin_vertex="\nvec3 transformed=vec3(position);\n";
var beginnormal_vertex="\nvec3 objectNormal=vec3(normal);\n";
var bsdfs="float punctualLightIntensityToIrradianceFactor(const in float lightDistance, const in float cutoffDistance, const in float decayExponent){\n\tif(decayExponent > 0.0){\n#if defined(PHYSICALLY_CORRECT_LIGHTS)\n\t\tfloat distanceFalloff=1.0 / max(pow(lightDistance, decayExponent), 0.01);\n\t\tfloat maxDistanceCutoffFactor=pow2(saturate(1.0 - pow4(lightDistance / cutoffDistance) ));\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow(saturate(-lightDistance / cutoffDistance + 1.0), decayExponent);\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert(const in vec3 diffuseColor){\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick(const in vec3 specularColor, const in float dotLH){\n\tfloat fresnel=exp2(( -5.55473 * dotLH - 6.98316) * dotLH);\n\treturn(1.0 - specularColor) * fresnel + specularColor;\n}\nfloat G_GGX_Smith(const in float alpha, const in float dotNL, const in float dotNV){\n\tfloat a2=pow2(alpha);\n\tfloat gl=dotNL + sqrt(a2 +(1.0 - a2) * pow2(dotNL) );\n\tfloat gv=dotNV + sqrt(a2 +(1.0 - a2) * pow2(dotNV) );\n\treturn 1.0 /(gl * gv);\n}\nfloat G_GGX_SmithCorrelated(const in float alpha, const in float dotNL, const in float dotNV){\n\tfloat a2=pow2(alpha);\n\tfloat gv=dotNL * sqrt(a2 +(1.0 - a2) * pow2(dotNV) );\n\tfloat gl=dotNV * sqrt(a2 +(1.0 - a2) * pow2(dotNL) );\n\treturn 0.5 / max(gv + gl, EPSILON);\n}\nfloat D_GGX(const in float alpha, const in float dotNH){\n\tfloat a2=pow2(alpha);\n\tfloat denom=pow2(dotNH) *(a2 - 1.0) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2(denom);\n}\nvec3 BRDF_Specular_GGX(const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness){\n\tfloat alpha=pow2(roughness);\n\tvec3 halfDir=normalize(incidentLight.direction + geometry.viewDir);\n\tfloat dotNL=saturate(dot(geometry.normal, incidentLight.direction) );\n\tfloat dotNV=saturate(dot(geometry.normal, geometry.viewDir) );\n\tfloat dotNH=saturate(dot(geometry.normal, halfDir) );\n\tfloat dotLH=saturate(dot(incidentLight.direction, halfDir) );\n\tvec3 F=F_Schlick(specularColor, dotLH);\n\tfloat G=G_GGX_SmithCorrelated(alpha, dotNL, dotNV);\n\tfloat D=D_GGX(alpha, dotNH);\n\treturn F *(G * D);\n}\nvec2 LTC_Uv(const in vec3 N, const in vec3 V, const in float roughness){\n\tconst float LUT_SIZE=64.0;\n\tconst float LUT_SCALE=(LUT_SIZE - 1.0) / LUT_SIZE;\n\tconst float LUT_BIAS=0.5 / LUT_SIZE;\n\tfloat dotNV=saturate(dot(N, V) );\n\tvec2 uv=vec2(roughness, sqrt(1.0 - dotNV) );\n\tuv=uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor(const in vec3 f){\n\tfloat l=length(f);\n\treturn max(( l * l + f.z) /(l + 1.0), 0.0);\n}\nvec3 LTC_EdgeVectorFormFactor(const in vec3 v1, const in vec3 v2){\n\tfloat x=dot(v1, v2);\n\tfloat y=abs(x);\n\tfloat a=0.8543985 +(0.4965155 + 0.0145206 * y) * y;\n\tfloat b=3.4175940 +(4.1616724 + y) * y;\n\tfloat v=a / b;\n\tfloat theta_sintheta=(x > 0.0) ? v:0.5 * inversesqrt(max(1.0 - x * x, 1e-7) ) - v;\n\treturn cross(v1, v2) * theta_sintheta;\n}\nvec3 LTC_Evaluate(const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ]){\n\tvec3 v1=rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2=rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal=cross(v1, v2);\n\tif(dot(lightNormal, P - rectCoords[ 0 ]) < 0.0) return vec3(0.0);\n\tvec3 T1, T2;\n\tT1=normalize(V - N * dot(V, N) );\n\tT2=- cross(N, T1);\n\tmat3 mat=mInv * transposeMat3(mat3(T1, T2, N) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ]=mat *(rectCoords[ 0 ] - P);\n\tcoords[ 1 ]=mat *(rectCoords[ 1 ] - P);\n\tcoords[ 2 ]=mat *(rectCoords[ 2 ] - P);\n\tcoords[ 3 ]=mat *(rectCoords[ 3 ] - P);\n\tcoords[ 0 ]=normalize(coords[ 0 ]);\n\tcoords[ 1 ]=normalize(coords[ 1 ]);\n\tcoords[ 2 ]=normalize(coords[ 2 ]);\n\tcoords[ 3 ]=normalize(coords[ 3 ]);\n\tvec3 vectorFormFactor=vec3(0.0);\n\tvectorFormFactor +=LTC_EdgeVectorFormFactor(coords[ 0 ], coords[ 1 ]);\n\tvectorFormFactor +=LTC_EdgeVectorFormFactor(coords[ 1 ], coords[ 2 ]);\n\tvectorFormFactor +=LTC_EdgeVectorFormFactor(coords[ 2 ], coords[ 3 ]);\n\tvectorFormFactor +=LTC_EdgeVectorFormFactor(coords[ 3 ], coords[ 0 ]);\n\tfloat result=LTC_ClippedSphereFormFactor(vectorFormFactor);\n\treturn vec3(result);\n}\nvec3 BRDF_Specular_GGX_Environment(const in GeometricContext geometry, const in vec3 specularColor, const in float roughness){\n\tfloat dotNV=saturate(dot(geometry.normal, geometry.viewDir) );\n\tconst vec4 c0=vec4(- 1, - 0.0275, - 0.572, 0.022);\n\tconst vec4 c1=vec4(1, 0.0425, 1.04, - 0.04);\n\tvec4 r=roughness * c0 + c1;\n\tfloat a004=min(r.x * r.x, exp2(- 9.28 * dotNV) ) * r.x + r.y;\n\tvec2 AB=vec2(-1.04, 1.04) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit(){\n\treturn 0.25;\n}\nfloat D_BlinnPhong(const in float shininess, const in float dotNH){\n\treturn RECIPROCAL_PI *(shininess * 0.5 + 1.0) * pow(dotNH, shininess);\n}\nvec3 BRDF_Specular_BlinnPhong(const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess){\n\tvec3 halfDir=normalize(incidentLight.direction + geometry.viewDir);\n\tfloat dotNH=saturate(dot(geometry.normal, halfDir) );\n\tfloat dotLH=saturate(dot(incidentLight.direction, halfDir) );\n\tvec3 F=F_Schlick(specularColor, dotLH);\n\tfloat G=G_BlinnPhong_Implicit();\n\tfloat D=D_BlinnPhong(shininess, dotNH);\n\treturn F *(G * D);\n}\nfloat GGXRoughnessToBlinnExponent(const in float ggxRoughness){\n\treturn(2.0 / pow2(ggxRoughness + 0.0001) - 2.0);\n}\nfloat BlinnExponentToGGXRoughness(const in float blinnExponent){\n\treturn sqrt(2.0 /(blinnExponent + 2.0) );\n}\n";
var bumpmap_pars_fragment="#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd(){\n\t\tvec2 dSTdx=dFdx(vUv);\n\t\tvec2 dSTdy=dFdy(vUv);\n\t\tfloat Hll=bumpScale * texture2D(bumpMap, vUv).x;\n\t\tfloat dBx=bumpScale * texture2D(bumpMap, vUv + dSTdx).x - Hll;\n\t\tfloat dBy=bumpScale * texture2D(bumpMap, vUv + dSTdy).x - Hll;\n\t\treturn vec2(dBx, dBy);\n\t}\n\tvec3 perturbNormalArb(vec3 surf_pos, vec3 surf_norm, vec2 dHdxy){\n\t\tvec3 vSigmaX=vec3(dFdx(surf_pos.x), dFdx(surf_pos.y), dFdx(surf_pos.z) );\n\t\tvec3 vSigmaY=vec3(dFdy(surf_pos.x), dFdy(surf_pos.y), dFdy(surf_pos.z) );\n\t\tvec3 vN=surf_norm;\n\t\tvec3 R1=cross(vSigmaY, vN);\n\t\tvec3 R2=cross(vN, vSigmaX);\n\t\tfloat fDet=dot(vSigmaX, R1);\n\t\tfDet *=(float(gl_FrontFacing) * 2.0 - 1.0);\n\t\tvec3 vGrad=sign(fDet) *(dHdxy.x * R1 + dHdxy.y * R2);\n\t\treturn normalize(abs(fDet) * surf_norm - vGrad);\n\t}\n#endif\n";
var clipping_planes_fragment="#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor(int i=0; i < UNION_CLIPPING_PLANES; i ++){\n\t\tplane=clippingPlanes[ i ];\n\t\tif(dot(vViewPosition, plane.xyz) > plane.w) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped=true;\n\t\t#pragma unroll_loop\n\t\tfor(int i=UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++){\n\t\t\tplane=clippingPlanes[ i ];\n\t\t\tclipped=(dot(vViewPosition, plane.xyz) > plane.w)&&clipped;\n\t\t}\n\t\tif(clipped) discard;\n\t#endif\n#endif\n";
var clipping_planes_pars_fragment="#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined(PHYSICAL)&&! defined(PHONG)\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n";
var clipping_planes_pars_vertex="#if NUM_CLIPPING_PLANES > 0&&! defined(PHYSICAL)&&! defined(PHONG)\n\tvarying vec3 vViewPosition;\n#endif\n";
var clipping_planes_vertex="#if NUM_CLIPPING_PLANES > 0&&! defined(PHYSICAL)&&! defined(PHONG)\n\tvViewPosition=- mvPosition.xyz;\n#endif\n";
var color_fragment="#ifdef USE_COLOR\n\tdiffuseColor.rgb *=vColor;\n#endif";
var color_pars_fragment="#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n";
var color_pars_vertex="#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif";
var color_vertex="#ifdef USE_COLOR\n\tvColor.xyz=color.xyz;\n#endif";
var common="#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp(a, 0.0, 1.0)\n#define whiteCompliment(a)(1.0 - saturate(a) )\nfloat pow2(const in float x){ return x*x; }\nfloat pow3(const in float x){ return x*x*x; }\nfloat pow4(const in float x){ float x2=x*x; return x2*x2; }\nfloat average(const in vec3 color){ return dot(color, vec3(0.3333) ); }\nhighp float rand (const in vec2 uv){\n\tconst highp float a=12.9898, b=78.233, c=43758.5453;\n\thighp float dt=dot(uv.xy, vec2(a,b) ), sn=mod(dt, PI);\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection(in vec3 dir, in mat4 matrix){\n\treturn normalize(( matrix * vec4(dir, 0.0) ).xyz);\n}\nvec3 inverseTransformDirection(in vec3 dir, in mat4 matrix){\n\treturn normalize(( vec4(dir, 0.0) * matrix).xyz);\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal){\n\tfloat distance=dot(planeNormal, point - pointOnPlane);\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal){\n\treturn sign(dot(point - pointOnPlane, planeNormal) );\n}\nvec3 linePlaneIntersect(in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal){\n\treturn lineDirection *(dot(planeNormal, pointOnPlane - pointOnLine) / dot(planeNormal, lineDirection) ) + pointOnLine;\n}\nmat3 transposeMat3(const in mat3 m){\n\tmat3 tmp;\n\ttmp[ 0 ]=vec3(m[ 0 ].x, m[ 1 ].x, m[ 2 ].x);\n\ttmp[ 1 ]=vec3(m[ 0 ].y, m[ 1 ].y, m[ 2 ].y);\n\ttmp[ 2 ]=vec3(m[ 0 ].z, m[ 1 ].z, m[ 2 ].z);\n\treturn tmp;\n}\nfloat linearToRelativeLuminance(const in vec3 color){\n\tvec3 weights=vec3(0.2126, 0.7152, 0.0722);\n\treturn dot(weights, color.rgb);\n}\n";
var cube_uv_reflection_fragment="#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction){\n\tvec3 absDirection=abs(direction);\n\tint face=-1;\n\tif(absDirection.x > absDirection.z){\n\t\tif(absDirection.x > absDirection.y)\n\t\t\tface=direction.x > 0.0 ? 0:3;\n\t\telse\n\t\t\tface=direction.y > 0.0 ? 1:4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y)\n\t\t\tface=direction.z > 0.0 ? 2:5;\n\t\telse\n\t\t\tface=direction.y > 0.0 ? 1:4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo(vec3 vec, float roughnessLevel, float roughness){\n\tfloat scale=exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness=dFdx(roughness);\n\tfloat dyRoughness=dFdy(roughness);\n\tvec3 dx=dFdx(vec * scale * dxRoughness);\n\tvec3 dy=dFdy(vec * scale * dyRoughness);\n\tfloat d=max(dot(dx, dx), dot(dy, dy) );\n\td=clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel=0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel){\n\tmipLevel=roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0:mipLevel;\n\tfloat a=16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed=exp2(vec2(roughnessLevel, mipLevel) );\n\tvec2 rcp_exp2_packed=vec2(1.0) / exp2_packed;\n\tfloat powScale=exp2_packed.x * exp2_packed.y;\n\tfloat scale=rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset=0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes=mipLevel==0.0;\n\tscale=bRes&&(scale < a) ? a:scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face=getFaceFromDirection(direction);\n\tfloat rcpPowScale=1.0 / powScale;\n\tif(face==0){\n\t\tr=vec3(direction.x, -direction.z, direction.y);\n\t\toffset=vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y=bRes&&(offset.y < 2.0*a) ? a:offset.y;\n\t}\n\telse if(face==1){\n\t\tr=vec3(direction.y, direction.x, direction.z);\n\t\toffset=vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y=bRes&&(offset.y < 2.0*a) ? a:offset.y;\n\t}\n\telse if(face==2){\n\t\tr=vec3(direction.z, direction.x, direction.y);\n\t\toffset=vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y=bRes&&(offset.y < 2.0*a) ? a:offset.y;\n\t}\n\telse if(face==3){\n\t\tr=vec3(direction.x, direction.z, direction.y);\n\t\toffset=vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y=bRes&&(offset.y < 2.0*a) ? 0.0:offset.y;\n\t}\n\telse if(face==4){\n\t\tr=vec3(direction.y, direction.x, -direction.z);\n\t\toffset=vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y=bRes&&(offset.y < 2.0*a) ? 0.0:offset.y;\n\t}\n\telse {\n\t\tr=vec3(direction.z, -direction.x, direction.y);\n\t\toffset=vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y=bRes&&(offset.y < 2.0*a) ? 0.0:offset.y;\n\t}\n\tr=normalize(r);\n\tfloat texelOffset=0.5 * cubeUV_rcpTextureSize;\n\tvec2 s=(r.yz / abs(r.x) + vec2(1.0) ) * 0.5;\n\tvec2 base=offset + vec2(texelOffset);\n\treturn base + s *(scale - 2.0 * texelOffset);\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness){\n\tfloat roughnessVal=roughness* cubeUV_maxLods3;\n\tfloat r1=floor(roughnessVal);\n\tfloat r2=r1 + 1.0;\n\tfloat t=fract(roughnessVal);\n\tvec2 mipInfo=MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s=mipInfo.y;\n\tfloat level0=mipInfo.x;\n\tfloat level1=level0 + 1.0;\n\tlevel1=level1 > 5.0 ? 5.0:level1;\n\tlevel0 +=min(floor(s + 0.5), 5.0);\n\tvec2 uv_10=getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10=envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20=getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20=envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result=mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n";
var defaultnormal_vertex="vec3 transformedNormal=normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal=- transformedNormal;\n#endif\n";
var displacementmap_pars_vertex="#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n";
var displacementmap_vertex="#ifdef USE_DISPLACEMENTMAP\n\ttransformed +=normalize(objectNormal) *(texture2D(displacementMap, uv).x * displacementScale + displacementBias);\n#endif\n";
var emissivemap_fragment="#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor=texture2D(emissiveMap, vUv);\n\temissiveColor.rgb=emissiveMapTexelToLinear(emissiveColor).rgb;\n\ttotalEmissiveRadiance *=emissiveColor.rgb;\n#endif\n";
var emissivemap_pars_fragment="#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n";
var encodings_fragment="  gl_FragColor=linearToOutputTexel(gl_FragColor);\n";
var encodings_pars_fragment="\nvec4 LinearToLinear(in vec4 value){\n\treturn value;\n}\nvec4 GammaToLinear(in vec4 value, in float gammaFactor){\n\treturn vec4(pow(value.xyz, vec3(gammaFactor) ), value.w);\n}\nvec4 LinearToGamma(in vec4 value, in float gammaFactor){\n\treturn vec4(pow(value.xyz, vec3(1.0 / gammaFactor) ), value.w);\n}\nvec4 sRGBToLinear(in vec4 value){\n\treturn vec4(mix(pow(value.rgb * 0.9478672986 + vec3(0.0521327014), vec3(2.4) ), value.rgb * 0.0773993808, vec3(lessThanEqual(value.rgb, vec3(0.04045) )) ), value.w);\n}\nvec4 LinearTosRGB(in vec4 value){\n\treturn vec4(mix(pow(value.rgb, vec3(0.41666) ) * 1.055 - vec3(0.055), value.rgb * 12.92, vec3(lessThanEqual(value.rgb, vec3(0.0031308) )) ), value.w);\n}\nvec4 RGBEToLinear(in vec4 value){\n\treturn vec4(value.rgb * exp2(value.a * 255.0 - 128.0), 1.0);\n}\nvec4 LinearToRGBE(in vec4 value){\n\tfloat maxComponent=max(max(value.r, value.g), value.b);\n\tfloat fExp=clamp(ceil(log2(maxComponent) ), -128.0, 127.0);\n\treturn vec4(value.rgb / exp2(fExp),(fExp + 128.0) / 255.0);\n}\nvec4 RGBMToLinear(in vec4 value, in float maxRange){\n\treturn vec4(value.xyz * value.w * maxRange, 1.0);\n}\nvec4 LinearToRGBM(in vec4 value, in float maxRange){\n\tfloat maxRGB=max(value.x, max(value.g, value.b) );\n\tfloat M=clamp(maxRGB / maxRange, 0.0, 1.0);\n\tM=ceil(M * 255.0) / 255.0;\n\treturn vec4(value.rgb /(M * maxRange), M);\n}\nvec4 RGBDToLinear(in vec4 value, in float maxRange){\n\treturn vec4(value.rgb *(( maxRange / 255.0) / value.a), 1.0);\n}\nvec4 LinearToRGBD(in vec4 value, in float maxRange){\n\tfloat maxRGB=max(value.x, max(value.g, value.b) );\n\tfloat D=max(maxRange / maxRGB, 1.0);\n\tD=min(floor(D) / 255.0, 1.0);\n\treturn vec4(value.rgb *(D *(255.0 / maxRange) ), D);\n}\nconst mat3 cLogLuvM=mat3(0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969);\nvec4 LinearToLogLuv(in vec4 value){\n\tvec3 Xp_Y_XYZp=value.rgb * cLogLuvM;\n\tXp_Y_XYZp=max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy=Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le=2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w=fract(Le);\n\tvResult.z=(Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM=mat3(6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268);\nvec4 LogLuvToLinear(in vec4 value){\n\tfloat Le=value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y=exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z=Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x=value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB=Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4(max(vRGB, 0.0), 1.0);\n}\n";
var envmap_fragment="#ifdef USE_ENVMAP\n\t#if defined(USE_BUMPMAP)||defined(USE_NORMALMAP)||defined(PHONG)\n\t\tvec3 cameraToVertex=normalize(vWorldPosition - cameraPosition);\n\t\tvec3 worldNormal=inverseTransformDirection(normal, viewMatrix);\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec=reflect(cameraToVertex, worldNormal);\n\t\t#else\n\t\t\tvec3 reflectVec=refract(cameraToVertex, worldNormal, refractionRatio);\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec=vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor=textureCube(envMap, vec3(flipEnvMap * reflectVec.x, reflectVec.yz) );\n\t#elif defined(ENVMAP_TYPE_EQUIREC)\n\t\tvec2 sampleUV;\n\t\treflectVec=normalize(reflectVec);\n\t\tsampleUV.y=asin(clamp(reflectVec.y, - 1.0, 1.0) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x=atan(reflectVec.z, reflectVec.x) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor=texture2D(envMap, sampleUV);\n\t#elif defined(ENVMAP_TYPE_SPHERE)\n\t\treflectVec=normalize(reflectVec);\n\t\tvec3 reflectView=normalize(( viewMatrix * vec4(reflectVec, 0.0) ).xyz + vec3(0.0, 0.0, 1.0) );\n\t\tvec4 envColor=texture2D(envMap, reflectView.xy * 0.5 + 0.5);\n\t#else\n\t\tvec4 envColor=vec4(0.0);\n\t#endif\n\tenvColor=envMapTexelToLinear(envColor);\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight=mix(outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity);\n\t#elif defined(ENVMAP_BLENDING_MIX)\n\t\toutgoingLight=mix(outgoingLight, envColor.xyz, specularStrength * reflectivity);\n\t#elif defined(ENVMAP_BLENDING_ADD)\n\t\toutgoingLight +=envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n";
var envmap_pars_fragment="#if defined(USE_ENVMAP)||defined(PHYSICAL)\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined(PHYSICAL)&&(defined(USE_BUMPMAP)||defined(USE_NORMALMAP)||defined(PHONG) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#if defined(USE_BUMPMAP)||defined(USE_NORMALMAP)||defined(PHONG)||defined(PHYSICAL)\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n";
var envmap_pars_vertex="#ifdef USE_ENVMAP\n\t#if defined(USE_BUMPMAP)||defined(USE_NORMALMAP)||defined(PHONG)\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n";
var envmap_vertex="#ifdef USE_ENVMAP\n\t#if defined(USE_BUMPMAP)||defined(USE_NORMALMAP)||defined(PHONG)\n\t\tvWorldPosition=worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex=normalize(worldPosition.xyz - cameraPosition);\n\t\tvec3 worldNormal=inverseTransformDirection(transformedNormal, viewMatrix);\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect=reflect(cameraToVertex, worldNormal);\n\t\t#else\n\t\t\tvReflect=refract(cameraToVertex, worldNormal, refractionRatio);\n\t\t#endif\n\t#endif\n#endif\n";
var fog_vertex="\n#ifdef USE_FOG\nfogDepth=-mvPosition.z;\n#endif";
var fog_pars_vertex="#ifdef USE_FOG\n  varying float fogDepth;\n#endif\n";
var fog_fragment="#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor=whiteCompliment(exp2(- fogDensity * fogDensity * fogDepth * fogDepth * LOG2) );\n\t#else\n\t\tfloat fogFactor=smoothstep(fogNear, fogFar, fogDepth);\n\t#endif\n\tgl_FragColor.rgb=mix(gl_FragColor.rgb, fogColor, fogFactor);\n#endif\n";
var fog_pars_fragment="#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n";
var gradientmap_pars_fragment="#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance(vec3 normal, vec3 lightDirection){\n\t\tfloat dotNL=dot(normal, lightDirection);\n\t\tvec2 coord=vec2(dotNL * 0.5 + 0.5, 0.0);\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D(gradientMap, coord).rgb;\n\t\t#else\n\t\t\treturn(coord.x < 0.7) ? vec3(0.7):vec3(1.0);\n\t\t#endif\n\t}\n#endif\n";
var lightmap_fragment="#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse +=PI * texture2D(lightMap, vUv2).xyz * lightMapIntensity;\n#endif\n";
var lightmap_pars_fragment="#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif";
var lights_lambert_vertex="vec3 diffuse=vec3(1.0);\nGeometricContext geometry;\ngeometry.position=mvPosition.xyz;\ngeometry.normal=normalize(transformedNormal);\ngeometry.viewDir=normalize(-mvPosition.xyz);\nGeometricContext backGeometry;\nbackGeometry.position=geometry.position;\nbackGeometry.normal=-geometry.normal;\nbackGeometry.viewDir=geometry.viewDir;\nvLightFront=vec3(0.0);\n#ifdef DOUBLE_SIDED\n\tvLightBack=vec3(0.0);\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_POINT_LIGHTS; i ++){\n\t\tgetPointDirectLightIrradiance(pointLights[ i ], geometry, directLight);\n\t\tdotNL=dot(geometry.normal, directLight.direction);\n\t\tdirectLightColor_Diffuse=PI * directLight.color;\n\t\tvLightFront +=saturate(dotNL) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack +=saturate(-dotNL) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_SPOT_LIGHTS; i ++){\n\t\tgetSpotDirectLightIrradiance(spotLights[ i ], geometry, directLight);\n\t\tdotNL=dot(geometry.normal, directLight.direction);\n\t\tdirectLightColor_Diffuse=PI * directLight.color;\n\t\tvLightFront +=saturate(dotNL) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack +=saturate(-dotNL) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_DIR_LIGHTS; i ++){\n\t\tgetDirectionalDirectLightIrradiance(directionalLights[ i ], geometry, directLight);\n\t\tdotNL=dot(geometry.normal, directLight.direction);\n\t\tdirectLightColor_Diffuse=PI * directLight.color;\n\t\tvLightFront +=saturate(dotNL) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack +=saturate(-dotNL) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_HEMI_LIGHTS; i ++){\n\t\tvLightFront +=getHemisphereLightIrradiance(hemisphereLights[ i ], geometry);\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack +=getHemisphereLightIrradiance(hemisphereLights[ i ], backGeometry);\n\t\t#endif\n\t}\n#endif\n";
var lights_pars_begin="uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance(const in vec3 ambientLightColor){\n\tvec3 irradiance=ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *=PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance(const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight){\n\t\tdirectLight.color=directionalLight.color;\n\t\tdirectLight.direction=directionalLight.direction;\n\t\tdirectLight.visible=true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance(const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight){\n\t\tvec3 lVector=pointLight.position - geometry.position;\n\t\tdirectLight.direction=normalize(lVector);\n\t\tfloat lightDistance=length(lVector);\n\t\tdirectLight.color=pointLight.color;\n\t\tdirectLight.color *=punctualLightIntensityToIrradianceFactor(lightDistance, pointLight.distance, pointLight.decay);\n\t\tdirectLight.visible=(directLight.color!=vec3(0.0) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance(const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight){\n\t\tvec3 lVector=spotLight.position - geometry.position;\n\t\tdirectLight.direction=normalize(lVector);\n\t\tfloat lightDistance=length(lVector);\n\t\tfloat angleCos=dot(directLight.direction, spotLight.direction);\n\t\tif(angleCos > spotLight.coneCos){\n\t\t\tfloat spotEffect=smoothstep(spotLight.coneCos, spotLight.penumbraCos, angleCos);\n\t\t\tdirectLight.color=spotLight.color;\n\t\t\tdirectLight.color *=spotEffect * punctualLightIntensityToIrradianceFactor(lightDistance, spotLight.distance, spotLight.decay);\n\t\t\tdirectLight.visible=true;\n\t\t}else{\n\t\t\tdirectLight.color=vec3(0.0);\n\t\t\tdirectLight.visible=false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance(const in HemisphereLight hemiLight, const in GeometricContext geometry){\n\t\tfloat dotNL=dot(geometry.normal, hemiLight.direction);\n\t\tfloat hemiDiffuseWeight=0.5 * dotNL + 0.5;\n\t\tvec3 irradiance=mix(hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight);\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *=PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n";
var lights_pars_maps="#if defined(USE_ENVMAP)&&defined(PHYSICAL)\n\tvec3 getLightProbeIndirectIrradiance(const in GeometricContext geometry, const in int maxMIPLevel){\n\t\tvec3 worldNormal=inverseTransformDirection(geometry.normal, viewMatrix);\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec=vec3(flipEnvMap * worldNormal.x, worldNormal.yz);\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor=textureCubeLodEXT(envMap, queryVec, float(maxMIPLevel) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor=textureCube(envMap, queryVec, float(maxMIPLevel) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb=envMapTexelToLinear(envMapColor).rgb;\n\t\t#elif defined(ENVMAP_TYPE_CUBE_UV)\n\t\t\tvec3 queryVec=vec3(flipEnvMap * worldNormal.x, worldNormal.yz);\n\t\t\tvec4 envMapColor=textureCubeUV(queryVec, 1.0);\n\t\t#else\n\t\t\tvec4 envMapColor=vec4(0.0);\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel(const in float blinnShininessExponent, const in int maxMIPLevel){\n\t\tfloat maxMIPLevelScalar=float(maxMIPLevel);\n\t\tfloat desiredMIPLevel=maxMIPLevelScalar + 0.79248 - 0.5 * log2(pow2(blinnShininessExponent) + 1.0);\n\t\treturn clamp(desiredMIPLevel, 0.0, maxMIPLevelScalar);\n\t}\n\tvec3 getLightProbeIndirectRadiance(const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel){\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec=reflect(-geometry.viewDir, geometry.normal);\n\t\t#else\n\t\t\tvec3 reflectVec=refract(-geometry.viewDir, geometry.normal, refractionRatio);\n\t\t#endif\n\t\treflectVec=inverseTransformDirection(reflectVec, viewMatrix);\n\t\tfloat specularMIPLevel=getSpecularMIPLevel(blinnShininessExponent, maxMIPLevel);\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec=vec3(flipEnvMap * reflectVec.x, reflectVec.yz);\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor=textureCubeLodEXT(envMap, queryReflectVec, specularMIPLevel);\n\t\t\t#else\n\t\t\t\tvec4 envMapColor=textureCube(envMap, queryReflectVec, specularMIPLevel);\n\t\t\t#endif\n\t\t\tenvMapColor.rgb=envMapTexelToLinear(envMapColor).rgb;\n\t\t#elif defined(ENVMAP_TYPE_CUBE_UV)\n\t\t\tvec3 queryReflectVec=vec3(flipEnvMap * reflectVec.x, reflectVec.yz);\n\t\t\tvec4 envMapColor=textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined(ENVMAP_TYPE_EQUIREC)\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y=asin(clamp(reflectVec.y, - 1.0, 1.0) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x=atan(reflectVec.z, reflectVec.x) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor=texture2DLodEXT(envMap, sampleUV, specularMIPLevel);\n\t\t\t#else\n\t\t\t\tvec4 envMapColor=texture2D(envMap, sampleUV, specularMIPLevel);\n\t\t\t#endif\n\t\t\tenvMapColor.rgb=envMapTexelToLinear(envMapColor).rgb;\n\t\t#elif defined(ENVMAP_TYPE_SPHERE)\n\t\t\tvec3 reflectView=normalize(( viewMatrix * vec4(reflectVec, 0.0) ).xyz + vec3(0.0,0.0,1.0) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor=texture2DLodEXT(envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel);\n\t\t\t#else\n\t\t\t\tvec4 envMapColor=texture2D(envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel);\n\t\t\t#endif\n\t\t\tenvMapColor.rgb=envMapTexelToLinear(envMapColor).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n";
var lights_phong_fragment="BlinnPhongMaterial material;\nmaterial.diffuseColor=diffuseColor.rgb;\nmaterial.specularColor=specular;\nmaterial.specularShininess=shininess;\nmaterial.specularStrength=specularStrength;\n";
var lights_phong_pars_fragment="varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong(const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight){\n\t#ifdef TOON\n\t\tvec3 irradiance=getGradientIrradiance(geometry.normal, directLight.direction) * directLight.color;\n\t#else\n\t\tfloat dotNL=saturate(dot(geometry.normal, directLight.direction) );\n\t\tvec3 irradiance=dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *=PI;\n\t#endif\n\treflectedLight.directDiffuse +=irradiance * BRDF_Diffuse_Lambert(material.diffuseColor);\n\treflectedLight.directSpecular +=irradiance * BRDF_Specular_BlinnPhong(directLight, geometry, material.specularColor, material.specularShininess) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong(const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight){\n\treflectedLight.indirectDiffuse +=irradiance * BRDF_Diffuse_Lambert(material.diffuseColor);\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD(material)\t(0)\n";
var lights_physical_fragment="PhysicalMaterial material;\nmaterial.diffuseColor=diffuseColor.rgb *(1.0 - metalnessFactor);\nmaterial.specularRoughness=clamp(roughnessFactor, 0.04, 1.0);\n#ifdef STANDARD\n\tmaterial.specularColor=mix(vec3(DEFAULT_SPECULAR_COEFFICIENT), diffuseColor.rgb, metalnessFactor);\n#else\n\tmaterial.specularColor=mix(vec3(MAXIMUM_SPECULAR_COEFFICIENT * pow2(reflectivity) ), diffuseColor.rgb, metalnessFactor);\n\tmaterial.clearCoat=saturate(clearCoat);\tmaterial.clearCoatRoughness=clamp(clearCoatRoughness, 0.04, 1.0);\n#endif\n";
var lights_physical_pars_fragment="struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox(const in float roughness, const in float dotNL){\n\treturn DEFAULT_SPECULAR_COEFFICIENT +(1.0 - DEFAULT_SPECULAR_COEFFICIENT) *(pow(1.0 - dotNL, 5.0) * pow(1.0 - roughness, 2.0) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical(const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight){\n\t\tvec3 normal=geometry.normal;\n\t\tvec3 viewDir=geometry.viewDir;\n\t\tvec3 position=geometry.position;\n\t\tvec3 lightPos=rectAreaLight.position;\n\t\tvec3 halfWidth=rectAreaLight.halfWidth;\n\t\tvec3 halfHeight=rectAreaLight.halfHeight;\n\t\tvec3 lightColor=rectAreaLight.color;\n\t\tfloat roughness=material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ]=lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ]=lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ]=lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ]=lightPos - halfWidth + halfHeight;\n\t\tvec2 uv=LTC_Uv(normal, viewDir, roughness);\n\t\tvec4 t1=texture2D(ltc_1, uv);\n\t\tvec4 t2=texture2D(ltc_2, uv);\n\t\tmat3 mInv=mat3(\n\t\t\tvec3(t1.x, 0, t1.y),\n\t\t\tvec3(0, 1,    0),\n\t\t\tvec3(t1.z, 0, t1.w)\n\t\t);\n\t\tvec3 fresnel=(material.specularColor * t2.x +(vec3(1.0) - material.specularColor) * t2.y);\n\t\treflectedLight.directSpecular +=lightColor * fresnel * LTC_Evaluate(normal, viewDir, position, mInv, rectCoords);\n\t\treflectedLight.directDiffuse +=lightColor * material.diffuseColor * LTC_Evaluate(normal, viewDir, position, mat3(1.0), rectCoords);\n\t}\n#endif\nvoid RE_Direct_Physical(const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight){\n\tfloat dotNL=saturate(dot(geometry.normal, directLight.direction) );\n\tvec3 irradiance=dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *=PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR=material.clearCoat * clearCoatDHRApprox(material.clearCoatRoughness, dotNL);\n\t#else\n\t\tfloat clearCoatDHR=0.0;\n\t#endif\n\treflectedLight.directSpecular +=(1.0 - clearCoatDHR) * irradiance * BRDF_Specular_GGX(directLight, geometry, material.specularColor, material.specularRoughness);\n\treflectedLight.directDiffuse +=(1.0 - clearCoatDHR) * irradiance * BRDF_Diffuse_Lambert(material.diffuseColor);\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular +=irradiance * material.clearCoat * BRDF_Specular_GGX(directLight, geometry, vec3(DEFAULT_SPECULAR_COEFFICIENT), material.clearCoatRoughness);\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical(const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight){\n\treflectedLight.indirectDiffuse +=irradiance * BRDF_Diffuse_Lambert(material.diffuseColor);\n}\nvoid RE_IndirectSpecular_Physical(const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight){\n\t#ifndef STANDARD\n\t\tfloat dotNV=saturate(dot(geometry.normal, geometry.viewDir) );\n\t\tfloat dotNL=dotNV;\n\t\tfloat clearCoatDHR=material.clearCoat * clearCoatDHRApprox(material.clearCoatRoughness, dotNL);\n\t#else\n\t\tfloat clearCoatDHR=0.0;\n\t#endif\n\treflectedLight.indirectSpecular +=(1.0 - clearCoatDHR) * radiance * BRDF_Specular_GGX_Environment(geometry, material.specularColor, material.specularRoughness);\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular +=clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment(geometry, vec3(DEFAULT_SPECULAR_COEFFICIENT), material.clearCoatRoughness);\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent(material)   GGXRoughnessToBlinnExponent(material.specularRoughness)\n#define Material_ClearCoat_BlinnShininessExponent(material)   GGXRoughnessToBlinnExponent(material.clearCoatRoughness)\nfloat computeSpecularOcclusion(const in float dotNV, const in float ambientOcclusion, const in float roughness){\n\treturn saturate(pow(dotNV + ambientOcclusion, exp2(- 16.0 * roughness - 1.0) ) - 1.0 + ambientOcclusion);\n}\n";
var lights_fragment_begin="\nGeometricContext geometry;\ngeometry.position=- vViewPosition;\ngeometry.normal=normal;\ngeometry.viewDir=normalize(vViewPosition);\nIncidentLight directLight;\n#if(NUM_POINT_LIGHTS > 0)&&defined(RE_Direct)\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_POINT_LIGHTS; i ++){\n\t\tpointLight=pointLights[ i ];\n\t\tgetPointDirectLightIrradiance(pointLight, geometry, directLight);\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *=all(bvec2(pointLight.shadow, directLight.visible) ) ? getPointShadow(pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar):1.0;\n\t\t#endif\n\t\tRE_Direct(directLight, geometry, material, reflectedLight);\n\t}\n#endif\n#if(NUM_SPOT_LIGHTS > 0)&&defined(RE_Direct)\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_SPOT_LIGHTS; i ++){\n\t\tspotLight=spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance(spotLight, geometry, directLight);\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *=all(bvec2(spotLight.shadow, directLight.visible) ) ? getShadow(spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ]):1.0;\n\t\t#endif\n\t\tRE_Direct(directLight, geometry, material, reflectedLight);\n\t}\n#endif\n#if(NUM_DIR_LIGHTS > 0)&&defined(RE_Direct)\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_DIR_LIGHTS; i ++){\n\t\tdirectionalLight=directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance(directionalLight, geometry, directLight);\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *=all(bvec2(directionalLight.shadow, directLight.visible) ) ? getShadow(directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ]):1.0;\n\t\t#endif\n\t\tRE_Direct(directLight, geometry, material, reflectedLight);\n\t}\n#endif\n#if(NUM_RECT_AREA_LIGHTS > 0)&&defined(RE_Direct_RectArea)\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_RECT_AREA_LIGHTS; i ++){\n\t\trectAreaLight=rectAreaLights[ i ];\n\t\tRE_Direct_RectArea(rectAreaLight, geometry, material, reflectedLight);\n\t}\n#endif\n#if defined(RE_IndirectDiffuse)\n\tvec3 irradiance=getAmbientLightIrradiance(ambientLightColor);\n\t#if(NUM_HEMI_LIGHTS > 0)\n\t\t#pragma unroll_loop\n\t\tfor(int i=0; i < NUM_HEMI_LIGHTS; i ++){\n\t\t\tirradiance +=getHemisphereLightIrradiance(hemisphereLights[ i ], geometry);\n\t\t}\n\t#endif\n#endif\n#if defined(RE_IndirectSpecular)\n\tvec3 radiance=vec3(0.0);\n\tvec3 clearCoatRadiance=vec3(0.0);\n#endif\n";
var lights_fragment_maps="#if defined(RE_IndirectDiffuse)\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance=texture2D(lightMap, vUv2).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *=PI;\n\t\t#endif\n\t\tirradiance +=lightMapIrradiance;\n\t#endif\n\t#if defined(USE_ENVMAP)&&defined(PHYSICAL)&&defined(ENVMAP_TYPE_CUBE_UV)\n\t\tirradiance +=getLightProbeIndirectIrradiance(geometry, maxMipLevel);\n\t#endif\n#endif\n#if defined(USE_ENVMAP)&&defined(RE_IndirectSpecular)\n\tradiance +=getLightProbeIndirectRadiance(geometry, Material_BlinnShininessExponent(material), maxMipLevel);\n\t#ifndef STANDARD\n\t\tclearCoatRadiance +=getLightProbeIndirectRadiance(geometry, Material_ClearCoat_BlinnShininessExponent(material), maxMipLevel);\n\t#endif\n#endif\n";
var lights_fragment_end="#if defined(RE_IndirectDiffuse)\n\tRE_IndirectDiffuse(irradiance, geometry, material, reflectedLight);\n#endif\n#if defined(RE_IndirectSpecular)\n\tRE_IndirectSpecular(radiance, clearCoatRadiance, geometry, material, reflectedLight);\n#endif\n";
var logdepthbuf_fragment="#if defined(USE_LOGDEPTHBUF)&&defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT=log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif";
var logdepthbuf_pars_fragment="#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n";
var logdepthbuf_pars_vertex="#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif";
var logdepthbuf_vertex="#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth=1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z=log2(max(EPSILON, gl_Position.w + 1.0) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *=gl_Position.w;\n\t#endif\n#endif\n";
var map_fragment="#ifdef USE_MAP\n\tvec4 texelColor=texture2D(map, vUv);\n\ttexelColor=mapTexelToLinear(texelColor);\n\tdiffuseColor *=texelColor;\n#endif\n";
var map_pars_fragment="#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n";
var map_particle_fragment="#ifdef USE_MAP\n\tvec2 uv=(uvTransform * vec3(gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1) ).xy;\n\tvec4 mapTexel=texture2D(map, uv);\n\tdiffuseColor *=mapTexelToLinear(mapTexel);\n#endif\n";
var map_particle_pars_fragment="#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n";
var metalnessmap_fragment="float metalnessFactor=metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness=texture2D(metalnessMap, vUv);\n\tmetalnessFactor *=texelMetalness.b;\n#endif\n";
var metalnessmap_pars_fragment="#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif";
var morphnormal_vertex="#ifdef USE_MORPHNORMALS\n\tobjectNormal +=(morphNormal0 - normal) * morphTargetInfluences[ 0 ];\n\tobjectNormal +=(morphNormal1 - normal) * morphTargetInfluences[ 1 ];\n\tobjectNormal +=(morphNormal2 - normal) * morphTargetInfluences[ 2 ];\n\tobjectNormal +=(morphNormal3 - normal) * morphTargetInfluences[ 3 ];\n#endif\n";
var morphtarget_pars_vertex="#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif";
var morphtarget_vertex="#ifdef USE_MORPHTARGETS\n\ttransformed +=(morphTarget0 - position) * morphTargetInfluences[ 0 ];\n\ttransformed +=(morphTarget1 - position) * morphTargetInfluences[ 1 ];\n\ttransformed +=(morphTarget2 - position) * morphTargetInfluences[ 2 ];\n\ttransformed +=(morphTarget3 - position) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed +=(morphTarget4 - position) * morphTargetInfluences[ 4 ];\n\ttransformed +=(morphTarget5 - position) * morphTargetInfluences[ 5 ];\n\ttransformed +=(morphTarget6 - position) * morphTargetInfluences[ 6 ];\n\ttransformed +=(morphTarget7 - position) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n";
var normal_fragment_begin="#ifdef FLAT_SHADED\n\tvec3 fdx=vec3(dFdx(vViewPosition.x), dFdx(vViewPosition.y), dFdx(vViewPosition.z) );\n\tvec3 fdy=vec3(dFdy(vViewPosition.x), dFdy(vViewPosition.y), dFdy(vViewPosition.z) );\n\tvec3 normal=normalize(cross(fdx, fdy) );\n#else\n\tvec3 normal=normalize(vNormal);\n\t#ifdef DOUBLE_SIDED\n\t\tnormal=normal *(float(gl_FrontFacing) * 2.0 - 1.0);\n\t#endif\n#endif\n";
var normal_fragment_maps="#ifdef USE_NORMALMAP\n\tnormal=perturbNormal2Arb(-vViewPosition, normal);\n#elif defined(USE_BUMPMAP)\n\tnormal=perturbNormalArb(-vViewPosition, normal, dHdxy_fwd());\n#endif\n";
var normalmap_pars_fragment="#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb(vec3 eye_pos, vec3 surf_norm){\n\t\tvec3 q0=vec3(dFdx(eye_pos.x), dFdx(eye_pos.y), dFdx(eye_pos.z) );\n\t\tvec3 q1=vec3(dFdy(eye_pos.x), dFdy(eye_pos.y), dFdy(eye_pos.z) );\n\t\tvec2 st0=dFdx(vUv.st);\n\t\tvec2 st1=dFdy(vUv.st);\n\t\tfloat scale=sign(st1.t * st0.s - st0.t * st1.s);\n\t\tvec3 S=normalize(( q0 * st1.t - q1 * st0.t) * scale);\n\t\tvec3 T=normalize(( - q0 * st1.s + q1 * st0.s) * scale);\n\t\tvec3 N=normalize(surf_norm);\n\t\tmat3 tsn=mat3(S, T, N);\n\t\tvec3 mapN=texture2D(normalMap, vUv).xyz * 2.0 - 1.0;\n\t\tmapN.xy *=normalScale;\n\t\tmapN.xy *=(float(gl_FrontFacing) * 2.0 - 1.0);\n\t\treturn normalize(tsn * mapN);\n\t}\n#endif\n";
var packing="vec3 packNormalToRGB(const in vec3 normal){\n\treturn normalize(normal) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal(const in vec3 rgb){\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale=256. / 255.;const float UnpackDownscale=255. / 256.;\nconst vec3 PackFactors=vec3(256. * 256. * 256., 256. * 256.,  256.);\nconst vec4 UnpackFactors=UnpackDownscale / vec4(PackFactors, 1.);\nconst float ShiftRight8=1. / 256.;\nvec4 packDepthToRGBA(const in float v){\n\tvec4 r=vec4(fract(v * PackFactors), v);\n\tr.yzw -=r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth(const in vec4 v){\n\treturn dot(v, UnpackFactors);\n}\nfloat viewZToOrthographicDepth(const in float viewZ, const in float near, const in float far){\n\treturn(viewZ + near) /(near - far);\n}\nfloat orthographicDepthToViewZ(const in float linearClipZ, const in float near, const in float far){\n\treturn linearClipZ *(near - far) - near;\n}\nfloat viewZToPerspectiveDepth(const in float viewZ, const in float near, const in float far){\n\treturn ((near + viewZ) * far) / ((far - near) * viewZ);\n}\nfloat perspectiveDepthToViewZ(const in float invClipZ, const in float near, const in float far){\n\treturn(near * far) /(( far - near) * invClipZ - far);\n}\n";
var premultiplied_alpha_fragment="#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *=gl_FragColor.a;\n#endif\n";
var project_vertex="vec4 mvPosition=modelViewMatrix * vec4(transformed, 1.0);\ngl_Position=projectionMatrix * mvPosition;\n";
var dithering_fragment="#if defined(DITHERING)\n  gl_FragColor.rgb=dithering(gl_FragColor.rgb);\n#endif\n";
var dithering_pars_fragment="#if defined(DITHERING)\n\tvec3 dithering(vec3 color){\n\t\tfloat grid_position=rand (gl_FragCoord.xy);\n\t\tvec3 dither_shift_RGB=vec3(0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0);\n\t\tdither_shift_RGB=mix(2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position);\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n";
var roughnessmap_fragment="float roughnessFactor=roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness=texture2D(roughnessMap, vUv);\n\troughnessFactor *=texelRoughness.g;\n#endif\n";
var roughnessmap_pars_fragment="#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif";
var shadowmap_pars_fragment="#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare(sampler2D depths, vec2 uv, float compare){\n\t\treturn step(compare, unpackRGBAToDepth(texture2D(depths, uv) ));\n\t}\n\tfloat texture2DShadowLerp(sampler2D depths, vec2 size, vec2 uv, float compare){\n\t\tconst vec2 offset=vec2(0.0, 1.0);\n\t\tvec2 texelSize=vec2(1.0) / size;\n\t\tvec2 centroidUV=floor(uv * size + 0.5) / size;\n\t\tfloat lb=texture2DCompare(depths, centroidUV + texelSize * offset.xx, compare);\n\t\tfloat lt=texture2DCompare(depths, centroidUV + texelSize * offset.xy, compare);\n\t\tfloat rb=texture2DCompare(depths, centroidUV + texelSize * offset.yx, compare);\n\t\tfloat rt=texture2DCompare(depths, centroidUV + texelSize * offset.yy, compare);\n\t\tvec2 f=fract(uv * size + 0.5);\n\t\tfloat a=mix(lb, lt, f.y);\n\t\tfloat b=mix(rb, rt, f.y);\n\t\tfloat c=mix(a, b, f.x);\n\t\treturn c;\n\t}\n\tfloat getShadow(sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord){\n\t\tfloat shadow=1.0;\n\t\tshadowCoord.xyz /=shadowCoord.w;\n\t\tshadowCoord.z +=shadowBias;\n\t\tbvec4 inFrustumVec=bvec4(shadowCoord.x >=0.0, shadowCoord.x <=1.0, shadowCoord.y >=0.0, shadowCoord.y <=1.0);\n\t\tbool inFrustum=all(inFrustumVec);\n\t\tbvec2 frustumTestVec=bvec2(inFrustum, shadowCoord.z <=1.0);\n\t\tbool frustumTest=all(frustumTestVec);\n\t\tif(frustumTest){\n\t\t#if defined(SHADOWMAP_TYPE_PCF)\n\t\t\tvec2 texelSize=vec2(1.0) / shadowMapSize;\n\t\t\tfloat dx0=- texelSize.x * shadowRadius;\n\t\t\tfloat dy0=- texelSize.y * shadowRadius;\n\t\t\tfloat dx1=+ texelSize.x * shadowRadius;\n\t\t\tfloat dy1=+ texelSize.y * shadowRadius;\n\t\t\tshadow=(\n\t\t\t\ttexture2DCompare(shadowMap, shadowCoord.xy + vec2(dx0, dy0), shadowCoord.z) +\n\t\t\t\ttexture2DCompare(shadowMap, shadowCoord.xy + vec2(0.0, dy0), shadowCoord.z) +\n\t\t\t\ttexture2DCompare(shadowMap, shadowCoord.xy + vec2(dx1, dy0), shadowCoord.z) +\n\t\t\t\ttexture2DCompare(shadowMap, shadowCoord.xy + vec2(dx0, 0.0), shadowCoord.z) +\n\t\t\t\ttexture2DCompare(shadowMap, shadowCoord.xy, shadowCoord.z) +\n\t\t\t\ttexture2DCompare(shadowMap, shadowCoord.xy + vec2(dx1, 0.0), shadowCoord.z) +\n\t\t\t\ttexture2DCompare(shadowMap, shadowCoord.xy + vec2(dx0, dy1), shadowCoord.z) +\n\t\t\t\ttexture2DCompare(shadowMap, shadowCoord.xy + vec2(0.0, dy1), shadowCoord.z) +\n\t\t\t\ttexture2DCompare(shadowMap, shadowCoord.xy + vec2(dx1, dy1), shadowCoord.z)\n\t\t\t) *(1.0 / 9.0);\n\t\t#elif defined(SHADOWMAP_TYPE_PCF_SOFT)\n\t\t\tvec2 texelSize=vec2(1.0) / shadowMapSize;\n\t\t\tfloat dx0=- texelSize.x * shadowRadius;\n\t\t\tfloat dy0=- texelSize.y * shadowRadius;\n\t\t\tfloat dx1=+ texelSize.x * shadowRadius;\n\t\t\tfloat dy1=+ texelSize.y * shadowRadius;\n\t\t\tshadow=(\n\t\t\t\ttexture2DShadowLerp(shadowMap, shadowMapSize, shadowCoord.xy + vec2(dx0, dy0), shadowCoord.z) +\n\t\t\t\ttexture2DShadowLerp(shadowMap, shadowMapSize, shadowCoord.xy + vec2(0.0, dy0), shadowCoord.z) +\n\t\t\t\ttexture2DShadowLerp(shadowMap, shadowMapSize, shadowCoord.xy + vec2(dx1, dy0), shadowCoord.z) +\n\t\t\t\ttexture2DShadowLerp(shadowMap, shadowMapSize, shadowCoord.xy + vec2(dx0, 0.0), shadowCoord.z) +\n\t\t\t\ttexture2DShadowLerp(shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z) +\n\t\t\t\ttexture2DShadowLerp(shadowMap, shadowMapSize, shadowCoord.xy + vec2(dx1, 0.0), shadowCoord.z) +\n\t\t\t\ttexture2DShadowLerp(shadowMap, shadowMapSize, shadowCoord.xy + vec2(dx0, dy1), shadowCoord.z) +\n\t\t\t\ttexture2DShadowLerp(shadowMap, shadowMapSize, shadowCoord.xy + vec2(0.0, dy1), shadowCoord.z) +\n\t\t\t\ttexture2DShadowLerp(shadowMap, shadowMapSize, shadowCoord.xy + vec2(dx1, dy1), shadowCoord.z)\n\t\t\t) *(1.0 / 9.0);\n\t\t#else\n\t\t\tshadow=texture2DCompare(shadowMap, shadowCoord.xy, shadowCoord.z);\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV(vec3 v, float texelSizeY){\n\t\tvec3 absV=abs(v);\n\t\tfloat scaleToCube=1.0 / max(absV.x, max(absV.y, absV.z) );\n\t\tabsV *=scaleToCube;\n\t\tv *=scaleToCube *(1.0 - 2.0 * texelSizeY);\n\t\tvec2 planar=v.xy;\n\t\tfloat almostATexel=1.5 * texelSizeY;\n\t\tfloat almostOne=1.0 - almostATexel;\n\t\tif(absV.z >=almostOne){\n\t\t\tif(v.z > 0.0)\n\t\t\t\tplanar.x=4.0 - v.x;\n\t\t}else if(absV.x >=almostOne){\n\t\t\tfloat signX=sign(v.x);\n\t\t\tplanar.x=v.z * signX + 2.0 * signX;\n\t\t}else if(absV.y >=almostOne){\n\t\t\tfloat signY=sign(v.y);\n\t\t\tplanar.x=v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y=v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2(0.125, 0.25) * planar + vec2(0.375, 0.75);\n\t}\n\tfloat getPointShadow(sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar){\n\t\tvec2 texelSize=vec2(1.0) /(shadowMapSize * vec2(4.0, 2.0) );\n\t\tvec3 lightToPosition=shadowCoord.xyz;\n\t\tfloat dp=(length(lightToPosition) - shadowCameraNear) /(shadowCameraFar - shadowCameraNear);\t\tdp +=shadowBias;\n\t\tvec3 bd3D=normalize(lightToPosition);\n\t\t#if defined(SHADOWMAP_TYPE_PCF)||defined(SHADOWMAP_TYPE_PCF_SOFT)\n\t\t\tvec2 offset=vec2(- 1, 1) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare(shadowMap, cubeToUV(bd3D + offset.xyy, texelSize.y), dp) +\n\t\t\t\ttexture2DCompare(shadowMap, cubeToUV(bd3D + offset.yyy, texelSize.y), dp) +\n\t\t\t\ttexture2DCompare(shadowMap, cubeToUV(bd3D + offset.xyx, texelSize.y), dp) +\n\t\t\t\ttexture2DCompare(shadowMap, cubeToUV(bd3D + offset.yyx, texelSize.y), dp) +\n\t\t\t\ttexture2DCompare(shadowMap, cubeToUV(bd3D, texelSize.y), dp) +\n\t\t\t\ttexture2DCompare(shadowMap, cubeToUV(bd3D + offset.xxy, texelSize.y), dp) +\n\t\t\t\ttexture2DCompare(shadowMap, cubeToUV(bd3D + offset.yxy, texelSize.y), dp) +\n\t\t\t\ttexture2DCompare(shadowMap, cubeToUV(bd3D + offset.xxx, texelSize.y), dp) +\n\t\t\t\ttexture2DCompare(shadowMap, cubeToUV(bd3D + offset.yxx, texelSize.y), dp)\n\t\t\t) *(1.0 / 9.0);\n\t\t#else\n\t\t\treturn texture2DCompare(shadowMap, cubeToUV(bd3D, texelSize.y), dp);\n\t\t#endif\n\t}\n#endif\n";
var shadowmap_pars_vertex="#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n";
var shadowmap_vertex="#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_DIR_LIGHTS; i ++){\n\t\tvDirectionalShadowCoord[ i ]=directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_SPOT_LIGHTS; i ++){\n\t\tvSpotShadowCoord[ i ]=spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_POINT_LIGHTS; i ++){\n\t\tvPointShadowCoord[ i ]=pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n";
var shadowmask_pars_fragment="float getShadowMask(){\n\tfloat shadow=1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_DIR_LIGHTS; i ++){\n\t\tdirectionalLight=directionalLights[ i ];\n\t\tshadow *=bool(directionalLight.shadow) ? getShadow(directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ]):1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_SPOT_LIGHTS; i ++){\n\t\tspotLight=spotLights[ i ];\n\t\tshadow *=bool(spotLight.shadow) ? getShadow(spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ]):1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor(int i=0; i < NUM_POINT_LIGHTS; i ++){\n\t\tpointLight=pointLights[ i ];\n\t\tshadow *=bool(pointLight.shadow) ? getPointShadow(pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar):1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n";
var skinbase_vertex="#ifdef USE_SKINNING\n\tmat4 boneMatX=getBoneMatrix(skinIndex.x);\n\tmat4 boneMatY=getBoneMatrix(skinIndex.y);\n\tmat4 boneMatZ=getBoneMatrix(skinIndex.z);\n\tmat4 boneMatW=getBoneMatrix(skinIndex.w);\n#endif";
var skinning_pars_vertex="#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix(const in float i){\n\t\t\tfloat j=i * 4.0;\n\t\t\tfloat x=mod(j, float(boneTextureSize) );\n\t\t\tfloat y=floor(j / float(boneTextureSize) );\n\t\t\tfloat dx=1.0 / float(boneTextureSize);\n\t\t\tfloat dy=1.0 / float(boneTextureSize);\n\t\t\ty=dy *(y + 0.5);\n\t\t\tvec4 v1=texture2D(boneTexture, vec2(dx *(x + 0.5), y) );\n\t\t\tvec4 v2=texture2D(boneTexture, vec2(dx *(x + 1.5), y) );\n\t\t\tvec4 v3=texture2D(boneTexture, vec2(dx *(x + 2.5), y) );\n\t\t\tvec4 v4=texture2D(boneTexture, vec2(dx *(x + 3.5), y) );\n\t\t\tmat4 bone=mat4(v1, v2, v3, v4);\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix(const in float i){\n\t\t\tmat4 bone=boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n";
var skinning_vertex="#ifdef USE_SKINNING\n\tvec4 skinVertex=bindMatrix * vec4(transformed, 1.0);\n\tvec4 skinned=vec4(0.0);\n\tskinned +=boneMatX * skinVertex * skinWeight.x;\n\tskinned +=boneMatY * skinVertex * skinWeight.y;\n\tskinned +=boneMatZ * skinVertex * skinWeight.z;\n\tskinned +=boneMatW * skinVertex * skinWeight.w;\n\ttransformed=(bindMatrixInverse * skinned).xyz;\n#endif\n";
var skinnormal_vertex="#ifdef USE_SKINNING\n\tmat4 skinMatrix=mat4(0.0);\n\tskinMatrix +=skinWeight.x * boneMatX;\n\tskinMatrix +=skinWeight.y * boneMatY;\n\tskinMatrix +=skinWeight.z * boneMatZ;\n\tskinMatrix +=skinWeight.w * boneMatW;\n\tskinMatrix=bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal=vec4(skinMatrix * vec4(objectNormal, 0.0) ).xyz;\n#endif\n";
var specularmap_fragment="float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular=texture2D(specularMap, vUv);\n\tspecularStrength=texelSpecular.r;\n#else\n\tspecularStrength=1.0;\n#endif";
var specularmap_pars_fragment="#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif";
var tonemapping_fragment="#if defined(TONE_MAPPING)\n  gl_FragColor.rgb=toneMapping(gl_FragColor.rgb);\n#endif\n";
var tonemapping_pars_fragment="#ifndef saturate\n\t#define saturate(a) clamp(a, 0.0, 1.0)\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping(vec3 color){\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping(vec3 color){\n\tcolor *=toneMappingExposure;\n\treturn saturate(color /(vec3(1.0) + color) );\n}\n#define Uncharted2Helper(x) max(((x *(0.15 * x + 0.10 * 0.50) + 0.20 * 0.02) /(x *(0.15 * x + 0.50) + 0.20 * 0.30) ) - 0.02 / 0.30, vec3(0.0) )\nvec3 Uncharted2ToneMapping(vec3 color){\n\tcolor *=toneMappingExposure;\n\treturn saturate(Uncharted2Helper(color) / Uncharted2Helper(vec3(toneMappingWhitePoint) ));\n}\nvec3 OptimizedCineonToneMapping(vec3 color){\n\tcolor *=toneMappingExposure;\n\tcolor=max(vec3(0.0), color - 0.004);\n\treturn pow(( color *(6.2 * color + 0.5) ) /(color *(6.2 * color + 1.7) + 0.06), vec3(2.2) );\n}\n";
var uv_pars_fragment="#if defined(USE_MAP)||defined(USE_BUMPMAP)||defined(USE_NORMALMAP)||defined(USE_SPECULARMAP)||defined(USE_ALPHAMAP)||defined(USE_EMISSIVEMAP)||defined(USE_ROUGHNESSMAP)||defined(USE_METALNESSMAP)\n\tvarying vec2 vUv;\n#endif";
var uv_pars_vertex="#if defined(USE_MAP)||defined(USE_BUMPMAP)||defined(USE_NORMALMAP)||defined(USE_SPECULARMAP)||defined(USE_ALPHAMAP)||defined(USE_EMISSIVEMAP)||defined(USE_ROUGHNESSMAP)||defined(USE_METALNESSMAP)\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n";
var uv_vertex="#if defined(USE_MAP)||defined(USE_BUMPMAP)||defined(USE_NORMALMAP)||defined(USE_SPECULARMAP)||defined(USE_ALPHAMAP)||defined(USE_EMISSIVEMAP)||defined(USE_ROUGHNESSMAP)||defined(USE_METALNESSMAP)\n\tvUv=(uvTransform * vec3(uv, 1) ).xy;\n#endif";
var uv2_pars_fragment="#if defined(USE_LIGHTMAP)||defined(USE_AOMAP)\n\tvarying vec2 vUv2;\n#endif";
var uv2_pars_vertex="#if defined(USE_LIGHTMAP)||defined(USE_AOMAP)\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif";
var uv2_vertex="#if defined(USE_LIGHTMAP)||defined(USE_AOMAP)\n\tvUv2=uv2;\n#endif";
var worldpos_vertex="#if defined(USE_ENVMAP)||defined(DISTANCE)||defined(USE_SHADOWMAP)\n\tvec4 worldPosition=modelMatrix * vec4(transformed, 1.0);\n#endif\n";
var cube_frag="uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main(){\n\tgl_FragColor=textureCube(tCube, vec3(tFlip * vWorldPosition.x, vWorldPosition.yz) );\n\tgl_FragColor.a *=opacity;\n}\n";
var cube_vert="varying vec3 vWorldPosition;\n#include <common>\nvoid main(){\n\tvWorldPosition=transformDirection(position, modelMatrix);\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z=gl_Position.w;\n}\n";
var depth_frag="#if DEPTH_PACKING==3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main(){\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor=vec4(1.0);\n\t#if DEPTH_PACKING==3200\n\t\tdiffuseColor.a=opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING==3200\n\t\tgl_FragColor=vec4(vec3(1.0 - gl_FragCoord.z), opacity);\n\t#elif DEPTH_PACKING==3201\n\t\tgl_FragColor=packDepthToRGBA(gl_FragCoord.z);\n\t#endif\n}\n";
var depth_vert="#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main(){\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n";
var distanceRGBA_frag="#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main (){\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor=vec4(1.0);\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist=length(vWorldPosition - referencePosition);\n\tdist=(dist - nearDistance) /(farDistance - nearDistance);\n\tdist=saturate(dist);\n\tgl_FragColor=packDepthToRGBA(dist);\n}\n";
var distanceRGBA_vert="#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main(){\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition=worldPosition.xyz;\n}\n";
var equirect_frag="uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main(){\n\tvec3 direction=normalize(vWorldPosition);\n\tvec2 sampleUV;\n\tsampleUV.y=asin(clamp(direction.y, - 1.0, 1.0) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x=atan(direction.z, direction.x) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor=texture2D(tEquirect, sampleUV);\n}\n";
var equirect_vert="varying vec3 vWorldPosition;\n#include <common>\nvoid main(){\n\tvWorldPosition=transformDirection(position, modelMatrix);\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";
var linedashed_frag="uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main(){\n\t#include <clipping_planes_fragment>\n\tif(mod(vLineDistance, totalSize) > dashSize){\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight=vec3(0.0);\n\tvec4 diffuseColor=vec4(diffuse, opacity);\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight=diffuseColor.rgb;\n\tgl_FragColor=vec4(outgoingLight, diffuseColor.a);\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
var linedashed_vert="uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main(){\n\t#include <color_vertex>\n\tvLineDistance=scale * lineDistance;\n\tvec4 mvPosition=modelViewMatrix * vec4(position, 1.0);\n\tgl_Position=projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n";
var meshbasic_frag="uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main(){\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor=vec4(diffuse, opacity);\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight=ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse +=texture2D(lightMap, vUv2).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse +=vec3(1.0);\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *=diffuseColor.rgb;\n\tvec3 outgoingLight=reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor=vec4(outgoingLight, diffuseColor.a);\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
var meshbasic_vert="#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main(){\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n";
var meshlambert_frag="uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main(){\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor=vec4(diffuse, opacity);\n\tReflectedLight reflectedLight=ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0) );\n\tvec3 totalEmissiveRadiance=emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse=getAmbientLightIrradiance(ambientLightColor);\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *=BRDF_Diffuse_Lambert(diffuseColor.rgb);\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse=(gl_FrontFacing) ? vLightFront:vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse=vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *=BRDF_Diffuse_Lambert(diffuseColor.rgb) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight=reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor=vec4(outgoingLight, diffuseColor.a);\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";
var meshlambert_vert="#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main(){\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
var meshphong_frag="#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main(){\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor=vec4(diffuse, opacity);\n\tReflectedLight reflectedLight=ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0) );\n\tvec3 totalEmissiveRadiance=emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight=reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor=vec4(outgoingLight, diffuseColor.a);\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";
var meshphong_vert="#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main(){\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal=normalize(transformedNormal);\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition=- mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
var meshphysical_frag="#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main(){\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor=vec4(diffuse, opacity);\n\tReflectedLight reflectedLight=ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0) );\n\tvec3 totalEmissiveRadiance=emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight=reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor=vec4(outgoingLight, diffuseColor.a);\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";
var meshphysical_vert="#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main(){\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal=normalize(transformedNormal);\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition=- mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
var normal_frag="#define NORMAL\nuniform float opacity;\n#if defined(FLAT_SHADED)||defined(USE_BUMPMAP)||defined(USE_NORMALMAP)\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main(){\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor=vec4(packNormalToRGB(normal), opacity);\n}\n";
var normal_vert="#define NORMAL\n#if defined(FLAT_SHADED)||defined(USE_BUMPMAP)||defined(USE_NORMALMAP)\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main(){\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal=normalize(transformedNormal);\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined(FLAT_SHADED)||defined(USE_BUMPMAP)||defined(USE_NORMALMAP)\n\tvViewPosition=- mvPosition.xyz;\n#endif\n}\n";
var points_frag="uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main(){\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight=vec3(0.0);\n\tvec4 diffuseColor=vec4(diffuse, opacity);\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight=diffuseColor.rgb;\n\tgl_FragColor=vec4(outgoingLight, diffuseColor.a);\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
var points_vert="uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main(){\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize=size *(scale / - mvPosition.z);\n\t#else\n\t\tgl_PointSize=size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}\n";
var shadow_frag="uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main(){\n\tgl_FragColor=vec4(color, opacity *(1.0 - getShadowMask()) );\n\t#include <fog_fragment>\n}\n";
var shadow_vert="#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main(){\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
var ShaderChunk={
alphamap_fragment: alphamap_fragment,
alphamap_pars_fragment: alphamap_pars_fragment,
alphatest_fragment: alphatest_fragment,
aomap_fragment: aomap_fragment,
aomap_pars_fragment: aomap_pars_fragment,
begin_vertex: begin_vertex,
beginnormal_vertex: beginnormal_vertex,
bsdfs: bsdfs,
bumpmap_pars_fragment: bumpmap_pars_fragment,
clipping_planes_fragment: clipping_planes_fragment,
clipping_planes_pars_fragment: clipping_planes_pars_fragment,
clipping_planes_pars_vertex: clipping_planes_pars_vertex,
clipping_planes_vertex: clipping_planes_vertex,
color_fragment: color_fragment,
color_pars_fragment: color_pars_fragment,
color_pars_vertex: color_pars_vertex,
color_vertex: color_vertex,
common: common,
cube_uv_reflection_fragment: cube_uv_reflection_fragment,
defaultnormal_vertex: defaultnormal_vertex,
displacementmap_pars_vertex: displacementmap_pars_vertex,
displacementmap_vertex: displacementmap_vertex,
emissivemap_fragment: emissivemap_fragment,
emissivemap_pars_fragment: emissivemap_pars_fragment,
encodings_fragment: encodings_fragment,
encodings_pars_fragment: encodings_pars_fragment,
envmap_fragment: envmap_fragment,
envmap_pars_fragment: envmap_pars_fragment,
envmap_pars_vertex: envmap_pars_vertex,
envmap_vertex: envmap_vertex,
fog_vertex: fog_vertex,
fog_pars_vertex: fog_pars_vertex,
fog_fragment: fog_fragment,
fog_pars_fragment: fog_pars_fragment,
gradientmap_pars_fragment: gradientmap_pars_fragment,
lightmap_fragment: lightmap_fragment,
lightmap_pars_fragment: lightmap_pars_fragment,
lights_lambert_vertex: lights_lambert_vertex,
lights_pars_begin: lights_pars_begin,
lights_pars_maps: lights_pars_maps,
lights_phong_fragment: lights_phong_fragment,
lights_phong_pars_fragment: lights_phong_pars_fragment,
lights_physical_fragment: lights_physical_fragment,
lights_physical_pars_fragment: lights_physical_pars_fragment,
lights_fragment_begin: lights_fragment_begin,
lights_fragment_maps: lights_fragment_maps,
lights_fragment_end: lights_fragment_end,
logdepthbuf_fragment: logdepthbuf_fragment,
logdepthbuf_pars_fragment: logdepthbuf_pars_fragment,
logdepthbuf_pars_vertex: logdepthbuf_pars_vertex,
logdepthbuf_vertex: logdepthbuf_vertex,
map_fragment: map_fragment,
map_pars_fragment: map_pars_fragment,
map_particle_fragment: map_particle_fragment,
map_particle_pars_fragment: map_particle_pars_fragment,
metalnessmap_fragment: metalnessmap_fragment,
metalnessmap_pars_fragment: metalnessmap_pars_fragment,
morphnormal_vertex: morphnormal_vertex,
morphtarget_pars_vertex: morphtarget_pars_vertex,
morphtarget_vertex: morphtarget_vertex,
normal_fragment_begin: normal_fragment_begin,
normal_fragment_maps: normal_fragment_maps,
normalmap_pars_fragment: normalmap_pars_fragment,
packing: packing,
premultiplied_alpha_fragment: premultiplied_alpha_fragment,
project_vertex: project_vertex,
dithering_fragment: dithering_fragment,
dithering_pars_fragment: dithering_pars_fragment,
roughnessmap_fragment: roughnessmap_fragment,
roughnessmap_pars_fragment: roughnessmap_pars_fragment,
shadowmap_pars_fragment: shadowmap_pars_fragment,
shadowmap_pars_vertex: shadowmap_pars_vertex,
shadowmap_vertex: shadowmap_vertex,
shadowmask_pars_fragment: shadowmask_pars_fragment,
skinbase_vertex: skinbase_vertex,
skinning_pars_vertex: skinning_pars_vertex,
skinning_vertex: skinning_vertex,
skinnormal_vertex: skinnormal_vertex,
specularmap_fragment: specularmap_fragment,
specularmap_pars_fragment: specularmap_pars_fragment,
tonemapping_fragment: tonemapping_fragment,
tonemapping_pars_fragment: tonemapping_pars_fragment,
uv_pars_fragment: uv_pars_fragment,
uv_pars_vertex: uv_pars_vertex,
uv_vertex: uv_vertex,
uv2_pars_fragment: uv2_pars_fragment,
uv2_pars_vertex: uv2_pars_vertex,
uv2_vertex: uv2_vertex,
worldpos_vertex: worldpos_vertex,
cube_frag: cube_frag,
cube_vert: cube_vert,
depth_frag: depth_frag,
depth_vert: depth_vert,
distanceRGBA_frag: distanceRGBA_frag,
distanceRGBA_vert: distanceRGBA_vert,
equirect_frag: equirect_frag,
equirect_vert: equirect_vert,
linedashed_frag: linedashed_frag,
linedashed_vert: linedashed_vert,
meshbasic_frag: meshbasic_frag,
meshbasic_vert: meshbasic_vert,
meshlambert_frag: meshlambert_frag,
meshlambert_vert: meshlambert_vert,
meshphong_frag: meshphong_frag,
meshphong_vert: meshphong_vert,
meshphysical_frag: meshphysical_frag,
meshphysical_vert: meshphysical_vert,
normal_frag: normal_frag,
normal_vert: normal_vert,
points_frag: points_frag,
points_vert: points_vert,
shadow_frag: shadow_frag,
shadow_vert: shadow_vert
};
var UniformsUtils={
merge: function(uniforms){
var merged={};
for(var u=0; u < uniforms.length; u ++){
var tmp=this.clone(uniforms[ u ]);
for(var p in tmp){
merged[ p ]=tmp[ p ];
}}
return merged;
},
clone: function(uniforms_src){
var uniforms_dst={};
for(var u in uniforms_src){
uniforms_dst[ u ]={};
for(var p in uniforms_src[ u ]){
var parameter_src=uniforms_src[ u ][ p ];
if(parameter_src&&(parameter_src.isColor ||
parameter_src.isMatrix3||parameter_src.isMatrix4 ||
parameter_src.isVector2||parameter_src.isVector3||parameter_src.isVector4 ||
parameter_src.isTexture) ){
uniforms_dst[ u ][ p ]=parameter_src.clone();
}else if(Array.isArray(parameter_src) ){
uniforms_dst[ u ][ p ]=parameter_src.slice();
}else{
uniforms_dst[ u ][ p ]=parameter_src;
}}
}
return uniforms_dst;
}};
var ColorKeywords={ 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,
'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,
'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,
'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,
'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,
'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,
'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,
'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,
'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,
'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,
'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,
'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,
'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,
'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,
'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,
'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,
'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,
'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,
'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,
'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,
'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,
'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,
'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,
'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };
function Color(r, g, b){
if(g===undefined&&b===undefined){
return this.set(r);
}
return this.setRGB(r, g, b);
}
Object.assign(Color.prototype, {
isColor: true,
r: 1, g: 1, b: 1,
set: function(value){
if(value&&value.isColor){
this.copy(value);
}else if(typeof value==='number'){
this.setHex(value);
}else if(typeof value==='string'){
this.setStyle(value);
}
return this;
},
setScalar: function(scalar){
this.r=scalar;
this.g=scalar;
this.b=scalar;
return this;
},
setHex: function(hex){
hex=Math.floor(hex);
this.r=(hex >> 16 & 255) / 255;
this.g=(hex >> 8 & 255) / 255;
this.b=(hex & 255) / 255;
return this;
},
setRGB: function(r, g, b){
this.r=r;
this.g=g;
this.b=b;
return this;
},
setHSL: function (){
function hue2rgb(p, q, t){
if(t < 0) t +=1;
if(t > 1) t -=1;
if(t < 1 / 6) return p +(q - p) * 6 * t;
if(t < 1 / 2) return q;
if(t < 2 / 3) return p +(q - p) * 6 *(2 / 3 - t);
return p;
}
return function setHSL(h, s, l){
h=_Math.euclideanModulo(h, 1);
s=_Math.clamp(s, 0, 1);
l=_Math.clamp(l, 0, 1);
if(s===0){
this.r=this.g=this.b=l;
}else{
var p=l <=0.5 ? l *(1 + s):l + s -(l * s);
var q=(2 * l) - p;
this.r=hue2rgb(q, p, h + 1 / 3);
this.g=hue2rgb(q, p, h);
this.b=hue2rgb(q, p, h - 1 / 3);
}
return this;
};}(),
setStyle: function(style){
function handleAlpha(string){
if(string===undefined) return;
if(parseFloat(string) < 1){
console.warn('THREE.Color: Alpha component of ' + style + ' will be ignored.');
}}
var m;
if(m=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(style) ){
var color;
var name=m[ 1 ];
var components=m[ 2 ];
switch(name){
case 'rgb':
case 'rgba':
if(color=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components) ){
this.r=Math.min(255, parseInt(color[ 1 ], 10) ) / 255;
this.g=Math.min(255, parseInt(color[ 2 ], 10) ) / 255;
this.b=Math.min(255, parseInt(color[ 3 ], 10) ) / 255;
handleAlpha(color[ 5 ]);
return this;
}
if(color=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components) ){
this.r=Math.min(100, parseInt(color[ 1 ], 10) ) / 100;
this.g=Math.min(100, parseInt(color[ 2 ], 10) ) / 100;
this.b=Math.min(100, parseInt(color[ 3 ], 10) ) / 100;
handleAlpha(color[ 5 ]);
return this;
}
break;
case 'hsl':
case 'hsla':
if(color=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components) ){
var h=parseFloat(color[ 1 ]) / 360;
var s=parseInt(color[ 2 ], 10) / 100;
var l=parseInt(color[ 3 ], 10) / 100;
handleAlpha(color[ 5 ]);
return this.setHSL(h, s, l);
}
break;
}}else if(m=/^\#([A-Fa-f0-9]+)$/.exec(style) ){
var hex=m[ 1 ];
var size=hex.length;
if(size===3){
this.r=parseInt(hex.charAt(0) + hex.charAt(0), 16) / 255;
this.g=parseInt(hex.charAt(1) + hex.charAt(1), 16) / 255;
this.b=parseInt(hex.charAt(2) + hex.charAt(2), 16) / 255;
return this;
}else if(size===6){
this.r=parseInt(hex.charAt(0) + hex.charAt(1), 16) / 255;
this.g=parseInt(hex.charAt(2) + hex.charAt(3), 16) / 255;
this.b=parseInt(hex.charAt(4) + hex.charAt(5), 16) / 255;
return this;
}}
if(style&&style.length > 0){
var hex=ColorKeywords[ style ];
if(hex!==undefined){
this.setHex(hex);
}else{
console.warn('THREE.Color: Unknown color ' + style);
}}
return this;
},
clone: function (){
return new this.constructor(this.r, this.g, this.b);
},
copy: function(color){
this.r=color.r;
this.g=color.g;
this.b=color.b;
return this;
},
copyGammaToLinear: function(color, gammaFactor){
if(gammaFactor===undefined) gammaFactor=2.0;
this.r=Math.pow(color.r, gammaFactor);
this.g=Math.pow(color.g, gammaFactor);
this.b=Math.pow(color.b, gammaFactor);
return this;
},
copyLinearToGamma: function(color, gammaFactor){
if(gammaFactor===undefined) gammaFactor=2.0;
var safeInverse=(gammaFactor > 0) ?(1.0 / gammaFactor):1.0;
this.r=Math.pow(color.r, safeInverse);
this.g=Math.pow(color.g, safeInverse);
this.b=Math.pow(color.b, safeInverse);
return this;
},
convertGammaToLinear: function(gammaFactor){
this.copyGammaToLinear(this, gammaFactor);
return this;
},
convertLinearToGamma: function(gammaFactor){
this.copyLinearToGamma(this, gammaFactor);
return this;
},
getHex: function (){
return(this.r * 255) << 16 ^(this.g * 255) << 8 ^(this.b * 255) << 0;
},
getHexString: function (){
return('000000' + this.getHex().toString(16) ).slice(- 6);
},
getHSL: function(target){
if(target===undefined){
console.warn('THREE.Color: .getHSL() target is now required');
target={ h: 0, s: 0, l: 0 };}
var r=this.r, g=this.g, b=this.b;
var max=Math.max(r, g, b);
var min=Math.min(r, g, b);
var hue, saturation;
var lightness=(min + max) / 2.0;
if(min===max){
hue=0;
saturation=0;
}else{
var delta=max - min;
saturation=lightness <=0.5 ? delta /(max + min):delta /(2 - max - min);
switch(max){
case r: hue=(g - b) / delta +(g < b ? 6:0); break;
case g: hue=(b - r) / delta + 2; break;
case b: hue=(r - g) / delta + 4; break;
}
hue /=6;
}
target.h=hue;
target.s=saturation;
target.l=lightness;
return target;
},
getStyle: function (){
return 'rgb(' +(( this.r * 255) | 0) + ',' +(( this.g * 255) | 0) + ',' +(( this.b * 255) | 0) + ')';
},
offsetHSL: function (){
var hsl={};
return function(h, s, l){
this.getHSL(hsl);
hsl.h +=h; hsl.s +=s; hsl.l +=l;
this.setHSL(hsl.h, hsl.s, hsl.l);
return this;
};}(),
add: function(color){
this.r +=color.r;
this.g +=color.g;
this.b +=color.b;
return this;
},
addColors: function(color1, color2){
this.r=color1.r + color2.r;
this.g=color1.g + color2.g;
this.b=color1.b + color2.b;
return this;
},
addScalar: function(s){
this.r +=s;
this.g +=s;
this.b +=s;
return this;
},
sub: function(color){
this.r=Math.max(0, this.r - color.r);
this.g=Math.max(0, this.g - color.g);
this.b=Math.max(0, this.b - color.b);
return this;
},
multiply: function(color){
this.r *=color.r;
this.g *=color.g;
this.b *=color.b;
return this;
},
multiplyScalar: function(s){
this.r *=s;
this.g *=s;
this.b *=s;
return this;
},
lerp: function(color, alpha){
this.r +=(color.r - this.r) * alpha;
this.g +=(color.g - this.g) * alpha;
this.b +=(color.b - this.b) * alpha;
return this;
},
equals: function(c){
return(c.r===this.r)&&(c.g===this.g)&&(c.b===this.b);
},
fromArray: function(array, offset){
if(offset===undefined) offset=0;
this.r=array[ offset ];
this.g=array[ offset + 1 ];
this.b=array[ offset + 2 ];
return this;
},
toArray: function(array, offset){
if(array===undefined) array=[];
if(offset===undefined) offset=0;
array[ offset ]=this.r;
array[ offset + 1 ]=this.g;
array[ offset + 2 ]=this.b;
return array;
},
toJSON: function (){
return this.getHex();
}});
var UniformsLib={
common: {
diffuse: { value: new Color(0xeeeeee) },
opacity: { value: 1.0 },
map: { value: null },
uvTransform: { value: new Matrix3() },
alphaMap: { value: null },
},
specularmap: {
specularMap: { value: null },
},
envmap: {
envMap: { value: null },
flipEnvMap: { value: - 1 },
reflectivity: { value: 1.0 },
refractionRatio: { value: 0.98 },
maxMipLevel: { value: 0 }},
aomap: {
aoMap: { value: null },
aoMapIntensity: { value: 1 }},
lightmap: {
lightMap: { value: null },
lightMapIntensity: { value: 1 }},
emissivemap: {
emissiveMap: { value: null }},
bumpmap: {
bumpMap: { value: null },
bumpScale: { value: 1 }},
normalmap: {
normalMap: { value: null },
normalScale: { value: new Vector2(1, 1) }},
displacementmap: {
displacementMap: { value: null },
displacementScale: { value: 1 },
displacementBias: { value: 0 }},
roughnessmap: {
roughnessMap: { value: null }},
metalnessmap: {
metalnessMap: { value: null }},
gradientmap: {
gradientMap: { value: null }},
fog: {
fogDensity: { value: 0.00025 },
fogNear: { value: 1 },
fogFar: { value: 2000 },
fogColor: { value: new Color(0xffffff) }},
lights: {
ambientLightColor: { value: [] },
directionalLights: { value: [], properties: {
direction: {},
color: {},
shadow: {},
shadowBias: {},
shadowRadius: {},
shadowMapSize: {}} },
directionalShadowMap: { value: [] },
directionalShadowMatrix: { value: [] },
spotLights: { value: [], properties: {
color: {},
position: {},
direction: {},
distance: {},
coneCos: {},
penumbraCos: {},
decay: {},
shadow: {},
shadowBias: {},
shadowRadius: {},
shadowMapSize: {}} },
spotShadowMap: { value: [] },
spotShadowMatrix: { value: [] },
pointLights: { value: [], properties: {
color: {},
position: {},
decay: {},
distance: {},
shadow: {},
shadowBias: {},
shadowRadius: {},
shadowMapSize: {},
shadowCameraNear: {},
shadowCameraFar: {}} },
pointShadowMap: { value: [] },
pointShadowMatrix: { value: [] },
hemisphereLights: { value: [], properties: {
direction: {},
skyColor: {},
groundColor: {}} },
rectAreaLights: { value: [], properties: {
color: {},
position: {},
width: {},
height: {}} }},
points: {
diffuse: { value: new Color(0xeeeeee) },
opacity: { value: 1.0 },
size: { value: 1.0 },
scale: { value: 1.0 },
map: { value: null },
uvTransform: { value: new Matrix3() }}
};
var ShaderLib={
basic: {
uniforms: UniformsUtils.merge([
UniformsLib.common,
UniformsLib.specularmap,
UniformsLib.envmap,
UniformsLib.aomap,
UniformsLib.lightmap,
UniformsLib.fog
]),
vertexShader: ShaderChunk.meshbasic_vert,
fragmentShader: ShaderChunk.meshbasic_frag
},
lambert: {
uniforms: UniformsUtils.merge([
UniformsLib.common,
UniformsLib.specularmap,
UniformsLib.envmap,
UniformsLib.aomap,
UniformsLib.lightmap,
UniformsLib.emissivemap,
UniformsLib.fog,
UniformsLib.lights,
{
emissive: { value: new Color(0x000000) }}
]),
vertexShader: ShaderChunk.meshlambert_vert,
fragmentShader: ShaderChunk.meshlambert_frag
},
phong: {
uniforms: UniformsUtils.merge([
UniformsLib.common,
UniformsLib.specularmap,
UniformsLib.envmap,
UniformsLib.aomap,
UniformsLib.lightmap,
UniformsLib.emissivemap,
UniformsLib.bumpmap,
UniformsLib.normalmap,
UniformsLib.displacementmap,
UniformsLib.gradientmap,
UniformsLib.fog,
UniformsLib.lights,
{
emissive: { value: new Color(0x000000) },
specular: { value: new Color(0x111111) },
shininess: { value: 30 }}
]),
vertexShader: ShaderChunk.meshphong_vert,
fragmentShader: ShaderChunk.meshphong_frag
},
standard: {
uniforms: UniformsUtils.merge([
UniformsLib.common,
UniformsLib.envmap,
UniformsLib.aomap,
UniformsLib.lightmap,
UniformsLib.emissivemap,
UniformsLib.bumpmap,
UniformsLib.normalmap,
UniformsLib.displacementmap,
UniformsLib.roughnessmap,
UniformsLib.metalnessmap,
UniformsLib.fog,
UniformsLib.lights,
{
emissive: { value: new Color(0x000000) },
roughness: { value: 0.5 },
metalness: { value: 0.5 },
envMapIntensity: { value: 1 }}
]),
vertexShader: ShaderChunk.meshphysical_vert,
fragmentShader: ShaderChunk.meshphysical_frag
},
points: {
uniforms: UniformsUtils.merge([
UniformsLib.points,
UniformsLib.fog
]),
vertexShader: ShaderChunk.points_vert,
fragmentShader: ShaderChunk.points_frag
},
dashed: {
uniforms: UniformsUtils.merge([
UniformsLib.common,
UniformsLib.fog,
{
scale: { value: 1 },
dashSize: { value: 1 },
totalSize: { value: 2 }}
]),
vertexShader: ShaderChunk.linedashed_vert,
fragmentShader: ShaderChunk.linedashed_frag
},
depth: {
uniforms: UniformsUtils.merge([
UniformsLib.common,
UniformsLib.displacementmap
]),
vertexShader: ShaderChunk.depth_vert,
fragmentShader: ShaderChunk.depth_frag
},
normal: {
uniforms: UniformsUtils.merge([
UniformsLib.common,
UniformsLib.bumpmap,
UniformsLib.normalmap,
UniformsLib.displacementmap,
{
opacity: { value: 1.0 }}
]),
vertexShader: ShaderChunk.normal_vert,
fragmentShader: ShaderChunk.normal_frag
},
cube: {
uniforms: {
tCube: { value: null },
tFlip: { value: - 1 },
opacity: { value: 1.0 }},
vertexShader: ShaderChunk.cube_vert,
fragmentShader: ShaderChunk.cube_frag
},
equirect: {
uniforms: {
tEquirect: { value: null },
},
vertexShader: ShaderChunk.equirect_vert,
fragmentShader: ShaderChunk.equirect_frag
},
distanceRGBA: {
uniforms: UniformsUtils.merge([
UniformsLib.common,
UniformsLib.displacementmap,
{
referencePosition: { value: new Vector3() },
nearDistance: { value: 1 },
farDistance: { value: 1000 }}
]),
vertexShader: ShaderChunk.distanceRGBA_vert,
fragmentShader: ShaderChunk.distanceRGBA_frag
},
shadow: {
uniforms: UniformsUtils.merge([
UniformsLib.lights,
UniformsLib.fog,
{
color: { value: new Color(0x00000) },
opacity: { value: 1.0 }},
]),
vertexShader: ShaderChunk.shadow_vert,
fragmentShader: ShaderChunk.shadow_frag
}};
ShaderLib.physical={
uniforms: UniformsUtils.merge([
ShaderLib.standard.uniforms,
{
clearCoat: { value: 0 },
clearCoatRoughness: { value: 0 }}
]),
vertexShader: ShaderChunk.meshphysical_vert,
fragmentShader: ShaderChunk.meshphysical_frag
};
function WebGLAnimation(){
var context=null;
var isAnimating=false;
var animationLoop=null;
function onAnimationFrame(time, frame){
if(isAnimating===false) return;
animationLoop(time, frame);
context.requestAnimationFrame(onAnimationFrame);
}
return {
start: function (){
if(isAnimating===true) return;
if(animationLoop===null) return;
context.requestAnimationFrame(onAnimationFrame);
isAnimating=true;
},
stop: function (){
isAnimating=false;
},
setAnimationLoop: function(callback){
animationLoop=callback;
},
setContext: function(value){
context=value;
}};}
function WebGLAttributes(gl){
var buffers=new WeakMap();
function createBuffer(attribute, bufferType){
var array=attribute.array;
var usage=attribute.dynamic ? gl.DYNAMIC_DRAW:gl.STATIC_DRAW;
var buffer=gl.createBuffer();
gl.bindBuffer(bufferType, buffer);
gl.bufferData(bufferType, array, usage);
attribute.onUploadCallback();
var type=gl.FLOAT;
if(array instanceof Float32Array){
type=gl.FLOAT;
}else if(array instanceof Float64Array){
console.warn('THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.');
}else if(array instanceof Uint16Array){
type=gl.UNSIGNED_SHORT;
}else if(array instanceof Int16Array){
type=gl.SHORT;
}else if(array instanceof Uint32Array){
type=gl.UNSIGNED_INT;
}else if(array instanceof Int32Array){
type=gl.INT;
}else if(array instanceof Int8Array){
type=gl.BYTE;
}else if(array instanceof Uint8Array){
type=gl.UNSIGNED_BYTE;
}
return {
buffer: buffer,
type: type,
bytesPerElement: array.BYTES_PER_ELEMENT,
version: attribute.version
};}
function updateBuffer(buffer, attribute, bufferType){
var array=attribute.array;
var updateRange=attribute.updateRange;
gl.bindBuffer(bufferType, buffer);
if(attribute.dynamic===false){
gl.bufferData(bufferType, array, gl.STATIC_DRAW);
}else if(updateRange.count===- 1){
gl.bufferSubData(bufferType, 0, array);
}else if(updateRange.count===0){
console.error('THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.');
}else{
gl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,
array.subarray(updateRange.offset, updateRange.offset + updateRange.count) );
updateRange.count=- 1;
}}
function get(attribute){
if(attribute.isInterleavedBufferAttribute) attribute=attribute.data;
return buffers.get(attribute);
}
function remove(attribute){
if(attribute.isInterleavedBufferAttribute) attribute=attribute.data;
var data=buffers.get(attribute);
if(data){
gl.deleteBuffer(data.buffer);
buffers.delete(attribute);
}}
function update(attribute, bufferType){
if(attribute.isInterleavedBufferAttribute) attribute=attribute.data;
var data=buffers.get(attribute);
if(data===undefined){
buffers.set(attribute, createBuffer(attribute, bufferType) );
}else if(data.version < attribute.version){
updateBuffer(data.buffer, attribute, bufferType);
data.version=attribute.version;
}}
return {
get: get,
remove: remove,
update: update
};}
function Euler(x, y, z, order){
this._x=x||0;
this._y=y||0;
this._z=z||0;
this._order=order||Euler.DefaultOrder;
}
Euler.RotationOrders=[ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];
Euler.DefaultOrder='XYZ';
Object.defineProperties(Euler.prototype, {
x: {
get: function (){
return this._x;
},
set: function(value){
this._x=value;
this.onChangeCallback();
}},
y: {
get: function (){
return this._y;
},
set: function(value){
this._y=value;
this.onChangeCallback();
}},
z: {
get: function (){
return this._z;
},
set: function(value){
this._z=value;
this.onChangeCallback();
}},
order: {
get: function (){
return this._order;
},
set: function(value){
this._order=value;
this.onChangeCallback();
}}
});
Object.assign(Euler.prototype, {
isEuler: true,
set: function(x, y, z, order){
this._x=x;
this._y=y;
this._z=z;
this._order=order||this._order;
this.onChangeCallback();
return this;
},
clone: function (){
return new this.constructor(this._x, this._y, this._z, this._order);
},
copy: function(euler){
this._x=euler._x;
this._y=euler._y;
this._z=euler._z;
this._order=euler._order;
this.onChangeCallback();
return this;
},
setFromRotationMatrix: function(m, order, update){
var clamp=_Math.clamp;
var te=m.elements;
var m11=te[ 0 ], m12=te[ 4 ], m13=te[ 8 ];
var m21=te[ 1 ], m22=te[ 5 ], m23=te[ 9 ];
var m31=te[ 2 ], m32=te[ 6 ], m33=te[ 10 ];
order=order||this._order;
if(order==='XYZ'){
this._y=Math.asin(clamp(m13, - 1, 1) );
if(Math.abs(m13) < 0.99999){
this._x=Math.atan2(- m23, m33);
this._z=Math.atan2(- m12, m11);
}else{
this._x=Math.atan2(m32, m22);
this._z=0;
}}else if(order==='YXZ'){
this._x=Math.asin(- clamp(m23, - 1, 1) );
if(Math.abs(m23) < 0.99999){
this._y=Math.atan2(m13, m33);
this._z=Math.atan2(m21, m22);
}else{
this._y=Math.atan2(- m31, m11);
this._z=0;
}}else if(order==='ZXY'){
this._x=Math.asin(clamp(m32, - 1, 1) );
if(Math.abs(m32) < 0.99999){
this._y=Math.atan2(- m31, m33);
this._z=Math.atan2(- m12, m22);
}else{
this._y=0;
this._z=Math.atan2(m21, m11);
}}else if(order==='ZYX'){
this._y=Math.asin(- clamp(m31, - 1, 1) );
if(Math.abs(m31) < 0.99999){
this._x=Math.atan2(m32, m33);
this._z=Math.atan2(m21, m11);
}else{
this._x=0;
this._z=Math.atan2(- m12, m22);
}}else if(order==='YZX'){
this._z=Math.asin(clamp(m21, - 1, 1) );
if(Math.abs(m21) < 0.99999){
this._x=Math.atan2(- m23, m22);
this._y=Math.atan2(- m31, m11);
}else{
this._x=0;
this._y=Math.atan2(m13, m33);
}}else if(order==='XZY'){
this._z=Math.asin(- clamp(m12, - 1, 1) );
if(Math.abs(m12) < 0.99999){
this._x=Math.atan2(m32, m22);
this._y=Math.atan2(m13, m11);
}else{
this._x=Math.atan2(- m23, m33);
this._y=0;
}}else{
console.warn('THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order);
}
this._order=order;
if(update!==false) this.onChangeCallback();
return this;
},
setFromQuaternion: function (){
var matrix=new Matrix4();
return function setFromQuaternion(q, order, update){
matrix.makeRotationFromQuaternion(q);
return this.setFromRotationMatrix(matrix, order, update);
};}(),
setFromVector3: function(v, order){
return this.set(v.x, v.y, v.z, order||this._order);
},
reorder: function (){
var q=new Quaternion();
return function reorder(newOrder){
q.setFromEuler(this);
return this.setFromQuaternion(q, newOrder);
};}(),
equals: function(euler){
return(euler._x===this._x)&&(euler._y===this._y)&&(euler._z===this._z)&&(euler._order===this._order);
},
fromArray: function(array){
this._x=array[ 0 ];
this._y=array[ 1 ];
this._z=array[ 2 ];
if(array[ 3 ]!==undefined) this._order=array[ 3 ];
this.onChangeCallback();
return this;
},
toArray: function(array, offset){
if(array===undefined) array=[];
if(offset===undefined) offset=0;
array[ offset ]=this._x;
array[ offset + 1 ]=this._y;
array[ offset + 2 ]=this._z;
array[ offset + 3 ]=this._order;
return array;
},
toVector3: function(optionalResult){
if(optionalResult){
return optionalResult.set(this._x, this._y, this._z);
}else{
return new Vector3(this._x, this._y, this._z);
}},
onChange: function(callback){
this.onChangeCallback=callback;
return this;
},
onChangeCallback: function (){}});
function Layers(){
this.mask=1 | 0;
}
Object.assign(Layers.prototype, {
set: function(channel){
this.mask=1 << channel | 0;
},
enable: function(channel){
this.mask |=1 << channel | 0;
},
toggle: function(channel){
this.mask ^=1 << channel | 0;
},
disable: function(channel){
this.mask &=~(1 << channel | 0);
},
test: function(layers){
return(this.mask & layers.mask)!==0;
}});
var object3DId=0;
function Object3D(){
Object.defineProperty(this, 'id', { value: object3DId ++ });
this.uuid=_Math.generateUUID();
this.name='';
this.type='Object3D';
this.parent=null;
this.children=[];
this.up=Object3D.DefaultUp.clone();
var position=new Vector3();
var rotation=new Euler();
var quaternion=new Quaternion();
var scale=new Vector3(1, 1, 1);
function onRotationChange(){
quaternion.setFromEuler(rotation, false);
}
function onQuaternionChange(){
rotation.setFromQuaternion(quaternion, undefined, false);
}
rotation.onChange(onRotationChange);
quaternion.onChange(onQuaternionChange);
Object.defineProperties(this, {
position: {
enumerable: true,
value: position
},
rotation: {
enumerable: true,
value: rotation
},
quaternion: {
enumerable: true,
value: quaternion
},
scale: {
enumerable: true,
value: scale
},
modelViewMatrix: {
value: new Matrix4()
},
normalMatrix: {
value: new Matrix3()
}});
this.matrix=new Matrix4();
this.matrixWorld=new Matrix4();
this.matrixAutoUpdate=Object3D.DefaultMatrixAutoUpdate;
this.matrixWorldNeedsUpdate=false;
this.layers=new Layers();
this.visible=true;
this.castShadow=false;
this.receiveShadow=false;
this.frustumCulled=true;
this.renderOrder=0;
this.userData={};}
Object3D.DefaultUp=new Vector3(0, 1, 0);
Object3D.DefaultMatrixAutoUpdate=true;
Object3D.prototype=Object.assign(Object.create(EventDispatcher.prototype), {
constructor: Object3D,
isObject3D: true,
onBeforeRender: function (){},
onAfterRender: function (){},
applyMatrix: function(matrix){
this.matrix.multiplyMatrices(matrix, this.matrix);
this.matrix.decompose(this.position, this.quaternion, this.scale);
},
applyQuaternion: function(q){
this.quaternion.premultiply(q);
return this;
},
setRotationFromAxisAngle: function(axis, angle){
this.quaternion.setFromAxisAngle(axis, angle);
},
setRotationFromEuler: function(euler){
this.quaternion.setFromEuler(euler, true);
},
setRotationFromMatrix: function(m){
this.quaternion.setFromRotationMatrix(m);
},
setRotationFromQuaternion: function(q){
this.quaternion.copy(q);
},
rotateOnAxis: function (){
var q1=new Quaternion();
return function rotateOnAxis(axis, angle){
q1.setFromAxisAngle(axis, angle);
this.quaternion.multiply(q1);
return this;
};}(),
rotateOnWorldAxis: function (){
var q1=new Quaternion();
return function rotateOnWorldAxis(axis, angle){
q1.setFromAxisAngle(axis, angle);
this.quaternion.premultiply(q1);
return this;
};}(),
rotateX: function (){
var v1=new Vector3(1, 0, 0);
return function rotateX(angle){
return this.rotateOnAxis(v1, angle);
};}(),
rotateY: function (){
var v1=new Vector3(0, 1, 0);
return function rotateY(angle){
return this.rotateOnAxis(v1, angle);
};}(),
rotateZ: function (){
var v1=new Vector3(0, 0, 1);
return function rotateZ(angle){
return this.rotateOnAxis(v1, angle);
};}(),
translateOnAxis: function (){
var v1=new Vector3();
return function translateOnAxis(axis, distance){
v1.copy(axis).applyQuaternion(this.quaternion);
this.position.add(v1.multiplyScalar(distance) );
return this;
};}(),
translateX: function (){
var v1=new Vector3(1, 0, 0);
return function translateX(distance){
return this.translateOnAxis(v1, distance);
};}(),
translateY: function (){
var v1=new Vector3(0, 1, 0);
return function translateY(distance){
return this.translateOnAxis(v1, distance);
};}(),
translateZ: function (){
var v1=new Vector3(0, 0, 1);
return function translateZ(distance){
return this.translateOnAxis(v1, distance);
};}(),
localToWorld: function(vector){
return vector.applyMatrix4(this.matrixWorld);
},
worldToLocal: function (){
var m1=new Matrix4();
return function worldToLocal(vector){
return vector.applyMatrix4(m1.getInverse(this.matrixWorld) );
};}(),
lookAt: function (){
var m1=new Matrix4();
var vector=new Vector3();
return function lookAt(x, y, z){
if(x.isVector3){
vector.copy(x);
}else{
vector.set(x, y, z);
}
if(this.isCamera){
m1.lookAt(this.position, vector, this.up);
}else{
m1.lookAt(vector, this.position, this.up);
}
this.quaternion.setFromRotationMatrix(m1);
};}(),
add: function(object){
if(arguments.length > 1){
for(var i=0; i < arguments.length; i ++){
this.add(arguments[ i ]);
}
return this;
}
if(object===this){
console.error("THREE.Object3D.add: object can't be added as a child of itself.", object);
return this;
}
if(( object&&object.isObject3D) ){
if(object.parent!==null){
object.parent.remove(object);
}
object.parent=this;
object.dispatchEvent({ type: 'added' });
this.children.push(object);
}else{
console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.", object);
}
return this;
},
remove: function(object){
if(arguments.length > 1){
for(var i=0; i < arguments.length; i ++){
this.remove(arguments[ i ]);
}
return this;
}
var index=this.children.indexOf(object);
if(index!==- 1){
object.parent=null;
object.dispatchEvent({ type: 'removed' });
this.children.splice(index, 1);
}
return this;
},
getObjectById: function(id){
return this.getObjectByProperty('id', id);
},
getObjectByName: function(name){
return this.getObjectByProperty('name', name);
},
getObjectByProperty: function(name, value){
if(this[ name ]===value) return this;
for(var i=0, l=this.children.length; i < l; i ++){
var child=this.children[ i ];
var object=child.getObjectByProperty(name, value);
if(object!==undefined){
return object;
}}
return undefined;
},
getWorldPosition: function(target){
if(target===undefined){
console.warn('THREE.Object3D: .getWorldPosition() target is now required');
target=new Vector3();
}
this.updateMatrixWorld(true);
return target.setFromMatrixPosition(this.matrixWorld);
},
getWorldQuaternion: function (){
var position=new Vector3();
var scale=new Vector3();
return function getWorldQuaternion(target){
if(target===undefined){
console.warn('THREE.Object3D: .getWorldQuaternion() target is now required');
target=new Quaternion();
}
this.updateMatrixWorld(true);
this.matrixWorld.decompose(position, target, scale);
return target;
};}(),
getWorldScale: function (){
var position=new Vector3();
var quaternion=new Quaternion();
return function getWorldScale(target){
if(target===undefined){
console.warn('THREE.Object3D: .getWorldScale() target is now required');
target=new Vector3();
}
this.updateMatrixWorld(true);
this.matrixWorld.decompose(position, quaternion, target);
return target;
};}(),
getWorldDirection: function (){
var quaternion=new Quaternion();
return function getWorldDirection(target){
if(target===undefined){
console.warn('THREE.Object3D: .getWorldDirection() target is now required');
target=new Vector3();
}
this.getWorldQuaternion(quaternion);
return target.set(0, 0, 1).applyQuaternion(quaternion);
};}(),
raycast: function (){},
traverse: function(callback){
callback(this);
var children=this.children;
for(var i=0, l=children.length; i < l; i ++){
children[ i ].traverse(callback);
}},
traverseVisible: function(callback){
if(this.visible===false) return;
callback(this);
var children=this.children;
for(var i=0, l=children.length; i < l; i ++){
children[ i ].traverseVisible(callback);
}},
traverseAncestors: function(callback){
var parent=this.parent;
if(parent!==null){
callback(parent);
parent.traverseAncestors(callback);
}},
updateMatrix: function (){
this.matrix.compose(this.position, this.quaternion, this.scale);
this.matrixWorldNeedsUpdate=true;
},
updateMatrixWorld: function(force){
if(this.matrixAutoUpdate) this.updateMatrix();
if(this.matrixWorldNeedsUpdate||force){
if(this.parent===null){
this.matrixWorld.copy(this.matrix);
}else{
this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix);
}
this.matrixWorldNeedsUpdate=false;
force=true;
}
var children=this.children;
for(var i=0, l=children.length; i < l; i ++){
children[ i ].updateMatrixWorld(force);
}},
toJSON: function(meta){
var isRootObject=(meta===undefined||typeof meta==='string');
var output={};
if(isRootObject){
meta={
geometries: {},
materials: {},
textures: {},
images: {},
shapes: {}};
output.metadata={
version: 4.5,
type: 'Object',
generator: 'Object3D.toJSON'
};}
var object={};
object.uuid=this.uuid;
object.type=this.type;
if(this.name!=='') object.name=this.name;
if(this.castShadow===true) object.castShadow=true;
if(this.receiveShadow===true) object.receiveShadow=true;
if(this.visible===false) object.visible=false;
if(this.frustumCulled===false) object.frustumCulled=false;
if(this.renderOrder!==0) object.renderOrder=this.renderOrder;
if(JSON.stringify(this.userData)!=='{}') object.userData=this.userData;
object.matrix=this.matrix.toArray();
if(this.matrixAutoUpdate===false) object.matrixAutoUpdate=false;
function serialize(library, element){
if(library[ element.uuid ]===undefined){
library[ element.uuid ]=element.toJSON(meta);
}
return element.uuid;
}
if(this.geometry!==undefined){
object.geometry=serialize(meta.geometries, this.geometry);
var parameters=this.geometry.parameters;
if(parameters!==undefined&&parameters.shapes!==undefined){
var shapes=parameters.shapes;
if(Array.isArray(shapes) ){
for(var i=0, l=shapes.length; i < l; i ++){
var shape=shapes[ i ];
serialize(meta.shapes, shape);
}}else{
serialize(meta.shapes, shapes);
}}
}
if(this.material!==undefined){
if(Array.isArray(this.material) ){
var uuids=[];
for(var i=0, l=this.material.length; i < l; i ++){
uuids.push(serialize(meta.materials, this.material[ i ]) );
}
object.material=uuids;
}else{
object.material=serialize(meta.materials, this.material);
}}
if(this.children.length > 0){
object.children=[];
for(var i=0; i < this.children.length; i ++){
object.children.push(this.children[ i ].toJSON(meta).object);
}}
if(isRootObject){
var geometries=extractFromCache(meta.geometries);
var materials=extractFromCache(meta.materials);
var textures=extractFromCache(meta.textures);
var images=extractFromCache(meta.images);
var shapes=extractFromCache(meta.shapes);
if(geometries.length > 0) output.geometries=geometries;
if(materials.length > 0) output.materials=materials;
if(textures.length > 0) output.textures=textures;
if(images.length > 0) output.images=images;
if(shapes.length > 0) output.shapes=shapes;
}
output.object=object;
return output;
function extractFromCache(cache){
var values=[];
for(var key in cache){
var data=cache[ key ];
delete data.metadata;
values.push(data);
}
return values;
}},
clone: function(recursive){
return new this.constructor().copy(this, recursive);
},
copy: function(source, recursive){
if(recursive===undefined) recursive=true;
this.name=source.name;
this.up.copy(source.up);
this.position.copy(source.position);
this.quaternion.copy(source.quaternion);
this.scale.copy(source.scale);
this.matrix.copy(source.matrix);
this.matrixWorld.copy(source.matrixWorld);
this.matrixAutoUpdate=source.matrixAutoUpdate;
this.matrixWorldNeedsUpdate=source.matrixWorldNeedsUpdate;
this.layers.mask=source.layers.mask;
this.visible=source.visible;
this.castShadow=source.castShadow;
this.receiveShadow=source.receiveShadow;
this.frustumCulled=source.frustumCulled;
this.renderOrder=source.renderOrder;
this.userData=JSON.parse(JSON.stringify(source.userData) );
if(recursive===true){
for(var i=0; i < source.children.length; i ++){
var child=source.children[ i ];
this.add(child.clone());
}}
return this;
}});
function Camera(){
Object3D.call(this);
this.type='Camera';
this.matrixWorldInverse=new Matrix4();
this.projectionMatrix=new Matrix4();
}
Camera.prototype=Object.assign(Object.create(Object3D.prototype), {
constructor: Camera,
isCamera: true,
copy: function(source, recursive){
Object3D.prototype.copy.call(this, source, recursive);
this.matrixWorldInverse.copy(source.matrixWorldInverse);
this.projectionMatrix.copy(source.projectionMatrix);
return this;
},
getWorldDirection: function (){
var quaternion=new Quaternion();
return function getWorldDirection(target){
if(target===undefined){
console.warn('THREE.Camera: .getWorldDirection() target is now required');
target=new Vector3();
}
this.getWorldQuaternion(quaternion);
return target.set(0, 0, - 1).applyQuaternion(quaternion);
};}(),
updateMatrixWorld: function(force){
Object3D.prototype.updateMatrixWorld.call(this, force);
this.matrixWorldInverse.getInverse(this.matrixWorld);
},
clone: function (){
return new this.constructor().copy(this);
}});
function OrthographicCamera(left, right, top, bottom, near, far){
Camera.call(this);
this.type='OrthographicCamera';
this.zoom=1;
this.view=null;
this.left=left;
this.right=right;
this.top=top;
this.bottom=bottom;
this.near=(near!==undefined) ? near:0.1;
this.far=(far!==undefined) ? far:2000;
this.updateProjectionMatrix();
}
OrthographicCamera.prototype=Object.assign(Object.create(Camera.prototype), {
constructor: OrthographicCamera,
isOrthographicCamera: true,
copy: function(source, recursive){
Camera.prototype.copy.call(this, source, recursive);
this.left=source.left;
this.right=source.right;
this.top=source.top;
this.bottom=source.bottom;
this.near=source.near;
this.far=source.far;
this.zoom=source.zoom;
this.view=source.view===null ? null:Object.assign({}, source.view);
return this;
},
setViewOffset: function(fullWidth, fullHeight, x, y, width, height){
if(this.view===null){
this.view={
enabled: true,
fullWidth: 1,
fullHeight: 1,
offsetX: 0,
offsetY: 0,
width: 1,
height: 1
};}
this.view.enabled=true;
this.view.fullWidth=fullWidth;
this.view.fullHeight=fullHeight;
this.view.offsetX=x;
this.view.offsetY=y;
this.view.width=width;
this.view.height=height;
this.updateProjectionMatrix();
},
clearViewOffset: function (){
if(this.view!==null){
this.view.enabled=false;
}
this.updateProjectionMatrix();
},
updateProjectionMatrix: function (){
var dx=(this.right - this.left) /(2 * this.zoom);
var dy=(this.top - this.bottom) /(2 * this.zoom);
var cx=(this.right + this.left) / 2;
var cy=(this.top + this.bottom) / 2;
var left=cx - dx;
var right=cx + dx;
var top=cy + dy;
var bottom=cy - dy;
if(this.view!==null&&this.view.enabled){
var zoomW=this.zoom /(this.view.width / this.view.fullWidth);
var zoomH=this.zoom /(this.view.height / this.view.fullHeight);
var scaleW=(this.right - this.left) / this.view.width;
var scaleH=(this.top - this.bottom) / this.view.height;
left +=scaleW *(this.view.offsetX / zoomW);
right=left + scaleW *(this.view.width / zoomW);
top -=scaleH *(this.view.offsetY / zoomH);
bottom=top - scaleH *(this.view.height / zoomH);
}
this.projectionMatrix.makeOrthographic(left, right, top, bottom, this.near, this.far);
},
toJSON: function(meta){
var data=Object3D.prototype.toJSON.call(this, meta);
data.object.zoom=this.zoom;
data.object.left=this.left;
data.object.right=this.right;
data.object.top=this.top;
data.object.bottom=this.bottom;
data.object.near=this.near;
data.object.far=this.far;
if(this.view!==null) data.object.view=Object.assign({}, this.view);
return data;
}});
function Face3(a, b, c, normal, color, materialIndex){
this.a=a;
this.b=b;
this.c=c;
this.normal=(normal&&normal.isVector3) ? normal:new Vector3();
this.vertexNormals=Array.isArray(normal) ? normal:[];
this.color=(color&&color.isColor) ? color:new Color();
this.vertexColors=Array.isArray(color) ? color:[];
this.materialIndex=materialIndex!==undefined ? materialIndex:0;
}
Object.assign(Face3.prototype, {
clone: function (){
return new this.constructor().copy(this);
},
copy: function(source){
this.a=source.a;
this.b=source.b;
this.c=source.c;
this.normal.copy(source.normal);
this.color.copy(source.color);
this.materialIndex=source.materialIndex;
for(var i=0, il=source.vertexNormals.length; i < il; i ++){
this.vertexNormals[ i ]=source.vertexNormals[ i ].clone();
}
for(var i=0, il=source.vertexColors.length; i < il; i ++){
this.vertexColors[ i ]=source.vertexColors[ i ].clone();
}
return this;
}});
var geometryId=0;
function Geometry(){
Object.defineProperty(this, 'id', { value: geometryId +=2 });
this.uuid=_Math.generateUUID();
this.name='';
this.type='Geometry';
this.vertices=[];
this.colors=[];
this.faces=[];
this.faceVertexUvs=[[]];
this.morphTargets=[];
this.morphNormals=[];
this.skinWeights=[];
this.skinIndices=[];
this.lineDistances=[];
this.boundingBox=null;
this.boundingSphere=null;
this.elementsNeedUpdate=false;
this.verticesNeedUpdate=false;
this.uvsNeedUpdate=false;
this.normalsNeedUpdate=false;
this.colorsNeedUpdate=false;
this.lineDistancesNeedUpdate=false;
this.groupsNeedUpdate=false;
}
Geometry.prototype=Object.assign(Object.create(EventDispatcher.prototype), {
constructor: Geometry,
isGeometry: true,
applyMatrix: function(matrix){
var normalMatrix=new Matrix3().getNormalMatrix(matrix);
for(var i=0, il=this.vertices.length; i < il; i ++){
var vertex=this.vertices[ i ];
vertex.applyMatrix4(matrix);
}
for(var i=0, il=this.faces.length; i < il; i ++){
var face=this.faces[ i ];
face.normal.applyMatrix3(normalMatrix).normalize();
for(var j=0, jl=face.vertexNormals.length; j < jl; j ++){
face.vertexNormals[ j ].applyMatrix3(normalMatrix).normalize();
}}
if(this.boundingBox!==null){
this.computeBoundingBox();
}
if(this.boundingSphere!==null){
this.computeBoundingSphere();
}
this.verticesNeedUpdate=true;
this.normalsNeedUpdate=true;
return this;
},
rotateX: function (){
var m1=new Matrix4();
return function rotateX(angle){
m1.makeRotationX(angle);
this.applyMatrix(m1);
return this;
};}(),
rotateY: function (){
var m1=new Matrix4();
return function rotateY(angle){
m1.makeRotationY(angle);
this.applyMatrix(m1);
return this;
};}(),
rotateZ: function (){
var m1=new Matrix4();
return function rotateZ(angle){
m1.makeRotationZ(angle);
this.applyMatrix(m1);
return this;
};}(),
translate: function (){
var m1=new Matrix4();
return function translate(x, y, z){
m1.makeTranslation(x, y, z);
this.applyMatrix(m1);
return this;
};}(),
scale: function (){
var m1=new Matrix4();
return function scale(x, y, z){
m1.makeScale(x, y, z);
this.applyMatrix(m1);
return this;
};}(),
lookAt: function (){
var obj=new Object3D();
return function lookAt(vector){
obj.lookAt(vector);
obj.updateMatrix();
this.applyMatrix(obj.matrix);
};}(),
fromBufferGeometry: function(geometry){
var scope=this;
var indices=geometry.index!==null ? geometry.index.array:undefined;
var attributes=geometry.attributes;
var positions=attributes.position.array;
var normals=attributes.normal!==undefined ? attributes.normal.array:undefined;
var colors=attributes.color!==undefined ? attributes.color.array:undefined;
var uvs=attributes.uv!==undefined ? attributes.uv.array:undefined;
var uvs2=attributes.uv2!==undefined ? attributes.uv2.array:undefined;
if(uvs2!==undefined) this.faceVertexUvs[ 1 ]=[];
var tempNormals=[];
var tempUVs=[];
var tempUVs2=[];
for(var i=0, j=0; i < positions.length; i +=3, j +=2){
scope.vertices.push(new Vector3(positions[ i ], positions[ i + 1 ], positions[ i + 2 ]) );
if(normals!==undefined){
tempNormals.push(new Vector3(normals[ i ], normals[ i + 1 ], normals[ i + 2 ]) );
}
if(colors!==undefined){
scope.colors.push(new Color(colors[ i ], colors[ i + 1 ], colors[ i + 2 ]) );
}
if(uvs!==undefined){
tempUVs.push(new Vector2(uvs[ j ], uvs[ j + 1 ]) );
}
if(uvs2!==undefined){
tempUVs2.push(new Vector2(uvs2[ j ], uvs2[ j + 1 ]) );
}}
function addFace(a, b, c, materialIndex){
var vertexNormals=normals!==undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ]:[];
var vertexColors=colors!==undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ]:[];
var face=new Face3(a, b, c, vertexNormals, vertexColors, materialIndex);
scope.faces.push(face);
if(uvs!==undefined){
scope.faceVertexUvs[ 0 ].push([ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ]);
}
if(uvs2!==undefined){
scope.faceVertexUvs[ 1 ].push([ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ]);
}}
var groups=geometry.groups;
if(groups.length > 0){
for(var i=0; i < groups.length; i ++){
var group=groups[ i ];
var start=group.start;
var count=group.count;
for(var j=start, jl=start + count; j < jl; j +=3){
if(indices!==undefined){
addFace(indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex);
}else{
addFace(j, j + 1, j + 2, group.materialIndex);
}}
}}else{
if(indices!==undefined){
for(var i=0; i < indices.length; i +=3){
addFace(indices[ i ], indices[ i + 1 ], indices[ i + 2 ]);
}}else{
for(var i=0; i < positions.length / 3; i +=3){
addFace(i, i + 1, i + 2);
}}
}
this.computeFaceNormals();
if(geometry.boundingBox!==null){
this.boundingBox=geometry.boundingBox.clone();
}
if(geometry.boundingSphere!==null){
this.boundingSphere=geometry.boundingSphere.clone();
}
return this;
},
center: function (){
var offset=new Vector3();
return function center(){
this.computeBoundingBox();
this.boundingBox.getCenter(offset).negate();
this.translate(offset.x, offset.y, offset.z);
return this;
};}(),
normalize: function (){
this.computeBoundingSphere();
var center=this.boundingSphere.center;
var radius=this.boundingSphere.radius;
var s=radius===0 ? 1:1.0 / radius;
var matrix=new Matrix4();
matrix.set(s, 0, 0, - s * center.x,
0, s, 0, - s * center.y,
0, 0, s, - s * center.z,
0, 0, 0, 1
);
this.applyMatrix(matrix);
return this;
},
computeFaceNormals: function (){
var cb=new Vector3(), ab=new Vector3();
for(var f=0, fl=this.faces.length; f < fl; f ++){
var face=this.faces[ f ];
var vA=this.vertices[ face.a ];
var vB=this.vertices[ face.b ];
var vC=this.vertices[ face.c ];
cb.subVectors(vC, vB);
ab.subVectors(vA, vB);
cb.cross(ab);
cb.normalize();
face.normal.copy(cb);
}},
computeVertexNormals: function(areaWeighted){
if(areaWeighted===undefined) areaWeighted=true;
var v, vl, f, fl, face, vertices;
vertices=new Array(this.vertices.length);
for(v=0, vl=this.vertices.length; v < vl; v ++){
vertices[ v ]=new Vector3();
}
if(areaWeighted){
var vA, vB, vC;
var cb=new Vector3(), ab=new Vector3();
for(f=0, fl=this.faces.length; f < fl; f ++){
face=this.faces[ f ];
vA=this.vertices[ face.a ];
vB=this.vertices[ face.b ];
vC=this.vertices[ face.c ];
cb.subVectors(vC, vB);
ab.subVectors(vA, vB);
cb.cross(ab);
vertices[ face.a ].add(cb);
vertices[ face.b ].add(cb);
vertices[ face.c ].add(cb);
}}else{
this.computeFaceNormals();
for(f=0, fl=this.faces.length; f < fl; f ++){
face=this.faces[ f ];
vertices[ face.a ].add(face.normal);
vertices[ face.b ].add(face.normal);
vertices[ face.c ].add(face.normal);
}}
for(v=0, vl=this.vertices.length; v < vl; v ++){
vertices[ v ].normalize();
}
for(f=0, fl=this.faces.length; f < fl; f ++){
face=this.faces[ f ];
var vertexNormals=face.vertexNormals;
if(vertexNormals.length===3){
vertexNormals[ 0 ].copy(vertices[ face.a ]);
vertexNormals[ 1 ].copy(vertices[ face.b ]);
vertexNormals[ 2 ].copy(vertices[ face.c ]);
}else{
vertexNormals[ 0 ]=vertices[ face.a ].clone();
vertexNormals[ 1 ]=vertices[ face.b ].clone();
vertexNormals[ 2 ]=vertices[ face.c ].clone();
}}
if(this.faces.length > 0){
this.normalsNeedUpdate=true;
}},
computeFlatVertexNormals: function (){
var f, fl, face;
this.computeFaceNormals();
for(f=0, fl=this.faces.length; f < fl; f ++){
face=this.faces[ f ];
var vertexNormals=face.vertexNormals;
if(vertexNormals.length===3){
vertexNormals[ 0 ].copy(face.normal);
vertexNormals[ 1 ].copy(face.normal);
vertexNormals[ 2 ].copy(face.normal);
}else{
vertexNormals[ 0 ]=face.normal.clone();
vertexNormals[ 1 ]=face.normal.clone();
vertexNormals[ 2 ]=face.normal.clone();
}}
if(this.faces.length > 0){
this.normalsNeedUpdate=true;
}},
computeMorphNormals: function (){
var i, il, f, fl, face;
for(f=0, fl=this.faces.length; f < fl; f ++){
face=this.faces[ f ];
if(! face.__originalFaceNormal){
face.__originalFaceNormal=face.normal.clone();
}else{
face.__originalFaceNormal.copy(face.normal);
}
if(! face.__originalVertexNormals) face.__originalVertexNormals=[];
for(i=0, il=face.vertexNormals.length; i < il; i ++){
if(! face.__originalVertexNormals[ i ]){
face.__originalVertexNormals[ i ]=face.vertexNormals[ i ].clone();
}else{
face.__originalVertexNormals[ i ].copy(face.vertexNormals[ i ]);
}}
}
var tmpGeo=new Geometry();
tmpGeo.faces=this.faces;
for(i=0, il=this.morphTargets.length; i < il; i ++){
if(! this.morphNormals[ i ]){
this.morphNormals[ i ]={};
this.morphNormals[ i ].faceNormals=[];
this.morphNormals[ i ].vertexNormals=[];
var dstNormalsFace=this.morphNormals[ i ].faceNormals;
var dstNormalsVertex=this.morphNormals[ i ].vertexNormals;
var faceNormal, vertexNormals;
for(f=0, fl=this.faces.length; f < fl; f ++){
faceNormal=new Vector3();
vertexNormals={ a: new Vector3(), b: new Vector3(), c: new Vector3() };
dstNormalsFace.push(faceNormal);
dstNormalsVertex.push(vertexNormals);
}}
var morphNormals=this.morphNormals[ i ];
tmpGeo.vertices=this.morphTargets[ i ].vertices;
tmpGeo.computeFaceNormals();
tmpGeo.computeVertexNormals();
var faceNormal, vertexNormals;
for(f=0, fl=this.faces.length; f < fl; f ++){
face=this.faces[ f ];
faceNormal=morphNormals.faceNormals[ f ];
vertexNormals=morphNormals.vertexNormals[ f ];
faceNormal.copy(face.normal);
vertexNormals.a.copy(face.vertexNormals[ 0 ]);
vertexNormals.b.copy(face.vertexNormals[ 1 ]);
vertexNormals.c.copy(face.vertexNormals[ 2 ]);
}}
for(f=0, fl=this.faces.length; f < fl; f ++){
face=this.faces[ f ];
face.normal=face.__originalFaceNormal;
face.vertexNormals=face.__originalVertexNormals;
}},
computeBoundingBox: function (){
if(this.boundingBox===null){
this.boundingBox=new Box3();
}
this.boundingBox.setFromPoints(this.vertices);
},
computeBoundingSphere: function (){
if(this.boundingSphere===null){
this.boundingSphere=new Sphere();
}
this.boundingSphere.setFromPoints(this.vertices);
},
merge: function(geometry, matrix, materialIndexOffset){
if(!(geometry&&geometry.isGeometry) ){
console.error('THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry);
return;
}
var normalMatrix,
vertexOffset=this.vertices.length,
vertices1=this.vertices,
vertices2=geometry.vertices,
faces1=this.faces,
faces2=geometry.faces,
uvs1=this.faceVertexUvs[ 0 ],
uvs2=geometry.faceVertexUvs[ 0 ],
colors1=this.colors,
colors2=geometry.colors;
if(materialIndexOffset===undefined) materialIndexOffset=0;
if(matrix!==undefined){
normalMatrix=new Matrix3().getNormalMatrix(matrix);
}
for(var i=0, il=vertices2.length; i < il; i ++){
var vertex=vertices2[ i ];
var vertexCopy=vertex.clone();
if(matrix!==undefined) vertexCopy.applyMatrix4(matrix);
vertices1.push(vertexCopy);
}
for(var i=0, il=colors2.length; i < il; i ++){
colors1.push(colors2[ i ].clone());
}
for(i=0, il=faces2.length; i < il; i ++){
var face=faces2[ i ], faceCopy, normal, color,
faceVertexNormals=face.vertexNormals,
faceVertexColors=face.vertexColors;
faceCopy=new Face3(face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset);
faceCopy.normal.copy(face.normal);
if(normalMatrix!==undefined){
faceCopy.normal.applyMatrix3(normalMatrix).normalize();
}
for(var j=0, jl=faceVertexNormals.length; j < jl; j ++){
normal=faceVertexNormals[ j ].clone();
if(normalMatrix!==undefined){
normal.applyMatrix3(normalMatrix).normalize();
}
faceCopy.vertexNormals.push(normal);
}
faceCopy.color.copy(face.color);
for(var j=0, jl=faceVertexColors.length; j < jl; j ++){
color=faceVertexColors[ j ];
faceCopy.vertexColors.push(color.clone());
}
faceCopy.materialIndex=face.materialIndex + materialIndexOffset;
faces1.push(faceCopy);
}
for(i=0, il=uvs2.length; i < il; i ++){
var uv=uvs2[ i ], uvCopy=[];
if(uv===undefined){
continue;
}
for(var j=0, jl=uv.length; j < jl; j ++){
uvCopy.push(uv[ j ].clone());
}
uvs1.push(uvCopy);
}},
mergeMesh: function(mesh){
if(!(mesh&&mesh.isMesh) ){
console.error('THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh);
return;
}
if(mesh.matrixAutoUpdate) mesh.updateMatrix();
this.merge(mesh.geometry, mesh.matrix);
},
mergeVertices: function (){
var verticesMap={};
var unique=[], changes=[];
var v, key;
var precisionPoints=4;
var precision=Math.pow(10, precisionPoints);
var i, il, face;
var indices, j, jl;
for(i=0, il=this.vertices.length; i < il; i ++){
v=this.vertices[ i ];
key=Math.round(v.x * precision) + '_' + Math.round(v.y * precision) + '_' + Math.round(v.z * precision);
if(verticesMap[ key ]===undefined){
verticesMap[ key ]=i;
unique.push(this.vertices[ i ]);
changes[ i ]=unique.length - 1;
}else{
changes[ i ]=changes[ verticesMap[ key ] ];
}}
var faceIndicesToRemove=[];
for(i=0, il=this.faces.length; i < il; i ++){
face=this.faces[ i ];
face.a=changes[ face.a ];
face.b=changes[ face.b ];
face.c=changes[ face.c ];
indices=[ face.a, face.b, face.c ];
for(var n=0; n < 3; n ++){
if(indices[ n ]===indices[(n + 1) % 3 ]){
faceIndicesToRemove.push(i);
break;
}}
}
for(i=faceIndicesToRemove.length - 1; i >=0; i --){
var idx=faceIndicesToRemove[ i ];
this.faces.splice(idx, 1);
for(j=0, jl=this.faceVertexUvs.length; j < jl; j ++){
this.faceVertexUvs[ j ].splice(idx, 1);
}}
var diff=this.vertices.length - unique.length;
this.vertices=unique;
return diff;
},
setFromPoints: function(points){
this.vertices=[];
for(var i=0, l=points.length; i < l; i ++){
var point=points[ i ];
this.vertices.push(new Vector3(point.x, point.y, point.z||0) );
}
return this;
},
sortFacesByMaterialIndex: function (){
var faces=this.faces;
var length=faces.length;
for(var i=0; i < length; i ++){
faces[ i ]._id=i;
}
function materialIndexSort(a, b){
return a.materialIndex - b.materialIndex;
}
faces.sort(materialIndexSort);
var uvs1=this.faceVertexUvs[ 0 ];
var uvs2=this.faceVertexUvs[ 1 ];
var newUvs1, newUvs2;
if(uvs1&&uvs1.length===length) newUvs1=[];
if(uvs2&&uvs2.length===length) newUvs2=[];
for(var i=0; i < length; i ++){
var id=faces[ i ]._id;
if(newUvs1) newUvs1.push(uvs1[ id ]);
if(newUvs2) newUvs2.push(uvs2[ id ]);
}
if(newUvs1) this.faceVertexUvs[ 0 ]=newUvs1;
if(newUvs2) this.faceVertexUvs[ 1 ]=newUvs2;
},
toJSON: function (){
var data={
metadata: {
version: 4.5,
type: 'Geometry',
generator: 'Geometry.toJSON'
}};
data.uuid=this.uuid;
data.type=this.type;
if(this.name!=='') data.name=this.name;
if(this.parameters!==undefined){
var parameters=this.parameters;
for(var key in parameters){
if(parameters[ key ]!==undefined) data[ key ]=parameters[ key ];
}
return data;
}
var vertices=[];
for(var i=0; i < this.vertices.length; i ++){
var vertex=this.vertices[ i ];
vertices.push(vertex.x, vertex.y, vertex.z);
}
var faces=[];
var normals=[];
var normalsHash={};
var colors=[];
var colorsHash={};
var uvs=[];
var uvsHash={};
for(var i=0; i < this.faces.length; i ++){
var face=this.faces[ i ];
var hasMaterial=true;
var hasFaceUv=false;
var hasFaceVertexUv=this.faceVertexUvs[ 0 ][ i ]!==undefined;
var hasFaceNormal=face.normal.length() > 0;
var hasFaceVertexNormal=face.vertexNormals.length > 0;
var hasFaceColor=face.color.r!==1||face.color.g!==1||face.color.b!==1;
var hasFaceVertexColor=face.vertexColors.length > 0;
var faceType=0;
faceType=setBit(faceType, 0, 0);
faceType=setBit(faceType, 1, hasMaterial);
faceType=setBit(faceType, 2, hasFaceUv);
faceType=setBit(faceType, 3, hasFaceVertexUv);
faceType=setBit(faceType, 4, hasFaceNormal);
faceType=setBit(faceType, 5, hasFaceVertexNormal);
faceType=setBit(faceType, 6, hasFaceColor);
faceType=setBit(faceType, 7, hasFaceVertexColor);
faces.push(faceType);
faces.push(face.a, face.b, face.c);
faces.push(face.materialIndex);
if(hasFaceVertexUv){
var faceVertexUvs=this.faceVertexUvs[ 0 ][ i ];
faces.push(getUvIndex(faceVertexUvs[ 0 ]),
getUvIndex(faceVertexUvs[ 1 ]),
getUvIndex(faceVertexUvs[ 2 ])
);
}
if(hasFaceNormal){
faces.push(getNormalIndex(face.normal) );
}
if(hasFaceVertexNormal){
var vertexNormals=face.vertexNormals;
faces.push(getNormalIndex(vertexNormals[ 0 ]),
getNormalIndex(vertexNormals[ 1 ]),
getNormalIndex(vertexNormals[ 2 ])
);
}
if(hasFaceColor){
faces.push(getColorIndex(face.color) );
}
if(hasFaceVertexColor){
var vertexColors=face.vertexColors;
faces.push(getColorIndex(vertexColors[ 0 ]),
getColorIndex(vertexColors[ 1 ]),
getColorIndex(vertexColors[ 2 ])
);
}}
function setBit(value, position, enabled){
return enabled ? value |(1 << position):value &(~(1 << position) );
}
function getNormalIndex(normal){
var hash=normal.x.toString() + normal.y.toString() + normal.z.toString();
if(normalsHash[ hash ]!==undefined){
return normalsHash[ hash ];
}
normalsHash[ hash ]=normals.length / 3;
normals.push(normal.x, normal.y, normal.z);
return normalsHash[ hash ];
}
function getColorIndex(color){
var hash=color.r.toString() + color.g.toString() + color.b.toString();
if(colorsHash[ hash ]!==undefined){
return colorsHash[ hash ];
}
colorsHash[ hash ]=colors.length;
colors.push(color.getHex());
return colorsHash[ hash ];
}
function getUvIndex(uv){
var hash=uv.x.toString() + uv.y.toString();
if(uvsHash[ hash ]!==undefined){
return uvsHash[ hash ];
}
uvsHash[ hash ]=uvs.length / 2;
uvs.push(uv.x, uv.y);
return uvsHash[ hash ];
}
data.data={};
data.data.vertices=vertices;
data.data.normals=normals;
if(colors.length > 0) data.data.colors=colors;
if(uvs.length > 0) data.data.uvs=[ uvs ];
data.data.faces=faces;
return data;
},
clone: function (){
return new Geometry().copy(this);
},
copy: function(source){
var i, il, j, jl, k, kl;
this.vertices=[];
this.colors=[];
this.faces=[];
this.faceVertexUvs=[[]];
this.morphTargets=[];
this.morphNormals=[];
this.skinWeights=[];
this.skinIndices=[];
this.lineDistances=[];
this.boundingBox=null;
this.boundingSphere=null;
this.name=source.name;
var vertices=source.vertices;
for(i=0, il=vertices.length; i < il; i ++){
this.vertices.push(vertices[ i ].clone());
}
var colors=source.colors;
for(i=0, il=colors.length; i < il; i ++){
this.colors.push(colors[ i ].clone());
}
var faces=source.faces;
for(i=0, il=faces.length; i < il; i ++){
this.faces.push(faces[ i ].clone());
}
for(i=0, il=source.faceVertexUvs.length; i < il; i ++){
var faceVertexUvs=source.faceVertexUvs[ i ];
if(this.faceVertexUvs[ i ]===undefined){
this.faceVertexUvs[ i ]=[];
}
for(j=0, jl=faceVertexUvs.length; j < jl; j ++){
var uvs=faceVertexUvs[ j ], uvsCopy=[];
for(k=0, kl=uvs.length; k < kl; k ++){
var uv=uvs[ k ];
uvsCopy.push(uv.clone());
}
this.faceVertexUvs[ i ].push(uvsCopy);
}}
var morphTargets=source.morphTargets;
for(i=0, il=morphTargets.length; i < il; i ++){
var morphTarget={};
morphTarget.name=morphTargets[ i ].name;
if(morphTargets[ i ].vertices!==undefined){
morphTarget.vertices=[];
for(j=0, jl=morphTargets[ i ].vertices.length; j < jl; j ++){
morphTarget.vertices.push(morphTargets[ i ].vertices[ j ].clone());
}}
if(morphTargets[ i ].normals!==undefined){
morphTarget.normals=[];
for(j=0, jl=morphTargets[ i ].normals.length; j < jl; j ++){
morphTarget.normals.push(morphTargets[ i ].normals[ j ].clone());
}}
this.morphTargets.push(morphTarget);
}
var morphNormals=source.morphNormals;
for(i=0, il=morphNormals.length; i < il; i ++){
var morphNormal={};
if(morphNormals[ i ].vertexNormals!==undefined){
morphNormal.vertexNormals=[];
for(j=0, jl=morphNormals[ i ].vertexNormals.length; j < jl; j ++){
var srcVertexNormal=morphNormals[ i ].vertexNormals[ j ];
var destVertexNormal={};
destVertexNormal.a=srcVertexNormal.a.clone();
destVertexNormal.b=srcVertexNormal.b.clone();
destVertexNormal.c=srcVertexNormal.c.clone();
morphNormal.vertexNormals.push(destVertexNormal);
}}
if(morphNormals[ i ].faceNormals!==undefined){
morphNormal.faceNormals=[];
for(j=0, jl=morphNormals[ i ].faceNormals.length; j < jl; j ++){
morphNormal.faceNormals.push(morphNormals[ i ].faceNormals[ j ].clone());
}}
this.morphNormals.push(morphNormal);
}
var skinWeights=source.skinWeights;
for(i=0, il=skinWeights.length; i < il; i ++){
this.skinWeights.push(skinWeights[ i ].clone());
}
var skinIndices=source.skinIndices;
for(i=0, il=skinIndices.length; i < il; i ++){
this.skinIndices.push(skinIndices[ i ].clone());
}
var lineDistances=source.lineDistances;
for(i=0, il=lineDistances.length; i < il; i ++){
this.lineDistances.push(lineDistances[ i ]);
}
var boundingBox=source.boundingBox;
if(boundingBox!==null){
this.boundingBox=boundingBox.clone();
}
var boundingSphere=source.boundingSphere;
if(boundingSphere!==null){
this.boundingSphere=boundingSphere.clone();
}
this.elementsNeedUpdate=source.elementsNeedUpdate;
this.verticesNeedUpdate=source.verticesNeedUpdate;
this.uvsNeedUpdate=source.uvsNeedUpdate;
this.normalsNeedUpdate=source.normalsNeedUpdate;
this.colorsNeedUpdate=source.colorsNeedUpdate;
this.lineDistancesNeedUpdate=source.lineDistancesNeedUpdate;
this.groupsNeedUpdate=source.groupsNeedUpdate;
return this;
},
dispose: function (){
this.dispatchEvent({ type: 'dispose' });
}});
function BufferAttribute(array, itemSize, normalized){
if(Array.isArray(array) ){
throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');
}
this.name='';
this.array=array;
this.itemSize=itemSize;
this.count=array!==undefined ? array.length / itemSize:0;
this.normalized=normalized===true;
this.dynamic=false;
this.updateRange={ offset: 0, count: - 1 };
this.version=0;
}
Object.defineProperty(BufferAttribute.prototype, 'needsUpdate', {
set: function(value){
if(value===true) this.version ++;
}});
Object.assign(BufferAttribute.prototype, {
isBufferAttribute: true,
onUploadCallback: function (){},
setArray: function(array){
if(Array.isArray(array) ){
throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');
}
this.count=array!==undefined ? array.length / this.itemSize:0;
this.array=array;
return this;
},
setDynamic: function(value){
this.dynamic=value;
return this;
},
copy: function(source){
this.name=source.name;
this.array=new source.array.constructor(source.array);
this.itemSize=source.itemSize;
this.count=source.count;
this.normalized=source.normalized;
this.dynamic=source.dynamic;
return this;
},
copyAt: function(index1, attribute, index2){
index1 *=this.itemSize;
index2 *=attribute.itemSize;
for(var i=0, l=this.itemSize; i < l; i ++){
this.array[ index1 + i ]=attribute.array[ index2 + i ];
}
return this;
},
copyArray: function(array){
this.array.set(array);
return this;
},
copyColorsArray: function(colors){
var array=this.array, offset=0;
for(var i=0, l=colors.length; i < l; i ++){
var color=colors[ i ];
if(color===undefined){
console.warn('THREE.BufferAttribute.copyColorsArray(): color is undefined', i);
color=new Color();
}
array[ offset ++ ]=color.r;
array[ offset ++ ]=color.g;
array[ offset ++ ]=color.b;
}
return this;
},
copyVector2sArray: function(vectors){
var array=this.array, offset=0;
for(var i=0, l=vectors.length; i < l; i ++){
var vector=vectors[ i ];
if(vector===undefined){
console.warn('THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i);
vector=new Vector2();
}
array[ offset ++ ]=vector.x;
array[ offset ++ ]=vector.y;
}
return this;
},
copyVector3sArray: function(vectors){
var array=this.array, offset=0;
for(var i=0, l=vectors.length; i < l; i ++){
var vector=vectors[ i ];
if(vector===undefined){
console.warn('THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i);
vector=new Vector3();
}
array[ offset ++ ]=vector.x;
array[ offset ++ ]=vector.y;
array[ offset ++ ]=vector.z;
}
return this;
},
copyVector4sArray: function(vectors){
var array=this.array, offset=0;
for(var i=0, l=vectors.length; i < l; i ++){
var vector=vectors[ i ];
if(vector===undefined){
console.warn('THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i);
vector=new Vector4();
}
array[ offset ++ ]=vector.x;
array[ offset ++ ]=vector.y;
array[ offset ++ ]=vector.z;
array[ offset ++ ]=vector.w;
}
return this;
},
set: function(value, offset){
if(offset===undefined) offset=0;
this.array.set(value, offset);
return this;
},
getX: function(index){
return this.array[ index * this.itemSize ];
},
setX: function(index, x){
this.array[ index * this.itemSize ]=x;
return this;
},
getY: function(index){
return this.array[ index * this.itemSize + 1 ];
},
setY: function(index, y){
this.array[ index * this.itemSize + 1 ]=y;
return this;
},
getZ: function(index){
return this.array[ index * this.itemSize + 2 ];
},
setZ: function(index, z){
this.array[ index * this.itemSize + 2 ]=z;
return this;
},
getW: function(index){
return this.array[ index * this.itemSize + 3 ];
},
setW: function(index, w){
this.array[ index * this.itemSize + 3 ]=w;
return this;
},
setXY: function(index, x, y){
index *=this.itemSize;
this.array[ index + 0 ]=x;
this.array[ index + 1 ]=y;
return this;
},
setXYZ: function(index, x, y, z){
index *=this.itemSize;
this.array[ index + 0 ]=x;
this.array[ index + 1 ]=y;
this.array[ index + 2 ]=z;
return this;
},
setXYZW: function(index, x, y, z, w){
index *=this.itemSize;
this.array[ index + 0 ]=x;
this.array[ index + 1 ]=y;
this.array[ index + 2 ]=z;
this.array[ index + 3 ]=w;
return this;
},
onUpload: function(callback){
this.onUploadCallback=callback;
return this;
},
clone: function (){
return new this.constructor(this.array, this.itemSize).copy(this);
}});
function Int8BufferAttribute(array, itemSize, normalized){
BufferAttribute.call(this, new Int8Array(array), itemSize, normalized);
}
Int8BufferAttribute.prototype=Object.create(BufferAttribute.prototype);
Int8BufferAttribute.prototype.constructor=Int8BufferAttribute;
function Uint8BufferAttribute(array, itemSize, normalized){
BufferAttribute.call(this, new Uint8Array(array), itemSize, normalized);
}
Uint8BufferAttribute.prototype=Object.create(BufferAttribute.prototype);
Uint8BufferAttribute.prototype.constructor=Uint8BufferAttribute;
function Uint8ClampedBufferAttribute(array, itemSize, normalized){
BufferAttribute.call(this, new Uint8ClampedArray(array), itemSize, normalized);
}
Uint8ClampedBufferAttribute.prototype=Object.create(BufferAttribute.prototype);
Uint8ClampedBufferAttribute.prototype.constructor=Uint8ClampedBufferAttribute;
function Int16BufferAttribute(array, itemSize, normalized){
BufferAttribute.call(this, new Int16Array(array), itemSize, normalized);
}
Int16BufferAttribute.prototype=Object.create(BufferAttribute.prototype);
Int16BufferAttribute.prototype.constructor=Int16BufferAttribute;
function Uint16BufferAttribute(array, itemSize, normalized){
BufferAttribute.call(this, new Uint16Array(array), itemSize, normalized);
}
Uint16BufferAttribute.prototype=Object.create(BufferAttribute.prototype);
Uint16BufferAttribute.prototype.constructor=Uint16BufferAttribute;
function Int32BufferAttribute(array, itemSize, normalized){
BufferAttribute.call(this, new Int32Array(array), itemSize, normalized);
}
Int32BufferAttribute.prototype=Object.create(BufferAttribute.prototype);
Int32BufferAttribute.prototype.constructor=Int32BufferAttribute;
function Uint32BufferAttribute(array, itemSize, normalized){
BufferAttribute.call(this, new Uint32Array(array), itemSize, normalized);
}
Uint32BufferAttribute.prototype=Object.create(BufferAttribute.prototype);
Uint32BufferAttribute.prototype.constructor=Uint32BufferAttribute;
function Float32BufferAttribute(array, itemSize, normalized){
BufferAttribute.call(this, new Float32Array(array), itemSize, normalized);
}
Float32BufferAttribute.prototype=Object.create(BufferAttribute.prototype);
Float32BufferAttribute.prototype.constructor=Float32BufferAttribute;
function Float64BufferAttribute(array, itemSize, normalized){
BufferAttribute.call(this, new Float64Array(array), itemSize, normalized);
}
Float64BufferAttribute.prototype=Object.create(BufferAttribute.prototype);
Float64BufferAttribute.prototype.constructor=Float64BufferAttribute;
function DirectGeometry(){
this.vertices=[];
this.normals=[];
this.colors=[];
this.uvs=[];
this.uvs2=[];
this.groups=[];
this.morphTargets={};
this.skinWeights=[];
this.skinIndices=[];
this.boundingBox=null;
this.boundingSphere=null;
this.verticesNeedUpdate=false;
this.normalsNeedUpdate=false;
this.colorsNeedUpdate=false;
this.uvsNeedUpdate=false;
this.groupsNeedUpdate=false;
}
Object.assign(DirectGeometry.prototype, {
computeGroups: function(geometry){
var group;
var groups=[];
var materialIndex=undefined;
var faces=geometry.faces;
for(var i=0; i < faces.length; i ++){
var face=faces[ i ];
if(face.materialIndex!==materialIndex){
materialIndex=face.materialIndex;
if(group!==undefined){
group.count=(i * 3) - group.start;
groups.push(group);
}
group={
start: i * 3,
materialIndex: materialIndex
};}}
if(group!==undefined){
group.count=(i * 3) - group.start;
groups.push(group);
}
this.groups=groups;
},
fromGeometry: function(geometry){
var faces=geometry.faces;
var vertices=geometry.vertices;
var faceVertexUvs=geometry.faceVertexUvs;
var hasFaceVertexUv=faceVertexUvs[ 0 ]&&faceVertexUvs[ 0 ].length > 0;
var hasFaceVertexUv2=faceVertexUvs[ 1 ]&&faceVertexUvs[ 1 ].length > 0;
var morphTargets=geometry.morphTargets;
var morphTargetsLength=morphTargets.length;
var morphTargetsPosition;
if(morphTargetsLength > 0){
morphTargetsPosition=[];
for(var i=0; i < morphTargetsLength; i ++){
morphTargetsPosition[ i ]=[];
}
this.morphTargets.position=morphTargetsPosition;
}
var morphNormals=geometry.morphNormals;
var morphNormalsLength=morphNormals.length;
var morphTargetsNormal;
if(morphNormalsLength > 0){
morphTargetsNormal=[];
for(var i=0; i < morphNormalsLength; i ++){
morphTargetsNormal[ i ]=[];
}
this.morphTargets.normal=morphTargetsNormal;
}
var skinIndices=geometry.skinIndices;
var skinWeights=geometry.skinWeights;
var hasSkinIndices=skinIndices.length===vertices.length;
var hasSkinWeights=skinWeights.length===vertices.length;
if(faces.length===0){
console.error('THREE.DirectGeometry: Faceless geometries are not supported.');
}
for(var i=0; i < faces.length; i ++){
var face=faces[ i ];
this.vertices.push(vertices[ face.a ], vertices[ face.b ], vertices[ face.c ]);
var vertexNormals=face.vertexNormals;
if(vertexNormals.length===3){
this.normals.push(vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ]);
}else{
var normal=face.normal;
this.normals.push(normal, normal, normal);
}
var vertexColors=face.vertexColors;
if(vertexColors.length===3){
this.colors.push(vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ]);
}else{
var color=face.color;
this.colors.push(color, color, color);
}
if(hasFaceVertexUv===true){
var vertexUvs=faceVertexUvs[ 0 ][ i ];
if(vertexUvs!==undefined){
this.uvs.push(vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ]);
}else{
console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i);
this.uvs.push(new Vector2(), new Vector2(), new Vector2());
}}
if(hasFaceVertexUv2===true){
var vertexUvs=faceVertexUvs[ 1 ][ i ];
if(vertexUvs!==undefined){
this.uvs2.push(vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ]);
}else{
console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i);
this.uvs2.push(new Vector2(), new Vector2(), new Vector2());
}}
for(var j=0; j < morphTargetsLength; j ++){
var morphTarget=morphTargets[ j ].vertices;
morphTargetsPosition[ j ].push(morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ]);
}
for(var j=0; j < morphNormalsLength; j ++){
var morphNormal=morphNormals[ j ].vertexNormals[ i ];
morphTargetsNormal[ j ].push(morphNormal.a, morphNormal.b, morphNormal.c);
}
if(hasSkinIndices){
this.skinIndices.push(skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ]);
}
if(hasSkinWeights){
this.skinWeights.push(skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ]);
}}
this.computeGroups(geometry);
this.verticesNeedUpdate=geometry.verticesNeedUpdate;
this.normalsNeedUpdate=geometry.normalsNeedUpdate;
this.colorsNeedUpdate=geometry.colorsNeedUpdate;
this.uvsNeedUpdate=geometry.uvsNeedUpdate;
this.groupsNeedUpdate=geometry.groupsNeedUpdate;
return this;
}});
function arrayMax(array){
if(array.length===0) return - Infinity;
var max=array[ 0 ];
for(var i=1, l=array.length; i < l; ++ i){
if(array[ i ] > max) max=array[ i ];
}
return max;
}
var bufferGeometryId=1;
function BufferGeometry(){
Object.defineProperty(this, 'id', { value: bufferGeometryId +=2 });
this.uuid=_Math.generateUUID();
this.name='';
this.type='BufferGeometry';
this.index=null;
this.attributes={};
this.morphAttributes={};
this.groups=[];
this.boundingBox=null;
this.boundingSphere=null;
this.drawRange={ start: 0, count: Infinity };
this.userData={};}
BufferGeometry.prototype=Object.assign(Object.create(EventDispatcher.prototype), {
constructor: BufferGeometry,
isBufferGeometry: true,
getIndex: function (){
return this.index;
},
setIndex: function(index){
if(Array.isArray(index) ){
this.index=new(arrayMax(index) > 65535 ? Uint32BufferAttribute:Uint16BufferAttribute)(index, 1);
}else{
this.index=index;
}},
addAttribute: function(name, attribute){
if(!(attribute&&attribute.isBufferAttribute)&&!(attribute&&attribute.isInterleavedBufferAttribute) ){
console.warn('THREE.BufferGeometry: .addAttribute() now expects(name, attribute).');
return this.addAttribute(name, new BufferAttribute(arguments[ 1 ], arguments[ 2 ]) );
}
if(name==='index'){
console.warn('THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.');
this.setIndex(attribute);
return this;
}
this.attributes[ name ]=attribute;
return this;
},
getAttribute: function(name){
return this.attributes[ name ];
},
removeAttribute: function(name){
delete this.attributes[ name ];
return this;
},
addGroup: function(start, count, materialIndex){
this.groups.push({
start: start,
count: count,
materialIndex: materialIndex!==undefined ? materialIndex:0
});
},
clearGroups: function (){
this.groups=[];
},
setDrawRange: function(start, count){
this.drawRange.start=start;
this.drawRange.count=count;
},
applyMatrix: function(matrix){
var position=this.attributes.position;
if(position!==undefined){
matrix.applyToBufferAttribute(position);
position.needsUpdate=true;
}
var normal=this.attributes.normal;
if(normal!==undefined){
var normalMatrix=new Matrix3().getNormalMatrix(matrix);
normalMatrix.applyToBufferAttribute(normal);
normal.needsUpdate=true;
}
if(this.boundingBox!==null){
this.computeBoundingBox();
}
if(this.boundingSphere!==null){
this.computeBoundingSphere();
}
return this;
},
rotateX: function (){
var m1=new Matrix4();
return function rotateX(angle){
m1.makeRotationX(angle);
this.applyMatrix(m1);
return this;
};}(),
rotateY: function (){
var m1=new Matrix4();
return function rotateY(angle){
m1.makeRotationY(angle);
this.applyMatrix(m1);
return this;
};}(),
rotateZ: function (){
var m1=new Matrix4();
return function rotateZ(angle){
m1.makeRotationZ(angle);
this.applyMatrix(m1);
return this;
};}(),
translate: function (){
var m1=new Matrix4();
return function translate(x, y, z){
m1.makeTranslation(x, y, z);
this.applyMatrix(m1);
return this;
};}(),
scale: function (){
var m1=new Matrix4();
return function scale(x, y, z){
m1.makeScale(x, y, z);
this.applyMatrix(m1);
return this;
};}(),
lookAt: function (){
var obj=new Object3D();
return function lookAt(vector){
obj.lookAt(vector);
obj.updateMatrix();
this.applyMatrix(obj.matrix);
};}(),
center: function (){
var offset=new Vector3();
return function center(){
this.computeBoundingBox();
this.boundingBox.getCenter(offset).negate();
this.translate(offset.x, offset.y, offset.z);
return this;
};}(),
setFromObject: function(object){
var geometry=object.geometry;
if(object.isPoints||object.isLine){
var positions=new Float32BufferAttribute(geometry.vertices.length * 3, 3);
var colors=new Float32BufferAttribute(geometry.colors.length * 3, 3);
this.addAttribute('position', positions.copyVector3sArray(geometry.vertices) );
this.addAttribute('color', colors.copyColorsArray(geometry.colors) );
if(geometry.lineDistances&&geometry.lineDistances.length===geometry.vertices.length){
var lineDistances=new Float32BufferAttribute(geometry.lineDistances.length, 1);
this.addAttribute('lineDistance', lineDistances.copyArray(geometry.lineDistances) );
}
if(geometry.boundingSphere!==null){
this.boundingSphere=geometry.boundingSphere.clone();
}
if(geometry.boundingBox!==null){
this.boundingBox=geometry.boundingBox.clone();
}}else if(object.isMesh){
if(geometry&&geometry.isGeometry){
this.fromGeometry(geometry);
}}
return this;
},
setFromPoints: function(points){
var position=[];
for(var i=0, l=points.length; i < l; i ++){
var point=points[ i ];
position.push(point.x, point.y, point.z||0);
}
this.addAttribute('position', new Float32BufferAttribute(position, 3) );
return this;
},
updateFromObject: function(object){
var geometry=object.geometry;
if(object.isMesh){
var direct=geometry.__directGeometry;
if(geometry.elementsNeedUpdate===true){
direct=undefined;
geometry.elementsNeedUpdate=false;
}
if(direct===undefined){
return this.fromGeometry(geometry);
}
direct.verticesNeedUpdate=geometry.verticesNeedUpdate;
direct.normalsNeedUpdate=geometry.normalsNeedUpdate;
direct.colorsNeedUpdate=geometry.colorsNeedUpdate;
direct.uvsNeedUpdate=geometry.uvsNeedUpdate;
direct.groupsNeedUpdate=geometry.groupsNeedUpdate;
geometry.verticesNeedUpdate=false;
geometry.normalsNeedUpdate=false;
geometry.colorsNeedUpdate=false;
geometry.uvsNeedUpdate=false;
geometry.groupsNeedUpdate=false;
geometry=direct;
}
var attribute;
if(geometry.verticesNeedUpdate===true){
attribute=this.attributes.position;
if(attribute!==undefined){
attribute.copyVector3sArray(geometry.vertices);
attribute.needsUpdate=true;
}
geometry.verticesNeedUpdate=false;
}
if(geometry.normalsNeedUpdate===true){
attribute=this.attributes.normal;
if(attribute!==undefined){
attribute.copyVector3sArray(geometry.normals);
attribute.needsUpdate=true;
}
geometry.normalsNeedUpdate=false;
}
if(geometry.colorsNeedUpdate===true){
attribute=this.attributes.color;
if(attribute!==undefined){
attribute.copyColorsArray(geometry.colors);
attribute.needsUpdate=true;
}
geometry.colorsNeedUpdate=false;
}
if(geometry.uvsNeedUpdate){
attribute=this.attributes.uv;
if(attribute!==undefined){
attribute.copyVector2sArray(geometry.uvs);
attribute.needsUpdate=true;
}
geometry.uvsNeedUpdate=false;
}
if(geometry.lineDistancesNeedUpdate){
attribute=this.attributes.lineDistance;
if(attribute!==undefined){
attribute.copyArray(geometry.lineDistances);
attribute.needsUpdate=true;
}
geometry.lineDistancesNeedUpdate=false;
}
if(geometry.groupsNeedUpdate){
geometry.computeGroups(object.geometry);
this.groups=geometry.groups;
geometry.groupsNeedUpdate=false;
}
return this;
},
fromGeometry: function(geometry){
geometry.__directGeometry=new DirectGeometry().fromGeometry(geometry);
return this.fromDirectGeometry(geometry.__directGeometry);
},
fromDirectGeometry: function(geometry){
var positions=new Float32Array(geometry.vertices.length * 3);
this.addAttribute('position', new BufferAttribute(positions, 3).copyVector3sArray(geometry.vertices) );
if(geometry.normals.length > 0){
var normals=new Float32Array(geometry.normals.length * 3);
this.addAttribute('normal', new BufferAttribute(normals, 3).copyVector3sArray(geometry.normals) );
}
if(geometry.colors.length > 0){
var colors=new Float32Array(geometry.colors.length * 3);
this.addAttribute('color', new BufferAttribute(colors, 3).copyColorsArray(geometry.colors) );
}
if(geometry.uvs.length > 0){
var uvs=new Float32Array(geometry.uvs.length * 2);
this.addAttribute('uv', new BufferAttribute(uvs, 2).copyVector2sArray(geometry.uvs) );
}
if(geometry.uvs2.length > 0){
var uvs2=new Float32Array(geometry.uvs2.length * 2);
this.addAttribute('uv2', new BufferAttribute(uvs2, 2).copyVector2sArray(geometry.uvs2) );
}
this.groups=geometry.groups;
for(var name in geometry.morphTargets){
var array=[];
var morphTargets=geometry.morphTargets[ name ];
for(var i=0, l=morphTargets.length; i < l; i ++){
var morphTarget=morphTargets[ i ];
var attribute=new Float32BufferAttribute(morphTarget.length * 3, 3);
array.push(attribute.copyVector3sArray(morphTarget) );
}
this.morphAttributes[ name ]=array;
}
if(geometry.skinIndices.length > 0){
var skinIndices=new Float32BufferAttribute(geometry.skinIndices.length * 4, 4);
this.addAttribute('skinIndex', skinIndices.copyVector4sArray(geometry.skinIndices) );
}
if(geometry.skinWeights.length > 0){
var skinWeights=new Float32BufferAttribute(geometry.skinWeights.length * 4, 4);
this.addAttribute('skinWeight', skinWeights.copyVector4sArray(geometry.skinWeights) );
}
if(geometry.boundingSphere!==null){
this.boundingSphere=geometry.boundingSphere.clone();
}
if(geometry.boundingBox!==null){
this.boundingBox=geometry.boundingBox.clone();
}
return this;
},
computeBoundingBox: function (){
if(this.boundingBox===null){
this.boundingBox=new Box3();
}
var position=this.attributes.position;
if(position!==undefined){
this.boundingBox.setFromBufferAttribute(position);
}else{
this.boundingBox.makeEmpty();
}
if(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z) ){
console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this);
}},
computeBoundingSphere: function (){
var box=new Box3();
var vector=new Vector3();
return function computeBoundingSphere(){
if(this.boundingSphere===null){
this.boundingSphere=new Sphere();
}
var position=this.attributes.position;
if(position){
var center=this.boundingSphere.center;
box.setFromBufferAttribute(position);
box.getCenter(center);
var maxRadiusSq=0;
for(var i=0, il=position.count; i < il; i ++){
vector.x=position.getX(i);
vector.y=position.getY(i);
vector.z=position.getZ(i);
maxRadiusSq=Math.max(maxRadiusSq, center.distanceToSquared(vector) );
}
this.boundingSphere.radius=Math.sqrt(maxRadiusSq);
if(isNaN(this.boundingSphere.radius) ){
console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this);
}}
};}(),
computeFaceNormals: function (){
},
computeVertexNormals: function (){
var index=this.index;
var attributes=this.attributes;
var groups=this.groups;
if(attributes.position){
var positions=attributes.position.array;
if(attributes.normal===undefined){
this.addAttribute('normal', new BufferAttribute(new Float32Array(positions.length), 3) );
}else{
var array=attributes.normal.array;
for(var i=0, il=array.length; i < il; i ++){
array[ i ]=0;
}}
var normals=attributes.normal.array;
var vA, vB, vC;
var pA=new Vector3(), pB=new Vector3(), pC=new Vector3();
var cb=new Vector3(), ab=new Vector3();
if(index){
var indices=index.array;
if(groups.length===0){
this.addGroup(0, indices.length);
}
for(var j=0, jl=groups.length; j < jl; ++ j){
var group=groups[ j ];
var start=group.start;
var count=group.count;
for(var i=start, il=start + count; i < il; i +=3){
vA=indices[ i + 0 ] * 3;
vB=indices[ i + 1 ] * 3;
vC=indices[ i + 2 ] * 3;
pA.fromArray(positions, vA);
pB.fromArray(positions, vB);
pC.fromArray(positions, vC);
cb.subVectors(pC, pB);
ab.subVectors(pA, pB);
cb.cross(ab);
normals[ vA ] +=cb.x;
normals[ vA + 1 ] +=cb.y;
normals[ vA + 2 ] +=cb.z;
normals[ vB ] +=cb.x;
normals[ vB + 1 ] +=cb.y;
normals[ vB + 2 ] +=cb.z;
normals[ vC ] +=cb.x;
normals[ vC + 1 ] +=cb.y;
normals[ vC + 2 ] +=cb.z;
}}
}else{
for(var i=0, il=positions.length; i < il; i +=9){
pA.fromArray(positions, i);
pB.fromArray(positions, i + 3);
pC.fromArray(positions, i + 6);
cb.subVectors(pC, pB);
ab.subVectors(pA, pB);
cb.cross(ab);
normals[ i ]=cb.x;
normals[ i + 1 ]=cb.y;
normals[ i + 2 ]=cb.z;
normals[ i + 3 ]=cb.x;
normals[ i + 4 ]=cb.y;
normals[ i + 5 ]=cb.z;
normals[ i + 6 ]=cb.x;
normals[ i + 7 ]=cb.y;
normals[ i + 8 ]=cb.z;
}}
this.normalizeNormals();
attributes.normal.needsUpdate=true;
}},
merge: function(geometry, offset){
if(!(geometry&&geometry.isBufferGeometry) ){
console.error('THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry);
return;
}
if(offset===undefined){
offset=0;
console.warn('THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '
+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'
);
}
var attributes=this.attributes;
for(var key in attributes){
if(geometry.attributes[ key ]===undefined) continue;
var attribute1=attributes[ key ];
var attributeArray1=attribute1.array;
var attribute2=geometry.attributes[ key ];
var attributeArray2=attribute2.array;
var attributeSize=attribute2.itemSize;
for(var i=0, j=attributeSize * offset; i < attributeArray2.length; i ++, j ++){
attributeArray1[ j ]=attributeArray2[ i ];
}}
return this;
},
normalizeNormals: function (){
var vector=new Vector3();
return function normalizeNormals(){
var normals=this.attributes.normal;
for(var i=0, il=normals.count; i < il; i ++){
vector.x=normals.getX(i);
vector.y=normals.getY(i);
vector.z=normals.getZ(i);
vector.normalize();
normals.setXYZ(i, vector.x, vector.y, vector.z);
}};}(),
toNonIndexed: function (){
if(this.index===null){
console.warn('THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.');
return this;
}
var geometry2=new BufferGeometry();
var indices=this.index.array;
var attributes=this.attributes;
for(var name in attributes){
var attribute=attributes[ name ];
var array=attribute.array;
var itemSize=attribute.itemSize;
var array2=new array.constructor(indices.length * itemSize);
var index=0, index2=0;
for(var i=0, l=indices.length; i < l; i ++){
index=indices[ i ] * itemSize;
for(var j=0; j < itemSize; j ++){
array2[ index2 ++ ]=array[ index ++ ];
}}
geometry2.addAttribute(name, new BufferAttribute(array2, itemSize) );
}
var groups=this.groups;
for(var i=0, l=groups.length; i < l; i ++){
var group=groups[ i ];
geometry2.addGroup(group.start, group.count, group.materialIndex);
}
return geometry2;
},
toJSON: function (){
var data={
metadata: {
version: 4.5,
type: 'BufferGeometry',
generator: 'BufferGeometry.toJSON'
}};
data.uuid=this.uuid;
data.type=this.type;
if(this.name!=='') data.name=this.name;
if(Object.keys(this.userData).length > 0) data.userData=this.userData;
if(this.parameters!==undefined){
var parameters=this.parameters;
for(var key in parameters){
if(parameters[ key ]!==undefined) data[ key ]=parameters[ key ];
}
return data;
}
data.data={ attributes: {}};
var index=this.index;
if(index!==null){
var array=Array.prototype.slice.call(index.array);
data.data.index={
type: index.array.constructor.name,
array: array
};}
var attributes=this.attributes;
for(var key in attributes){
var attribute=attributes[ key ];
var array=Array.prototype.slice.call(attribute.array);
data.data.attributes[ key ]={
itemSize: attribute.itemSize,
type: attribute.array.constructor.name,
array: array,
normalized: attribute.normalized
};}
var groups=this.groups;
if(groups.length > 0){
data.data.groups=JSON.parse(JSON.stringify(groups) );
}
var boundingSphere=this.boundingSphere;
if(boundingSphere!==null){
data.data.boundingSphere={
center: boundingSphere.center.toArray(),
radius: boundingSphere.radius
};}
return data;
},
clone: function (){
return new BufferGeometry().copy(this);
},
copy: function(source){
var name, i, l;
this.index=null;
this.attributes={};
this.morphAttributes={};
this.groups=[];
this.boundingBox=null;
this.boundingSphere=null;
this.name=source.name;
var index=source.index;
if(index!==null){
this.setIndex(index.clone());
}
var attributes=source.attributes;
for(name in attributes){
var attribute=attributes[ name ];
this.addAttribute(name, attribute.clone());
}
var morphAttributes=source.morphAttributes;
for(name in morphAttributes){
var array=[];
var morphAttribute=morphAttributes[ name ];
for(i=0, l=morphAttribute.length; i < l; i ++){
array.push(morphAttribute[ i ].clone());
}
this.morphAttributes[ name ]=array;
}
var groups=source.groups;
for(i=0, l=groups.length; i < l; i ++){
var group=groups[ i ];
this.addGroup(group.start, group.count, group.materialIndex);
}
var boundingBox=source.boundingBox;
if(boundingBox!==null){
this.boundingBox=boundingBox.clone();
}
var boundingSphere=source.boundingSphere;
if(boundingSphere!==null){
this.boundingSphere=boundingSphere.clone();
}
this.drawRange.start=source.drawRange.start;
this.drawRange.count=source.drawRange.count;
this.userData=source.userData;
return this;
},
dispose: function (){
this.dispatchEvent({ type: 'dispose' });
}});
function BoxGeometry(width, height, depth, widthSegments, heightSegments, depthSegments){
Geometry.call(this);
this.type='BoxGeometry';
this.parameters={
width: width,
height: height,
depth: depth,
widthSegments: widthSegments,
heightSegments: heightSegments,
depthSegments: depthSegments
};
this.fromBufferGeometry(new BoxBufferGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) );
this.mergeVertices();
}
BoxGeometry.prototype=Object.create(Geometry.prototype);
BoxGeometry.prototype.constructor=BoxGeometry;
function BoxBufferGeometry(width, height, depth, widthSegments, heightSegments, depthSegments){
BufferGeometry.call(this);
this.type='BoxBufferGeometry';
this.parameters={
width: width,
height: height,
depth: depth,
widthSegments: widthSegments,
heightSegments: heightSegments,
depthSegments: depthSegments
};
var scope=this;
width=width||1;
height=height||1;
depth=depth||1;
widthSegments=Math.floor(widthSegments)||1;
heightSegments=Math.floor(heightSegments)||1;
depthSegments=Math.floor(depthSegments)||1;
var indices=[];
var vertices=[];
var normals=[];
var uvs=[];
var numberOfVertices=0;
var groupStart=0;
buildPlane('z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0);
buildPlane('z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1);
buildPlane('x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2);
buildPlane('x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3);
buildPlane('x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4);
buildPlane('x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5);
this.setIndex(indices);
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
this.addAttribute('normal', new Float32BufferAttribute(normals, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvs, 2) );
function buildPlane(u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex){
var segmentWidth=width / gridX;
var segmentHeight=height / gridY;
var widthHalf=width / 2;
var heightHalf=height / 2;
var depthHalf=depth / 2;
var gridX1=gridX + 1;
var gridY1=gridY + 1;
var vertexCounter=0;
var groupCount=0;
var ix, iy;
var vector=new Vector3();
for(iy=0; iy < gridY1; iy ++){
var y=iy * segmentHeight - heightHalf;
for(ix=0; ix < gridX1; ix ++){
var x=ix * segmentWidth - widthHalf;
vector[ u ]=x * udir;
vector[ v ]=y * vdir;
vector[ w ]=depthHalf;
vertices.push(vector.x, vector.y, vector.z);
vector[ u ]=0;
vector[ v ]=0;
vector[ w ]=depth > 0 ? 1:- 1;
normals.push(vector.x, vector.y, vector.z);
uvs.push(ix / gridX);
uvs.push(1 -(iy / gridY) );
vertexCounter +=1;
}}
for(iy=0; iy < gridY; iy ++){
for(ix=0; ix < gridX; ix ++){
var a=numberOfVertices + ix + gridX1 * iy;
var b=numberOfVertices + ix + gridX1 *(iy + 1);
var c=numberOfVertices +(ix + 1) + gridX1 *(iy + 1);
var d=numberOfVertices +(ix + 1) + gridX1 * iy;
indices.push(a, b, d);
indices.push(b, c, d);
groupCount +=6;
}}
scope.addGroup(groupStart, groupCount, materialIndex);
groupStart +=groupCount;
numberOfVertices +=vertexCounter;
}}
BoxBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
BoxBufferGeometry.prototype.constructor=BoxBufferGeometry;
function PlaneGeometry(width, height, widthSegments, heightSegments){
Geometry.call(this);
this.type='PlaneGeometry';
this.parameters={
width: width,
height: height,
widthSegments: widthSegments,
heightSegments: heightSegments
};
this.fromBufferGeometry(new PlaneBufferGeometry(width, height, widthSegments, heightSegments) );
this.mergeVertices();
}
PlaneGeometry.prototype=Object.create(Geometry.prototype);
PlaneGeometry.prototype.constructor=PlaneGeometry;
function PlaneBufferGeometry(width, height, widthSegments, heightSegments){
BufferGeometry.call(this);
this.type='PlaneBufferGeometry';
this.parameters={
width: width,
height: height,
widthSegments: widthSegments,
heightSegments: heightSegments
};
width=width||1;
height=height||1;
var width_half=width / 2;
var height_half=height / 2;
var gridX=Math.floor(widthSegments)||1;
var gridY=Math.floor(heightSegments)||1;
var gridX1=gridX + 1;
var gridY1=gridY + 1;
var segment_width=width / gridX;
var segment_height=height / gridY;
var ix, iy;
var indices=[];
var vertices=[];
var normals=[];
var uvs=[];
for(iy=0; iy < gridY1; iy ++){
var y=iy * segment_height - height_half;
for(ix=0; ix < gridX1; ix ++){
var x=ix * segment_width - width_half;
vertices.push(x, - y, 0);
normals.push(0, 0, 1);
uvs.push(ix / gridX);
uvs.push(1 -(iy / gridY) );
}}
for(iy=0; iy < gridY; iy ++){
for(ix=0; ix < gridX; ix ++){
var a=ix + gridX1 * iy;
var b=ix + gridX1 *(iy + 1);
var c=(ix + 1) + gridX1 *(iy + 1);
var d=(ix + 1) + gridX1 * iy;
indices.push(a, b, d);
indices.push(b, c, d);
}}
this.setIndex(indices);
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
this.addAttribute('normal', new Float32BufferAttribute(normals, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvs, 2) );
}
PlaneBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
PlaneBufferGeometry.prototype.constructor=PlaneBufferGeometry;
var materialId=0;
function Material(){
Object.defineProperty(this, 'id', { value: materialId ++ });
this.uuid=_Math.generateUUID();
this.name='';
this.type='Material';
this.fog=true;
this.lights=true;
this.blending=NormalBlending;
this.side=FrontSide;
this.flatShading=false;
this.vertexColors=NoColors;
this.opacity=1;
this.transparent=false;
this.blendSrc=SrcAlphaFactor;
this.blendDst=OneMinusSrcAlphaFactor;
this.blendEquation=AddEquation;
this.blendSrcAlpha=null;
this.blendDstAlpha=null;
this.blendEquationAlpha=null;
this.depthFunc=LessEqualDepth;
this.depthTest=true;
this.depthWrite=true;
this.clippingPlanes=null;
this.clipIntersection=false;
this.clipShadows=false;
this.shadowSide=null;
this.colorWrite=true;
this.precision=null;
this.polygonOffset=false;
this.polygonOffsetFactor=0;
this.polygonOffsetUnits=0;
this.dithering=false;
this.alphaTest=0;
this.premultipliedAlpha=false;
this.overdraw=0;
this.visible=true;
this.userData={};
this.needsUpdate=true;
}
Material.prototype=Object.assign(Object.create(EventDispatcher.prototype), {
constructor: Material,
isMaterial: true,
onBeforeCompile: function (){},
setValues: function(values){
if(values===undefined) return;
for(var key in values){
var newValue=values[ key ];
if(newValue===undefined){
console.warn("THREE.Material: '" + key + "' parameter is undefined.");
continue;
}
if(key==='shading'){
console.warn('THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.');
this.flatShading=(newValue===FlatShading) ? true:false;
continue;
}
var currentValue=this[ key ];
if(currentValue===undefined){
console.warn("THREE." + this.type + ": '" + key + "' is not a property of this material.");
continue;
}
if(currentValue&&currentValue.isColor){
currentValue.set(newValue);
}else if(( currentValue&&currentValue.isVector3)&&(newValue&&newValue.isVector3) ){
currentValue.copy(newValue);
}else if(key==='overdraw'){
this[ key ]=Number(newValue);
}else{
this[ key ]=newValue;
}}
},
toJSON: function(meta){
var isRoot=(meta===undefined||typeof meta==='string');
if(isRoot){
meta={
textures: {},
images: {}};}
var data={
metadata: {
version: 4.5,
type: 'Material',
generator: 'Material.toJSON'
}};
data.uuid=this.uuid;
data.type=this.type;
if(this.name!=='') data.name=this.name;
if(this.color&&this.color.isColor) data.color=this.color.getHex();
if(this.roughness!==undefined) data.roughness=this.roughness;
if(this.metalness!==undefined) data.metalness=this.metalness;
if(this.emissive&&this.emissive.isColor) data.emissive=this.emissive.getHex();
if(this.emissiveIntensity!==1) data.emissiveIntensity=this.emissiveIntensity;
if(this.specular&&this.specular.isColor) data.specular=this.specular.getHex();
if(this.shininess!==undefined) data.shininess=this.shininess;
if(this.clearCoat!==undefined) data.clearCoat=this.clearCoat;
if(this.clearCoatRoughness!==undefined) data.clearCoatRoughness=this.clearCoatRoughness;
if(this.map&&this.map.isTexture) data.map=this.map.toJSON(meta).uuid;
if(this.alphaMap&&this.alphaMap.isTexture) data.alphaMap=this.alphaMap.toJSON(meta).uuid;
if(this.lightMap&&this.lightMap.isTexture) data.lightMap=this.lightMap.toJSON(meta).uuid;
if(this.aoMap&&this.aoMap.isTexture){
data.aoMap=this.aoMap.toJSON(meta).uuid;
data.aoMapIntensity=this.aoMapIntensity;
}
if(this.bumpMap&&this.bumpMap.isTexture){
data.bumpMap=this.bumpMap.toJSON(meta).uuid;
data.bumpScale=this.bumpScale;
}
if(this.normalMap&&this.normalMap.isTexture){
data.normalMap=this.normalMap.toJSON(meta).uuid;
data.normalScale=this.normalScale.toArray();
}
if(this.displacementMap&&this.displacementMap.isTexture){
data.displacementMap=this.displacementMap.toJSON(meta).uuid;
data.displacementScale=this.displacementScale;
data.displacementBias=this.displacementBias;
}
if(this.roughnessMap&&this.roughnessMap.isTexture) data.roughnessMap=this.roughnessMap.toJSON(meta).uuid;
if(this.metalnessMap&&this.metalnessMap.isTexture) data.metalnessMap=this.metalnessMap.toJSON(meta).uuid;
if(this.emissiveMap&&this.emissiveMap.isTexture) data.emissiveMap=this.emissiveMap.toJSON(meta).uuid;
if(this.specularMap&&this.specularMap.isTexture) data.specularMap=this.specularMap.toJSON(meta).uuid;
if(this.envMap&&this.envMap.isTexture){
data.envMap=this.envMap.toJSON(meta).uuid;
data.reflectivity=this.reflectivity;
}
if(this.gradientMap&&this.gradientMap.isTexture){
data.gradientMap=this.gradientMap.toJSON(meta).uuid;
}
if(this.size!==undefined) data.size=this.size;
if(this.sizeAttenuation!==undefined) data.sizeAttenuation=this.sizeAttenuation;
if(this.blending!==NormalBlending) data.blending=this.blending;
if(this.flatShading===true) data.flatShading=this.flatShading;
if(this.side!==FrontSide) data.side=this.side;
if(this.vertexColors!==NoColors) data.vertexColors=this.vertexColors;
if(this.opacity < 1) data.opacity=this.opacity;
if(this.transparent===true) data.transparent=this.transparent;
data.depthFunc=this.depthFunc;
data.depthTest=this.depthTest;
data.depthWrite=this.depthWrite;
if(this.rotation!==0) data.rotation=this.rotation;
if(this.linewidth!==1) data.linewidth=this.linewidth;
if(this.dashSize!==undefined) data.dashSize=this.dashSize;
if(this.gapSize!==undefined) data.gapSize=this.gapSize;
if(this.scale!==undefined) data.scale=this.scale;
if(this.dithering===true) data.dithering=true;
if(this.alphaTest > 0) data.alphaTest=this.alphaTest;
if(this.premultipliedAlpha===true) data.premultipliedAlpha=this.premultipliedAlpha;
if(this.wireframe===true) data.wireframe=this.wireframe;
if(this.wireframeLinewidth > 1) data.wireframeLinewidth=this.wireframeLinewidth;
if(this.wireframeLinecap!=='round') data.wireframeLinecap=this.wireframeLinecap;
if(this.wireframeLinejoin!=='round') data.wireframeLinejoin=this.wireframeLinejoin;
if(this.morphTargets===true) data.morphTargets=true;
if(this.skinning===true) data.skinning=true;
if(this.visible===false) data.visible=false;
if(JSON.stringify(this.userData)!=='{}') data.userData=this.userData;
function extractFromCache(cache){
var values=[];
for(var key in cache){
var data=cache[ key ];
delete data.metadata;
values.push(data);
}
return values;
}
if(isRoot){
var textures=extractFromCache(meta.textures);
var images=extractFromCache(meta.images);
if(textures.length > 0) data.textures=textures;
if(images.length > 0) data.images=images;
}
return data;
},
clone: function (){
return new this.constructor().copy(this);
},
copy: function(source){
this.name=source.name;
this.fog=source.fog;
this.lights=source.lights;
this.blending=source.blending;
this.side=source.side;
this.flatShading=source.flatShading;
this.vertexColors=source.vertexColors;
this.opacity=source.opacity;
this.transparent=source.transparent;
this.blendSrc=source.blendSrc;
this.blendDst=source.blendDst;
this.blendEquation=source.blendEquation;
this.blendSrcAlpha=source.blendSrcAlpha;
this.blendDstAlpha=source.blendDstAlpha;
this.blendEquationAlpha=source.blendEquationAlpha;
this.depthFunc=source.depthFunc;
this.depthTest=source.depthTest;
this.depthWrite=source.depthWrite;
this.colorWrite=source.colorWrite;
this.precision=source.precision;
this.polygonOffset=source.polygonOffset;
this.polygonOffsetFactor=source.polygonOffsetFactor;
this.polygonOffsetUnits=source.polygonOffsetUnits;
this.dithering=source.dithering;
this.alphaTest=source.alphaTest;
this.premultipliedAlpha=source.premultipliedAlpha;
this.overdraw=source.overdraw;
this.visible=source.visible;
this.userData=JSON.parse(JSON.stringify(source.userData) );
this.clipShadows=source.clipShadows;
this.clipIntersection=source.clipIntersection;
var srcPlanes=source.clippingPlanes,
dstPlanes=null;
if(srcPlanes!==null){
var n=srcPlanes.length;
dstPlanes=new Array(n);
for(var i=0; i!==n; ++ i)
dstPlanes[ i ]=srcPlanes[ i ].clone();
}
this.clippingPlanes=dstPlanes;
this.shadowSide=source.shadowSide;
return this;
},
dispose: function (){
this.dispatchEvent({ type: 'dispose' });
}});
function MeshBasicMaterial(parameters){
Material.call(this);
this.type='MeshBasicMaterial';
this.color=new Color(0xffffff);
this.map=null;
this.lightMap=null;
this.lightMapIntensity=1.0;
this.aoMap=null;
this.aoMapIntensity=1.0;
this.specularMap=null;
this.alphaMap=null;
this.envMap=null;
this.combine=MultiplyOperation;
this.reflectivity=1;
this.refractionRatio=0.98;
this.wireframe=false;
this.wireframeLinewidth=1;
this.wireframeLinecap='round';
this.wireframeLinejoin='round';
this.skinning=false;
this.morphTargets=false;
this.lights=false;
this.setValues(parameters);
}
MeshBasicMaterial.prototype=Object.create(Material.prototype);
MeshBasicMaterial.prototype.constructor=MeshBasicMaterial;
MeshBasicMaterial.prototype.isMeshBasicMaterial=true;
MeshBasicMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this, source);
this.color.copy(source.color);
this.map=source.map;
this.lightMap=source.lightMap;
this.lightMapIntensity=source.lightMapIntensity;
this.aoMap=source.aoMap;
this.aoMapIntensity=source.aoMapIntensity;
this.specularMap=source.specularMap;
this.alphaMap=source.alphaMap;
this.envMap=source.envMap;
this.combine=source.combine;
this.reflectivity=source.reflectivity;
this.refractionRatio=source.refractionRatio;
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
this.wireframeLinecap=source.wireframeLinecap;
this.wireframeLinejoin=source.wireframeLinejoin;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
return this;
};
function ShaderMaterial(parameters){
Material.call(this);
this.type='ShaderMaterial';
this.defines={};
this.uniforms={};
this.vertexShader='void main(){\n\tgl_Position=projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}';
this.fragmentShader='void main(){\n\tgl_FragColor=vec4(1.0, 0.0, 0.0, 1.0);\n}';
this.linewidth=1;
this.wireframe=false;
this.wireframeLinewidth=1;
this.fog=false;
this.lights=false;
this.clipping=false;
this.skinning=false;
this.morphTargets=false;
this.morphNormals=false;
this.extensions={
derivatives: false,
fragDepth: false,
drawBuffers: false,
shaderTextureLOD: false
};
this.defaultAttributeValues={
'color': [ 1, 1, 1 ],
'uv': [ 0, 0 ],
'uv2': [ 0, 0 ]
};
this.index0AttributeName=undefined;
this.uniformsNeedUpdate=false;
if(parameters!==undefined){
if(parameters.attributes!==undefined){
console.error('THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.');
}
this.setValues(parameters);
}}
ShaderMaterial.prototype=Object.create(Material.prototype);
ShaderMaterial.prototype.constructor=ShaderMaterial;
ShaderMaterial.prototype.isShaderMaterial=true;
ShaderMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this, source);
this.fragmentShader=source.fragmentShader;
this.vertexShader=source.vertexShader;
this.uniforms=UniformsUtils.clone(source.uniforms);
this.defines=Object.assign({}, source.defines);
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
this.lights=source.lights;
this.clipping=source.clipping;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
this.morphNormals=source.morphNormals;
this.extensions=source.extensions;
return this;
};
ShaderMaterial.prototype.toJSON=function(meta){
var data=Material.prototype.toJSON.call(this, meta);
data.uniforms=this.uniforms;
data.vertexShader=this.vertexShader;
data.fragmentShader=this.fragmentShader;
return data;
};
function Ray(origin, direction){
this.origin=(origin!==undefined) ? origin:new Vector3();
this.direction=(direction!==undefined) ? direction:new Vector3();
}
Object.assign(Ray.prototype, {
set: function(origin, direction){
this.origin.copy(origin);
this.direction.copy(direction);
return this;
},
clone: function (){
return new this.constructor().copy(this);
},
copy: function(ray){
this.origin.copy(ray.origin);
this.direction.copy(ray.direction);
return this;
},
at: function(t, target){
if(target===undefined){
console.warn('THREE.Ray: .at() target is now required');
target=new Vector3();
}
return target.copy(this.direction).multiplyScalar(t).add(this.origin);
},
lookAt: function(v){
this.direction.copy(v).sub(this.origin).normalize();
return this;
},
recast: function (){
var v1=new Vector3();
return function recast(t){
this.origin.copy(this.at(t, v1) );
return this;
};}(),
closestPointToPoint: function(point, target){
if(target===undefined){
console.warn('THREE.Ray: .closestPointToPoint() target is now required');
target=new Vector3();
}
target.subVectors(point, this.origin);
var directionDistance=target.dot(this.direction);
if(directionDistance < 0){
return target.copy(this.origin);
}
return target.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);
},
distanceToPoint: function(point){
return Math.sqrt(this.distanceSqToPoint(point) );
},
distanceSqToPoint: function (){
var v1=new Vector3();
return function distanceSqToPoint(point){
var directionDistance=v1.subVectors(point, this.origin).dot(this.direction);
if(directionDistance < 0){
return this.origin.distanceToSquared(point);
}
v1.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);
return v1.distanceToSquared(point);
};}(),
distanceSqToSegment: function (){
var segCenter=new Vector3();
var segDir=new Vector3();
var diff=new Vector3();
return function distanceSqToSegment(v0, v1, optionalPointOnRay, optionalPointOnSegment){
segCenter.copy(v0).add(v1).multiplyScalar(0.5);
segDir.copy(v1).sub(v0).normalize();
diff.copy(this.origin).sub(segCenter);
var segExtent=v0.distanceTo(v1) * 0.5;
var a01=- this.direction.dot(segDir);
var b0=diff.dot(this.direction);
var b1=- diff.dot(segDir);
var c=diff.lengthSq();
var det=Math.abs(1 - a01 * a01);
var s0, s1, sqrDist, extDet;
if(det > 0){
s0=a01 * b1 - b0;
s1=a01 * b0 - b1;
extDet=segExtent * det;
if(s0 >=0){
if(s1 >=- extDet){
if(s1 <=extDet){
var invDet=1 / det;
s0 *=invDet;
s1 *=invDet;
sqrDist=s0 *(s0 + a01 * s1 + 2 * b0) + s1 *(a01 * s0 + s1 + 2 * b1) + c;
}else{
s1=segExtent;
s0=Math.max(0, -(a01 * s1 + b0) );
sqrDist=- s0 * s0 + s1 *(s1 + 2 * b1) + c;
}}else{
s1=- segExtent;
s0=Math.max(0, -(a01 * s1 + b0) );
sqrDist=- s0 * s0 + s1 *(s1 + 2 * b1) + c;
}}else{
if(s1 <=- extDet){
s0=Math.max(0, -(- a01 * segExtent + b0) );
s1=(s0 > 0) ? - segExtent:Math.min(Math.max(- segExtent, - b1), segExtent);
sqrDist=- s0 * s0 + s1 *(s1 + 2 * b1) + c;
}else if(s1 <=extDet){
s0=0;
s1=Math.min(Math.max(- segExtent, - b1), segExtent);
sqrDist=s1 *(s1 + 2 * b1) + c;
}else{
s0=Math.max(0, -(a01 * segExtent + b0) );
s1=(s0 > 0) ? segExtent:Math.min(Math.max(- segExtent, - b1), segExtent);
sqrDist=- s0 * s0 + s1 *(s1 + 2 * b1) + c;
}}
}else{
s1=(a01 > 0) ? - segExtent:segExtent;
s0=Math.max(0, -(a01 * s1 + b0) );
sqrDist=- s0 * s0 + s1 *(s1 + 2 * b1) + c;
}
if(optionalPointOnRay){
optionalPointOnRay.copy(this.direction).multiplyScalar(s0).add(this.origin);
}
if(optionalPointOnSegment){
optionalPointOnSegment.copy(segDir).multiplyScalar(s1).add(segCenter);
}
return sqrDist;
};}(),
intersectSphere: function (){
var v1=new Vector3();
return function intersectSphere(sphere, target){
v1.subVectors(sphere.center, this.origin);
var tca=v1.dot(this.direction);
var d2=v1.dot(v1) - tca * tca;
var radius2=sphere.radius * sphere.radius;
if(d2 > radius2) return null;
var thc=Math.sqrt(radius2 - d2);
var t0=tca - thc;
var t1=tca + thc;
if(t0 < 0&&t1 < 0) return null;
if(t0 < 0) return this.at(t1, target);
return this.at(t0, target);
};}(),
intersectsSphere: function(sphere){
return this.distanceToPoint(sphere.center) <=sphere.radius;
},
distanceToPlane: function(plane){
var denominator=plane.normal.dot(this.direction);
if(denominator===0){
if(plane.distanceToPoint(this.origin)===0){
return 0;
}
return null;
}
var t=-(this.origin.dot(plane.normal) + plane.constant) / denominator;
return t >=0 ? t:null;
},
intersectPlane: function(plane, target){
var t=this.distanceToPlane(plane);
if(t===null){
return null;
}
return this.at(t, target);
},
intersectsPlane: function(plane){
var distToPoint=plane.distanceToPoint(this.origin);
if(distToPoint===0){
return true;
}
var denominator=plane.normal.dot(this.direction);
if(denominator * distToPoint < 0){
return true;
}
return false;
},
intersectBox: function(box, target){
var tmin, tmax, tymin, tymax, tzmin, tzmax;
var invdirx=1 / this.direction.x,
invdiry=1 / this.direction.y,
invdirz=1 / this.direction.z;
var origin=this.origin;
if(invdirx >=0){
tmin=(box.min.x - origin.x) * invdirx;
tmax=(box.max.x - origin.x) * invdirx;
}else{
tmin=(box.max.x - origin.x) * invdirx;
tmax=(box.min.x - origin.x) * invdirx;
}
if(invdiry >=0){
tymin=(box.min.y - origin.y) * invdiry;
tymax=(box.max.y - origin.y) * invdiry;
}else{
tymin=(box.max.y - origin.y) * invdiry;
tymax=(box.min.y - origin.y) * invdiry;
}
if(( tmin > tymax)||(tymin > tmax) ) return null;
if(tymin > tmin||tmin!==tmin) tmin=tymin;
if(tymax < tmax||tmax!==tmax) tmax=tymax;
if(invdirz >=0){
tzmin=(box.min.z - origin.z) * invdirz;
tzmax=(box.max.z - origin.z) * invdirz;
}else{
tzmin=(box.max.z - origin.z) * invdirz;
tzmax=(box.min.z - origin.z) * invdirz;
}
if(( tmin > tzmax)||(tzmin > tmax) ) return null;
if(tzmin > tmin||tmin!==tmin) tmin=tzmin;
if(tzmax < tmax||tmax!==tmax) tmax=tzmax;
if(tmax < 0) return null;
return this.at(tmin >=0 ? tmin:tmax, target);
},
intersectsBox:(function (){
var v=new Vector3();
return function intersectsBox(box){
return this.intersectBox(box, v)!==null;
};})(),
intersectTriangle: function (){
var diff=new Vector3();
var edge1=new Vector3();
var edge2=new Vector3();
var normal=new Vector3();
return function intersectTriangle(a, b, c, backfaceCulling, target){
edge1.subVectors(b, a);
edge2.subVectors(c, a);
normal.crossVectors(edge1, edge2);
var DdN=this.direction.dot(normal);
var sign;
if(DdN > 0){
if(backfaceCulling) return null;
sign=1;
}else if(DdN < 0){
sign=- 1;
DdN=- DdN;
}else{
return null;
}
diff.subVectors(this.origin, a);
var DdQxE2=sign * this.direction.dot(edge2.crossVectors(diff, edge2) );
if(DdQxE2 < 0){
return null;
}
var DdE1xQ=sign * this.direction.dot(edge1.cross(diff) );
if(DdE1xQ < 0){
return null;
}
if(DdQxE2 + DdE1xQ > DdN){
return null;
}
var QdN=- sign * diff.dot(normal);
if(QdN < 0){
return null;
}
return this.at(QdN / DdN, target);
};}(),
applyMatrix4: function(matrix4){
this.origin.applyMatrix4(matrix4);
this.direction.transformDirection(matrix4);
return this;
},
equals: function(ray){
return ray.origin.equals(this.origin)&&ray.direction.equals(this.direction);
}});
function Line3(start, end){
this.start=(start!==undefined) ? start:new Vector3();
this.end=(end!==undefined) ? end:new Vector3();
}
Object.assign(Line3.prototype, {
set: function(start, end){
this.start.copy(start);
this.end.copy(end);
return this;
},
clone: function (){
return new this.constructor().copy(this);
},
copy: function(line){
this.start.copy(line.start);
this.end.copy(line.end);
return this;
},
getCenter: function(target){
if(target===undefined){
console.warn('THREE.Line3: .getCenter() target is now required');
target=new Vector3();
}
return target.addVectors(this.start, this.end).multiplyScalar(0.5);
},
delta: function(target){
if(target===undefined){
console.warn('THREE.Line3: .delta() target is now required');
target=new Vector3();
}
return target.subVectors(this.end, this.start);
},
distanceSq: function (){
return this.start.distanceToSquared(this.end);
},
distance: function (){
return this.start.distanceTo(this.end);
},
at: function(t, target){
if(target===undefined){
console.warn('THREE.Line3: .at() target is now required');
target=new Vector3();
}
return this.delta(target).multiplyScalar(t).add(this.start);
},
closestPointToPointParameter: function (){
var startP=new Vector3();
var startEnd=new Vector3();
return function closestPointToPointParameter(point, clampToLine){
startP.subVectors(point, this.start);
startEnd.subVectors(this.end, this.start);
var startEnd2=startEnd.dot(startEnd);
var startEnd_startP=startEnd.dot(startP);
var t=startEnd_startP / startEnd2;
if(clampToLine){
t=_Math.clamp(t, 0, 1);
}
return t;
};}(),
closestPointToPoint: function(point, clampToLine, target){
var t=this.closestPointToPointParameter(point, clampToLine);
if(target===undefined){
console.warn('THREE.Line3: .closestPointToPoint() target is now required');
target=new Vector3();
}
return this.delta(target).multiplyScalar(t).add(this.start);
},
applyMatrix4: function(matrix){
this.start.applyMatrix4(matrix);
this.end.applyMatrix4(matrix);
return this;
},
equals: function(line){
return line.start.equals(this.start)&&line.end.equals(this.end);
}});
function Triangle(a, b, c){
this.a=(a!==undefined) ? a:new Vector3();
this.b=(b!==undefined) ? b:new Vector3();
this.c=(c!==undefined) ? c:new Vector3();
}
Object.assign(Triangle, {
getNormal: function (){
var v0=new Vector3();
return function getNormal(a, b, c, target){
if(target===undefined){
console.warn('THREE.Triangle: .getNormal() target is now required');
target=new Vector3();
}
target.subVectors(c, b);
v0.subVectors(a, b);
target.cross(v0);
var targetLengthSq=target.lengthSq();
if(targetLengthSq > 0){
return target.multiplyScalar(1 / Math.sqrt(targetLengthSq) );
}
return target.set(0, 0, 0);
};}(),
getBarycoord: function (){
var v0=new Vector3();
var v1=new Vector3();
var v2=new Vector3();
return function getBarycoord(point, a, b, c, target){
v0.subVectors(c, a);
v1.subVectors(b, a);
v2.subVectors(point, a);
var dot00=v0.dot(v0);
var dot01=v0.dot(v1);
var dot02=v0.dot(v2);
var dot11=v1.dot(v1);
var dot12=v1.dot(v2);
var denom=(dot00 * dot11 - dot01 * dot01);
if(target===undefined){
console.warn('THREE.Triangle: .getBarycoord() target is now required');
target=new Vector3();
}
if(denom===0){
return target.set(- 2, - 1, - 1);
}
var invDenom=1 / denom;
var u=(dot11 * dot02 - dot01 * dot12) * invDenom;
var v=(dot00 * dot12 - dot01 * dot02) * invDenom;
return target.set(1 - u - v, v, u);
};}(),
containsPoint: function (){
var v1=new Vector3();
return function containsPoint(point, a, b, c){
Triangle.getBarycoord(point, a, b, c, v1);
return(v1.x >=0)&&(v1.y >=0)&&(( v1.x + v1.y) <=1);
};}()
});
Object.assign(Triangle.prototype, {
set: function(a, b, c){
this.a.copy(a);
this.b.copy(b);
this.c.copy(c);
return this;
},
setFromPointsAndIndices: function(points, i0, i1, i2){
this.a.copy(points[ i0 ]);
this.b.copy(points[ i1 ]);
this.c.copy(points[ i2 ]);
return this;
},
clone: function (){
return new this.constructor().copy(this);
},
copy: function(triangle){
this.a.copy(triangle.a);
this.b.copy(triangle.b);
this.c.copy(triangle.c);
return this;
},
getArea: function (){
var v0=new Vector3();
var v1=new Vector3();
return function getArea(){
v0.subVectors(this.c, this.b);
v1.subVectors(this.a, this.b);
return v0.cross(v1).length() * 0.5;
};}(),
getMidpoint: function(target){
if(target===undefined){
console.warn('THREE.Triangle: .getMidpoint() target is now required');
target=new Vector3();
}
return target.addVectors(this.a, this.b).add(this.c).multiplyScalar(1 / 3);
},
getNormal: function(target){
return Triangle.getNormal(this.a, this.b, this.c, target);
},
getPlane: function(target){
if(target===undefined){
console.warn('THREE.Triangle: .getPlane() target is now required');
target=new Vector3();
}
return target.setFromCoplanarPoints(this.a, this.b, this.c);
},
getBarycoord: function(point, target){
return Triangle.getBarycoord(point, this.a, this.b, this.c, target);
},
containsPoint: function(point){
return Triangle.containsPoint(point, this.a, this.b, this.c);
},
intersectsBox: function(box){
return box.intersectsTriangle(this);
},
closestPointToPoint: function (){
var plane=new Plane();
var edgeList=[ new Line3(), new Line3(), new Line3() ];
var projectedPoint=new Vector3();
var closestPoint=new Vector3();
return function closestPointToPoint(point, target){
if(target===undefined){
console.warn('THREE.Triangle: .closestPointToPoint() target is now required');
target=new Vector3();
}
var minDistance=Infinity;
plane.setFromCoplanarPoints(this.a, this.b, this.c);
plane.projectPoint(point, projectedPoint);
if(this.containsPoint(projectedPoint)===true){
target.copy(projectedPoint);
}else{
edgeList[ 0 ].set(this.a, this.b);
edgeList[ 1 ].set(this.b, this.c);
edgeList[ 2 ].set(this.c, this.a);
for(var i=0; i < edgeList.length; i ++){
edgeList[ i ].closestPointToPoint(projectedPoint, true, closestPoint);
var distance=projectedPoint.distanceToSquared(closestPoint);
if(distance < minDistance){
minDistance=distance;
target.copy(closestPoint);
}}
}
return target;
};}(),
equals: function(triangle){
return triangle.a.equals(this.a)&&triangle.b.equals(this.b)&&triangle.c.equals(this.c);
}});
function Mesh(geometry, material){
Object3D.call(this);
this.type='Mesh';
this.geometry=geometry!==undefined ? geometry:new BufferGeometry();
this.material=material!==undefined ? material:new MeshBasicMaterial( { color: Math.random() * 0xffffff });
this.drawMode=TrianglesDrawMode;
this.updateMorphTargets();
}
Mesh.prototype=Object.assign(Object.create(Object3D.prototype), {
constructor: Mesh,
isMesh: true,
setDrawMode: function(value){
this.drawMode=value;
},
copy: function(source){
Object3D.prototype.copy.call(this, source);
this.drawMode=source.drawMode;
if(source.morphTargetInfluences!==undefined){
this.morphTargetInfluences=source.morphTargetInfluences.slice();
}
if(source.morphTargetDictionary!==undefined){
this.morphTargetDictionary=Object.assign({}, source.morphTargetDictionary);
}
return this;
},
updateMorphTargets: function (){
var geometry=this.geometry;
var m, ml, name;
if(geometry.isBufferGeometry){
var morphAttributes=geometry.morphAttributes;
var keys=Object.keys(morphAttributes);
if(keys.length > 0){
var morphAttribute=morphAttributes[ keys[ 0 ] ];
if(morphAttribute!==undefined){
this.morphTargetInfluences=[];
this.morphTargetDictionary={};
for(m=0, ml=morphAttribute.length; m < ml; m ++){
name=morphAttribute[ m ].name||String(m);
this.morphTargetInfluences.push(0);
this.morphTargetDictionary[ name ]=m;
}}
}}else{
var morphTargets=geometry.morphTargets;
if(morphTargets!==undefined&&morphTargets.length > 0){
this.morphTargetInfluences=[];
this.morphTargetDictionary={};
for(m=0, ml=morphTargets.length; m < ml; m ++){
name=morphTargets[ m ].name||String(m);
this.morphTargetInfluences.push(0);
this.morphTargetDictionary[ name ]=m;
}}
}},
raycast:(function (){
var inverseMatrix=new Matrix4();
var ray=new Ray();
var sphere=new Sphere();
var vA=new Vector3();
var vB=new Vector3();
var vC=new Vector3();
var tempA=new Vector3();
var tempB=new Vector3();
var tempC=new Vector3();
var uvA=new Vector2();
var uvB=new Vector2();
var uvC=new Vector2();
var barycoord=new Vector3();
var intersectionPoint=new Vector3();
var intersectionPointWorld=new Vector3();
function uvIntersection(point, p1, p2, p3, uv1, uv2, uv3){
Triangle.getBarycoord(point, p1, p2, p3, barycoord);
uv1.multiplyScalar(barycoord.x);
uv2.multiplyScalar(barycoord.y);
uv3.multiplyScalar(barycoord.z);
uv1.add(uv2).add(uv3);
return uv1.clone();
}
function checkIntersection(object, material, raycaster, ray, pA, pB, pC, point){
var intersect;
if(material.side===BackSide){
intersect=ray.intersectTriangle(pC, pB, pA, true, point);
}else{
intersect=ray.intersectTriangle(pA, pB, pC, material.side!==DoubleSide, point);
}
if(intersect===null) return null;
intersectionPointWorld.copy(point);
intersectionPointWorld.applyMatrix4(object.matrixWorld);
var distance=raycaster.ray.origin.distanceTo(intersectionPointWorld);
if(distance < raycaster.near||distance > raycaster.far) return null;
return {
distance: distance,
point: intersectionPointWorld.clone(),
object: object
};}
function checkBufferGeometryIntersection(object, raycaster, ray, position, uv, a, b, c){
vA.fromBufferAttribute(position, a);
vB.fromBufferAttribute(position, b);
vC.fromBufferAttribute(position, c);
var intersection=checkIntersection(object, object.material, raycaster, ray, vA, vB, vC, intersectionPoint);
if(intersection){
if(uv){
uvA.fromBufferAttribute(uv, a);
uvB.fromBufferAttribute(uv, b);
uvC.fromBufferAttribute(uv, c);
intersection.uv=uvIntersection(intersectionPoint, vA, vB, vC, uvA, uvB, uvC);
}
var face=new Face3(a, b, c);
Triangle.getNormal(vA, vB, vC, face.normal);
intersection.face=face;
}
return intersection;
}
return function raycast(raycaster, intersects){
var geometry=this.geometry;
var material=this.material;
var matrixWorld=this.matrixWorld;
if(material===undefined) return;
if(geometry.boundingSphere===null) geometry.computeBoundingSphere();
sphere.copy(geometry.boundingSphere);
sphere.applyMatrix4(matrixWorld);
if(raycaster.ray.intersectsSphere(sphere)===false) return;
inverseMatrix.getInverse(matrixWorld);
ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);
if(geometry.boundingBox!==null){
if(ray.intersectsBox(geometry.boundingBox)===false) return;
}
var intersection;
if(geometry.isBufferGeometry){
var a, b, c;
var index=geometry.index;
var position=geometry.attributes.position;
var uv=geometry.attributes.uv;
var i, l;
if(index!==null){
for(i=0, l=index.count; i < l; i +=3){
a=index.getX(i);
b=index.getX(i + 1);
c=index.getX(i + 2);
intersection=checkBufferGeometryIntersection(this, raycaster, ray, position, uv, a, b, c);
if(intersection){
intersection.faceIndex=Math.floor(i / 3);
intersects.push(intersection);
}}
}else if(position!==undefined){
for(i=0, l=position.count; i < l; i +=3){
a=i;
b=i + 1;
c=i + 2;
intersection=checkBufferGeometryIntersection(this, raycaster, ray, position, uv, a, b, c);
if(intersection){
intersection.faceIndex=Math.floor(i / 3);
intersects.push(intersection);
}}
}}else if(geometry.isGeometry){
var fvA, fvB, fvC;
var isMultiMaterial=Array.isArray(material);
var vertices=geometry.vertices;
var faces=geometry.faces;
var uvs;
var faceVertexUvs=geometry.faceVertexUvs[ 0 ];
if(faceVertexUvs.length > 0) uvs=faceVertexUvs;
for(var f=0, fl=faces.length; f < fl; f ++){
var face=faces[ f ];
var faceMaterial=isMultiMaterial ? material[ face.materialIndex ]:material;
if(faceMaterial===undefined) continue;
fvA=vertices[ face.a ];
fvB=vertices[ face.b ];
fvC=vertices[ face.c ];
if(faceMaterial.morphTargets===true){
var morphTargets=geometry.morphTargets;
var morphInfluences=this.morphTargetInfluences;
vA.set(0, 0, 0);
vB.set(0, 0, 0);
vC.set(0, 0, 0);
for(var t=0, tl=morphTargets.length; t < tl; t ++){
var influence=morphInfluences[ t ];
if(influence===0) continue;
var targets=morphTargets[ t ].vertices;
vA.addScaledVector(tempA.subVectors(targets[ face.a ], fvA), influence);
vB.addScaledVector(tempB.subVectors(targets[ face.b ], fvB), influence);
vC.addScaledVector(tempC.subVectors(targets[ face.c ], fvC), influence);
}
vA.add(fvA);
vB.add(fvB);
vC.add(fvC);
fvA=vA;
fvB=vB;
fvC=vC;
}
intersection=checkIntersection(this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint);
if(intersection){
if(uvs&&uvs[ f ]){
var uvs_f=uvs[ f ];
uvA.copy(uvs_f[ 0 ]);
uvB.copy(uvs_f[ 1 ]);
uvC.copy(uvs_f[ 2 ]);
intersection.uv=uvIntersection(intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC);
}
intersection.face=face;
intersection.faceIndex=f;
intersects.push(intersection);
}}
}};}()),
clone: function (){
return new this.constructor(this.geometry, this.material).copy(this);
}});
function WebGLBackground(renderer, state, objects, premultipliedAlpha){
var clearColor=new Color(0x000000);
var clearAlpha=0;
var planeCamera, planeMesh;
var boxMesh;
function render(renderList, scene, camera, forceClear){
var background=scene.background;
if(background===null){
setClear(clearColor, clearAlpha);
}else if(background&&background.isColor){
setClear(background, 1);
forceClear=true;
}
if(renderer.autoClear||forceClear){
renderer.clear(renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil);
}
if(background&&background.isCubeTexture){
if(boxMesh===undefined){
boxMesh=new Mesh(
new BoxBufferGeometry(1, 1, 1),
new ShaderMaterial( {
uniforms: ShaderLib.cube.uniforms,
vertexShader: ShaderLib.cube.vertexShader,
fragmentShader: ShaderLib.cube.fragmentShader,
side: BackSide,
depthTest: true,
depthWrite: false,
fog: false
})
);
boxMesh.geometry.removeAttribute('normal');
boxMesh.geometry.removeAttribute('uv');
boxMesh.onBeforeRender=function(renderer, scene, camera){
this.matrixWorld.copyPosition(camera.matrixWorld);
};
objects.update(boxMesh);
}
boxMesh.material.uniforms.tCube.value=background;
renderList.push(boxMesh, boxMesh.geometry, boxMesh.material, 0, null);
}else if(background&&background.isTexture){
if(planeCamera===undefined){
planeCamera=new OrthographicCamera(- 1, 1, 1, - 1, 0, 1);
planeMesh=new Mesh(
new PlaneBufferGeometry(2, 2),
new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false })
);
objects.update(planeMesh);
}
planeMesh.material.map=background;
renderer.renderBufferDirect(planeCamera, null, planeMesh.geometry, planeMesh.material, planeMesh, null);
}}
function setClear(color, alpha){
state.buffers.color.setClear(color.r, color.g, color.b, alpha, premultipliedAlpha);
}
return {
getClearColor: function (){
return clearColor;
},
setClearColor: function(color, alpha){
clearColor.set(color);
clearAlpha=alpha!==undefined ? alpha:1;
setClear(clearColor, clearAlpha);
},
getClearAlpha: function (){
return clearAlpha;
},
setClearAlpha: function(alpha){
clearAlpha=alpha;
setClear(clearColor, clearAlpha);
},
render: render
};}
function WebGLBufferRenderer(gl, extensions, info){
var mode;
function setMode(value){
mode=value;
}
function render(start, count){
gl.drawArrays(mode, start, count);
info.update(count, mode);
}
function renderInstances(geometry, start, count){
var extension=extensions.get('ANGLE_instanced_arrays');
if(extension===null){
console.error('THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');
return;
}
extension.drawArraysInstancedANGLE(mode, start, count, geometry.maxInstancedCount);
info.update(count, mode, geometry.maxInstancedCount);
}
this.setMode=setMode;
this.render=render;
this.renderInstances=renderInstances;
}
function WebGLCapabilities(gl, extensions, parameters){
var maxAnisotropy;
function getMaxAnisotropy(){
if(maxAnisotropy!==undefined) return maxAnisotropy;
var extension=extensions.get('EXT_texture_filter_anisotropic');
if(extension!==null){
maxAnisotropy=gl.getParameter(extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT);
}else{
maxAnisotropy=0;
}
return maxAnisotropy;
}
function getMaxPrecision(precision){
if(precision==='highp'){
if(gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision > 0 &&
gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0){
return 'highp';
}
precision='mediump';
}
if(precision==='mediump'){
if(gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision > 0 &&
gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision > 0){
return 'mediump';
}}
return 'lowp';
}
var precision=parameters.precision!==undefined ? parameters.precision:'highp';
var maxPrecision=getMaxPrecision(precision);
if(maxPrecision!==precision){
console.warn('THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.');
precision=maxPrecision;
}
var logarithmicDepthBuffer=parameters.logarithmicDepthBuffer===true;
var maxTextures=gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
var maxVertexTextures=gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS);
var maxTextureSize=gl.getParameter(gl.MAX_TEXTURE_SIZE);
var maxCubemapSize=gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);
var maxAttributes=gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
var maxVertexUniforms=gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS);
var maxVaryings=gl.getParameter(gl.MAX_VARYING_VECTORS);
var maxFragmentUniforms=gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS);
var vertexTextures=maxVertexTextures > 0;
var floatFragmentTextures = !! extensions.get('OES_texture_float');
var floatVertexTextures=vertexTextures&&floatFragmentTextures;
return {
getMaxAnisotropy: getMaxAnisotropy,
getMaxPrecision: getMaxPrecision,
precision: precision,
logarithmicDepthBuffer: logarithmicDepthBuffer,
maxTextures: maxTextures,
maxVertexTextures: maxVertexTextures,
maxTextureSize: maxTextureSize,
maxCubemapSize: maxCubemapSize,
maxAttributes: maxAttributes,
maxVertexUniforms: maxVertexUniforms,
maxVaryings: maxVaryings,
maxFragmentUniforms: maxFragmentUniforms,
vertexTextures: vertexTextures,
floatFragmentTextures: floatFragmentTextures,
floatVertexTextures: floatVertexTextures
};}
function WebGLClipping(){
var scope=this,
globalState=null,
numGlobalPlanes=0,
localClippingEnabled=false,
renderingShadows=false,
plane=new Plane(),
viewNormalMatrix=new Matrix3(),
uniform={ value: null, needsUpdate: false };
this.uniform=uniform;
this.numPlanes=0;
this.numIntersection=0;
this.init=function(planes, enableLocalClipping, camera){
var enabled =
planes.length!==0 ||
enableLocalClipping ||
numGlobalPlanes!==0 ||
localClippingEnabled;
localClippingEnabled=enableLocalClipping;
globalState=projectPlanes(planes, camera, 0);
numGlobalPlanes=planes.length;
return enabled;
};
this.beginShadows=function (){
renderingShadows=true;
projectPlanes(null);
};
this.endShadows=function (){
renderingShadows=false;
resetGlobalState();
};
this.setState=function(planes, clipIntersection, clipShadows, camera, cache, fromCache){
if(! localClippingEnabled||planes===null||planes.length===0||renderingShadows&&! clipShadows){
if(renderingShadows){
projectPlanes(null);
}else{
resetGlobalState();
}}else{
var nGlobal=renderingShadows ? 0:numGlobalPlanes,
lGlobal=nGlobal * 4,
dstArray=cache.clippingState||null;
uniform.value=dstArray;
dstArray=projectPlanes(planes, camera, lGlobal, fromCache);
for(var i=0; i!==lGlobal; ++ i){
dstArray[ i ]=globalState[ i ];
}
cache.clippingState=dstArray;
this.numIntersection=clipIntersection ? this.numPlanes:0;
this.numPlanes +=nGlobal;
}};
function resetGlobalState(){
if(uniform.value!==globalState){
uniform.value=globalState;
uniform.needsUpdate=numGlobalPlanes > 0;
}
scope.numPlanes=numGlobalPlanes;
scope.numIntersection=0;
}
function projectPlanes(planes, camera, dstOffset, skipTransform){
var nPlanes=planes!==null ? planes.length:0,
dstArray=null;
if(nPlanes!==0){
dstArray=uniform.value;
if(skipTransform!==true||dstArray===null){
var flatSize=dstOffset + nPlanes * 4,
viewMatrix=camera.matrixWorldInverse;
viewNormalMatrix.getNormalMatrix(viewMatrix);
if(dstArray===null||dstArray.length < flatSize){
dstArray=new Float32Array(flatSize);
}
for(var i=0, i4=dstOffset; i!==nPlanes; ++ i, i4 +=4){
plane.copy(planes[ i ]).applyMatrix4(viewMatrix, viewNormalMatrix);
plane.normal.toArray(dstArray, i4);
dstArray[ i4 + 3 ]=plane.constant;
}}
uniform.value=dstArray;
uniform.needsUpdate=true;
}
scope.numPlanes=nPlanes;
return dstArray;
}}
function WebGLExtensions(gl){
var extensions={};
return {
get: function(name){
if(extensions[ name ]!==undefined){
return extensions[ name ];
}
var extension;
switch(name){
case 'WEBGL_depth_texture':
extension=gl.getExtension('WEBGL_depth_texture')||gl.getExtension('MOZ_WEBGL_depth_texture')||gl.getExtension('WEBKIT_WEBGL_depth_texture');
break;
case 'EXT_texture_filter_anisotropic':
extension=gl.getExtension('EXT_texture_filter_anisotropic')||gl.getExtension('MOZ_EXT_texture_filter_anisotropic')||gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');
break;
case 'WEBGL_compressed_texture_s3tc':
extension=gl.getExtension('WEBGL_compressed_texture_s3tc')||gl.getExtension('MOZ_WEBGL_compressed_texture_s3tc')||gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc');
break;
case 'WEBGL_compressed_texture_pvrtc':
extension=gl.getExtension('WEBGL_compressed_texture_pvrtc')||gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');
break;
default:
extension=gl.getExtension(name);
}
if(extension===null){
console.warn('THREE.WebGLRenderer: ' + name + ' extension not supported.');
}
extensions[ name ]=extension;
return extension;
}};}
function WebGLGeometries(gl, attributes, info){
var geometries={};
var wireframeAttributes={};
function onGeometryDispose(event){
var geometry=event.target;
var buffergeometry=geometries[ geometry.id ];
if(buffergeometry.index!==null){
attributes.remove(buffergeometry.index);
}
for(var name in buffergeometry.attributes){
attributes.remove(buffergeometry.attributes[ name ]);
}
geometry.removeEventListener('dispose', onGeometryDispose);
delete geometries[ geometry.id ];
var attribute=wireframeAttributes[ geometry.id ];
if(attribute){
attributes.remove(attribute);
delete wireframeAttributes[ geometry.id ];
}
attribute=wireframeAttributes[ buffergeometry.id ];
if(attribute){
attributes.remove(attribute);
delete wireframeAttributes[ buffergeometry.id ];
}
info.memory.geometries --;
}
function get(object, geometry){
var buffergeometry=geometries[ geometry.id ];
if(buffergeometry) return buffergeometry;
geometry.addEventListener('dispose', onGeometryDispose);
if(geometry.isBufferGeometry){
buffergeometry=geometry;
}else if(geometry.isGeometry){
if(geometry._bufferGeometry===undefined){
geometry._bufferGeometry=new BufferGeometry().setFromObject(object);
}
buffergeometry=geometry._bufferGeometry;
}
geometries[ geometry.id ]=buffergeometry;
info.memory.geometries ++;
return buffergeometry;
}
function update(geometry){
var index=geometry.index;
var geometryAttributes=geometry.attributes;
if(index!==null){
attributes.update(index, gl.ELEMENT_ARRAY_BUFFER);
}
for(var name in geometryAttributes){
attributes.update(geometryAttributes[ name ], gl.ARRAY_BUFFER);
}
var morphAttributes=geometry.morphAttributes;
for(var name in morphAttributes){
var array=morphAttributes[ name ];
for(var i=0, l=array.length; i < l; i ++){
attributes.update(array[ i ], gl.ARRAY_BUFFER);
}}
}
function getWireframeAttribute(geometry){
var attribute=wireframeAttributes[ geometry.id ];
if(attribute) return attribute;
var indices=[];
var geometryIndex=geometry.index;
var geometryAttributes=geometry.attributes;
if(geometryIndex!==null){
var array=geometryIndex.array;
for(var i=0, l=array.length; i < l; i +=3){
var a=array[ i + 0 ];
var b=array[ i + 1 ];
var c=array[ i + 2 ];
indices.push(a, b, b, c, c, a);
}}else{
var array=geometryAttributes.position.array;
for(var i=0, l=(array.length / 3) - 1; i < l; i +=3){
var a=i + 0;
var b=i + 1;
var c=i + 2;
indices.push(a, b, b, c, c, a);
}}
attribute=new(arrayMax(indices) > 65535 ? Uint32BufferAttribute:Uint16BufferAttribute)(indices, 1);
attributes.update(attribute, gl.ELEMENT_ARRAY_BUFFER);
wireframeAttributes[ geometry.id ]=attribute;
return attribute;
}
return {
get: get,
update: update,
getWireframeAttribute: getWireframeAttribute
};}
function WebGLIndexedBufferRenderer(gl, extensions, info){
var mode;
function setMode(value){
mode=value;
}
var type, bytesPerElement;
function setIndex(value){
type=value.type;
bytesPerElement=value.bytesPerElement;
}
function render(start, count){
gl.drawElements(mode, count, type, start * bytesPerElement);
info.update(count, mode);
}
function renderInstances(geometry, start, count){
var extension=extensions.get('ANGLE_instanced_arrays');
if(extension===null){
console.error('THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');
return;
}
extension.drawElementsInstancedANGLE(mode, count, type, start * bytesPerElement, geometry.maxInstancedCount);
info.update(count, mode, geometry.maxInstancedCount);
}
this.setMode=setMode;
this.setIndex=setIndex;
this.render=render;
this.renderInstances=renderInstances;
}
function WebGLInfo(gl){
var memory={
geometries: 0,
textures: 0
};
var render={
frame: 0,
calls: 0,
triangles: 0,
points: 0,
lines: 0
};
function update(count, mode, instanceCount){
instanceCount=instanceCount||1;
render.calls ++;
switch(mode){
case gl.TRIANGLES:
render.triangles +=instanceCount *(count / 3);
break;
case gl.TRIANGLE_STRIP:
case gl.TRIANGLE_FAN:
render.triangles +=instanceCount *(count - 2);
break;
case gl.LINES:
render.lines +=instanceCount *(count / 2);
break;
case gl.LINE_STRIP:
render.lines +=instanceCount *(count - 1);
break;
case gl.LINE_LOOP:
render.lines +=instanceCount * count;
break;
case gl.POINTS:
render.points +=instanceCount * count;
break;
default:
console.error('THREE.WebGLInfo: Unknown draw mode:', mode);
break;
}}
function reset(){
render.frame ++;
render.calls=0;
render.triangles=0;
render.points=0;
render.lines=0;
}
return {
memory: memory,
render: render,
programs: null,
autoReset: true,
reset: reset,
update: update
};}
function absNumericalSort(a, b){
return Math.abs(b[ 1 ]) - Math.abs(a[ 1 ]);
}
function WebGLMorphtargets(gl){
var influencesList={};
var morphInfluences=new Float32Array(8);
function update(object, geometry, material, program){
var objectInfluences=object.morphTargetInfluences;
var length=objectInfluences.length;
var influences=influencesList[ geometry.id ];
if(influences===undefined){
influences=[];
for(var i=0; i < length; i ++){
influences[ i ]=[ i, 0 ];
}
influencesList[ geometry.id ]=influences;
}
var morphTargets=material.morphTargets&&geometry.morphAttributes.position;
var morphNormals=material.morphNormals&&geometry.morphAttributes.normal;
for(var i=0; i < length; i ++){
var influence=influences[ i ];
if(influence[ 1 ]!==0){
if(morphTargets) geometry.removeAttribute('morphTarget' + i);
if(morphNormals) geometry.removeAttribute('morphNormal' + i);
}}
for(var i=0; i < length; i ++){
var influence=influences[ i ];
influence[ 0 ]=i;
influence[ 1 ]=objectInfluences[ i ];
}
influences.sort(absNumericalSort);
for(var i=0; i < 8; i ++){
var influence=influences[ i ];
if(influence){
var index=influence[ 0 ];
var value=influence[ 1 ];
if(value){
if(morphTargets) geometry.addAttribute('morphTarget' + i, morphTargets[ index ]);
if(morphNormals) geometry.addAttribute('morphNormal' + i, morphNormals[ index ]);
morphInfluences[ i ]=value;
continue;
}}
morphInfluences[ i ]=0;
}
program.getUniforms().setValue(gl, 'morphTargetInfluences', morphInfluences);
}
return {
update: update
};}
function WebGLObjects(geometries, info){
var updateList={};
function update(object){
var frame=info.render.frame;
var geometry=object.geometry;
var buffergeometry=geometries.get(object, geometry);
if(updateList[ buffergeometry.id ]!==frame){
if(geometry.isGeometry){
buffergeometry.updateFromObject(object);
}
geometries.update(buffergeometry);
updateList[ buffergeometry.id ]=frame;
}
return buffergeometry;
}
function dispose(){
updateList={};}
return {
update: update,
dispose: dispose
};}
function CubeTexture(images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding){
images=images!==undefined ? images:[];
mapping=mapping!==undefined ? mapping:CubeReflectionMapping;
Texture.call(this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding);
this.flipY=false;
}
CubeTexture.prototype=Object.create(Texture.prototype);
CubeTexture.prototype.constructor=CubeTexture;
CubeTexture.prototype.isCubeTexture=true;
Object.defineProperty(CubeTexture.prototype, 'images', {
get: function (){
return this.image;
},
set: function(value){
this.image=value;
}});
var emptyTexture=new Texture();
var emptyCubeTexture=new CubeTexture();
function UniformContainer(){
this.seq=[];
this.map={};}
var arrayCacheF32=[];
var arrayCacheI32=[];
var mat4array=new Float32Array(16);
var mat3array=new Float32Array(9);
var mat2array=new Float32Array(4);
function flatten(array, nBlocks, blockSize){
var firstElem=array[ 0 ];
if(firstElem <=0||firstElem > 0) return array;
var n=nBlocks * blockSize,
r=arrayCacheF32[ n ];
if(r===undefined){
r=new Float32Array(n);
arrayCacheF32[ n ]=r;
}
if(nBlocks!==0){
firstElem.toArray(r, 0);
for(var i=1, offset=0; i!==nBlocks; ++ i){
offset +=blockSize;
array[ i ].toArray(r, offset);
}}
return r;
}
function arraysEqual(a, b){
if(a.length!==b.length) return false;
for(var i=0, l=a.length; i < l; i ++){
if(a[ i ]!==b[ i ]) return false;
}
return true;
}
function copyArray(a, b){
for(var i=0, l=b.length; i < l; i ++){
a[ i ]=b[ i ];
}}
function allocTexUnits(renderer, n){
var r=arrayCacheI32[ n ];
if(r===undefined){
r=new Int32Array(n);
arrayCacheI32[ n ]=r;
}
for(var i=0; i!==n; ++ i)
r[ i ]=renderer.allocTextureUnit();
return r;
}
function setValue1f(gl, v){
var cache=this.cache;
if(cache[ 0 ]===v) return;
gl.uniform1f(this.addr, v);
cache[ 0 ]=v;
}
function setValue1i(gl, v){
var cache=this.cache;
if(cache[ 0 ]===v) return;
gl.uniform1i(this.addr, v);
cache[ 0 ]=v;
}
function setValue2fv(gl, v){
var cache=this.cache;
if(v.x!==undefined){
if(cache[ 0 ]!==v.x||cache[ 1 ]!==v.y){
gl.uniform2f(this.addr, v.x, v.y);
cache[ 0 ]=v.x;
cache[ 1 ]=v.y;
}}else{
if(arraysEqual(cache, v) ) return;
gl.uniform2fv(this.addr, v);
copyArray(cache, v);
}}
function setValue3fv(gl, v){
var cache=this.cache;
if(v.x!==undefined){
if(cache[ 0 ]!==v.x||cache[ 1 ]!==v.y||cache[ 2 ]!==v.z){
gl.uniform3f(this.addr, v.x, v.y, v.z);
cache[ 0 ]=v.x;
cache[ 1 ]=v.y;
cache[ 2 ]=v.z;
}}else if(v.r!==undefined){
if(cache[ 0 ]!==v.r||cache[ 1 ]!==v.g||cache[ 2 ]!==v.b){
gl.uniform3f(this.addr, v.r, v.g, v.b);
cache[ 0 ]=v.r;
cache[ 1 ]=v.g;
cache[ 2 ]=v.b;
}}else{
if(arraysEqual(cache, v) ) return;
gl.uniform3fv(this.addr, v);
copyArray(cache, v);
}}
function setValue4fv(gl, v){
var cache=this.cache;
if(v.x!==undefined){
if(cache[ 0 ]!==v.x||cache[ 1 ]!==v.y||cache[ 2 ]!==v.z||cache[ 3 ]!==v.w){
gl.uniform4f(this.addr, v.x, v.y, v.z, v.w);
cache[ 0 ]=v.x;
cache[ 1 ]=v.y;
cache[ 2 ]=v.z;
cache[ 3 ]=v.w;
}}else{
if(arraysEqual(cache, v) ) return;
gl.uniform4fv(this.addr, v);
copyArray(cache, v);
}}
function setValue2fm(gl, v){
var cache=this.cache;
var elements=v.elements;
if(elements===undefined){
if(arraysEqual(cache, v) ) return;
gl.uniformMatrix2fv(this.addr, false, v);
copyArray(cache, v);
}else{
if(arraysEqual(cache, elements) ) return;
mat2array.set(elements);
gl.uniformMatrix2fv(this.addr, false, mat2array);
copyArray(cache, elements);
}}
function setValue3fm(gl, v){
var cache=this.cache;
var elements=v.elements;
if(elements===undefined){
if(arraysEqual(cache, v) ) return;
gl.uniformMatrix3fv(this.addr, false, v);
copyArray(cache, v);
}else{
if(arraysEqual(cache, elements) ) return;
mat3array.set(elements);
gl.uniformMatrix3fv(this.addr, false, mat3array);
copyArray(cache, elements);
}}
function setValue4fm(gl, v){
var cache=this.cache;
var elements=v.elements;
if(elements===undefined){
if(arraysEqual(cache, v) ) return;
gl.uniformMatrix4fv(this.addr, false, v);
copyArray(cache, v);
}else{
if(arraysEqual(cache, elements) ) return;
mat4array.set(elements);
gl.uniformMatrix4fv(this.addr, false, mat4array);
copyArray(cache, elements);
}}
function setValueT1(gl, v, renderer){
var cache=this.cache;
var unit=renderer.allocTextureUnit();
if(cache[ 0 ]!==unit){
gl.uniform1i(this.addr, unit);
cache[ 0 ]=unit;
}
renderer.setTexture2D(v||emptyTexture, unit);
}
function setValueT6(gl, v, renderer){
var cache=this.cache;
var unit=renderer.allocTextureUnit();
if(cache[ 0 ]!==unit){
gl.uniform1i(this.addr, unit);
cache[ 0 ]=unit;
}
renderer.setTextureCube(v||emptyCubeTexture, unit);
}
function setValue2iv(gl, v){
var cache=this.cache;
if(arraysEqual(cache, v) ) return;
gl.uniform2iv(this.addr, v);
copyArray(cache, v);
}
function setValue3iv(gl, v){
var cache=this.cache;
if(arraysEqual(cache, v) ) return;
gl.uniform3iv(this.addr, v);
copyArray(cache, v);
}
function setValue4iv(gl, v){
var cache=this.cache;
if(arraysEqual(cache, v) ) return;
gl.uniform4iv(this.addr, v);
copyArray(cache, v);
}
function getSingularSetter(type){
switch(type){
case 0x1406: return setValue1f;
case 0x8b50: return setValue2fv;
case 0x8b51: return setValue3fv;
case 0x8b52: return setValue4fv;
case 0x8b5a: return setValue2fm;
case 0x8b5b: return setValue3fm;
case 0x8b5c: return setValue4fm;
case 0x8b5e: case 0x8d66: return setValueT1;
case 0x8b60: return setValueT6;
case 0x1404: case 0x8b56: return setValue1i;
case 0x8b53: case 0x8b57: return setValue2iv;
case 0x8b54: case 0x8b58: return setValue3iv;
case 0x8b55: case 0x8b59: return setValue4iv;
}}
function setValue1fv(gl, v){
var cache=this.cache;
if(arraysEqual(cache, v) ) return;
gl.uniform1fv(this.addr, v);
copyArray(cache, v);
}
function setValue1iv(gl, v){
var cache=this.cache;
if(arraysEqual(cache, v) ) return;
gl.uniform1iv(this.addr, v);
copyArray(cache, v);
}
function setValueV2a(gl, v){
var cache=this.cache;
var data=flatten(v, this.size, 2);
if(arraysEqual(cache, data) ) return;
gl.uniform2fv(this.addr, data);
this.updateCache(data);
}
function setValueV3a(gl, v){
var cache=this.cache;
var data=flatten(v, this.size, 3);
if(arraysEqual(cache, data) ) return;
gl.uniform3fv(this.addr, data);
this.updateCache(data);
}
function setValueV4a(gl, v){
var cache=this.cache;
var data=flatten(v, this.size, 4);
if(arraysEqual(cache, data) ) return;
gl.uniform4fv(this.addr, data);
this.updateCache(data);
}
function setValueM2a(gl, v){
var cache=this.cache;
var data=flatten(v, this.size, 4);
if(arraysEqual(cache, data) ) return;
gl.uniformMatrix2fv(this.addr, false, data);
this.updateCache(data);
}
function setValueM3a(gl, v){
var cache=this.cache;
var data=flatten(v, this.size, 9);
if(arraysEqual(cache, data) ) return;
gl.uniformMatrix3fv(this.addr, false, data);
this.updateCache(data);
}
function setValueM4a(gl, v){
var cache=this.cache;
var data=flatten(v, this.size, 16);
if(arraysEqual(cache, data) ) return;
gl.uniformMatrix4fv(this.addr, false, data);
this.updateCache(data);
}
function setValueT1a(gl, v, renderer){
var cache=this.cache;
var n=v.length;
var units=allocTexUnits(renderer, n);
if(arraysEqual(cache, units)===false){
gl.uniform1iv(this.addr, units);
copyArray(cache, units);
}
for(var i=0; i!==n; ++ i){
renderer.setTexture2D(v[ i ]||emptyTexture, units[ i ]);
}}
function setValueT6a(gl, v, renderer){
var cache=this.cache;
var n=v.length;
var units=allocTexUnits(renderer, n);
if(arraysEqual(cache, units)===false){
gl.uniform1iv(this.addr, units);
copyArray(cache, units);
}
for(var i=0; i!==n; ++ i){
renderer.setTextureCube(v[ i ]||emptyCubeTexture, units[ i ]);
}}
function getPureArraySetter(type){
switch(type){
case 0x1406: return setValue1fv;
case 0x8b50: return setValueV2a;
case 0x8b51: return setValueV3a;
case 0x8b52: return setValueV4a;
case 0x8b5a: return setValueM2a;
case 0x8b5b: return setValueM3a;
case 0x8b5c: return setValueM4a;
case 0x8b5e: return setValueT1a;
case 0x8b60: return setValueT6a;
case 0x1404: case 0x8b56: return setValue1iv;
case 0x8b53: case 0x8b57: return setValue2iv;
case 0x8b54: case 0x8b58: return setValue3iv;
case 0x8b55: case 0x8b59: return setValue4iv;
}}
function SingleUniform(id, activeInfo, addr){
this.id=id;
this.addr=addr;
this.cache=[];
this.setValue=getSingularSetter(activeInfo.type);
}
function PureArrayUniform(id, activeInfo, addr){
this.id=id;
this.addr=addr;
this.cache=[];
this.size=activeInfo.size;
this.setValue=getPureArraySetter(activeInfo.type);
}
PureArrayUniform.prototype.updateCache=function(data){
var cache=this.cache;
if(data instanceof Float32Array&&cache.length!==data.length){
this.cache=new Float32Array(data.length);
}
copyArray(cache, data);
};
function StructuredUniform(id){
this.id=id;
UniformContainer.call(this);
}
StructuredUniform.prototype.setValue=function(gl, value){
var seq=this.seq;
for(var i=0, n=seq.length; i!==n; ++ i){
var u=seq[ i ];
u.setValue(gl, value[ u.id ]);
}};
var RePathPart=/([\w\d_]+)(\])?(\[|\.)?/g;
function addUniform(container, uniformObject){
container.seq.push(uniformObject);
container.map[ uniformObject.id ]=uniformObject;
}
function parseUniform(activeInfo, addr, container){
var path=activeInfo.name,
pathLength=path.length;
RePathPart.lastIndex=0;
while(true){
var match=RePathPart.exec(path),
matchEnd=RePathPart.lastIndex,
id=match[ 1 ],
idIsIndex=match[ 2 ]===']',
subscript=match[ 3 ];
if(idIsIndex) id=id | 0;
if(subscript===undefined||subscript==='['&&matchEnd + 2===pathLength){
addUniform(container, subscript===undefined ?
new SingleUniform(id, activeInfo, addr) :
new PureArrayUniform(id, activeInfo, addr) );
break;
}else{
var map=container.map, next=map[ id ];
if(next===undefined){
next=new StructuredUniform(id);
addUniform(container, next);
}
container=next;
}}
}
function WebGLUniforms(gl, program, renderer){
UniformContainer.call(this);
this.renderer=renderer;
var n=gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
for(var i=0; i < n; ++ i){
var info=gl.getActiveUniform(program, i),
addr=gl.getUniformLocation(program, info.name);
parseUniform(info, addr, this);
}}
WebGLUniforms.prototype.setValue=function(gl, name, value){
var u=this.map[ name ];
if(u!==undefined) u.setValue(gl, value, this.renderer);
};
WebGLUniforms.prototype.setOptional=function(gl, object, name){
var v=object[ name ];
if(v!==undefined) this.setValue(gl, name, v);
};
WebGLUniforms.upload=function(gl, seq, values, renderer){
for(var i=0, n=seq.length; i!==n; ++ i){
var u=seq[ i ],
v=values[ u.id ];
if(v.needsUpdate!==false){
u.setValue(gl, v.value, renderer);
}}
};
WebGLUniforms.seqWithValue=function(seq, values){
var r=[];
for(var i=0, n=seq.length; i!==n; ++ i){
var u=seq[ i ];
if(u.id in values) r.push(u);
}
return r;
};
function addLineNumbers(string){
var lines=string.split('\n');
for(var i=0; i < lines.length; i ++){
lines[ i ]=(i + 1) + ': ' + lines[ i ];
}
return lines.join('\n');
}
function WebGLShader(gl, type, string){
var shader=gl.createShader(type);
gl.shaderSource(shader, string);
gl.compileShader(shader);
if(gl.getShaderParameter(shader, gl.COMPILE_STATUS)===false){
console.error('THREE.WebGLShader: Shader couldn\'t compile.');
}
if(gl.getShaderInfoLog(shader)!==''){
console.warn('THREE.WebGLShader: gl.getShaderInfoLog()', type===gl.VERTEX_SHADER ? 'vertex':'fragment', gl.getShaderInfoLog(shader), addLineNumbers(string) );
}
return shader;
}
var programIdCount=0;
function getEncodingComponents(encoding){
switch(encoding){
case LinearEncoding:
return [ 'Linear', '(value)' ];
case sRGBEncoding:
return [ 'sRGB', '(value)' ];
case RGBEEncoding:
return [ 'RGBE', '(value)' ];
case RGBM7Encoding:
return [ 'RGBM', '(value, 7.0)' ];
case RGBM16Encoding:
return [ 'RGBM', '(value, 16.0)' ];
case RGBDEncoding:
return [ 'RGBD', '(value, 256.0)' ];
case GammaEncoding:
return [ 'Gamma', '(value, float(GAMMA_FACTOR) )' ];
default:
throw new Error('unsupported encoding: ' + encoding);
}}
function getTexelDecodingFunction(functionName, encoding){
var components=getEncodingComponents(encoding);
return 'vec4 ' + functionName + '(vec4 value){ return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }';
}
function getTexelEncodingFunction(functionName, encoding){
var components=getEncodingComponents(encoding);
return 'vec4 ' + functionName + '(vec4 value){ return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';
}
function getToneMappingFunction(functionName, toneMapping){
var toneMappingName;
switch(toneMapping){
case LinearToneMapping:
toneMappingName='Linear';
break;
case ReinhardToneMapping:
toneMappingName='Reinhard';
break;
case Uncharted2ToneMapping:
toneMappingName='Uncharted2';
break;
case CineonToneMapping:
toneMappingName='OptimizedCineon';
break;
default:
throw new Error('unsupported toneMapping: ' + toneMapping);
}
return 'vec3 ' + functionName + '(vec3 color){ return ' + toneMappingName + 'ToneMapping(color); }';
}
function generateExtensions(extensions, parameters, rendererExtensions){
extensions=extensions||{};
var chunks=[
(extensions.derivatives||parameters.envMapCubeUV||parameters.bumpMap||parameters.normalMap||parameters.flatShading) ? '#extension GL_OES_standard_derivatives:enable':'',
(extensions.fragDepth||parameters.logarithmicDepthBuffer)&&rendererExtensions.get('EXT_frag_depth') ? '#extension GL_EXT_frag_depth:enable':'',
(extensions.drawBuffers)&&rendererExtensions.get('WEBGL_draw_buffers') ? '#extension GL_EXT_draw_buffers:require':'',
(extensions.shaderTextureLOD||parameters.envMap)&&rendererExtensions.get('EXT_shader_texture_lod') ? '#extension GL_EXT_shader_texture_lod:enable':''
];
return chunks.filter(filterEmptyLine).join('\n');
}
function generateDefines(defines){
var chunks=[];
for(var name in defines){
var value=defines[ name ];
if(value===false) continue;
chunks.push('#define ' + name + ' ' + value);
}
return chunks.join('\n');
}
function fetchAttributeLocations(gl, program){
var attributes={};
var n=gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
for(var i=0; i < n; i ++){
var info=gl.getActiveAttrib(program, i);
var name=info.name;
attributes[ name ]=gl.getAttribLocation(program, name);
}
return attributes;
}
function filterEmptyLine(string){
return string!=='';
}
function replaceLightNums(string, parameters){
return string
.replace(/NUM_DIR_LIGHTS/g, parameters.numDirLights)
.replace(/NUM_SPOT_LIGHTS/g, parameters.numSpotLights)
.replace(/NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights)
.replace(/NUM_POINT_LIGHTS/g, parameters.numPointLights)
.replace(/NUM_HEMI_LIGHTS/g, parameters.numHemiLights);
}
function replaceClippingPlaneNums(string, parameters){
return string
.replace(/NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes)
.replace(/UNION_CLIPPING_PLANES/g,(parameters.numClippingPlanes - parameters.numClipIntersection) );
}
function parseIncludes(string){
var pattern=/^[ \t]*#include +<([\w\d.]+)>/gm;
function replace(match, include){
var replace=ShaderChunk[ include ];
if(replace===undefined){
throw new Error('Can not resolve #include <' + include + '>');
}
return parseIncludes(replace);
}
return string.replace(pattern, replace);
}
function unrollLoops(string){
var pattern=/#pragma unroll_loop[\s]+?for \(int i \=(\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;
function replace(match, start, end, snippet){
var unroll='';
for(var i=parseInt(start); i < parseInt(end); i ++){
unroll +=snippet.replace(/\[ i \]/g, '[ ' + i + ' ]');
}
return unroll;
}
return string.replace(pattern, replace);
}
function WebGLProgram(renderer, extensions, code, material, shader, parameters){
var gl=renderer.context;
var defines=material.defines;
var vertexShader=shader.vertexShader;
var fragmentShader=shader.fragmentShader;
var shadowMapTypeDefine='SHADOWMAP_TYPE_BASIC';
if(parameters.shadowMapType===PCFShadowMap){
shadowMapTypeDefine='SHADOWMAP_TYPE_PCF';
}else if(parameters.shadowMapType===PCFSoftShadowMap){
shadowMapTypeDefine='SHADOWMAP_TYPE_PCF_SOFT';
}
var envMapTypeDefine='ENVMAP_TYPE_CUBE';
var envMapModeDefine='ENVMAP_MODE_REFLECTION';
var envMapBlendingDefine='ENVMAP_BLENDING_MULTIPLY';
if(parameters.envMap){
switch(material.envMap.mapping){
case CubeReflectionMapping:
case CubeRefractionMapping:
envMapTypeDefine='ENVMAP_TYPE_CUBE';
break;
case CubeUVReflectionMapping:
case CubeUVRefractionMapping:
envMapTypeDefine='ENVMAP_TYPE_CUBE_UV';
break;
case EquirectangularReflectionMapping:
case EquirectangularRefractionMapping:
envMapTypeDefine='ENVMAP_TYPE_EQUIREC';
break;
case SphericalReflectionMapping:
envMapTypeDefine='ENVMAP_TYPE_SPHERE';
break;
}
switch(material.envMap.mapping){
case CubeRefractionMapping:
case EquirectangularRefractionMapping:
envMapModeDefine='ENVMAP_MODE_REFRACTION';
break;
}
switch(material.combine){
case MultiplyOperation:
envMapBlendingDefine='ENVMAP_BLENDING_MULTIPLY';
break;
case MixOperation:
envMapBlendingDefine='ENVMAP_BLENDING_MIX';
break;
case AddOperation:
envMapBlendingDefine='ENVMAP_BLENDING_ADD';
break;
}}
var gammaFactorDefine=(renderer.gammaFactor > 0) ? renderer.gammaFactor:1.0;
var customExtensions=generateExtensions(material.extensions, parameters, extensions);
var customDefines=generateDefines(defines);
var program=gl.createProgram();
var prefixVertex, prefixFragment;
if(material.isRawShaderMaterial){
prefixVertex=[
customDefines
].filter(filterEmptyLine).join('\n');
if(prefixVertex.length > 0){
prefixVertex +='\n';
}
prefixFragment=[
customExtensions,
customDefines
].filter(filterEmptyLine).join('\n');
if(prefixFragment.length > 0){
prefixFragment +='\n';
}}else{
prefixVertex=[
'precision ' + parameters.precision + ' float;',
'precision ' + parameters.precision + ' int;',
'#define SHADER_NAME ' + shader.name,
customDefines,
parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES':'',
'#define GAMMA_FACTOR ' + gammaFactorDefine,
'#define MAX_BONES ' + parameters.maxBones,
(parameters.useFog&&parameters.fog) ? '#define USE_FOG':'',
(parameters.useFog&&parameters.fogExp) ? '#define FOG_EXP2':'',
parameters.map ? '#define USE_MAP':'',
parameters.envMap ? '#define USE_ENVMAP':'',
parameters.envMap ? '#define ' + envMapModeDefine:'',
parameters.lightMap ? '#define USE_LIGHTMAP':'',
parameters.aoMap ? '#define USE_AOMAP':'',
parameters.emissiveMap ? '#define USE_EMISSIVEMAP':'',
parameters.bumpMap ? '#define USE_BUMPMAP':'',
parameters.normalMap ? '#define USE_NORMALMAP':'',
parameters.displacementMap&&parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP':'',
parameters.specularMap ? '#define USE_SPECULARMAP':'',
parameters.roughnessMap ? '#define USE_ROUGHNESSMAP':'',
parameters.metalnessMap ? '#define USE_METALNESSMAP':'',
parameters.alphaMap ? '#define USE_ALPHAMAP':'',
parameters.vertexColors ? '#define USE_COLOR':'',
parameters.flatShading ? '#define FLAT_SHADED':'',
parameters.skinning ? '#define USE_SKINNING':'',
parameters.useVertexTexture ? '#define BONE_TEXTURE':'',
parameters.morphTargets ? '#define USE_MORPHTARGETS':'',
parameters.morphNormals&&parameters.flatShading===false ? '#define USE_MORPHNORMALS':'',
parameters.doubleSided ? '#define DOUBLE_SIDED':'',
parameters.flipSided ? '#define FLIP_SIDED':'',
parameters.shadowMapEnabled ? '#define USE_SHADOWMAP':'',
parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine:'',
parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION':'',
parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF':'',
parameters.logarithmicDepthBuffer&&extensions.get('EXT_frag_depth') ? '#define USE_LOGDEPTHBUF_EXT':'',
'uniform mat4 modelMatrix;',
'uniform mat4 modelViewMatrix;',
'uniform mat4 projectionMatrix;',
'uniform mat4 viewMatrix;',
'uniform mat3 normalMatrix;',
'uniform vec3 cameraPosition;',
'attribute vec3 position;',
'attribute vec3 normal;',
'attribute vec2 uv;',
'#ifdef USE_COLOR',
'	attribute vec3 color;',
'#endif',
'#ifdef USE_MORPHTARGETS',
'	attribute vec3 morphTarget0;',
'	attribute vec3 morphTarget1;',
'	attribute vec3 morphTarget2;',
'	attribute vec3 morphTarget3;',
'	#ifdef USE_MORPHNORMALS',
'		attribute vec3 morphNormal0;',
'		attribute vec3 morphNormal1;',
'		attribute vec3 morphNormal2;',
'		attribute vec3 morphNormal3;',
'	#else',
'		attribute vec3 morphTarget4;',
'		attribute vec3 morphTarget5;',
'		attribute vec3 morphTarget6;',
'		attribute vec3 morphTarget7;',
'	#endif',
'#endif',
'#ifdef USE_SKINNING',
'	attribute vec4 skinIndex;',
'	attribute vec4 skinWeight;',
'#endif',
'\n'
].filter(filterEmptyLine).join('\n');
prefixFragment=[
customExtensions,
'precision ' + parameters.precision + ' float;',
'precision ' + parameters.precision + ' int;',
'#define SHADER_NAME ' + shader.name,
customDefines,
parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest +(parameters.alphaTest % 1 ? '':'.0'):'',
'#define GAMMA_FACTOR ' + gammaFactorDefine,
(parameters.useFog&&parameters.fog) ? '#define USE_FOG':'',
(parameters.useFog&&parameters.fogExp) ? '#define FOG_EXP2':'',
parameters.map ? '#define USE_MAP':'',
parameters.envMap ? '#define USE_ENVMAP':'',
parameters.envMap ? '#define ' + envMapTypeDefine:'',
parameters.envMap ? '#define ' + envMapModeDefine:'',
parameters.envMap ? '#define ' + envMapBlendingDefine:'',
parameters.lightMap ? '#define USE_LIGHTMAP':'',
parameters.aoMap ? '#define USE_AOMAP':'',
parameters.emissiveMap ? '#define USE_EMISSIVEMAP':'',
parameters.bumpMap ? '#define USE_BUMPMAP':'',
parameters.normalMap ? '#define USE_NORMALMAP':'',
parameters.specularMap ? '#define USE_SPECULARMAP':'',
parameters.roughnessMap ? '#define USE_ROUGHNESSMAP':'',
parameters.metalnessMap ? '#define USE_METALNESSMAP':'',
parameters.alphaMap ? '#define USE_ALPHAMAP':'',
parameters.vertexColors ? '#define USE_COLOR':'',
parameters.gradientMap ? '#define USE_GRADIENTMAP':'',
parameters.flatShading ? '#define FLAT_SHADED':'',
parameters.doubleSided ? '#define DOUBLE_SIDED':'',
parameters.flipSided ? '#define FLIP_SIDED':'',
parameters.shadowMapEnabled ? '#define USE_SHADOWMAP':'',
parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine:'',
parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA':'',
parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS':'',
parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF':'',
parameters.logarithmicDepthBuffer&&extensions.get('EXT_frag_depth') ? '#define USE_LOGDEPTHBUF_EXT':'',
parameters.envMap&&extensions.get('EXT_shader_texture_lod') ? '#define TEXTURE_LOD_EXT':'',
'uniform mat4 viewMatrix;',
'uniform vec3 cameraPosition;',
(parameters.toneMapping!==NoToneMapping) ? '#define TONE_MAPPING':'',
(parameters.toneMapping!==NoToneMapping) ? ShaderChunk[ 'tonemapping_pars_fragment' ]:'',
(parameters.toneMapping!==NoToneMapping) ? getToneMappingFunction('toneMapping', parameters.toneMapping):'',
parameters.dithering ? '#define DITHERING':'',
(parameters.outputEncoding||parameters.mapEncoding||parameters.envMapEncoding||parameters.emissiveMapEncoding) ? ShaderChunk[ 'encodings_pars_fragment' ]:'',
parameters.mapEncoding ? getTexelDecodingFunction('mapTexelToLinear', parameters.mapEncoding):'',
parameters.envMapEncoding ? getTexelDecodingFunction('envMapTexelToLinear', parameters.envMapEncoding):'',
parameters.emissiveMapEncoding ? getTexelDecodingFunction('emissiveMapTexelToLinear', parameters.emissiveMapEncoding):'',
parameters.outputEncoding ? getTexelEncodingFunction('linearToOutputTexel', parameters.outputEncoding):'',
parameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking:'',
'\n'
].filter(filterEmptyLine).join('\n');
}
vertexShader=parseIncludes(vertexShader);
vertexShader=replaceLightNums(vertexShader, parameters);
vertexShader=replaceClippingPlaneNums(vertexShader, parameters);
fragmentShader=parseIncludes(fragmentShader);
fragmentShader=replaceLightNums(fragmentShader, parameters);
fragmentShader=replaceClippingPlaneNums(fragmentShader, parameters);
vertexShader=unrollLoops(vertexShader);
fragmentShader=unrollLoops(fragmentShader);
var vertexGlsl=prefixVertex + vertexShader;
var fragmentGlsl=prefixFragment + fragmentShader;
var glVertexShader=WebGLShader(gl, gl.VERTEX_SHADER, vertexGlsl);
var glFragmentShader=WebGLShader(gl, gl.FRAGMENT_SHADER, fragmentGlsl);
gl.attachShader(program, glVertexShader);
gl.attachShader(program, glFragmentShader);
if(material.index0AttributeName!==undefined){
gl.bindAttribLocation(program, 0, material.index0AttributeName);
}else if(parameters.morphTargets===true){
gl.bindAttribLocation(program, 0, 'position');
}
gl.linkProgram(program);
var programLog=gl.getProgramInfoLog(program).trim();
var vertexLog=gl.getShaderInfoLog(glVertexShader).trim();
var fragmentLog=gl.getShaderInfoLog(glFragmentShader).trim();
var runnable=true;
var haveDiagnostics=true;
if(gl.getProgramParameter(program, gl.LINK_STATUS)===false){
runnable=false;
console.error('THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter(program, gl.VALIDATE_STATUS), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog);
}else if(programLog!==''){
console.warn('THREE.WebGLProgram: gl.getProgramInfoLog()', programLog);
}else if(vertexLog===''||fragmentLog===''){
haveDiagnostics=false;
}
if(haveDiagnostics){
this.diagnostics={
runnable: runnable,
material: material,
programLog: programLog,
vertexShader: {
log: vertexLog,
prefix: prefixVertex
},
fragmentShader: {
log: fragmentLog,
prefix: prefixFragment
}};}
gl.deleteShader(glVertexShader);
gl.deleteShader(glFragmentShader);
var cachedUniforms;
this.getUniforms=function (){
if(cachedUniforms===undefined){
cachedUniforms=new WebGLUniforms(gl, program, renderer);
}
return cachedUniforms;
};
var cachedAttributes;
this.getAttributes=function (){
if(cachedAttributes===undefined){
cachedAttributes=fetchAttributeLocations(gl, program);
}
return cachedAttributes;
};
this.destroy=function (){
gl.deleteProgram(program);
this.program=undefined;
};
Object.defineProperties(this, {
uniforms: {
get: function (){
console.warn('THREE.WebGLProgram: .uniforms is now .getUniforms().');
return this.getUniforms();
}},
attributes: {
get: function (){
console.warn('THREE.WebGLProgram: .attributes is now .getAttributes().');
return this.getAttributes();
}}
});
this.name=shader.name;
this.id=programIdCount ++;
this.code=code;
this.usedTimes=1;
this.program=program;
this.vertexShader=glVertexShader;
this.fragmentShader=glFragmentShader;
return this;
}
function WebGLPrograms(renderer, extensions, capabilities){
var programs=[];
var shaderIDs={
MeshDepthMaterial: 'depth',
MeshDistanceMaterial: 'distanceRGBA',
MeshNormalMaterial: 'normal',
MeshBasicMaterial: 'basic',
MeshLambertMaterial: 'lambert',
MeshPhongMaterial: 'phong',
MeshToonMaterial: 'phong',
MeshStandardMaterial: 'physical',
MeshPhysicalMaterial: 'physical',
LineBasicMaterial: 'basic',
LineDashedMaterial: 'dashed',
PointsMaterial: 'points',
ShadowMaterial: 'shadow'
};
var parameterNames=[
"precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding",
"lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "displacementMap", "specularMap",
"roughnessMap", "metalnessMap", "gradientMap",
"alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp",
"flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning",
"maxBones", "useVertexTexture", "morphTargets", "morphNormals",
"maxMorphTargets", "maxMorphNormals", "premultipliedAlpha",
"numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights",
"shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights',
"alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering"
];
function allocateBones(object){
var skeleton=object.skeleton;
var bones=skeleton.bones;
if(capabilities.floatVertexTextures){
return 1024;
}else{
var nVertexUniforms=capabilities.maxVertexUniforms;
var nVertexMatrices=Math.floor(( nVertexUniforms - 20) / 4);
var maxBones=Math.min(nVertexMatrices, bones.length);
if(maxBones < bones.length){
console.warn('THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.');
return 0;
}
return maxBones;
}}
function getTextureEncodingFromMap(map, gammaOverrideLinear){
var encoding;
if(! map){
encoding=LinearEncoding;
}else if(map.isTexture){
encoding=map.encoding;
}else if(map.isWebGLRenderTarget){
console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.");
encoding=map.texture.encoding;
}
if(encoding===LinearEncoding&&gammaOverrideLinear){
encoding=GammaEncoding;
}
return encoding;
}
this.getParameters=function(material, lights, shadows, fog, nClipPlanes, nClipIntersection, object){
var shaderID=shaderIDs[ material.type ];
var maxBones=object.isSkinnedMesh ? allocateBones(object):0;
var precision=capabilities.precision;
if(material.precision!==null){
precision=capabilities.getMaxPrecision(material.precision);
if(precision!==material.precision){
console.warn('THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.');
}}
var currentRenderTarget=renderer.getRenderTarget();
var parameters={
shaderID: shaderID,
precision: precision,
supportsVertexTextures: capabilities.vertexTextures,
outputEncoding: getTextureEncodingFromMap(( ! currentRenderTarget) ? null:currentRenderTarget.texture, renderer.gammaOutput),
map: !! material.map,
mapEncoding: getTextureEncodingFromMap(material.map, renderer.gammaInput),
envMap: !! material.envMap,
envMapMode: material.envMap&&material.envMap.mapping,
envMapEncoding: getTextureEncodingFromMap(material.envMap, renderer.gammaInput),
envMapCubeUV:(!! material.envMap)&&(( material.envMap.mapping===CubeUVReflectionMapping)||(material.envMap.mapping===CubeUVRefractionMapping) ),
lightMap: !! material.lightMap,
aoMap: !! material.aoMap,
emissiveMap: !! material.emissiveMap,
emissiveMapEncoding: getTextureEncodingFromMap(material.emissiveMap, renderer.gammaInput),
bumpMap: !! material.bumpMap,
normalMap: !! material.normalMap,
displacementMap: !! material.displacementMap,
roughnessMap: !! material.roughnessMap,
metalnessMap: !! material.metalnessMap,
specularMap: !! material.specularMap,
alphaMap: !! material.alphaMap,
gradientMap: !! material.gradientMap,
combine: material.combine,
vertexColors: material.vertexColors,
fog: !! fog,
useFog: material.fog,
fogExp:(fog&&fog.isFogExp2),
flatShading: material.flatShading,
sizeAttenuation: material.sizeAttenuation,
logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,
skinning: material.skinning&&maxBones > 0,
maxBones: maxBones,
useVertexTexture: capabilities.floatVertexTextures,
morphTargets: material.morphTargets,
morphNormals: material.morphNormals,
maxMorphTargets: renderer.maxMorphTargets,
maxMorphNormals: renderer.maxMorphNormals,
numDirLights: lights.directional.length,
numPointLights: lights.point.length,
numSpotLights: lights.spot.length,
numRectAreaLights: lights.rectArea.length,
numHemiLights: lights.hemi.length,
numClippingPlanes: nClipPlanes,
numClipIntersection: nClipIntersection,
dithering: material.dithering,
shadowMapEnabled: renderer.shadowMap.enabled&&object.receiveShadow&&shadows.length > 0,
shadowMapType: renderer.shadowMap.type,
toneMapping: renderer.toneMapping,
physicallyCorrectLights: renderer.physicallyCorrectLights,
premultipliedAlpha: material.premultipliedAlpha,
alphaTest: material.alphaTest,
doubleSided: material.side===DoubleSide,
flipSided: material.side===BackSide,
depthPacking:(material.depthPacking!==undefined) ? material.depthPacking:false
};
return parameters;
};
this.getProgramCode=function(material, parameters){
var array=[];
if(parameters.shaderID){
array.push(parameters.shaderID);
}else{
array.push(material.fragmentShader);
array.push(material.vertexShader);
}
if(material.defines!==undefined){
for(var name in material.defines){
array.push(name);
array.push(material.defines[ name ]);
}}
for(var i=0; i < parameterNames.length; i ++){
array.push(parameters[ parameterNames[ i ] ]);
}
array.push(material.onBeforeCompile.toString());
array.push(renderer.gammaOutput);
return array.join();
};
this.acquireProgram=function(material, shader, parameters, code){
var program;
for(var p=0, pl=programs.length; p < pl; p ++){
var programInfo=programs[ p ];
if(programInfo.code===code){
program=programInfo;
++ program.usedTimes;
break;
}}
if(program===undefined){
program=new WebGLProgram(renderer, extensions, code, material, shader, parameters);
programs.push(program);
}
return program;
};
this.releaseProgram=function(program){
if(-- program.usedTimes===0){
var i=programs.indexOf(program);
programs[ i ]=programs[ programs.length - 1 ];
programs.pop();
program.destroy();
}};
this.programs=programs;
}
function WebGLProperties(){
var properties=new WeakMap();
function get(object){
var map=properties.get(object);
if(map===undefined){
map={};
properties.set(object, map);
}
return map;
}
function remove(object){
properties.delete(object);
}
function update(object, key, value){
properties.get(object)[ key ]=value;
}
function dispose(){
properties=new WeakMap();
}
return {
get: get,
remove: remove,
update: update,
dispose: dispose
};}
function painterSortStable(a, b){
if(a.renderOrder!==b.renderOrder){
return a.renderOrder - b.renderOrder;
}else if(a.program&&b.program&&a.program!==b.program){
return a.program.id - b.program.id;
}else if(a.material.id!==b.material.id){
return a.material.id - b.material.id;
}else if(a.z!==b.z){
return a.z - b.z;
}else{
return a.id - b.id;
}}
function reversePainterSortStable(a, b){
if(a.renderOrder!==b.renderOrder){
return a.renderOrder - b.renderOrder;
} if(a.z!==b.z){
return b.z - a.z;
}else{
return a.id - b.id;
}}
function WebGLRenderList(){
var renderItems=[];
var renderItemsIndex=0;
var opaque=[];
var transparent=[];
function init(){
renderItemsIndex=0;
opaque.length=0;
transparent.length=0;
}
function push(object, geometry, material, z, group){
var renderItem=renderItems[ renderItemsIndex ];
if(renderItem===undefined){
renderItem={
id: object.id,
object: object,
geometry: geometry,
material: material,
program: material.program,
renderOrder: object.renderOrder,
z: z,
group: group
};
renderItems[ renderItemsIndex ]=renderItem;
}else{
renderItem.id=object.id;
renderItem.object=object;
renderItem.geometry=geometry;
renderItem.material=material;
renderItem.program=material.program;
renderItem.renderOrder=object.renderOrder;
renderItem.z=z;
renderItem.group=group;
}
(material.transparent===true ? transparent:opaque).push(renderItem);
renderItemsIndex ++;
}
function sort(){
if(opaque.length > 1) opaque.sort(painterSortStable);
if(transparent.length > 1) transparent.sort(reversePainterSortStable);
}
return {
opaque: opaque,
transparent: transparent,
init: init,
push: push,
sort: sort
};}
function WebGLRenderLists(){
var lists={};
function get(scene, camera){
var hash=scene.id + ',' + camera.id;
var list=lists[ hash ];
if(list===undefined){
list=new WebGLRenderList();
lists[ hash ]=list;
}
return list;
}
function dispose(){
lists={};}
return {
get: get,
dispose: dispose
};}
function UniformsCache(){
var lights={};
return {
get: function(light){
if(lights[ light.id ]!==undefined){
return lights[ light.id ];
}
var uniforms;
switch(light.type){
case 'DirectionalLight':
uniforms={
direction: new Vector3(),
color: new Color(),
shadow: false,
shadowBias: 0,
shadowRadius: 1,
shadowMapSize: new Vector2()
};
break;
case 'SpotLight':
uniforms={
position: new Vector3(),
direction: new Vector3(),
color: new Color(),
distance: 0,
coneCos: 0,
penumbraCos: 0,
decay: 0,
shadow: false,
shadowBias: 0,
shadowRadius: 1,
shadowMapSize: new Vector2()
};
break;
case 'PointLight':
uniforms={
position: new Vector3(),
color: new Color(),
distance: 0,
decay: 0,
shadow: false,
shadowBias: 0,
shadowRadius: 1,
shadowMapSize: new Vector2(),
shadowCameraNear: 1,
shadowCameraFar: 1000
};
break;
case 'HemisphereLight':
uniforms={
direction: new Vector3(),
skyColor: new Color(),
groundColor: new Color()
};
break;
case 'RectAreaLight':
uniforms={
color: new Color(),
position: new Vector3(),
halfWidth: new Vector3(),
halfHeight: new Vector3()
};
break;
}
lights[ light.id ]=uniforms;
return uniforms;
}};}
var count=0;
function WebGLLights(){
var cache=new UniformsCache();
var state={
id: count ++,
hash: '',
ambient: [ 0, 0, 0 ],
directional: [],
directionalShadowMap: [],
directionalShadowMatrix: [],
spot: [],
spotShadowMap: [],
spotShadowMatrix: [],
rectArea: [],
point: [],
pointShadowMap: [],
pointShadowMatrix: [],
hemi: []
};
var vector3=new Vector3();
var matrix4=new Matrix4();
var matrix42=new Matrix4();
function setup(lights, shadows, camera){
var r=0, g=0, b=0;
var directionalLength=0;
var pointLength=0;
var spotLength=0;
var rectAreaLength=0;
var hemiLength=0;
var viewMatrix=camera.matrixWorldInverse;
for(var i=0, l=lights.length; i < l; i ++){
var light=lights[ i ];
var color=light.color;
var intensity=light.intensity;
var distance=light.distance;
var shadowMap=(light.shadow&&light.shadow.map) ? light.shadow.map.texture:null;
if(light.isAmbientLight){
r +=color.r * intensity;
g +=color.g * intensity;
b +=color.b * intensity;
}else if(light.isDirectionalLight){
var uniforms=cache.get(light);
uniforms.color.copy(light.color).multiplyScalar(light.intensity);
uniforms.direction.setFromMatrixPosition(light.matrixWorld);
vector3.setFromMatrixPosition(light.target.matrixWorld);
uniforms.direction.sub(vector3);
uniforms.direction.transformDirection(viewMatrix);
uniforms.shadow=light.castShadow;
if(light.castShadow){
var shadow=light.shadow;
uniforms.shadowBias=shadow.bias;
uniforms.shadowRadius=shadow.radius;
uniforms.shadowMapSize=shadow.mapSize;
}
state.directionalShadowMap[ directionalLength ]=shadowMap;
state.directionalShadowMatrix[ directionalLength ]=light.shadow.matrix;
state.directional[ directionalLength ]=uniforms;
directionalLength ++;
}else if(light.isSpotLight){
var uniforms=cache.get(light);
uniforms.position.setFromMatrixPosition(light.matrixWorld);
uniforms.position.applyMatrix4(viewMatrix);
uniforms.color.copy(color).multiplyScalar(intensity);
uniforms.distance=distance;
uniforms.direction.setFromMatrixPosition(light.matrixWorld);
vector3.setFromMatrixPosition(light.target.matrixWorld);
uniforms.direction.sub(vector3);
uniforms.direction.transformDirection(viewMatrix);
uniforms.coneCos=Math.cos(light.angle);
uniforms.penumbraCos=Math.cos(light.angle *(1 - light.penumbra) );
uniforms.decay=(light.distance===0) ? 0.0:light.decay;
uniforms.shadow=light.castShadow;
if(light.castShadow){
var shadow=light.shadow;
uniforms.shadowBias=shadow.bias;
uniforms.shadowRadius=shadow.radius;
uniforms.shadowMapSize=shadow.mapSize;
}
state.spotShadowMap[ spotLength ]=shadowMap;
state.spotShadowMatrix[ spotLength ]=light.shadow.matrix;
state.spot[ spotLength ]=uniforms;
spotLength ++;
}else if(light.isRectAreaLight){
var uniforms=cache.get(light);
uniforms.color.copy(color).multiplyScalar(intensity);
uniforms.position.setFromMatrixPosition(light.matrixWorld);
uniforms.position.applyMatrix4(viewMatrix);
matrix42.identity();
matrix4.copy(light.matrixWorld);
matrix4.premultiply(viewMatrix);
matrix42.extractRotation(matrix4);
uniforms.halfWidth.set(light.width * 0.5, 0.0, 0.0);
uniforms.halfHeight.set(0.0, light.height * 0.5, 0.0);
uniforms.halfWidth.applyMatrix4(matrix42);
uniforms.halfHeight.applyMatrix4(matrix42);
state.rectArea[ rectAreaLength ]=uniforms;
rectAreaLength ++;
}else if(light.isPointLight){
var uniforms=cache.get(light);
uniforms.position.setFromMatrixPosition(light.matrixWorld);
uniforms.position.applyMatrix4(viewMatrix);
uniforms.color.copy(light.color).multiplyScalar(light.intensity);
uniforms.distance=light.distance;
uniforms.decay=(light.distance===0) ? 0.0:light.decay;
uniforms.shadow=light.castShadow;
if(light.castShadow){
var shadow=light.shadow;
uniforms.shadowBias=shadow.bias;
uniforms.shadowRadius=shadow.radius;
uniforms.shadowMapSize=shadow.mapSize;
uniforms.shadowCameraNear=shadow.camera.near;
uniforms.shadowCameraFar=shadow.camera.far;
}
state.pointShadowMap[ pointLength ]=shadowMap;
state.pointShadowMatrix[ pointLength ]=light.shadow.matrix;
state.point[ pointLength ]=uniforms;
pointLength ++;
}else if(light.isHemisphereLight){
var uniforms=cache.get(light);
uniforms.direction.setFromMatrixPosition(light.matrixWorld);
uniforms.direction.transformDirection(viewMatrix);
uniforms.direction.normalize();
uniforms.skyColor.copy(light.color).multiplyScalar(intensity);
uniforms.groundColor.copy(light.groundColor).multiplyScalar(intensity);
state.hemi[ hemiLength ]=uniforms;
hemiLength ++;
}}
state.ambient[ 0 ]=r;
state.ambient[ 1 ]=g;
state.ambient[ 2 ]=b;
state.directional.length=directionalLength;
state.spot.length=spotLength;
state.rectArea.length=rectAreaLength;
state.point.length=pointLength;
state.hemi.length=hemiLength;
state.hash=state.id + ',' + directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + shadows.length;
}
return {
setup: setup,
state: state
};}
function WebGLRenderState(){
var lights=new WebGLLights();
var lightsArray=[];
var shadowsArray=[];
var spritesArray=[];
function init(){
lightsArray.length=0;
shadowsArray.length=0;
spritesArray.length=0;
}
function pushLight(light){
lightsArray.push(light);
}
function pushShadow(shadowLight){
shadowsArray.push(shadowLight);
}
function pushSprite(shadowLight){
spritesArray.push(shadowLight);
}
function setupLights(camera){
lights.setup(lightsArray, shadowsArray, camera);
}
var state={
lightsArray: lightsArray,
shadowsArray: shadowsArray,
spritesArray: spritesArray,
lights: lights
};
return {
init: init,
state: state,
setupLights: setupLights,
pushLight: pushLight,
pushShadow: pushShadow,
pushSprite: pushSprite
};}
function WebGLRenderStates(){
var renderStates={};
function get(scene, camera){
var hash=scene.id + ',' + camera.id;
var renderState=renderStates[ hash ];
if(renderState===undefined){
renderState=new WebGLRenderState();
renderStates[ hash ]=renderState;
}
return renderState;
}
function dispose(){
renderStates={};}
return {
get: get,
dispose: dispose
};}
function MeshDepthMaterial(parameters){
Material.call(this);
this.type='MeshDepthMaterial';
this.depthPacking=BasicDepthPacking;
this.skinning=false;
this.morphTargets=false;
this.map=null;
this.alphaMap=null;
this.displacementMap=null;
this.displacementScale=1;
this.displacementBias=0;
this.wireframe=false;
this.wireframeLinewidth=1;
this.fog=false;
this.lights=false;
this.setValues(parameters);
}
MeshDepthMaterial.prototype=Object.create(Material.prototype);
MeshDepthMaterial.prototype.constructor=MeshDepthMaterial;
MeshDepthMaterial.prototype.isMeshDepthMaterial=true;
MeshDepthMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this, source);
this.depthPacking=source.depthPacking;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
this.map=source.map;
this.alphaMap=source.alphaMap;
this.displacementMap=source.displacementMap;
this.displacementScale=source.displacementScale;
this.displacementBias=source.displacementBias;
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
return this;
};
function MeshDistanceMaterial(parameters){
Material.call(this);
this.type='MeshDistanceMaterial';
this.referencePosition=new Vector3();
this.nearDistance=1;
this.farDistance=1000;
this.skinning=false;
this.morphTargets=false;
this.map=null;
this.alphaMap=null;
this.displacementMap=null;
this.displacementScale=1;
this.displacementBias=0;
this.fog=false;
this.lights=false;
this.setValues(parameters);
}
MeshDistanceMaterial.prototype=Object.create(Material.prototype);
MeshDistanceMaterial.prototype.constructor=MeshDistanceMaterial;
MeshDistanceMaterial.prototype.isMeshDistanceMaterial=true;
MeshDistanceMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this, source);
this.referencePosition.copy(source.referencePosition);
this.nearDistance=source.nearDistance;
this.farDistance=source.farDistance;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
this.map=source.map;
this.alphaMap=source.alphaMap;
this.displacementMap=source.displacementMap;
this.displacementScale=source.displacementScale;
this.displacementBias=source.displacementBias;
return this;
};
function WebGLShadowMap(_renderer, _objects, maxTextureSize){
var _frustum=new Frustum(),
_projScreenMatrix=new Matrix4(),
_shadowMapSize=new Vector2(),
_maxShadowMapSize=new Vector2(maxTextureSize, maxTextureSize),
_lookTarget=new Vector3(),
_lightPositionWorld=new Vector3(),
_MorphingFlag=1,
_SkinningFlag=2,
_NumberOfMaterialVariants=(_MorphingFlag | _SkinningFlag) + 1,
_depthMaterials=new Array(_NumberOfMaterialVariants),
_distanceMaterials=new Array(_NumberOfMaterialVariants),
_materialCache={};
var shadowSide={ 0: BackSide, 1: FrontSide, 2: DoubleSide };
var cubeDirections=[
new Vector3(1, 0, 0), new Vector3(- 1, 0, 0), new Vector3(0, 0, 1),
new Vector3(0, 0, - 1), new Vector3(0, 1, 0), new Vector3(0, - 1, 0)
];
var cubeUps=[
new Vector3(0, 1, 0), new Vector3(0, 1, 0), new Vector3(0, 1, 0),
new Vector3(0, 1, 0), new Vector3(0, 0, 1),	new Vector3(0, 0, - 1)
];
var cube2DViewPorts=[
new Vector4(), new Vector4(), new Vector4(),
new Vector4(), new Vector4(), new Vector4()
];
for(var i=0; i!==_NumberOfMaterialVariants; ++ i){
var useMorphing=(i & _MorphingFlag)!==0;
var useSkinning=(i & _SkinningFlag)!==0;
var depthMaterial=new MeshDepthMaterial( {
depthPacking: RGBADepthPacking,
morphTargets: useMorphing,
skinning: useSkinning
});
_depthMaterials[ i ]=depthMaterial;
var distanceMaterial=new MeshDistanceMaterial( {
morphTargets: useMorphing,
skinning: useSkinning
});
_distanceMaterials[ i ]=distanceMaterial;
}
var scope=this;
this.enabled=false;
this.autoUpdate=true;
this.needsUpdate=false;
this.type=PCFShadowMap;
this.render=function(lights, scene, camera){
if(scope.enabled===false) return;
if(scope.autoUpdate===false&&scope.needsUpdate===false) return;
if(lights.length===0) return;
var _gl=_renderer.context;
var _state=_renderer.state;
_state.disable(_gl.BLEND);
_state.buffers.color.setClear(1, 1, 1, 1);
_state.buffers.depth.setTest(true);
_state.setScissorTest(false);
var faceCount;
for(var i=0, il=lights.length; i < il; i ++){
var light=lights[ i ];
var shadow=light.shadow;
var isPointLight=light&&light.isPointLight;
if(shadow===undefined){
console.warn('THREE.WebGLShadowMap:', light, 'has no shadow.');
continue;
}
var shadowCamera=shadow.camera;
_shadowMapSize.copy(shadow.mapSize);
_shadowMapSize.min(_maxShadowMapSize);
if(isPointLight){
var vpWidth=_shadowMapSize.x;
var vpHeight=_shadowMapSize.y;
cube2DViewPorts[ 0 ].set(vpWidth * 2, vpHeight, vpWidth, vpHeight);
cube2DViewPorts[ 1 ].set(0, vpHeight, vpWidth, vpHeight);
cube2DViewPorts[ 2 ].set(vpWidth * 3, vpHeight, vpWidth, vpHeight);
cube2DViewPorts[ 3 ].set(vpWidth, vpHeight, vpWidth, vpHeight);
cube2DViewPorts[ 4 ].set(vpWidth * 3, 0, vpWidth, vpHeight);
cube2DViewPorts[ 5 ].set(vpWidth, 0, vpWidth, vpHeight);
_shadowMapSize.x *=4.0;
_shadowMapSize.y *=2.0;
}
if(shadow.map===null){
var pars={ minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };
shadow.map=new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y, pars);
shadow.map.texture.name=light.name + ".shadowMap";
shadowCamera.updateProjectionMatrix();
}
if(shadow.isSpotLightShadow){
shadow.update(light);
}
var shadowMap=shadow.map;
var shadowMatrix=shadow.matrix;
_lightPositionWorld.setFromMatrixPosition(light.matrixWorld);
shadowCamera.position.copy(_lightPositionWorld);
if(isPointLight){
faceCount=6;
shadowMatrix.makeTranslation(- _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z);
}else{
faceCount=1;
_lookTarget.setFromMatrixPosition(light.target.matrixWorld);
shadowCamera.lookAt(_lookTarget);
shadowCamera.updateMatrixWorld();
shadowMatrix.set(0.5, 0.0, 0.0, 0.5,
0.0, 0.5, 0.0, 0.5,
0.0, 0.0, 0.5, 0.5,
0.0, 0.0, 0.0, 1.0
);
shadowMatrix.multiply(shadowCamera.projectionMatrix);
shadowMatrix.multiply(shadowCamera.matrixWorldInverse);
}
_renderer.setRenderTarget(shadowMap);
_renderer.clear();
for(var face=0; face < faceCount; face ++){
if(isPointLight){
_lookTarget.copy(shadowCamera.position);
_lookTarget.add(cubeDirections[ face ]);
shadowCamera.up.copy(cubeUps[ face ]);
shadowCamera.lookAt(_lookTarget);
shadowCamera.updateMatrixWorld();
var vpDimensions=cube2DViewPorts[ face ];
_state.viewport(vpDimensions);
}
_projScreenMatrix.multiplyMatrices(shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse);
_frustum.setFromMatrix(_projScreenMatrix);
renderObject(scene, camera, shadowCamera, isPointLight);
}}
scope.needsUpdate=false;
};
function getDepthMaterial(object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar){
var geometry=object.geometry;
var result=null;
var materialVariants=_depthMaterials;
var customMaterial=object.customDepthMaterial;
if(isPointLight){
materialVariants=_distanceMaterials;
customMaterial=object.customDistanceMaterial;
}
if(! customMaterial){
var useMorphing=false;
if(material.morphTargets){
if(geometry&&geometry.isBufferGeometry){
useMorphing=geometry.morphAttributes&&geometry.morphAttributes.position&&geometry.morphAttributes.position.length > 0;
}else if(geometry&&geometry.isGeometry){
useMorphing=geometry.morphTargets&&geometry.morphTargets.length > 0;
}}
if(object.isSkinnedMesh&&material.skinning===false){
console.warn('THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object);
}
var useSkinning=object.isSkinnedMesh&&material.skinning;
var variantIndex=0;
if(useMorphing) variantIndex |=_MorphingFlag;
if(useSkinning) variantIndex |=_SkinningFlag;
result=materialVariants[ variantIndex ];
}else{
result=customMaterial;
}
if(_renderer.localClippingEnabled &&
material.clipShadows===true &&
material.clippingPlanes.length!==0){
var keyA=result.uuid, keyB=material.uuid;
var materialsForVariant=_materialCache[ keyA ];
if(materialsForVariant===undefined){
materialsForVariant={};
_materialCache[ keyA ]=materialsForVariant;
}
var cachedMaterial=materialsForVariant[ keyB ];
if(cachedMaterial===undefined){
cachedMaterial=result.clone();
materialsForVariant[ keyB ]=cachedMaterial;
}
result=cachedMaterial;
}
result.visible=material.visible;
result.wireframe=material.wireframe;
result.side=(material.shadowSide!=null) ? material.shadowSide:shadowSide[ material.side ];
result.clipShadows=material.clipShadows;
result.clippingPlanes=material.clippingPlanes;
result.clipIntersection=material.clipIntersection;
result.wireframeLinewidth=material.wireframeLinewidth;
result.linewidth=material.linewidth;
if(isPointLight&&result.isMeshDistanceMaterial){
result.referencePosition.copy(lightPositionWorld);
result.nearDistance=shadowCameraNear;
result.farDistance=shadowCameraFar;
}
return result;
}
function renderObject(object, camera, shadowCamera, isPointLight){
if(object.visible===false) return;
var visible=object.layers.test(camera.layers);
if(visible&&(object.isMesh||object.isLine||object.isPoints) ){
if(object.castShadow&&(! object.frustumCulled||_frustum.intersectsObject(object) )){
object.modelViewMatrix.multiplyMatrices(shadowCamera.matrixWorldInverse, object.matrixWorld);
var geometry=_objects.update(object);
var material=object.material;
if(Array.isArray(material) ){
var groups=geometry.groups;
for(var k=0, kl=groups.length; k < kl; k ++){
var group=groups[ k ];
var groupMaterial=material[ group.materialIndex ];
if(groupMaterial&&groupMaterial.visible){
var depthMaterial=getDepthMaterial(object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far);
_renderer.renderBufferDirect(shadowCamera, null, geometry, depthMaterial, object, group);
}}
}else if(material.visible){
var depthMaterial=getDepthMaterial(object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far);
_renderer.renderBufferDirect(shadowCamera, null, geometry, depthMaterial, object, null);
}}
}
var children=object.children;
for(var i=0, l=children.length; i < l; i ++){
renderObject(children[ i ], camera, shadowCamera, isPointLight);
}}
}
function CanvasTexture(canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy){
Texture.call(this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy);
this.needsUpdate=true;
}
CanvasTexture.prototype=Object.create(Texture.prototype);
CanvasTexture.prototype.constructor=CanvasTexture;
CanvasTexture.prototype.isCanvasTexture=true;
function WebGLSpriteRenderer(renderer, gl, state, textures, capabilities){
var vertexBuffer, elementBuffer;
var program, attributes, uniforms;
var texture;
var spritePosition=new Vector3();
var spriteRotation=new Quaternion();
var spriteScale=new Vector3();
function init(){
var vertices=new Float32Array([
- 0.5, - 0.5, 0, 0,
0.5, - 0.5, 1, 0,
0.5, 0.5, 1, 1,
- 0.5, 0.5, 0, 1
]);
var faces=new Uint16Array([
0, 1, 2,
0, 2, 3
]);
vertexBuffer=gl.createBuffer();
elementBuffer=gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW);
program=createProgram();
attributes={
position: gl.getAttribLocation(program, 'position'),
uv: gl.getAttribLocation(program, 'uv')
};
uniforms={
uvOffset: gl.getUniformLocation(program, 'uvOffset'),
uvScale: gl.getUniformLocation(program, 'uvScale'),
rotation: gl.getUniformLocation(program, 'rotation'),
center: gl.getUniformLocation(program, 'center'),
scale: gl.getUniformLocation(program, 'scale'),
color: gl.getUniformLocation(program, 'color'),
map: gl.getUniformLocation(program, 'map'),
opacity: gl.getUniformLocation(program, 'opacity'),
modelViewMatrix: gl.getUniformLocation(program, 'modelViewMatrix'),
projectionMatrix: gl.getUniformLocation(program, 'projectionMatrix'),
fogType: gl.getUniformLocation(program, 'fogType'),
fogDensity: gl.getUniformLocation(program, 'fogDensity'),
fogNear: gl.getUniformLocation(program, 'fogNear'),
fogFar: gl.getUniformLocation(program, 'fogFar'),
fogColor: gl.getUniformLocation(program, 'fogColor'),
fogDepth: gl.getUniformLocation(program, 'fogDepth'),
alphaTest: gl.getUniformLocation(program, 'alphaTest')
};
var canvas=document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
canvas.width=8;
canvas.height=8;
var context=canvas.getContext('2d');
context.fillStyle='white';
context.fillRect(0, 0, 8, 8);
texture=new CanvasTexture(canvas);
}
this.render=function(sprites, scene, camera){
if(sprites.length===0) return;
if(program===undefined){
init();
}
state.useProgram(program);
state.initAttributes();
state.enableAttribute(attributes.position);
state.enableAttribute(attributes.uv);
state.disableUnusedAttributes();
state.disable(gl.CULL_FACE);
state.enable(gl.BLEND);
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.vertexAttribPointer(attributes.position, 2, gl.FLOAT, false, 2 * 8, 0);
gl.vertexAttribPointer(attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementBuffer);
gl.uniformMatrix4fv(uniforms.projectionMatrix, false, camera.projectionMatrix.elements);
state.activeTexture(gl.TEXTURE0);
gl.uniform1i(uniforms.map, 0);
var oldFogType=0;
var sceneFogType=0;
var fog=scene.fog;
if(fog){
gl.uniform3f(uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b);
if(fog.isFog){
gl.uniform1f(uniforms.fogNear, fog.near);
gl.uniform1f(uniforms.fogFar, fog.far);
gl.uniform1i(uniforms.fogType, 1);
oldFogType=1;
sceneFogType=1;
}else if(fog.isFogExp2){
gl.uniform1f(uniforms.fogDensity, fog.density);
gl.uniform1i(uniforms.fogType, 2);
oldFogType=2;
sceneFogType=2;
}}else{
gl.uniform1i(uniforms.fogType, 0);
oldFogType=0;
sceneFogType=0;
}
for(var i=0, l=sprites.length; i < l; i ++){
var sprite=sprites[ i ];
sprite.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse, sprite.matrixWorld);
sprite.z=- sprite.modelViewMatrix.elements[ 14 ];
}
sprites.sort(painterSortStable);
var scale=[];
var center=[];
for(var i=0, l=sprites.length; i < l; i ++){
var sprite=sprites[ i ];
var material=sprite.material;
if(material.visible===false) continue;
sprite.onBeforeRender(renderer, scene, camera, undefined, material, undefined);
gl.uniform1f(uniforms.alphaTest, material.alphaTest);
gl.uniformMatrix4fv(uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements);
sprite.matrixWorld.decompose(spritePosition, spriteRotation, spriteScale);
scale[ 0 ]=spriteScale.x;
scale[ 1 ]=spriteScale.y;
center[ 0 ]=sprite.center.x - 0.5;
center[ 1 ]=sprite.center.y - 0.5;
var fogType=0;
if(scene.fog&&material.fog){
fogType=sceneFogType;
}
if(oldFogType!==fogType){
gl.uniform1i(uniforms.fogType, fogType);
oldFogType=fogType;
}
if(material.map!==null){
gl.uniform2f(uniforms.uvOffset, material.map.offset.x, material.map.offset.y);
gl.uniform2f(uniforms.uvScale, material.map.repeat.x, material.map.repeat.y);
}else{
gl.uniform2f(uniforms.uvOffset, 0, 0);
gl.uniform2f(uniforms.uvScale, 1, 1);
}
gl.uniform1f(uniforms.opacity, material.opacity);
gl.uniform3f(uniforms.color, material.color.r, material.color.g, material.color.b);
gl.uniform1f(uniforms.rotation, material.rotation);
gl.uniform2fv(uniforms.center, center);
gl.uniform2fv(uniforms.scale, scale);
state.setBlending(material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha);
state.buffers.depth.setTest(material.depthTest);
state.buffers.depth.setMask(material.depthWrite);
state.buffers.color.setMask(material.colorWrite);
textures.setTexture2D(material.map||texture, 0);
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
sprite.onAfterRender(renderer, scene, camera, undefined, material, undefined);
}
state.enable(gl.CULL_FACE);
state.reset();
};
function createProgram(){
var program=gl.createProgram();
var vertexShader=gl.createShader(gl.VERTEX_SHADER);
var fragmentShader=gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(vertexShader, [
'precision ' + capabilities.precision + ' float;',
'#define SHADER_NAME ' + 'SpriteMaterial',
'uniform mat4 modelViewMatrix;',
'uniform mat4 projectionMatrix;',
'uniform float rotation;',
'uniform vec2 center;',
'uniform vec2 scale;',
'uniform vec2 uvOffset;',
'uniform vec2 uvScale;',
'attribute vec2 position;',
'attribute vec2 uv;',
'varying vec2 vUV;',
'varying float fogDepth;',
'void main(){',
'	vUV=uvOffset + uv * uvScale;',
'	vec2 alignedPosition=(position - center) * scale;',
'	vec2 rotatedPosition;',
'	rotatedPosition.x=cos(rotation) * alignedPosition.x - sin(rotation) * alignedPosition.y;',
'	rotatedPosition.y=sin(rotation) * alignedPosition.x + cos(rotation) * alignedPosition.y;',
'	vec4 mvPosition;',
'	mvPosition=modelViewMatrix * vec4(0.0, 0.0, 0.0, 1.0);',
'	mvPosition.xy +=rotatedPosition;',
'	gl_Position=projectionMatrix * mvPosition;',
'	fogDepth=- mvPosition.z;',
'}'
].join('\n') );
gl.shaderSource(fragmentShader, [
'precision ' + capabilities.precision + ' float;',
'#define SHADER_NAME ' + 'SpriteMaterial',
'uniform vec3 color;',
'uniform sampler2D map;',
'uniform float opacity;',
'uniform int fogType;',
'uniform vec3 fogColor;',
'uniform float fogDensity;',
'uniform float fogNear;',
'uniform float fogFar;',
'uniform float alphaTest;',
'varying vec2 vUV;',
'varying float fogDepth;',
'void main(){',
'	vec4 texture=texture2D(map, vUV);',
'	gl_FragColor=vec4(color * texture.xyz, texture.a * opacity);',
'	if(gl_FragColor.a < alphaTest) discard;',
'	if(fogType > 0){',
'		float fogFactor=0.0;',
'		if(fogType==1){',
'			fogFactor=smoothstep(fogNear, fogFar, fogDepth);',
'		}else{',
'			const float LOG2=1.442695;',
'			fogFactor=exp2(- fogDensity * fogDensity * fogDepth * fogDepth * LOG2);',
'			fogFactor=1.0 - clamp(fogFactor, 0.0, 1.0);',
'		}',
'		gl_FragColor.rgb=mix(gl_FragColor.rgb, fogColor, fogFactor);',
'	}',
'}'
].join('\n') );
gl.compileShader(vertexShader);
gl.compileShader(fragmentShader);
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
return program;
}
function painterSortStable(a, b){
if(a.renderOrder!==b.renderOrder){
return a.renderOrder - b.renderOrder;
}else if(a.z!==b.z){
return b.z - a.z;
}else{
return b.id - a.id;
}}
}
function WebGLState(gl, extensions, utils){
function ColorBuffer(){
var locked=false;
var color=new Vector4();
var currentColorMask=null;
var currentColorClear=new Vector4(0, 0, 0, 0);
return {
setMask: function(colorMask){
if(currentColorMask!==colorMask&&! locked){
gl.colorMask(colorMask, colorMask, colorMask, colorMask);
currentColorMask=colorMask;
}},
setLocked: function(lock){
locked=lock;
},
setClear: function(r, g, b, a, premultipliedAlpha){
if(premultipliedAlpha===true){
r *=a; g *=a; b *=a;
}
color.set(r, g, b, a);
if(currentColorClear.equals(color)===false){
gl.clearColor(r, g, b, a);
currentColorClear.copy(color);
}},
reset: function (){
locked=false;
currentColorMask=null;
currentColorClear.set(- 1, 0, 0, 0);
}};}
function DepthBuffer(){
var locked=false;
var currentDepthMask=null;
var currentDepthFunc=null;
var currentDepthClear=null;
return {
setTest: function(depthTest){
if(depthTest){
enable(gl.DEPTH_TEST);
}else{
disable(gl.DEPTH_TEST);
}},
setMask: function(depthMask){
if(currentDepthMask!==depthMask&&! locked){
gl.depthMask(depthMask);
currentDepthMask=depthMask;
}},
setFunc: function(depthFunc){
if(currentDepthFunc!==depthFunc){
if(depthFunc){
switch(depthFunc){
case NeverDepth:
gl.depthFunc(gl.NEVER);
break;
case AlwaysDepth:
gl.depthFunc(gl.ALWAYS);
break;
case LessDepth:
gl.depthFunc(gl.LESS);
break;
case LessEqualDepth:
gl.depthFunc(gl.LEQUAL);
break;
case EqualDepth:
gl.depthFunc(gl.EQUAL);
break;
case GreaterEqualDepth:
gl.depthFunc(gl.GEQUAL);
break;
case GreaterDepth:
gl.depthFunc(gl.GREATER);
break;
case NotEqualDepth:
gl.depthFunc(gl.NOTEQUAL);
break;
default:
gl.depthFunc(gl.LEQUAL);
}}else{
gl.depthFunc(gl.LEQUAL);
}
currentDepthFunc=depthFunc;
}},
setLocked: function(lock){
locked=lock;
},
setClear: function(depth){
if(currentDepthClear!==depth){
gl.clearDepth(depth);
currentDepthClear=depth;
}},
reset: function (){
locked=false;
currentDepthMask=null;
currentDepthFunc=null;
currentDepthClear=null;
}};}
function StencilBuffer(){
var locked=false;
var currentStencilMask=null;
var currentStencilFunc=null;
var currentStencilRef=null;
var currentStencilFuncMask=null;
var currentStencilFail=null;
var currentStencilZFail=null;
var currentStencilZPass=null;
var currentStencilClear=null;
return {
setTest: function(stencilTest){
if(stencilTest){
enable(gl.STENCIL_TEST);
}else{
disable(gl.STENCIL_TEST);
}},
setMask: function(stencilMask){
if(currentStencilMask!==stencilMask&&! locked){
gl.stencilMask(stencilMask);
currentStencilMask=stencilMask;
}},
setFunc: function(stencilFunc, stencilRef, stencilMask){
if(currentStencilFunc!==stencilFunc ||
currentStencilRef!==stencilRef 	||
currentStencilFuncMask!==stencilMask){
gl.stencilFunc(stencilFunc, stencilRef, stencilMask);
currentStencilFunc=stencilFunc;
currentStencilRef=stencilRef;
currentStencilFuncMask=stencilMask;
}},
setOp: function(stencilFail, stencilZFail, stencilZPass){
if(currentStencilFail!==stencilFail 	||
currentStencilZFail!==stencilZFail ||
currentStencilZPass!==stencilZPass){
gl.stencilOp(stencilFail, stencilZFail, stencilZPass);
currentStencilFail=stencilFail;
currentStencilZFail=stencilZFail;
currentStencilZPass=stencilZPass;
}},
setLocked: function(lock){
locked=lock;
},
setClear: function(stencil){
if(currentStencilClear!==stencil){
gl.clearStencil(stencil);
currentStencilClear=stencil;
}},
reset: function (){
locked=false;
currentStencilMask=null;
currentStencilFunc=null;
currentStencilRef=null;
currentStencilFuncMask=null;
currentStencilFail=null;
currentStencilZFail=null;
currentStencilZPass=null;
currentStencilClear=null;
}};}
var colorBuffer=new ColorBuffer();
var depthBuffer=new DepthBuffer();
var stencilBuffer=new StencilBuffer();
var maxVertexAttributes=gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
var newAttributes=new Uint8Array(maxVertexAttributes);
var enabledAttributes=new Uint8Array(maxVertexAttributes);
var attributeDivisors=new Uint8Array(maxVertexAttributes);
var capabilities={};
var compressedTextureFormats=null;
var currentProgram=null;
var currentBlending=null;
var currentBlendEquation=null;
var currentBlendSrc=null;
var currentBlendDst=null;
var currentBlendEquationAlpha=null;
var currentBlendSrcAlpha=null;
var currentBlendDstAlpha=null;
var currentPremultipledAlpha=false;
var currentFlipSided=null;
var currentCullFace=null;
var currentLineWidth=null;
var currentPolygonOffsetFactor=null;
var currentPolygonOffsetUnits=null;
var maxTextures=gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);
var lineWidthAvailable=false;
var version=0;
var glVersion=gl.getParameter(gl.VERSION);
if(glVersion.indexOf('WebGL')!==- 1){
version=parseFloat(/^WebGL\ ([0-9])/.exec(glVersion)[ 1 ]);
lineWidthAvailable=(version >=1.0);
}else if(glVersion.indexOf('OpenGL ES')!==- 1){
version=parseFloat(/^OpenGL\ ES\ ([0-9])/.exec(glVersion)[ 1 ]);
lineWidthAvailable=(version >=2.0);
}
var currentTextureSlot=null;
var currentBoundTextures={};
var currentScissor=new Vector4();
var currentViewport=new Vector4();
function createTexture(type, target, count){
var data=new Uint8Array(4);
var texture=gl.createTexture();
gl.bindTexture(type, texture);
gl.texParameteri(type, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(type, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
for(var i=0; i < count; i ++){
gl.texImage2D(target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);
}
return texture;
}
var emptyTextures={};
emptyTextures[ gl.TEXTURE_2D ]=createTexture(gl.TEXTURE_2D, gl.TEXTURE_2D, 1);
emptyTextures[ gl.TEXTURE_CUBE_MAP ]=createTexture(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6);
colorBuffer.setClear(0, 0, 0, 1);
depthBuffer.setClear(1);
stencilBuffer.setClear(0);
enable(gl.DEPTH_TEST);
depthBuffer.setFunc(LessEqualDepth);
setFlipSided(false);
setCullFace(CullFaceBack);
enable(gl.CULL_FACE);
enable(gl.BLEND);
setBlending(NormalBlending);
function initAttributes(){
for(var i=0, l=newAttributes.length; i < l; i ++){
newAttributes[ i ]=0;
}}
function enableAttribute(attribute){
enableAttributeAndDivisor(attribute, 0);
}
function enableAttributeAndDivisor(attribute, meshPerAttribute){
newAttributes[ attribute ]=1;
if(enabledAttributes[ attribute ]===0){
gl.enableVertexAttribArray(attribute);
enabledAttributes[ attribute ]=1;
}
if(attributeDivisors[ attribute ]!==meshPerAttribute){
var extension=extensions.get('ANGLE_instanced_arrays');
extension.vertexAttribDivisorANGLE(attribute, meshPerAttribute);
attributeDivisors[ attribute ]=meshPerAttribute;
}}
function disableUnusedAttributes(){
for(var i=0, l=enabledAttributes.length; i!==l; ++ i){
if(enabledAttributes[ i ]!==newAttributes[ i ]){
gl.disableVertexAttribArray(i);
enabledAttributes[ i ]=0;
}}
}
function enable(id){
if(capabilities[ id ]!==true){
gl.enable(id);
capabilities[ id ]=true;
}}
function disable(id){
if(capabilities[ id ]!==false){
gl.disable(id);
capabilities[ id ]=false;
}}
function getCompressedTextureFormats(){
if(compressedTextureFormats===null){
compressedTextureFormats=[];
if(extensions.get('WEBGL_compressed_texture_pvrtc') ||
extensions.get('WEBGL_compressed_texture_s3tc') ||
extensions.get('WEBGL_compressed_texture_etc1') ||
extensions.get('WEBGL_compressed_texture_astc') ){
var formats=gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS);
for(var i=0; i < formats.length; i ++){
compressedTextureFormats.push(formats[ i ]);
}}
}
return compressedTextureFormats;
}
function useProgram(program){
if(currentProgram!==program){
gl.useProgram(program);
currentProgram=program;
return true;
}
return false;
}
function setBlending(blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha){
if(blending!==NoBlending){
enable(gl.BLEND);
}else{
disable(gl.BLEND);
}
if(blending!==CustomBlending){
if(blending!==currentBlending||premultipliedAlpha!==currentPremultipledAlpha){
switch(blending){
case AdditiveBlending:
if(premultipliedAlpha){
gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE);
}else{
gl.blendEquation(gl.FUNC_ADD);
gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
}
break;
case SubtractiveBlending:
if(premultipliedAlpha){
gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
gl.blendFuncSeparate(gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA);
}else{
gl.blendEquation(gl.FUNC_ADD);
gl.blendFunc(gl.ZERO, gl.ONE_MINUS_SRC_COLOR);
}
break;
case MultiplyBlending:
if(premultipliedAlpha){
gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
gl.blendFuncSeparate(gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA);
}else{
gl.blendEquation(gl.FUNC_ADD);
gl.blendFunc(gl.ZERO, gl.SRC_COLOR);
}
break;
default:
if(premultipliedAlpha){
gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
}else{
gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
}}
}
currentBlendEquation=null;
currentBlendSrc=null;
currentBlendDst=null;
currentBlendEquationAlpha=null;
currentBlendSrcAlpha=null;
currentBlendDstAlpha=null;
}else{
blendEquationAlpha=blendEquationAlpha||blendEquation;
blendSrcAlpha=blendSrcAlpha||blendSrc;
blendDstAlpha=blendDstAlpha||blendDst;
if(blendEquation!==currentBlendEquation||blendEquationAlpha!==currentBlendEquationAlpha){
gl.blendEquationSeparate(utils.convert(blendEquation), utils.convert(blendEquationAlpha) );
currentBlendEquation=blendEquation;
currentBlendEquationAlpha=blendEquationAlpha;
}
if(blendSrc!==currentBlendSrc||blendDst!==currentBlendDst||blendSrcAlpha!==currentBlendSrcAlpha||blendDstAlpha!==currentBlendDstAlpha){
gl.blendFuncSeparate(utils.convert(blendSrc), utils.convert(blendDst), utils.convert(blendSrcAlpha), utils.convert(blendDstAlpha) );
currentBlendSrc=blendSrc;
currentBlendDst=blendDst;
currentBlendSrcAlpha=blendSrcAlpha;
currentBlendDstAlpha=blendDstAlpha;
}}
currentBlending=blending;
currentPremultipledAlpha=premultipliedAlpha;
}
function setMaterial(material, frontFaceCW){
material.side===DoubleSide
? disable(gl.CULL_FACE)
: enable(gl.CULL_FACE);
var flipSided=(material.side===BackSide);
if(frontFaceCW) flipSided = ! flipSided;
setFlipSided(flipSided);
material.transparent===true
? setBlending(material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha)
: setBlending(NoBlending);
depthBuffer.setFunc(material.depthFunc);
depthBuffer.setTest(material.depthTest);
depthBuffer.setMask(material.depthWrite);
colorBuffer.setMask(material.colorWrite);
setPolygonOffset(material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits);
}
function setFlipSided(flipSided){
if(currentFlipSided!==flipSided){
if(flipSided){
gl.frontFace(gl.CW);
}else{
gl.frontFace(gl.CCW);
}
currentFlipSided=flipSided;
}}
function setCullFace(cullFace){
if(cullFace!==CullFaceNone){
enable(gl.CULL_FACE);
if(cullFace!==currentCullFace){
if(cullFace===CullFaceBack){
gl.cullFace(gl.BACK);
}else if(cullFace===CullFaceFront){
gl.cullFace(gl.FRONT);
}else{
gl.cullFace(gl.FRONT_AND_BACK);
}}
}else{
disable(gl.CULL_FACE);
}
currentCullFace=cullFace;
}
function setLineWidth(width){
if(width!==currentLineWidth){
if(lineWidthAvailable) gl.lineWidth(width);
currentLineWidth=width;
}}
function setPolygonOffset(polygonOffset, factor, units){
if(polygonOffset){
enable(gl.POLYGON_OFFSET_FILL);
if(currentPolygonOffsetFactor!==factor||currentPolygonOffsetUnits!==units){
gl.polygonOffset(factor, units);
currentPolygonOffsetFactor=factor;
currentPolygonOffsetUnits=units;
}}else{
disable(gl.POLYGON_OFFSET_FILL);
}}
function setScissorTest(scissorTest){
if(scissorTest){
enable(gl.SCISSOR_TEST);
}else{
disable(gl.SCISSOR_TEST);
}}
function activeTexture(webglSlot){
if(webglSlot===undefined) webglSlot=gl.TEXTURE0 + maxTextures - 1;
if(currentTextureSlot!==webglSlot){
gl.activeTexture(webglSlot);
currentTextureSlot=webglSlot;
}}
function bindTexture(webglType, webglTexture){
if(currentTextureSlot===null){
activeTexture();
}
var boundTexture=currentBoundTextures[ currentTextureSlot ];
if(boundTexture===undefined){
boundTexture={ type: undefined, texture: undefined };
currentBoundTextures[ currentTextureSlot ]=boundTexture;
}
if(boundTexture.type!==webglType||boundTexture.texture!==webglTexture){
gl.bindTexture(webglType, webglTexture||emptyTextures[ webglType ]);
boundTexture.type=webglType;
boundTexture.texture=webglTexture;
}}
function compressedTexImage2D(){
try {
gl.compressedTexImage2D.apply(gl, arguments);
} catch(error){
console.error('THREE.WebGLState:', error);
}}
function texImage2D(){
try {
gl.texImage2D.apply(gl, arguments);
} catch(error){
console.error('THREE.WebGLState:', error);
}}
function scissor(scissor){
if(currentScissor.equals(scissor)===false){
gl.scissor(scissor.x, scissor.y, scissor.z, scissor.w);
currentScissor.copy(scissor);
}}
function viewport(viewport){
if(currentViewport.equals(viewport)===false){
gl.viewport(viewport.x, viewport.y, viewport.z, viewport.w);
currentViewport.copy(viewport);
}}
function reset(){
for(var i=0; i < enabledAttributes.length; i ++){
if(enabledAttributes[ i ]===1){
gl.disableVertexAttribArray(i);
enabledAttributes[ i ]=0;
}}
capabilities={};
compressedTextureFormats=null;
currentTextureSlot=null;
currentBoundTextures={};
currentProgram=null;
currentBlending=null;
currentFlipSided=null;
currentCullFace=null;
colorBuffer.reset();
depthBuffer.reset();
stencilBuffer.reset();
}
return {
buffers: {
color: colorBuffer,
depth: depthBuffer,
stencil: stencilBuffer
},
initAttributes: initAttributes,
enableAttribute: enableAttribute,
enableAttributeAndDivisor: enableAttributeAndDivisor,
disableUnusedAttributes: disableUnusedAttributes,
enable: enable,
disable: disable,
getCompressedTextureFormats: getCompressedTextureFormats,
useProgram: useProgram,
setBlending: setBlending,
setMaterial: setMaterial,
setFlipSided: setFlipSided,
setCullFace: setCullFace,
setLineWidth: setLineWidth,
setPolygonOffset: setPolygonOffset,
setScissorTest: setScissorTest,
activeTexture: activeTexture,
bindTexture: bindTexture,
compressedTexImage2D: compressedTexImage2D,
texImage2D: texImage2D,
scissor: scissor,
viewport: viewport,
reset: reset
};}
function WebGLTextures(_gl, extensions, state, properties, capabilities, utils, info){
var _isWebGL2=(typeof WebGL2RenderingContext!=='undefined'&&_gl instanceof WebGL2RenderingContext); 
var _videoTextures={};
var _canvas;
function clampToMaxSize(image, maxSize){
if(image.width > maxSize||image.height > maxSize){
if('data' in image){
console.warn('THREE.WebGLRenderer: image in DataTexture is too big (' + image.width + 'x' + image.height + ').');
return;
}
var scale=maxSize / Math.max(image.width, image.height);
var canvas=document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
canvas.width=Math.floor(image.width * scale);
canvas.height=Math.floor(image.height * scale);
var context=canvas.getContext('2d');
context.drawImage(image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height);
console.warn('THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image);
return canvas;
}
return image;
}
function isPowerOfTwo(image){
return _Math.isPowerOfTwo(image.width)&&_Math.isPowerOfTwo(image.height);
}
function makePowerOfTwo(image){
if(image instanceof HTMLImageElement||image instanceof HTMLCanvasElement||image instanceof ImageBitmap){
if(_canvas===undefined) _canvas=document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
_canvas.width=_Math.floorPowerOfTwo(image.width);
_canvas.height=_Math.floorPowerOfTwo(image.height);
var context=_canvas.getContext('2d');
context.drawImage(image, 0, 0, _canvas.width, _canvas.height);
console.warn('THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height, image);
return _canvas;
}
return image;
}
function textureNeedsPowerOfTwo(texture){
return(texture.wrapS!==ClampToEdgeWrapping||texture.wrapT!==ClampToEdgeWrapping) ||
(texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter);
}
function textureNeedsGenerateMipmaps(texture, isPowerOfTwo){
return texture.generateMipmaps&&isPowerOfTwo &&
texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter;
}
function generateMipmap(target, texture, width, height){
_gl.generateMipmap(target);
var textureProperties=properties.get(texture);
textureProperties.__maxMipLevel=Math.log(Math.max(width, height) ) * Math.LOG2E;
}
function filterFallback(f){
if(f===NearestFilter||f===NearestMipMapNearestFilter||f===NearestMipMapLinearFilter){
return _gl.NEAREST;
}
return _gl.LINEAR;
}
function onTextureDispose(event){
var texture=event.target;
texture.removeEventListener('dispose', onTextureDispose);
deallocateTexture(texture);
if(texture.isVideoTexture){
delete _videoTextures[ texture.id ];
}
info.memory.textures --;
}
function onRenderTargetDispose(event){
var renderTarget=event.target;
renderTarget.removeEventListener('dispose', onRenderTargetDispose);
deallocateRenderTarget(renderTarget);
info.memory.textures --;
}
function deallocateTexture(texture){
var textureProperties=properties.get(texture);
if(texture.image&&textureProperties.__image__webglTextureCube){
_gl.deleteTexture(textureProperties.__image__webglTextureCube);
}else{
if(textureProperties.__webglInit===undefined) return;
_gl.deleteTexture(textureProperties.__webglTexture);
}
properties.remove(texture);
}
function deallocateRenderTarget(renderTarget){
var renderTargetProperties=properties.get(renderTarget);
var textureProperties=properties.get(renderTarget.texture);
if(! renderTarget) return;
if(textureProperties.__webglTexture!==undefined){
_gl.deleteTexture(textureProperties.__webglTexture);
}
if(renderTarget.depthTexture){
renderTarget.depthTexture.dispose();
}
if(renderTarget.isWebGLRenderTargetCube){
for(var i=0; i < 6; i ++){
_gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[ i ]);
if(renderTargetProperties.__webglDepthbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer[ i ]);
}}else{
_gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer);
if(renderTargetProperties.__webglDepthbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer);
}
properties.remove(renderTarget.texture);
properties.remove(renderTarget);
}
function setTexture2D(texture, slot){
var textureProperties=properties.get(texture);
if(texture.isVideoTexture) updateVideoTexture(texture);
if(texture.version > 0&&textureProperties.__version!==texture.version){
var image=texture.image;
if(image===undefined){
console.warn('THREE.WebGLRenderer: Texture marked for update but image is undefined', texture);
}else if(image.complete===false){
console.warn('THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture);
}else{
uploadTexture(textureProperties, texture, slot);
return;
}}
state.activeTexture(_gl.TEXTURE0 + slot);
state.bindTexture(_gl.TEXTURE_2D, textureProperties.__webglTexture);
}
function setTextureCube(texture, slot){
var textureProperties=properties.get(texture);
if(texture.image.length===6){
if(texture.version > 0&&textureProperties.__version!==texture.version){
if(! textureProperties.__image__webglTextureCube){
texture.addEventListener('dispose', onTextureDispose);
textureProperties.__image__webglTextureCube=_gl.createTexture();
info.memory.textures ++;
}
state.activeTexture(_gl.TEXTURE0 + slot);
state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube);
_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY);
var isCompressed=(texture&&texture.isCompressedTexture);
var isDataTexture=(texture.image[ 0 ]&&texture.image[ 0 ].isDataTexture);
var cubeImage=[];
for(var i=0; i < 6; i ++){
if(! isCompressed&&! isDataTexture){
cubeImage[ i ]=clampToMaxSize(texture.image[ i ], capabilities.maxCubemapSize);
}else{
cubeImage[ i ]=isDataTexture ? texture.image[ i ].image:texture.image[ i ];
}}
var image=cubeImage[ 0 ],
isPowerOfTwoImage=isPowerOfTwo(image),
glFormat=utils.convert(texture.format),
glType=utils.convert(texture.type);
setTextureParameters(_gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage);
for(var i=0; i < 6; i ++){
if(! isCompressed){
if(isDataTexture){
state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data);
}else{
state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ]);
}}else{
var mipmap, mipmaps=cubeImage[ i ].mipmaps;
for(var j=0, jl=mipmaps.length; j < jl; j ++){
mipmap=mipmaps[ j ];
if(texture.format!==RGBAFormat&&texture.format!==RGBFormat){
if(state.getCompressedTextureFormats().indexOf(glFormat) > - 1){
state.compressedTexImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data);
}else{
console.warn('THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()');
}}else{
state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data);
}}
}}
if(! isCompressed){
textureProperties.__maxMipLevel=0;
}else{
textureProperties.__maxMipLevel=mipmaps.length - 1;
}
if(textureNeedsGenerateMipmaps(texture, isPowerOfTwoImage) ){
generateMipmap(_gl.TEXTURE_CUBE_MAP, texture, image.width, image.height);
}
textureProperties.__version=texture.version;
if(texture.onUpdate) texture.onUpdate(texture);
}else{
state.activeTexture(_gl.TEXTURE0 + slot);
state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube);
}}
}
function setTextureCubeDynamic(texture, slot){
state.activeTexture(_gl.TEXTURE0 + slot);
state.bindTexture(_gl.TEXTURE_CUBE_MAP, properties.get(texture).__webglTexture);
}
function setTextureParameters(textureType, texture, isPowerOfTwoImage){
var extension;
if(isPowerOfTwoImage){
_gl.texParameteri(textureType, _gl.TEXTURE_WRAP_S, utils.convert(texture.wrapS) );
_gl.texParameteri(textureType, _gl.TEXTURE_WRAP_T, utils.convert(texture.wrapT) );
_gl.texParameteri(textureType, _gl.TEXTURE_MAG_FILTER, utils.convert(texture.magFilter) );
_gl.texParameteri(textureType, _gl.TEXTURE_MIN_FILTER, utils.convert(texture.minFilter) );
}else{
_gl.texParameteri(textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE);
_gl.texParameteri(textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE);
if(texture.wrapS!==ClampToEdgeWrapping||texture.wrapT!==ClampToEdgeWrapping){
console.warn('THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture);
}
_gl.texParameteri(textureType, _gl.TEXTURE_MAG_FILTER, filterFallback(texture.magFilter) );
_gl.texParameteri(textureType, _gl.TEXTURE_MIN_FILTER, filterFallback(texture.minFilter) );
if(texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter){
console.warn('THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture);
}}
extension=extensions.get('EXT_texture_filter_anisotropic');
if(extension){
if(texture.type===FloatType&&extensions.get('OES_texture_float_linear')===null) return;
if(texture.type===HalfFloatType&&extensions.get('OES_texture_half_float_linear')===null) return;
if(texture.anisotropy > 1||properties.get(texture).__currentAnisotropy){
_gl.texParameterf(textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(texture.anisotropy, capabilities.getMaxAnisotropy()) );
properties.get(texture).__currentAnisotropy=texture.anisotropy;
}}
}
function uploadTexture(textureProperties, texture, slot){
if(textureProperties.__webglInit===undefined){
textureProperties.__webglInit=true;
texture.addEventListener('dispose', onTextureDispose);
textureProperties.__webglTexture=_gl.createTexture();
info.memory.textures ++;
}
state.activeTexture(_gl.TEXTURE0 + slot);
state.bindTexture(_gl.TEXTURE_2D, textureProperties.__webglTexture);
_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY);
_gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha);
_gl.pixelStorei(_gl.UNPACK_ALIGNMENT, texture.unpackAlignment);
var image=clampToMaxSize(texture.image, capabilities.maxTextureSize);
if(textureNeedsPowerOfTwo(texture)&&isPowerOfTwo(image)===false){
image=makePowerOfTwo(image);
}
var isPowerOfTwoImage=isPowerOfTwo(image),
glFormat=utils.convert(texture.format),
glType=utils.convert(texture.type);
setTextureParameters(_gl.TEXTURE_2D, texture, isPowerOfTwoImage);
var mipmap, mipmaps=texture.mipmaps;
if(texture.isDepthTexture){
var internalFormat=_gl.DEPTH_COMPONENT;
if(texture.type===FloatType){
if(! _isWebGL2) throw new Error('Float Depth Texture only supported in WebGL2.0');
internalFormat=_gl.DEPTH_COMPONENT32F;
}else if(_isWebGL2){
internalFormat=_gl.DEPTH_COMPONENT16;
}
if(texture.format===DepthFormat&&internalFormat===_gl.DEPTH_COMPONENT){
if(texture.type!==UnsignedShortType&&texture.type!==UnsignedIntType){
console.warn('THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.');
texture.type=UnsignedShortType;
glType=utils.convert(texture.type);
}}
if(texture.format===DepthStencilFormat){
internalFormat=_gl.DEPTH_STENCIL;
if(texture.type!==UnsignedInt248Type){
console.warn('THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.');
texture.type=UnsignedInt248Type;
glType=utils.convert(texture.type);
}}
state.texImage2D(_gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null);
}else if(texture.isDataTexture){
if(mipmaps.length > 0&&isPowerOfTwoImage){
for(var i=0, il=mipmaps.length; i < il; i ++){
mipmap=mipmaps[ i ];
state.texImage2D(_gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data);
}
texture.generateMipmaps=false;
textureProperties.__maxMipLevel=mipmaps.length - 1;
}else{
state.texImage2D(_gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data);
textureProperties.__maxMipLevel=0;
}}else if(texture.isCompressedTexture){
for(var i=0, il=mipmaps.length; i < il; i ++){
mipmap=mipmaps[ i ];
if(texture.format!==RGBAFormat&&texture.format!==RGBFormat){
if(state.getCompressedTextureFormats().indexOf(glFormat) > - 1){
state.compressedTexImage2D(_gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data);
}else{
console.warn('THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()');
}}else{
state.texImage2D(_gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data);
}}
textureProperties.__maxMipLevel=mipmaps.length - 1;
}else{
if(mipmaps.length > 0&&isPowerOfTwoImage){
for(var i=0, il=mipmaps.length; i < il; i ++){
mipmap=mipmaps[ i ];
state.texImage2D(_gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap);
}
texture.generateMipmaps=false;
textureProperties.__maxMipLevel=mipmaps.length - 1;
}else{
state.texImage2D(_gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image);
textureProperties.__maxMipLevel=0;
}}
if(textureNeedsGenerateMipmaps(texture, isPowerOfTwoImage) ){
generateMipmap(_gl.TEXTURE_2D, texture, image.width, image.height);
}
textureProperties.__version=texture.version;
if(texture.onUpdate) texture.onUpdate(texture);
}
function setupFrameBufferTexture(framebuffer, renderTarget, attachment, textureTarget){
var glFormat=utils.convert(renderTarget.texture.format);
var glType=utils.convert(renderTarget.texture.type);
state.texImage2D(textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null);
_gl.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer);
_gl.framebufferTexture2D(_gl.FRAMEBUFFER, attachment, textureTarget, properties.get(renderTarget.texture).__webglTexture, 0);
_gl.bindFramebuffer(_gl.FRAMEBUFFER, null);
}
function setupRenderBufferStorage(renderbuffer, renderTarget){
_gl.bindRenderbuffer(_gl.RENDERBUFFER, renderbuffer);
if(renderTarget.depthBuffer&&! renderTarget.stencilBuffer){
_gl.renderbufferStorage(_gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height);
_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer);
}else if(renderTarget.depthBuffer&&renderTarget.stencilBuffer){
_gl.renderbufferStorage(_gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height);
_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer);
}else{
_gl.renderbufferStorage(_gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height);
}
_gl.bindRenderbuffer(_gl.RENDERBUFFER, null);
}
function setupDepthTexture(framebuffer, renderTarget){
var isCube=(renderTarget&&renderTarget.isWebGLRenderTargetCube);
if(isCube) throw new Error('Depth Texture with cube render targets is not supported');
_gl.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer);
if(!(renderTarget.depthTexture&&renderTarget.depthTexture.isDepthTexture) ){
throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');
}
if(! properties.get(renderTarget.depthTexture).__webglTexture ||
renderTarget.depthTexture.image.width!==renderTarget.width ||
renderTarget.depthTexture.image.height!==renderTarget.height){
renderTarget.depthTexture.image.width=renderTarget.width;
renderTarget.depthTexture.image.height=renderTarget.height;
renderTarget.depthTexture.needsUpdate=true;
}
setTexture2D(renderTarget.depthTexture, 0);
var webglDepthTexture=properties.get(renderTarget.depthTexture).__webglTexture;
if(renderTarget.depthTexture.format===DepthFormat){
_gl.framebufferTexture2D(_gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0);
}else if(renderTarget.depthTexture.format===DepthStencilFormat){
_gl.framebufferTexture2D(_gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0);
}else{
throw new Error('Unknown depthTexture format');
}}
function setupDepthRenderbuffer(renderTarget){
var renderTargetProperties=properties.get(renderTarget);
var isCube=(renderTarget.isWebGLRenderTargetCube===true);
if(renderTarget.depthTexture){
if(isCube) throw new Error('target.depthTexture not supported in Cube render targets');
setupDepthTexture(renderTargetProperties.__webglFramebuffer, renderTarget);
}else{
if(isCube){
renderTargetProperties.__webglDepthbuffer=[];
for(var i=0; i < 6; i ++){
_gl.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ]);
renderTargetProperties.__webglDepthbuffer[ i ]=_gl.createRenderbuffer();
setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer[ i ], renderTarget);
}}else{
_gl.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer);
renderTargetProperties.__webglDepthbuffer=_gl.createRenderbuffer();
setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer, renderTarget);
}}
_gl.bindFramebuffer(_gl.FRAMEBUFFER, null);
}
function setupRenderTarget(renderTarget){
var renderTargetProperties=properties.get(renderTarget);
var textureProperties=properties.get(renderTarget.texture);
renderTarget.addEventListener('dispose', onRenderTargetDispose);
textureProperties.__webglTexture=_gl.createTexture();
info.memory.textures ++;
var isCube=(renderTarget.isWebGLRenderTargetCube===true);
var isTargetPowerOfTwo=isPowerOfTwo(renderTarget);
if(isCube){
renderTargetProperties.__webglFramebuffer=[];
for(var i=0; i < 6; i ++){
renderTargetProperties.__webglFramebuffer[ i ]=_gl.createFramebuffer();
}}else{
renderTargetProperties.__webglFramebuffer=_gl.createFramebuffer();
}
if(isCube){
state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture);
setTextureParameters(_gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo);
for(var i=0; i < 6; i ++){
setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i);
}
if(textureNeedsGenerateMipmaps(renderTarget.texture, isTargetPowerOfTwo) ){
generateMipmap(_gl.TEXTURE_CUBE_MAP, renderTarget.texture, renderTarget.width, renderTarget.height);
}
state.bindTexture(_gl.TEXTURE_CUBE_MAP, null);
}else{
state.bindTexture(_gl.TEXTURE_2D, textureProperties.__webglTexture);
setTextureParameters(_gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo);
setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D);
if(textureNeedsGenerateMipmaps(renderTarget.texture, isTargetPowerOfTwo) ){
generateMipmap(_gl.TEXTURE_2D, renderTarget.texture, renderTarget.width, renderTarget.height);
}
state.bindTexture(_gl.TEXTURE_2D, null);
}
if(renderTarget.depthBuffer){
setupDepthRenderbuffer(renderTarget);
}}
function updateRenderTargetMipmap(renderTarget){
var texture=renderTarget.texture;
var isTargetPowerOfTwo=isPowerOfTwo(renderTarget);
if(textureNeedsGenerateMipmaps(texture, isTargetPowerOfTwo) ){
var target=renderTarget.isWebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP:_gl.TEXTURE_2D;
var webglTexture=properties.get(texture).__webglTexture;
state.bindTexture(target, webglTexture);
generateMipmap(target, texture, renderTarget.width, renderTarget.height);
state.bindTexture(target, null);
}}
function updateVideoTexture(texture){
var id=texture.id;
var frame=info.render.frame;
if(_videoTextures[ id ]!==frame){
_videoTextures[ id ]=frame;
texture.update();
}}
this.setTexture2D=setTexture2D;
this.setTextureCube=setTextureCube;
this.setTextureCubeDynamic=setTextureCubeDynamic;
this.setupRenderTarget=setupRenderTarget;
this.updateRenderTargetMipmap=updateRenderTargetMipmap;
}
function WebGLUtils(gl, extensions){
function convert(p){
var extension;
if(p===RepeatWrapping) return gl.REPEAT;
if(p===ClampToEdgeWrapping) return gl.CLAMP_TO_EDGE;
if(p===MirroredRepeatWrapping) return gl.MIRRORED_REPEAT;
if(p===NearestFilter) return gl.NEAREST;
if(p===NearestMipMapNearestFilter) return gl.NEAREST_MIPMAP_NEAREST;
if(p===NearestMipMapLinearFilter) return gl.NEAREST_MIPMAP_LINEAR;
if(p===LinearFilter) return gl.LINEAR;
if(p===LinearMipMapNearestFilter) return gl.LINEAR_MIPMAP_NEAREST;
if(p===LinearMipMapLinearFilter) return gl.LINEAR_MIPMAP_LINEAR;
if(p===UnsignedByteType) return gl.UNSIGNED_BYTE;
if(p===UnsignedShort4444Type) return gl.UNSIGNED_SHORT_4_4_4_4;
if(p===UnsignedShort5551Type) return gl.UNSIGNED_SHORT_5_5_5_1;
if(p===UnsignedShort565Type) return gl.UNSIGNED_SHORT_5_6_5;
if(p===ByteType) return gl.BYTE;
if(p===ShortType) return gl.SHORT;
if(p===UnsignedShortType) return gl.UNSIGNED_SHORT;
if(p===IntType) return gl.INT;
if(p===UnsignedIntType) return gl.UNSIGNED_INT;
if(p===FloatType) return gl.FLOAT;
if(p===HalfFloatType){
extension=extensions.get('OES_texture_half_float');
if(extension!==null) return extension.HALF_FLOAT_OES;
}
if(p===AlphaFormat) return gl.ALPHA;
if(p===RGBFormat) return gl.RGB;
if(p===RGBAFormat) return gl.RGBA;
if(p===LuminanceFormat) return gl.LUMINANCE;
if(p===LuminanceAlphaFormat) return gl.LUMINANCE_ALPHA;
if(p===DepthFormat) return gl.DEPTH_COMPONENT;
if(p===DepthStencilFormat) return gl.DEPTH_STENCIL;
if(p===AddEquation) return gl.FUNC_ADD;
if(p===SubtractEquation) return gl.FUNC_SUBTRACT;
if(p===ReverseSubtractEquation) return gl.FUNC_REVERSE_SUBTRACT;
if(p===ZeroFactor) return gl.ZERO;
if(p===OneFactor) return gl.ONE;
if(p===SrcColorFactor) return gl.SRC_COLOR;
if(p===OneMinusSrcColorFactor) return gl.ONE_MINUS_SRC_COLOR;
if(p===SrcAlphaFactor) return gl.SRC_ALPHA;
if(p===OneMinusSrcAlphaFactor) return gl.ONE_MINUS_SRC_ALPHA;
if(p===DstAlphaFactor) return gl.DST_ALPHA;
if(p===OneMinusDstAlphaFactor) return gl.ONE_MINUS_DST_ALPHA;
if(p===DstColorFactor) return gl.DST_COLOR;
if(p===OneMinusDstColorFactor) return gl.ONE_MINUS_DST_COLOR;
if(p===SrcAlphaSaturateFactor) return gl.SRC_ALPHA_SATURATE;
if(p===RGB_S3TC_DXT1_Format||p===RGBA_S3TC_DXT1_Format ||
p===RGBA_S3TC_DXT3_Format||p===RGBA_S3TC_DXT5_Format){
extension=extensions.get('WEBGL_compressed_texture_s3tc');
if(extension!==null){
if(p===RGB_S3TC_DXT1_Format) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;
if(p===RGBA_S3TC_DXT1_Format) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;
if(p===RGBA_S3TC_DXT3_Format) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;
if(p===RGBA_S3TC_DXT5_Format) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;
}}
if(p===RGB_PVRTC_4BPPV1_Format||p===RGB_PVRTC_2BPPV1_Format ||
p===RGBA_PVRTC_4BPPV1_Format||p===RGBA_PVRTC_2BPPV1_Format){
extension=extensions.get('WEBGL_compressed_texture_pvrtc');
if(extension!==null){
if(p===RGB_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
if(p===RGB_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
if(p===RGBA_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
if(p===RGBA_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
}}
if(p===RGB_ETC1_Format){
extension=extensions.get('WEBGL_compressed_texture_etc1');
if(extension!==null) return extension.COMPRESSED_RGB_ETC1_WEBGL;
}
if(p===RGBA_ASTC_4x4_Format||p===RGBA_ASTC_5x4_Format||p===RGBA_ASTC_5x5_Format ||
p===RGBA_ASTC_6x5_Format||p===RGBA_ASTC_6x6_Format||p===RGBA_ASTC_8x5_Format ||
p===RGBA_ASTC_8x6_Format||p===RGBA_ASTC_8x8_Format||p===RGBA_ASTC_10x5_Format ||
p===RGBA_ASTC_10x6_Format||p===RGBA_ASTC_10x8_Format||p===RGBA_ASTC_10x10_Format ||
p===RGBA_ASTC_12x10_Format||p===RGBA_ASTC_12x12_Format){
extension=extensions.get('WEBGL_compressed_texture_astc');
if(extension!==null){
return p;
}}
if(p===MinEquation||p===MaxEquation){
extension=extensions.get('EXT_blend_minmax');
if(extension!==null){
if(p===MinEquation) return extension.MIN_EXT;
if(p===MaxEquation) return extension.MAX_EXT;
}}
if(p===UnsignedInt248Type){
extension=extensions.get('WEBGL_depth_texture');
if(extension!==null) return extension.UNSIGNED_INT_24_8_WEBGL;
}
return 0;
}
return { convert: convert };}
function PerspectiveCamera(fov, aspect, near, far){
Camera.call(this);
this.type='PerspectiveCamera';
this.fov=fov!==undefined ? fov:50;
this.zoom=1;
this.near=near!==undefined ? near:0.1;
this.far=far!==undefined ? far:2000;
this.focus=10;
this.aspect=aspect!==undefined ? aspect:1;
this.view=null;
this.filmGauge=35;
this.filmOffset=0;
this.updateProjectionMatrix();
}
PerspectiveCamera.prototype=Object.assign(Object.create(Camera.prototype), {
constructor: PerspectiveCamera,
isPerspectiveCamera: true,
copy: function(source, recursive){
Camera.prototype.copy.call(this, source, recursive);
this.fov=source.fov;
this.zoom=source.zoom;
this.near=source.near;
this.far=source.far;
this.focus=source.focus;
this.aspect=source.aspect;
this.view=source.view===null ? null:Object.assign({}, source.view);
this.filmGauge=source.filmGauge;
this.filmOffset=source.filmOffset;
return this;
},
setFocalLength: function(focalLength){
var vExtentSlope=0.5 * this.getFilmHeight() / focalLength;
this.fov=_Math.RAD2DEG * 2 * Math.atan(vExtentSlope);
this.updateProjectionMatrix();
},
getFocalLength: function (){
var vExtentSlope=Math.tan(_Math.DEG2RAD * 0.5 * this.fov);
return 0.5 * this.getFilmHeight() / vExtentSlope;
},
getEffectiveFOV: function (){
return _Math.RAD2DEG * 2 * Math.atan(Math.tan(_Math.DEG2RAD * 0.5 * this.fov) / this.zoom);
},
getFilmWidth: function (){
return this.filmGauge * Math.min(this.aspect, 1);
},
getFilmHeight: function (){
return this.filmGauge / Math.max(this.aspect, 1);
},
setViewOffset: function(fullWidth, fullHeight, x, y, width, height){
this.aspect=fullWidth / fullHeight;
if(this.view===null){
this.view={
enabled: true,
fullWidth: 1,
fullHeight: 1,
offsetX: 0,
offsetY: 0,
width: 1,
height: 1
};}
this.view.enabled=true;
this.view.fullWidth=fullWidth;
this.view.fullHeight=fullHeight;
this.view.offsetX=x;
this.view.offsetY=y;
this.view.width=width;
this.view.height=height;
this.updateProjectionMatrix();
},
clearViewOffset: function (){
if(this.view!==null){
this.view.enabled=false;
}
this.updateProjectionMatrix();
},
updateProjectionMatrix: function (){
var near=this.near,
top=near * Math.tan(_Math.DEG2RAD * 0.5 * this.fov) / this.zoom,
height=2 * top,
width=this.aspect * height,
left=- 0.5 * width,
view=this.view;
if(this.view!==null&&this.view.enabled){
var fullWidth=view.fullWidth,
fullHeight=view.fullHeight;
left +=view.offsetX * width / fullWidth;
top -=view.offsetY * height / fullHeight;
width *=view.width / fullWidth;
height *=view.height / fullHeight;
}
var skew=this.filmOffset;
if(skew!==0) left +=near * skew / this.getFilmWidth();
this.projectionMatrix.makePerspective(left, left + width, top, top - height, near, this.far);
},
toJSON: function(meta){
var data=Object3D.prototype.toJSON.call(this, meta);
data.object.fov=this.fov;
data.object.zoom=this.zoom;
data.object.near=this.near;
data.object.far=this.far;
data.object.focus=this.focus;
data.object.aspect=this.aspect;
if(this.view!==null) data.object.view=Object.assign({}, this.view);
data.object.filmGauge=this.filmGauge;
data.object.filmOffset=this.filmOffset;
return data;
}});
function ArrayCamera(array){
PerspectiveCamera.call(this);
this.cameras=array||[];
}
ArrayCamera.prototype=Object.assign(Object.create(PerspectiveCamera.prototype), {
constructor: ArrayCamera,
isArrayCamera: true
});
function WebVRManager(renderer){
var scope=this;
var device=null;
var frameData=null;
var poseTarget=null;
var standingMatrix=new Matrix4();
var standingMatrixInverse=new Matrix4();
if(typeof window!=='undefined'&&'VRFrameData' in window){
frameData=new window.VRFrameData();
window.addEventListener('vrdisplaypresentchange', onVRDisplayPresentChange, false);
}
var matrixWorldInverse=new Matrix4();
var tempQuaternion=new Quaternion();
var tempPosition=new Vector3();
var cameraL=new PerspectiveCamera();
cameraL.bounds=new Vector4(0.0, 0.0, 0.5, 1.0);
cameraL.layers.enable(1);
var cameraR=new PerspectiveCamera();
cameraR.bounds=new Vector4(0.5, 0.0, 0.5, 1.0);
cameraR.layers.enable(2);
var cameraVR=new ArrayCamera([ cameraL, cameraR ]);
cameraVR.layers.enable(1);
cameraVR.layers.enable(2);
function isPresenting(){
return device!==null&&device.isPresenting===true;
}
var currentSize, currentPixelRatio;
function onVRDisplayPresentChange(){
if(isPresenting()){
var eyeParameters=device.getEyeParameters('left');
var renderWidth=eyeParameters.renderWidth;
var renderHeight=eyeParameters.renderHeight;
currentPixelRatio=renderer.getPixelRatio();
currentSize=renderer.getSize();
renderer.setDrawingBufferSize(renderWidth * 2, renderHeight, 1);
animation.start();
}else if(scope.enabled){
renderer.setDrawingBufferSize(currentSize.width, currentSize.height, currentPixelRatio);
animation.stop();
}}
this.enabled=false;
this.userHeight=1.6;
this.getDevice=function (){
return device;
};
this.setDevice=function(value){
if(value!==undefined) device=value;
animation.setContext(value);
};
this.setPoseTarget=function(object){
if(object!==undefined) poseTarget=object;
};
this.getCamera=function(camera){
if(device===null) return camera;
device.depthNear=camera.near;
device.depthFar=camera.far;
device.getFrameData(frameData);
var stageParameters=device.stageParameters;
if(stageParameters){
standingMatrix.fromArray(stageParameters.sittingToStandingTransform);
}else{
standingMatrix.makeTranslation(0, scope.userHeight, 0);
}
var pose=frameData.pose;
var poseObject=poseTarget!==null ? poseTarget:camera;
poseObject.matrix.copy(standingMatrix);
poseObject.matrix.decompose(poseObject.position, poseObject.quaternion, poseObject.scale);
if(pose.orientation!==null){
tempQuaternion.fromArray(pose.orientation);
poseObject.quaternion.multiply(tempQuaternion);
}
if(pose.position!==null){
tempQuaternion.setFromRotationMatrix(standingMatrix);
tempPosition.fromArray(pose.position);
tempPosition.applyQuaternion(tempQuaternion);
poseObject.position.add(tempPosition);
}
poseObject.updateMatrixWorld();
if(device.isPresenting===false) return camera;
cameraL.near=camera.near;
cameraR.near=camera.near;
cameraL.far=camera.far;
cameraR.far=camera.far;
cameraVR.matrixWorld.copy(camera.matrixWorld);
cameraVR.matrixWorldInverse.copy(camera.matrixWorldInverse);
cameraL.matrixWorldInverse.fromArray(frameData.leftViewMatrix);
cameraR.matrixWorldInverse.fromArray(frameData.rightViewMatrix);
standingMatrixInverse.getInverse(standingMatrix);
cameraL.matrixWorldInverse.multiply(standingMatrixInverse);
cameraR.matrixWorldInverse.multiply(standingMatrixInverse);
var parent=poseObject.parent;
if(parent!==null){
matrixWorldInverse.getInverse(parent.matrixWorld);
cameraL.matrixWorldInverse.multiply(matrixWorldInverse);
cameraR.matrixWorldInverse.multiply(matrixWorldInverse);
}
cameraL.matrixWorld.getInverse(cameraL.matrixWorldInverse);
cameraR.matrixWorld.getInverse(cameraR.matrixWorldInverse);
cameraL.projectionMatrix.fromArray(frameData.leftProjectionMatrix);
cameraR.projectionMatrix.fromArray(frameData.rightProjectionMatrix);
cameraVR.projectionMatrix.copy(cameraL.projectionMatrix);
var layers=device.getLayers();
if(layers.length){
var layer=layers[ 0 ];
if(layer.leftBounds!==null&&layer.leftBounds.length===4){
cameraL.bounds.fromArray(layer.leftBounds);
}
if(layer.rightBounds!==null&&layer.rightBounds.length===4){
cameraR.bounds.fromArray(layer.rightBounds);
}}
return cameraVR;
};
this.getStandingMatrix=function (){
return standingMatrix;
};
this.isPresenting=isPresenting;
var animation=new WebGLAnimation();
this.setAnimationLoop=function(callback){
animation.setAnimationLoop(callback);
};
this.submitFrame=function (){
if(isPresenting()) device.submitFrame();
};
this.dispose=function (){
if(typeof window!=='undefined'){
window.removeEventListener('vrdisplaypresentchange', onVRDisplayPresentChange);
}};}
function WebXRManager(renderer){
var gl=renderer.context;
var device=null;
var session=null;
var frameOfRef=null;
var pose=null;
function isPresenting(){
return session!==null&&frameOfRef!==null;
}
var cameraL=new PerspectiveCamera();
cameraL.layers.enable(1);
cameraL.viewport=new Vector4();
var cameraR=new PerspectiveCamera();
cameraR.layers.enable(2);
cameraR.viewport=new Vector4();
var cameraVR=new ArrayCamera([ cameraL, cameraR ]);
cameraVR.layers.enable(1);
cameraVR.layers.enable(2);
this.enabled=false;
this.getDevice=function (){
return device;
};
this.setDevice=function(value){
if(value!==undefined) device=value;
gl.setCompatibleXRDevice(value);
};
this.setSession=function(value, options){
session=value;
if(session!==null){
session.addEventListener('end', function (){
renderer.setFramebuffer(null);
animation.stop();
});
session.baseLayer=new XRWebGLLayer(session, gl);
session.requestFrameOfReference(options.frameOfReferenceType).then(function(value){
frameOfRef=value;
renderer.setFramebuffer(session.baseLayer.framebuffer);
animation.setContext(session);
animation.start();
});
}};
function updateCamera(camera, parent){
if(parent===null){
camera.matrixWorld.copy(camera.matrix);
}else{
camera.matrixWorld.multiplyMatrices(parent.matrixWorld, camera.matrix);
}
camera.matrixWorldInverse.getInverse(camera.matrixWorld);
}
this.getCamera=function(camera){
if(isPresenting()){
var parent=camera.parent;
var cameras=cameraVR.cameras;
updateCamera(cameraVR, parent);
for(var i=0; i < cameras.length; i ++){
updateCamera(cameras[ i ], parent);
}
camera.matrixWorld.copy(cameraVR.matrixWorld);
var children=camera.children;
for(var i=0, l=children.length; i < l; i ++){
children[ i ].updateMatrixWorld(true);
}
return cameraVR;
}
return camera;
};
this.isPresenting=isPresenting;
var onAnimationFrameCallback=null;
function onAnimationFrame(time, frame){
pose=frame.getDevicePose(frameOfRef);
var layer=session.baseLayer;
var views=frame.views;
for(var i=0; i < views.length; i ++){
var view=views[ i ];
var viewport=layer.getViewport(view);
var viewMatrix=pose.getViewMatrix(view);
var camera=cameraVR.cameras[ i ];
camera.matrix.fromArray(viewMatrix).getInverse(camera.matrix);
camera.projectionMatrix.fromArray(view.projectionMatrix);
camera.viewport.set(viewport.x, viewport.y, viewport.width, viewport.height);
if(i===0){
cameraVR.matrix.copy(camera.matrix);
cameraVR.projectionMatrix.copy(camera.projectionMatrix);
}}
if(onAnimationFrameCallback) onAnimationFrameCallback();
}
var animation=new WebGLAnimation();
animation.setAnimationLoop(onAnimationFrame);
this.setAnimationLoop=function(callback){
onAnimationFrameCallback=callback;
};
this.getStandingMatrix=function (){
console.warn('THREE.WebXRManager: getStandingMatrix() is no longer needed.');
return new THREE.Matrix4();
};
this.submitFrame=function (){};}
function WebGLRenderer(parameters){
console.log('THREE.WebGLRenderer', REVISION);
parameters=parameters||{};
var _canvas=parameters.canvas!==undefined ? parameters.canvas:document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas'),
_context=parameters.context!==undefined ? parameters.context:null,
_alpha=parameters.alpha!==undefined ? parameters.alpha:false,
_depth=parameters.depth!==undefined ? parameters.depth:true,
_stencil=parameters.stencil!==undefined ? parameters.stencil:true,
_antialias=parameters.antialias!==undefined ? parameters.antialias:false,
_premultipliedAlpha=parameters.premultipliedAlpha!==undefined ? parameters.premultipliedAlpha:true,
_preserveDrawingBuffer=parameters.preserveDrawingBuffer!==undefined ? parameters.preserveDrawingBuffer:false,
_powerPreference=parameters.powerPreference!==undefined ? parameters.powerPreference:'default';
var currentRenderList=null;
var currentRenderState=null;
this.domElement=_canvas;
this.context=null;
this.autoClear=true;
this.autoClearColor=true;
this.autoClearDepth=true;
this.autoClearStencil=true;
this.sortObjects=true;
this.clippingPlanes=[];
this.localClippingEnabled=false;
this.gammaFactor=2.0;
this.gammaInput=false;
this.gammaOutput=false;
this.physicallyCorrectLights=false;
this.toneMapping=LinearToneMapping;
this.toneMappingExposure=1.0;
this.toneMappingWhitePoint=1.0;
this.maxMorphTargets=8;
this.maxMorphNormals=4;
var _this=this,
_isContextLost=false,
_framebuffer=null,
_currentRenderTarget=null,
_currentFramebuffer=null,
_currentMaterialId=- 1,
_currentGeometryProgram='',
_currentCamera=null,
_currentArrayCamera=null,
_currentViewport=new Vector4(),
_currentScissor=new Vector4(),
_currentScissorTest=null,
_usedTextureUnits=0,
_width=_canvas.width,
_height=_canvas.height,
_pixelRatio=1,
_viewport=new Vector4(0, 0, _width, _height),
_scissor=new Vector4(0, 0, _width, _height),
_scissorTest=false,
_frustum=new Frustum(),
_clipping=new WebGLClipping(),
_clippingEnabled=false,
_localClippingEnabled=false,
_projScreenMatrix=new Matrix4(),
_vector3=new Vector3();
function getTargetPixelRatio(){
return _currentRenderTarget===null ? _pixelRatio:1;
}
var _gl;
try {
var contextAttributes={
alpha: _alpha,
depth: _depth,
stencil: _stencil,
antialias: _antialias,
premultipliedAlpha: _premultipliedAlpha,
preserveDrawingBuffer: _preserveDrawingBuffer,
powerPreference: _powerPreference
};
_canvas.addEventListener('webglcontextlost', onContextLost, false);
_canvas.addEventListener('webglcontextrestored', onContextRestore, false);
_gl=_context||_canvas.getContext('webgl', contextAttributes)||_canvas.getContext('experimental-webgl', contextAttributes);
if(_gl===null){
if(_canvas.getContext('webgl')!==null){
throw new Error('Error creating WebGL context with your selected attributes.');
}else{
throw new Error('Error creating WebGL context.');
}}
if(_gl.getShaderPrecisionFormat===undefined){
_gl.getShaderPrecisionFormat=function (){
return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };};
}} catch(error){
console.error('THREE.WebGLRenderer: ' + error.message);
}
var extensions, capabilities, state, info;
var properties, textures, attributes, geometries, objects;
var programCache, renderLists, renderStates;
var background, morphtargets, bufferRenderer, indexedBufferRenderer;
var spriteRenderer;
var utils;
function initGLContext(){
extensions=new WebGLExtensions(_gl);
extensions.get('WEBGL_depth_texture');
extensions.get('OES_texture_float');
extensions.get('OES_texture_float_linear');
extensions.get('OES_texture_half_float');
extensions.get('OES_texture_half_float_linear');
extensions.get('OES_standard_derivatives');
extensions.get('OES_element_index_uint');
extensions.get('ANGLE_instanced_arrays');
utils=new WebGLUtils(_gl, extensions);
capabilities=new WebGLCapabilities(_gl, extensions, parameters);
state=new WebGLState(_gl, extensions, utils);
state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio) );
state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio) );
info=new WebGLInfo(_gl);
properties=new WebGLProperties();
textures=new WebGLTextures(_gl, extensions, state, properties, capabilities, utils, info);
attributes=new WebGLAttributes(_gl);
geometries=new WebGLGeometries(_gl, attributes, info);
objects=new WebGLObjects(geometries, info);
morphtargets=new WebGLMorphtargets(_gl);
programCache=new WebGLPrograms(_this, extensions, capabilities);
renderLists=new WebGLRenderLists();
renderStates=new WebGLRenderStates();
background=new WebGLBackground(_this, state, objects, _premultipliedAlpha);
bufferRenderer=new WebGLBufferRenderer(_gl, extensions, info);
indexedBufferRenderer=new WebGLIndexedBufferRenderer(_gl, extensions, info);
spriteRenderer=new WebGLSpriteRenderer(_this, _gl, state, textures, capabilities);
info.programs=programCache.programs;
_this.context=_gl;
_this.capabilities=capabilities;
_this.extensions=extensions;
_this.properties=properties;
_this.renderLists=renderLists;
_this.state=state;
_this.info=info;
}
initGLContext();
var vr=('xr' in navigator) ? new WebXRManager(_this):new WebVRManager(_this);
this.vr=vr;
var shadowMap=new WebGLShadowMap(_this, objects, capabilities.maxTextureSize);
this.shadowMap=shadowMap;
this.getContext=function (){
return _gl;
};
this.getContextAttributes=function (){
return _gl.getContextAttributes();
};
this.forceContextLoss=function (){
var extension=extensions.get('WEBGL_lose_context');
if(extension) extension.loseContext();
};
this.forceContextRestore=function (){
var extension=extensions.get('WEBGL_lose_context');
if(extension) extension.restoreContext();
};
this.getPixelRatio=function (){
return _pixelRatio;
};
this.setPixelRatio=function(value){
if(value===undefined) return;
_pixelRatio=value;
this.setSize(_width, _height, false);
};
this.getSize=function (){
return {
width: _width,
height: _height
};};
this.setSize=function(width, height, updateStyle){
if(vr.isPresenting()){
console.warn('THREE.WebGLRenderer: Can\'t change size while VR device is presenting.');
return;
}
_width=width;
_height=height;
_canvas.width=width * _pixelRatio;
_canvas.height=height * _pixelRatio;
if(updateStyle!==false){
_canvas.style.width=width + 'px';
_canvas.style.height=height + 'px';
}
this.setViewport(0, 0, width, height);
};
this.getDrawingBufferSize=function (){
return {
width: _width * _pixelRatio,
height: _height * _pixelRatio
};};
this.setDrawingBufferSize=function(width, height, pixelRatio){
_width=width;
_height=height;
_pixelRatio=pixelRatio;
_canvas.width=width * pixelRatio;
_canvas.height=height * pixelRatio;
this.setViewport(0, 0, width, height);
};
this.getCurrentViewport=function (){
return _currentViewport;
};
this.setViewport=function(x, y, width, height){
_viewport.set(x, _height - y - height, width, height);
state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio) );
};
this.setScissor=function(x, y, width, height){
_scissor.set(x, _height - y - height, width, height);
state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio) );
};
this.setScissorTest=function(boolean){
state.setScissorTest(_scissorTest=boolean);
};
this.getClearColor=function (){
return background.getClearColor();
};
this.setClearColor=function (){
background.setClearColor.apply(background, arguments);
};
this.getClearAlpha=function (){
return background.getClearAlpha();
};
this.setClearAlpha=function (){
background.setClearAlpha.apply(background, arguments);
};
this.clear=function(color, depth, stencil){
var bits=0;
if(color===undefined||color) bits |=_gl.COLOR_BUFFER_BIT;
if(depth===undefined||depth) bits |=_gl.DEPTH_BUFFER_BIT;
if(stencil===undefined||stencil) bits |=_gl.STENCIL_BUFFER_BIT;
_gl.clear(bits);
};
this.clearColor=function (){
this.clear(true, false, false);
};
this.clearDepth=function (){
this.clear(false, true, false);
};
this.clearStencil=function (){
this.clear(false, false, true);
};
this.clearTarget=function(renderTarget, color, depth, stencil){
this.setRenderTarget(renderTarget);
this.clear(color, depth, stencil);
};
this.dispose=function (){
_canvas.removeEventListener('webglcontextlost', onContextLost, false);
_canvas.removeEventListener('webglcontextrestored', onContextRestore, false);
renderLists.dispose();
renderStates.dispose();
properties.dispose();
objects.dispose();
vr.dispose();
animation.stop();
};
function onContextLost(event){
event.preventDefault();
console.log('THREE.WebGLRenderer: Context Lost.');
_isContextLost=true;
}
function onContextRestore(){
console.log('THREE.WebGLRenderer: Context Restored.');
_isContextLost=false;
initGLContext();
}
function onMaterialDispose(event){
var material=event.target;
material.removeEventListener('dispose', onMaterialDispose);
deallocateMaterial(material);
}
function deallocateMaterial(material){
releaseMaterialProgramReference(material);
properties.remove(material);
}
function releaseMaterialProgramReference(material){
var programInfo=properties.get(material).program;
material.program=undefined;
if(programInfo!==undefined){
programCache.releaseProgram(programInfo);
}}
function renderObjectImmediate(object, program, material){
object.render(function(object){
_this.renderBufferImmediate(object, program, material);
});
}
this.renderBufferImmediate=function(object, program, material){
state.initAttributes();
var buffers=properties.get(object);
if(object.hasPositions&&! buffers.position) buffers.position=_gl.createBuffer();
if(object.hasNormals&&! buffers.normal) buffers.normal=_gl.createBuffer();
if(object.hasUvs&&! buffers.uv) buffers.uv=_gl.createBuffer();
if(object.hasColors&&! buffers.color) buffers.color=_gl.createBuffer();
var programAttributes=program.getAttributes();
if(object.hasPositions){
_gl.bindBuffer(_gl.ARRAY_BUFFER, buffers.position);
_gl.bufferData(_gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW);
state.enableAttribute(programAttributes.position);
_gl.vertexAttribPointer(programAttributes.position, 3, _gl.FLOAT, false, 0, 0);
}
if(object.hasNormals){
_gl.bindBuffer(_gl.ARRAY_BUFFER, buffers.normal);
if(! material.isMeshPhongMaterial &&
! material.isMeshStandardMaterial &&
! material.isMeshNormalMaterial &&
material.flatShading===true){
for(var i=0, l=object.count * 3; i < l; i +=9){
var array=object.normalArray;
var nx=(array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ]) / 3;
var ny=(array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ]) / 3;
var nz=(array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ]) / 3;
array[ i + 0 ]=nx;
array[ i + 1 ]=ny;
array[ i + 2 ]=nz;
array[ i + 3 ]=nx;
array[ i + 4 ]=ny;
array[ i + 5 ]=nz;
array[ i + 6 ]=nx;
array[ i + 7 ]=ny;
array[ i + 8 ]=nz;
}}
_gl.bufferData(_gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW);
state.enableAttribute(programAttributes.normal);
_gl.vertexAttribPointer(programAttributes.normal, 3, _gl.FLOAT, false, 0, 0);
}
if(object.hasUvs&&material.map){
_gl.bindBuffer(_gl.ARRAY_BUFFER, buffers.uv);
_gl.bufferData(_gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW);
state.enableAttribute(programAttributes.uv);
_gl.vertexAttribPointer(programAttributes.uv, 2, _gl.FLOAT, false, 0, 0);
}
if(object.hasColors&&material.vertexColors!==NoColors){
_gl.bindBuffer(_gl.ARRAY_BUFFER, buffers.color);
_gl.bufferData(_gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW);
state.enableAttribute(programAttributes.color);
_gl.vertexAttribPointer(programAttributes.color, 3, _gl.FLOAT, false, 0, 0);
}
state.disableUnusedAttributes();
_gl.drawArrays(_gl.TRIANGLES, 0, object.count);
object.count=0;
};
this.renderBufferDirect=function(camera, fog, geometry, material, object, group){
var frontFaceCW=(object.isMesh&&object.matrixWorld.determinant() < 0);
state.setMaterial(material, frontFaceCW);
var program=setProgram(camera, fog, material, object);
var geometryProgram=geometry.id + '_' + program.id + '_' +(material.wireframe===true);
var updateBuffers=false;
if(geometryProgram!==_currentGeometryProgram){
_currentGeometryProgram=geometryProgram;
updateBuffers=true;
}
if(object.morphTargetInfluences){
morphtargets.update(object, geometry, material, program);
updateBuffers=true;
}
var index=geometry.index;
var position=geometry.attributes.position;
var rangeFactor=1;
if(material.wireframe===true){
index=geometries.getWireframeAttribute(geometry);
rangeFactor=2;
}
var attribute;
var renderer=bufferRenderer;
if(index!==null){
attribute=attributes.get(index);
renderer=indexedBufferRenderer;
renderer.setIndex(attribute);
}
if(updateBuffers){
setupVertexAttributes(material, program, geometry);
if(index!==null){
_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER, attribute.buffer);
}}
var dataCount=Infinity;
if(index!==null){
dataCount=index.count;
}else if(position!==undefined){
dataCount=position.count;
}
var rangeStart=geometry.drawRange.start * rangeFactor;
var rangeCount=geometry.drawRange.count * rangeFactor;
var groupStart=group!==null ? group.start * rangeFactor:0;
var groupCount=group!==null ? group.count * rangeFactor:Infinity;
var drawStart=Math.max(rangeStart, groupStart);
var drawEnd=Math.min(dataCount, rangeStart + rangeCount, groupStart + groupCount) - 1;
var drawCount=Math.max(0, drawEnd - drawStart + 1);
if(drawCount===0) return;
if(object.isMesh){
if(material.wireframe===true){
state.setLineWidth(material.wireframeLinewidth * getTargetPixelRatio());
renderer.setMode(_gl.LINES);
}else{
switch(object.drawMode){
case TrianglesDrawMode:
renderer.setMode(_gl.TRIANGLES);
break;
case TriangleStripDrawMode:
renderer.setMode(_gl.TRIANGLE_STRIP);
break;
case TriangleFanDrawMode:
renderer.setMode(_gl.TRIANGLE_FAN);
break;
}}
}else if(object.isLine){
var lineWidth=material.linewidth;
if(lineWidth===undefined) lineWidth=1;
state.setLineWidth(lineWidth * getTargetPixelRatio());
if(object.isLineSegments){
renderer.setMode(_gl.LINES);
}else if(object.isLineLoop){
renderer.setMode(_gl.LINE_LOOP);
}else{
renderer.setMode(_gl.LINE_STRIP);
}}else if(object.isPoints){
renderer.setMode(_gl.POINTS);
}
if(geometry&&geometry.isInstancedBufferGeometry){
if(geometry.maxInstancedCount > 0){
renderer.renderInstances(geometry, drawStart, drawCount);
}}else{
renderer.render(drawStart, drawCount);
}};
function setupVertexAttributes(material, program, geometry){
if(geometry&&geometry.isInstancedBufferGeometry){
if(extensions.get('ANGLE_instanced_arrays')===null){
console.error('THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');
return;
}}
state.initAttributes();
var geometryAttributes=geometry.attributes;
var programAttributes=program.getAttributes();
var materialDefaultAttributeValues=material.defaultAttributeValues;
for(var name in programAttributes){
var programAttribute=programAttributes[ name ];
if(programAttribute >=0){
var geometryAttribute=geometryAttributes[ name ];
if(geometryAttribute!==undefined){
var normalized=geometryAttribute.normalized;
var size=geometryAttribute.itemSize;
var attribute=attributes.get(geometryAttribute);
if(attribute===undefined) continue;
var buffer=attribute.buffer;
var type=attribute.type;
var bytesPerElement=attribute.bytesPerElement;
if(geometryAttribute.isInterleavedBufferAttribute){
var data=geometryAttribute.data;
var stride=data.stride;
var offset=geometryAttribute.offset;
if(data&&data.isInstancedInterleavedBuffer){
state.enableAttributeAndDivisor(programAttribute, data.meshPerAttribute);
if(geometry.maxInstancedCount===undefined){
geometry.maxInstancedCount=data.meshPerAttribute * data.count;
}}else{
state.enableAttribute(programAttribute);
}
_gl.bindBuffer(_gl.ARRAY_BUFFER, buffer);
_gl.vertexAttribPointer(programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement);
}else{
if(geometryAttribute.isInstancedBufferAttribute){
state.enableAttributeAndDivisor(programAttribute, geometryAttribute.meshPerAttribute);
if(geometry.maxInstancedCount===undefined){
geometry.maxInstancedCount=geometryAttribute.meshPerAttribute * geometryAttribute.count;
}}else{
state.enableAttribute(programAttribute);
}
_gl.bindBuffer(_gl.ARRAY_BUFFER, buffer);
_gl.vertexAttribPointer(programAttribute, size, type, normalized, 0, 0);
}}else if(materialDefaultAttributeValues!==undefined){
var value=materialDefaultAttributeValues[ name ];
if(value!==undefined){
switch(value.length){
case 2:
_gl.vertexAttrib2fv(programAttribute, value);
break;
case 3:
_gl.vertexAttrib3fv(programAttribute, value);
break;
case 4:
_gl.vertexAttrib4fv(programAttribute, value);
break;
default:
_gl.vertexAttrib1fv(programAttribute, value);
}}
}}
}
state.disableUnusedAttributes();
}
this.compile=function(scene, camera){
currentRenderState=renderStates.get(scene, camera);
currentRenderState.init();
scene.traverse(function(object){
if(object.isLight){
currentRenderState.pushLight(object);
if(object.castShadow){
currentRenderState.pushShadow(object);
}}
});
currentRenderState.setupLights(camera);
scene.traverse(function(object){
if(object.material){
if(Array.isArray(object.material) ){
for(var i=0; i < object.material.length; i ++){
initMaterial(object.material[ i ], scene.fog, object);
}}else{
initMaterial(object.material, scene.fog, object);
}}
});
};
var onAnimationFrameCallback=null;
function onAnimationFrame(){
if(vr.isPresenting()) return;
if(onAnimationFrameCallback) onAnimationFrameCallback();
}
var animation=new WebGLAnimation();
animation.setAnimationLoop(onAnimationFrame);
animation.setContext(window);
this.setAnimationLoop=function(callback){
onAnimationFrameCallback=callback;
vr.setAnimationLoop(callback);
animation.start();
};
this.render=function(scene, camera, renderTarget, forceClear){
if(!(camera&&camera.isCamera) ){
console.error('THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.');
return;
}
if(_isContextLost) return;
_currentGeometryProgram='';
_currentMaterialId=- 1;
_currentCamera=null;
if(scene.autoUpdate===true) scene.updateMatrixWorld();
if(camera.parent===null) camera.updateMatrixWorld();
if(vr.enabled){
camera=vr.getCamera(camera);
}
currentRenderState=renderStates.get(scene, camera);
currentRenderState.init();
scene.onBeforeRender(_this, scene, camera, renderTarget);
_projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
_frustum.setFromMatrix(_projScreenMatrix);
_localClippingEnabled=this.localClippingEnabled;
_clippingEnabled=_clipping.init(this.clippingPlanes, _localClippingEnabled, camera);
currentRenderList=renderLists.get(scene, camera);
currentRenderList.init();
projectObject(scene, camera, _this.sortObjects);
if(_this.sortObjects===true){
currentRenderList.sort();
}
if(_clippingEnabled) _clipping.beginShadows();
var shadowsArray=currentRenderState.state.shadowsArray;
shadowMap.render(shadowsArray, scene, camera);
currentRenderState.setupLights(camera);
if(_clippingEnabled) _clipping.endShadows();
if(this.info.autoReset) this.info.reset();
if(renderTarget===undefined){
renderTarget=null;
}
this.setRenderTarget(renderTarget);
background.render(currentRenderList, scene, camera, forceClear);
var opaqueObjects=currentRenderList.opaque;
var transparentObjects=currentRenderList.transparent;
if(scene.overrideMaterial){
var overrideMaterial=scene.overrideMaterial;
if(opaqueObjects.length) renderObjects(opaqueObjects, scene, camera, overrideMaterial);
if(transparentObjects.length) renderObjects(transparentObjects, scene, camera, overrideMaterial);
}else{
if(opaqueObjects.length) renderObjects(opaqueObjects, scene, camera);
if(transparentObjects.length) renderObjects(transparentObjects, scene, camera);
}
var spritesArray=currentRenderState.state.spritesArray;
spriteRenderer.render(spritesArray, scene, camera);
if(renderTarget){
textures.updateRenderTargetMipmap(renderTarget);
}
state.buffers.depth.setTest(true);
state.buffers.depth.setMask(true);
state.buffers.color.setMask(true);
state.setPolygonOffset(false);
scene.onAfterRender(_this, scene, camera);
if(vr.enabled){
vr.submitFrame();
}
currentRenderList=null;
currentRenderState=null;
};
function projectObject(object, camera, sortObjects){
if(object.visible===false) return;
var visible=object.layers.test(camera.layers);
if(visible){
if(object.isLight){
currentRenderState.pushLight(object);
if(object.castShadow){
currentRenderState.pushShadow(object);
}}else if(object.isSprite){
if(! object.frustumCulled||_frustum.intersectsSprite(object) ){
currentRenderState.pushSprite(object);
}}else if(object.isImmediateRenderObject){
if(sortObjects){
_vector3.setFromMatrixPosition(object.matrixWorld)
.applyMatrix4(_projScreenMatrix);
}
currentRenderList.push(object, null, object.material, _vector3.z, null);
}else if(object.isMesh||object.isLine||object.isPoints){
if(object.isSkinnedMesh){
object.skeleton.update();
}
if(! object.frustumCulled||_frustum.intersectsObject(object) ){
if(sortObjects){
_vector3.setFromMatrixPosition(object.matrixWorld)
.applyMatrix4(_projScreenMatrix);
}
var geometry=objects.update(object);
var material=object.material;
if(Array.isArray(material) ){
var groups=geometry.groups;
for(var i=0, l=groups.length; i < l; i ++){
var group=groups[ i ];
var groupMaterial=material[ group.materialIndex ];
if(groupMaterial&&groupMaterial.visible){
currentRenderList.push(object, geometry, groupMaterial, _vector3.z, group);
}}
}else if(material.visible){
currentRenderList.push(object, geometry, material, _vector3.z, null);
}}
}}
var children=object.children;
for(var i=0, l=children.length; i < l; i ++){
projectObject(children[ i ], camera, sortObjects);
}}
function renderObjects(renderList, scene, camera, overrideMaterial){
for(var i=0, l=renderList.length; i < l; i ++){
var renderItem=renderList[ i ];
var object=renderItem.object;
var geometry=renderItem.geometry;
var material=overrideMaterial===undefined ? renderItem.material:overrideMaterial;
var group=renderItem.group;
if(camera.isArrayCamera){
_currentArrayCamera=camera;
var cameras=camera.cameras;
for(var j=0, jl=cameras.length; j < jl; j ++){
var camera2=cameras[ j ];
if(object.layers.test(camera2.layers) ){
if('viewport' in camera2){
state.viewport(_currentViewport.copy(camera2.viewport) );
}else{
var bounds=camera2.bounds;
var x=bounds.x * _width;
var y=bounds.y * _height;
var width=bounds.z * _width;
var height=bounds.w * _height;
state.viewport(_currentViewport.set(x, y, width, height).multiplyScalar(_pixelRatio) );
}
renderObject(object, scene, camera2, geometry, material, group);
}}
}else{
_currentArrayCamera=null;
renderObject(object, scene, camera, geometry, material, group);
}}
}
function renderObject(object, scene, camera, geometry, material, group){
object.onBeforeRender(_this, scene, camera, geometry, material, group);
currentRenderState=renderStates.get(scene, _currentArrayCamera||camera);
object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse, object.matrixWorld);
object.normalMatrix.getNormalMatrix(object.modelViewMatrix);
if(object.isImmediateRenderObject){
var frontFaceCW=(object.isMesh&&object.matrixWorld.determinant() < 0);
state.setMaterial(material, frontFaceCW);
var program=setProgram(camera, scene.fog, material, object);
_currentGeometryProgram='';
renderObjectImmediate(object, program, material);
}else{
_this.renderBufferDirect(camera, scene.fog, geometry, material, object, group);
}
object.onAfterRender(_this, scene, camera, geometry, material, group);
currentRenderState=renderStates.get(scene, _currentArrayCamera||camera);
}
function initMaterial(material, fog, object){
var materialProperties=properties.get(material);
var lights=currentRenderState.state.lights;
var shadowsArray=currentRenderState.state.shadowsArray;
var parameters=programCache.getParameters(material, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object);
var code=programCache.getProgramCode(material, parameters);
var program=materialProperties.program;
var programChange=true;
if(program===undefined){
material.addEventListener('dispose', onMaterialDispose);
}else if(program.code!==code){
releaseMaterialProgramReference(material);
}else if(materialProperties.lightsHash!==lights.state.hash){
properties.update(material, 'lightsHash', lights.state.hash);
programChange=false;
}else if(parameters.shaderID!==undefined){
return;
}else{
programChange=false;
}
if(programChange){
if(parameters.shaderID){
var shader=ShaderLib[ parameters.shaderID ];
materialProperties.shader={
name: material.type,
uniforms: UniformsUtils.clone(shader.uniforms),
vertexShader: shader.vertexShader,
fragmentShader: shader.fragmentShader
};}else{
materialProperties.shader={
name: material.type,
uniforms: material.uniforms,
vertexShader: material.vertexShader,
fragmentShader: material.fragmentShader
};}
material.onBeforeCompile(materialProperties.shader, _this);
program=programCache.acquireProgram(material, materialProperties.shader, parameters, code);
materialProperties.program=program;
material.program=program;
}
var programAttributes=program.getAttributes();
if(material.morphTargets){
material.numSupportedMorphTargets=0;
for(var i=0; i < _this.maxMorphTargets; i ++){
if(programAttributes[ 'morphTarget' + i ] >=0){
material.numSupportedMorphTargets ++;
}}
}
if(material.morphNormals){
material.numSupportedMorphNormals=0;
for(var i=0; i < _this.maxMorphNormals; i ++){
if(programAttributes[ 'morphNormal' + i ] >=0){
material.numSupportedMorphNormals ++;
}}
}
var uniforms=materialProperties.shader.uniforms;
if(! material.isShaderMaterial &&
! material.isRawShaderMaterial ||
material.clipping===true){
materialProperties.numClippingPlanes=_clipping.numPlanes;
materialProperties.numIntersection=_clipping.numIntersection;
uniforms.clippingPlanes=_clipping.uniform;
}
materialProperties.fog=fog;
materialProperties.lightsHash=lights.state.hash;
if(material.lights){
uniforms.ambientLightColor.value=lights.state.ambient;
uniforms.directionalLights.value=lights.state.directional;
uniforms.spotLights.value=lights.state.spot;
uniforms.rectAreaLights.value=lights.state.rectArea;
uniforms.pointLights.value=lights.state.point;
uniforms.hemisphereLights.value=lights.state.hemi;
uniforms.directionalShadowMap.value=lights.state.directionalShadowMap;
uniforms.directionalShadowMatrix.value=lights.state.directionalShadowMatrix;
uniforms.spotShadowMap.value=lights.state.spotShadowMap;
uniforms.spotShadowMatrix.value=lights.state.spotShadowMatrix;
uniforms.pointShadowMap.value=lights.state.pointShadowMap;
uniforms.pointShadowMatrix.value=lights.state.pointShadowMatrix;
}
var progUniforms=materialProperties.program.getUniforms(),
uniformsList =
WebGLUniforms.seqWithValue(progUniforms.seq, uniforms);
materialProperties.uniformsList=uniformsList;
}
function setProgram(camera, fog, material, object){
_usedTextureUnits=0;
var materialProperties=properties.get(material);
var lights=currentRenderState.state.lights;
if(_clippingEnabled){
if(_localClippingEnabled||camera!==_currentCamera){
var useCache =
camera===_currentCamera &&
material.id===_currentMaterialId;
_clipping.setState(material.clippingPlanes, material.clipIntersection, material.clipShadows,
camera, materialProperties, useCache);
}}
if(material.needsUpdate===false){
if(materialProperties.program===undefined){
material.needsUpdate=true;
}else if(material.fog&&materialProperties.fog!==fog){
material.needsUpdate=true;
}else if(material.lights&&materialProperties.lightsHash!==lights.state.hash){
material.needsUpdate=true;
}else if(materialProperties.numClippingPlanes!==undefined &&
(materialProperties.numClippingPlanes!==_clipping.numPlanes ||
materialProperties.numIntersection!==_clipping.numIntersection) ){
material.needsUpdate=true;
}}
if(material.needsUpdate){
initMaterial(material, fog, object);
material.needsUpdate=false;
}
var refreshProgram=false;
var refreshMaterial=false;
var refreshLights=false;
var program=materialProperties.program,
p_uniforms=program.getUniforms(),
m_uniforms=materialProperties.shader.uniforms;
if(state.useProgram(program.program) ){
refreshProgram=true;
refreshMaterial=true;
refreshLights=true;
}
if(material.id!==_currentMaterialId){
_currentMaterialId=material.id;
refreshMaterial=true;
}
if(refreshProgram||camera!==_currentCamera){
p_uniforms.setValue(_gl, 'projectionMatrix', camera.projectionMatrix);
if(capabilities.logarithmicDepthBuffer){
p_uniforms.setValue(_gl, 'logDepthBufFC',
2.0 /(Math.log(camera.far + 1.0) / Math.LN2) );
}
if(_currentCamera!==(_currentArrayCamera||camera) ){
_currentCamera=(_currentArrayCamera||camera);
refreshMaterial=true;
refreshLights=true;
}
if(material.isShaderMaterial ||
material.isMeshPhongMaterial ||
material.isMeshStandardMaterial ||
material.envMap){
var uCamPos=p_uniforms.map.cameraPosition;
if(uCamPos!==undefined){
uCamPos.setValue(_gl,
_vector3.setFromMatrixPosition(camera.matrixWorld) );
}}
if(material.isMeshPhongMaterial ||
material.isMeshLambertMaterial ||
material.isMeshBasicMaterial ||
material.isMeshStandardMaterial ||
material.isShaderMaterial ||
material.skinning){
p_uniforms.setValue(_gl, 'viewMatrix', camera.matrixWorldInverse);
}}
if(material.skinning){
p_uniforms.setOptional(_gl, object, 'bindMatrix');
p_uniforms.setOptional(_gl, object, 'bindMatrixInverse');
var skeleton=object.skeleton;
if(skeleton){
var bones=skeleton.bones;
if(capabilities.floatVertexTextures){
if(skeleton.boneTexture===undefined){
var size=Math.sqrt(bones.length * 4);
size=_Math.ceilPowerOfTwo(size);
size=Math.max(size, 4);
var boneMatrices=new Float32Array(size * size * 4);
boneMatrices.set(skeleton.boneMatrices);
var boneTexture=new DataTexture(boneMatrices, size, size, RGBAFormat, FloatType);
boneTexture.needsUpdate=true;
skeleton.boneMatrices=boneMatrices;
skeleton.boneTexture=boneTexture;
skeleton.boneTextureSize=size;
}
p_uniforms.setValue(_gl, 'boneTexture', skeleton.boneTexture);
p_uniforms.setValue(_gl, 'boneTextureSize', skeleton.boneTextureSize);
}else{
p_uniforms.setOptional(_gl, skeleton, 'boneMatrices');
}}
}
if(refreshMaterial){
p_uniforms.setValue(_gl, 'toneMappingExposure', _this.toneMappingExposure);
p_uniforms.setValue(_gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint);
if(material.lights){
markUniformsLightsNeedsUpdate(m_uniforms, refreshLights);
}
if(fog&&material.fog){
refreshUniformsFog(m_uniforms, fog);
}
if(material.isMeshBasicMaterial){
refreshUniformsCommon(m_uniforms, material);
}else if(material.isMeshLambertMaterial){
refreshUniformsCommon(m_uniforms, material);
refreshUniformsLambert(m_uniforms, material);
}else if(material.isMeshPhongMaterial){
refreshUniformsCommon(m_uniforms, material);
if(material.isMeshToonMaterial){
refreshUniformsToon(m_uniforms, material);
}else{
refreshUniformsPhong(m_uniforms, material);
}}else if(material.isMeshStandardMaterial){
refreshUniformsCommon(m_uniforms, material);
if(material.isMeshPhysicalMaterial){
refreshUniformsPhysical(m_uniforms, material);
}else{
refreshUniformsStandard(m_uniforms, material);
}}else if(material.isMeshDepthMaterial){
refreshUniformsCommon(m_uniforms, material);
refreshUniformsDepth(m_uniforms, material);
}else if(material.isMeshDistanceMaterial){
refreshUniformsCommon(m_uniforms, material);
refreshUniformsDistance(m_uniforms, material);
}else if(material.isMeshNormalMaterial){
refreshUniformsCommon(m_uniforms, material);
refreshUniformsNormal(m_uniforms, material);
}else if(material.isLineBasicMaterial){
refreshUniformsLine(m_uniforms, material);
if(material.isLineDashedMaterial){
refreshUniformsDash(m_uniforms, material);
}}else if(material.isPointsMaterial){
refreshUniformsPoints(m_uniforms, material);
}else if(material.isShadowMaterial){
m_uniforms.color.value=material.color;
m_uniforms.opacity.value=material.opacity;
}
if(m_uniforms.ltc_1!==undefined) m_uniforms.ltc_1.value=UniformsLib.LTC_1;
if(m_uniforms.ltc_2!==undefined) m_uniforms.ltc_2.value=UniformsLib.LTC_2;
WebGLUniforms.upload(_gl, materialProperties.uniformsList, m_uniforms, _this);
}
if(material.isShaderMaterial&&material.uniformsNeedUpdate===true){
WebGLUniforms.upload(_gl, materialProperties.uniformsList, m_uniforms, _this);
material.uniformsNeedUpdate=false;
}
p_uniforms.setValue(_gl, 'modelViewMatrix', object.modelViewMatrix);
p_uniforms.setValue(_gl, 'normalMatrix', object.normalMatrix);
p_uniforms.setValue(_gl, 'modelMatrix', object.matrixWorld);
return program;
}
function refreshUniformsCommon(uniforms, material){
uniforms.opacity.value=material.opacity;
if(material.color){
uniforms.diffuse.value=material.color;
}
if(material.emissive){
uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity);
}
if(material.map){
uniforms.map.value=material.map;
}
if(material.alphaMap){
uniforms.alphaMap.value=material.alphaMap;
}
if(material.specularMap){
uniforms.specularMap.value=material.specularMap;
}
if(material.envMap){
uniforms.envMap.value=material.envMap;
uniforms.flipEnvMap.value=(!(material.envMap&&material.envMap.isCubeTexture) ) ? 1:- 1;
uniforms.reflectivity.value=material.reflectivity;
uniforms.refractionRatio.value=material.refractionRatio;
uniforms.maxMipLevel.value=properties.get(material.envMap).__maxMipLevel;
}
if(material.lightMap){
uniforms.lightMap.value=material.lightMap;
uniforms.lightMapIntensity.value=material.lightMapIntensity;
}
if(material.aoMap){
uniforms.aoMap.value=material.aoMap;
uniforms.aoMapIntensity.value=material.aoMapIntensity;
}
var uvScaleMap;
if(material.map){
uvScaleMap=material.map;
}else if(material.specularMap){
uvScaleMap=material.specularMap;
}else if(material.displacementMap){
uvScaleMap=material.displacementMap;
}else if(material.normalMap){
uvScaleMap=material.normalMap;
}else if(material.bumpMap){
uvScaleMap=material.bumpMap;
}else if(material.roughnessMap){
uvScaleMap=material.roughnessMap;
}else if(material.metalnessMap){
uvScaleMap=material.metalnessMap;
}else if(material.alphaMap){
uvScaleMap=material.alphaMap;
}else if(material.emissiveMap){
uvScaleMap=material.emissiveMap;
}
if(uvScaleMap!==undefined){
if(uvScaleMap.isWebGLRenderTarget){
uvScaleMap=uvScaleMap.texture;
}
if(uvScaleMap.matrixAutoUpdate===true){
uvScaleMap.updateMatrix();
}
uniforms.uvTransform.value.copy(uvScaleMap.matrix);
}}
function refreshUniformsLine(uniforms, material){
uniforms.diffuse.value=material.color;
uniforms.opacity.value=material.opacity;
}
function refreshUniformsDash(uniforms, material){
uniforms.dashSize.value=material.dashSize;
uniforms.totalSize.value=material.dashSize + material.gapSize;
uniforms.scale.value=material.scale;
}
function refreshUniformsPoints(uniforms, material){
uniforms.diffuse.value=material.color;
uniforms.opacity.value=material.opacity;
uniforms.size.value=material.size * _pixelRatio;
uniforms.scale.value=_height * 0.5;
uniforms.map.value=material.map;
if(material.map!==null){
if(material.map.matrixAutoUpdate===true){
material.map.updateMatrix();
}
uniforms.uvTransform.value.copy(material.map.matrix);
}}
function refreshUniformsFog(uniforms, fog){
uniforms.fogColor.value=fog.color;
if(fog.isFog){
uniforms.fogNear.value=fog.near;
uniforms.fogFar.value=fog.far;
}else if(fog.isFogExp2){
uniforms.fogDensity.value=fog.density;
}}
function refreshUniformsLambert(uniforms, material){
if(material.emissiveMap){
uniforms.emissiveMap.value=material.emissiveMap;
}}
function refreshUniformsPhong(uniforms, material){
uniforms.specular.value=material.specular;
uniforms.shininess.value=Math.max(material.shininess, 1e-4);
if(material.emissiveMap){
uniforms.emissiveMap.value=material.emissiveMap;
}
if(material.bumpMap){
uniforms.bumpMap.value=material.bumpMap;
uniforms.bumpScale.value=material.bumpScale;
if(material.side===BackSide) uniforms.bumpScale.value *=- 1;
}
if(material.normalMap){
uniforms.normalMap.value=material.normalMap;
uniforms.normalScale.value.copy(material.normalScale);
if(material.side===BackSide) uniforms.normalScale.value.negate();
}
if(material.displacementMap){
uniforms.displacementMap.value=material.displacementMap;
uniforms.displacementScale.value=material.displacementScale;
uniforms.displacementBias.value=material.displacementBias;
}}
function refreshUniformsToon(uniforms, material){
refreshUniformsPhong(uniforms, material);
if(material.gradientMap){
uniforms.gradientMap.value=material.gradientMap;
}}
function refreshUniformsStandard(uniforms, material){
uniforms.roughness.value=material.roughness;
uniforms.metalness.value=material.metalness;
if(material.roughnessMap){
uniforms.roughnessMap.value=material.roughnessMap;
}
if(material.metalnessMap){
uniforms.metalnessMap.value=material.metalnessMap;
}
if(material.emissiveMap){
uniforms.emissiveMap.value=material.emissiveMap;
}
if(material.bumpMap){
uniforms.bumpMap.value=material.bumpMap;
uniforms.bumpScale.value=material.bumpScale;
if(material.side===BackSide) uniforms.bumpScale.value *=- 1;
}
if(material.normalMap){
uniforms.normalMap.value=material.normalMap;
uniforms.normalScale.value.copy(material.normalScale);
if(material.side===BackSide) uniforms.normalScale.value.negate();
}
if(material.displacementMap){
uniforms.displacementMap.value=material.displacementMap;
uniforms.displacementScale.value=material.displacementScale;
uniforms.displacementBias.value=material.displacementBias;
}
if(material.envMap){
uniforms.envMapIntensity.value=material.envMapIntensity;
}}
function refreshUniformsPhysical(uniforms, material){
uniforms.clearCoat.value=material.clearCoat;
uniforms.clearCoatRoughness.value=material.clearCoatRoughness;
refreshUniformsStandard(uniforms, material);
}
function refreshUniformsDepth(uniforms, material){
if(material.displacementMap){
uniforms.displacementMap.value=material.displacementMap;
uniforms.displacementScale.value=material.displacementScale;
uniforms.displacementBias.value=material.displacementBias;
}}
function refreshUniformsDistance(uniforms, material){
if(material.displacementMap){
uniforms.displacementMap.value=material.displacementMap;
uniforms.displacementScale.value=material.displacementScale;
uniforms.displacementBias.value=material.displacementBias;
}
uniforms.referencePosition.value.copy(material.referencePosition);
uniforms.nearDistance.value=material.nearDistance;
uniforms.farDistance.value=material.farDistance;
}
function refreshUniformsNormal(uniforms, material){
if(material.bumpMap){
uniforms.bumpMap.value=material.bumpMap;
uniforms.bumpScale.value=material.bumpScale;
if(material.side===BackSide) uniforms.bumpScale.value *=- 1;
}
if(material.normalMap){
uniforms.normalMap.value=material.normalMap;
uniforms.normalScale.value.copy(material.normalScale);
if(material.side===BackSide) uniforms.normalScale.value.negate();
}
if(material.displacementMap){
uniforms.displacementMap.value=material.displacementMap;
uniforms.displacementScale.value=material.displacementScale;
uniforms.displacementBias.value=material.displacementBias;
}}
function markUniformsLightsNeedsUpdate(uniforms, value){
uniforms.ambientLightColor.needsUpdate=value;
uniforms.directionalLights.needsUpdate=value;
uniforms.pointLights.needsUpdate=value;
uniforms.spotLights.needsUpdate=value;
uniforms.rectAreaLights.needsUpdate=value;
uniforms.hemisphereLights.needsUpdate=value;
}
function allocTextureUnit(){
var textureUnit=_usedTextureUnits;
if(textureUnit >=capabilities.maxTextures){
console.warn('THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures);
}
_usedTextureUnits +=1;
return textureUnit;
}
this.allocTextureUnit=allocTextureUnit;
this.setTexture2D=(function (){
var warned=false;
return function setTexture2D(texture, slot){
if(texture&&texture.isWebGLRenderTarget){
if(! warned){
console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.");
warned=true;
}
texture=texture.texture;
}
textures.setTexture2D(texture, slot);
};}());
this.setTexture=(function (){
var warned=false;
return function setTexture(texture, slot){
if(! warned){
console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.");
warned=true;
}
textures.setTexture2D(texture, slot);
};}());
this.setTextureCube=(function (){
var warned=false;
return function setTextureCube(texture, slot){
if(texture&&texture.isWebGLRenderTargetCube){
if(! warned){
console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.");
warned=true;
}
texture=texture.texture;
}
if(( texture&&texture.isCubeTexture) ||
(Array.isArray(texture.image)&&texture.image.length===6) ){
textures.setTextureCube(texture, slot);
}else{
textures.setTextureCubeDynamic(texture, slot);
}};}());
this.setFramebuffer=function(value){
_framebuffer=value;
};
this.getRenderTarget=function (){
return _currentRenderTarget;
};
this.setRenderTarget=function(renderTarget){
_currentRenderTarget=renderTarget;
if(renderTarget&&properties.get(renderTarget).__webglFramebuffer===undefined){
textures.setupRenderTarget(renderTarget);
}
var framebuffer=_framebuffer;
var isCube=false;
if(renderTarget){
var __webglFramebuffer=properties.get(renderTarget).__webglFramebuffer;
if(renderTarget.isWebGLRenderTargetCube){
framebuffer=__webglFramebuffer[ renderTarget.activeCubeFace ];
isCube=true;
}else{
framebuffer=__webglFramebuffer;
}
_currentViewport.copy(renderTarget.viewport);
_currentScissor.copy(renderTarget.scissor);
_currentScissorTest=renderTarget.scissorTest;
}else{
_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio);
_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio);
_currentScissorTest=_scissorTest;
}
if(_currentFramebuffer!==framebuffer){
_gl.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer);
_currentFramebuffer=framebuffer;
}
state.viewport(_currentViewport);
state.scissor(_currentScissor);
state.setScissorTest(_currentScissorTest);
if(isCube){
var textureProperties=properties.get(renderTarget.texture);
_gl.framebufferTexture2D(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel);
}};
this.readRenderTargetPixels=function(renderTarget, x, y, width, height, buffer){
if(!(renderTarget&&renderTarget.isWebGLRenderTarget) ){
console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.');
return;
}
var framebuffer=properties.get(renderTarget).__webglFramebuffer;
if(framebuffer){
var restore=false;
if(framebuffer!==_currentFramebuffer){
_gl.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer);
restore=true;
}
try {
var texture=renderTarget.texture;
var textureFormat=texture.format;
var textureType=texture.type;
if(textureFormat!==RGBAFormat&&utils.convert(textureFormat)!==_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_FORMAT) ){
console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.');
return;
}
if(textureType!==UnsignedByteType&&utils.convert(textureType)!==_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_TYPE) &&
!(textureType===FloatType&&(extensions.get('OES_texture_float')||extensions.get('WEBGL_color_buffer_float') )) &&
!(textureType===HalfFloatType&&extensions.get('EXT_color_buffer_half_float') )){
console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.');
return;
}
if(_gl.checkFramebufferStatus(_gl.FRAMEBUFFER)===_gl.FRAMEBUFFER_COMPLETE){
if(( x >=0&&x <=(renderTarget.width - width) )&&(y >=0&&y <=(renderTarget.height - height) )){
_gl.readPixels(x, y, width, height, utils.convert(textureFormat), utils.convert(textureType), buffer);
}}else{
console.error('THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.');
}} finally {
if(restore){
_gl.bindFramebuffer(_gl.FRAMEBUFFER, _currentFramebuffer);
}}
}};
this.copyFramebufferToTexture=function(position, texture, level){
var width=texture.image.width;
var height=texture.image.height;
var glFormat=utils.convert(texture.format);
this.setTexture2D(texture, 0);
_gl.copyTexImage2D(_gl.TEXTURE_2D, level||0, glFormat, position.x, position.y, width, height, 0);
};
this.copyTextureToTexture=function(position, srcTexture, dstTexture, level){
var width=srcTexture.image.width;
var height=srcTexture.image.height;
var glFormat=utils.convert(dstTexture.format);
var glType=utils.convert(dstTexture.type);
this.setTexture2D(dstTexture, 0);
if(srcTexture.isDataTexture){
_gl.texSubImage2D(_gl.TEXTURE_2D, level||0, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data);
}else{
_gl.texSubImage2D(_gl.TEXTURE_2D, level||0, position.x, position.y, glFormat, glType, srcTexture.image);
}};}
function FogExp2(color, density){
this.name='';
this.color=new Color(color);
this.density=(density!==undefined) ? density:0.00025;
}
FogExp2.prototype.isFogExp2=true;
FogExp2.prototype.clone=function (){
return new FogExp2(this.color, this.density);
};
FogExp2.prototype.toJSON=function(){
return {
type: 'FogExp2',
color: this.color.getHex(),
density: this.density
};};
function Fog(color, near, far){
this.name='';
this.color=new Color(color);
this.near=(near!==undefined) ? near:1;
this.far=(far!==undefined) ? far:1000;
}
Fog.prototype.isFog=true;
Fog.prototype.clone=function (){
return new Fog(this.color, this.near, this.far);
};
Fog.prototype.toJSON=function(){
return {
type: 'Fog',
color: this.color.getHex(),
near: this.near,
far: this.far
};};
function Scene(){
Object3D.call(this);
this.type='Scene';
this.background=null;
this.fog=null;
this.overrideMaterial=null;
this.autoUpdate=true;
}
Scene.prototype=Object.assign(Object.create(Object3D.prototype), {
constructor: Scene,
copy: function(source, recursive){
Object3D.prototype.copy.call(this, source, recursive);
if(source.background!==null) this.background=source.background.clone();
if(source.fog!==null) this.fog=source.fog.clone();
if(source.overrideMaterial!==null) this.overrideMaterial=source.overrideMaterial.clone();
this.autoUpdate=source.autoUpdate;
this.matrixAutoUpdate=source.matrixAutoUpdate;
return this;
},
toJSON: function(meta){
var data=Object3D.prototype.toJSON.call(this, meta);
if(this.background!==null) data.object.background=this.background.toJSON(meta);
if(this.fog!==null) data.object.fog=this.fog.toJSON();
return data;
}});
function SpriteMaterial(parameters){
Material.call(this);
this.type='SpriteMaterial';
this.color=new Color(0xffffff);
this.map=null;
this.rotation=0;
this.fog=false;
this.lights=false;
this.setValues(parameters);
}
SpriteMaterial.prototype=Object.create(Material.prototype);
SpriteMaterial.prototype.constructor=SpriteMaterial;
SpriteMaterial.prototype.isSpriteMaterial=true;
SpriteMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this, source);
this.color.copy(source.color);
this.map=source.map;
this.rotation=source.rotation;
return this;
};
function Sprite(material){
Object3D.call(this);
this.type='Sprite';
this.material=(material!==undefined) ? material:new SpriteMaterial();
this.center=new Vector2(0.5, 0.5);
}
Sprite.prototype=Object.assign(Object.create(Object3D.prototype), {
constructor: Sprite,
isSprite: true,
raycast:(function (){
var intersectPoint=new Vector3();
var worldPosition=new Vector3();
var worldScale=new Vector3();
return function raycast(raycaster, intersects){
worldPosition.setFromMatrixPosition(this.matrixWorld);
raycaster.ray.closestPointToPoint(worldPosition, intersectPoint);
worldScale.setFromMatrixScale(this.matrixWorld);
var guessSizeSq=worldScale.x * worldScale.y / 4;
if(worldPosition.distanceToSquared(intersectPoint) > guessSizeSq) return;
var distance=raycaster.ray.origin.distanceTo(intersectPoint);
if(distance < raycaster.near||distance > raycaster.far) return;
intersects.push({
distance: distance,
point: intersectPoint.clone(),
face: null,
object: this
});
};}()),
clone: function (){
return new this.constructor(this.material).copy(this);
},
copy: function(source){
Object3D.prototype.copy.call(this, source);
if(source.center!==undefined) this.center.copy(source.center);
return this;
}});
function LOD(){
Object3D.call(this);
this.type='LOD';
Object.defineProperties(this, {
levels: {
enumerable: true,
value: []
}});
}
LOD.prototype=Object.assign(Object.create(Object3D.prototype), {
constructor: LOD,
copy: function(source){
Object3D.prototype.copy.call(this, source, false);
var levels=source.levels;
for(var i=0, l=levels.length; i < l; i ++){
var level=levels[ i ];
this.addLevel(level.object.clone(), level.distance);
}
return this;
},
addLevel: function(object, distance){
if(distance===undefined) distance=0;
distance=Math.abs(distance);
var levels=this.levels;
for(var l=0; l < levels.length; l ++){
if(distance < levels[ l ].distance){
break;
}}
levels.splice(l, 0, { distance: distance, object: object });
this.add(object);
},
getObjectForDistance: function(distance){
var levels=this.levels;
for(var i=1, l=levels.length; i < l; i ++){
if(distance < levels[ i ].distance){
break;
}}
return levels[ i - 1 ].object;
},
raycast:(function (){
var matrixPosition=new Vector3();
return function raycast(raycaster, intersects){
matrixPosition.setFromMatrixPosition(this.matrixWorld);
var distance=raycaster.ray.origin.distanceTo(matrixPosition);
this.getObjectForDistance(distance).raycast(raycaster, intersects);
};}()),
update: function (){
var v1=new Vector3();
var v2=new Vector3();
return function update(camera){
var levels=this.levels;
if(levels.length > 1){
v1.setFromMatrixPosition(camera.matrixWorld);
v2.setFromMatrixPosition(this.matrixWorld);
var distance=v1.distanceTo(v2);
levels[ 0 ].object.visible=true;
for(var i=1, l=levels.length; i < l; i ++){
if(distance >=levels[ i ].distance){
levels[ i - 1 ].object.visible=false;
levels[ i ].object.visible=true;
}else{
break;
}}
for(; i < l; i ++){
levels[ i ].object.visible=false;
}}
};}(),
toJSON: function(meta){
var data=Object3D.prototype.toJSON.call(this, meta);
data.object.levels=[];
var levels=this.levels;
for(var i=0, l=levels.length; i < l; i ++){
var level=levels[ i ];
data.object.levels.push({
object: level.object.uuid,
distance: level.distance
});
}
return data;
}});
function Skeleton(bones, boneInverses){
bones=bones||[];
this.bones=bones.slice(0);
this.boneMatrices=new Float32Array(this.bones.length * 16);
if(boneInverses===undefined){
this.calculateInverses();
}else{
if(this.bones.length===boneInverses.length){
this.boneInverses=boneInverses.slice(0);
}else{
console.warn('THREE.Skeleton boneInverses is the wrong length.');
this.boneInverses=[];
for(var i=0, il=this.bones.length; i < il; i ++){
this.boneInverses.push(new Matrix4());
}}
}}
Object.assign(Skeleton.prototype, {
calculateInverses: function (){
this.boneInverses=[];
for(var i=0, il=this.bones.length; i < il; i ++){
var inverse=new Matrix4();
if(this.bones[ i ]){
inverse.getInverse(this.bones[ i ].matrixWorld);
}
this.boneInverses.push(inverse);
}},
pose: function (){
var bone, i, il;
for(i=0, il=this.bones.length; i < il; i ++){
bone=this.bones[ i ];
if(bone){
bone.matrixWorld.getInverse(this.boneInverses[ i ]);
}}
for(i=0, il=this.bones.length; i < il; i ++){
bone=this.bones[ i ];
if(bone){
if(bone.parent&&bone.parent.isBone){
bone.matrix.getInverse(bone.parent.matrixWorld);
bone.matrix.multiply(bone.matrixWorld);
}else{
bone.matrix.copy(bone.matrixWorld);
}
bone.matrix.decompose(bone.position, bone.quaternion, bone.scale);
}}
},
update:(function (){
var offsetMatrix=new Matrix4();
var identityMatrix=new Matrix4();
return function update(){
var bones=this.bones;
var boneInverses=this.boneInverses;
var boneMatrices=this.boneMatrices;
var boneTexture=this.boneTexture;
for(var i=0, il=bones.length; i < il; i ++){
var matrix=bones[ i ] ? bones[ i ].matrixWorld:identityMatrix;
offsetMatrix.multiplyMatrices(matrix, boneInverses[ i ]);
offsetMatrix.toArray(boneMatrices, i * 16);
}
if(boneTexture!==undefined){
boneTexture.needsUpdate=true;
}};})(),
clone: function (){
return new Skeleton(this.bones, this.boneInverses);
},
getBoneByName: function(name){
for(var i=0, il=this.bones.length; i < il; i ++){
var bone=this.bones[ i ];
if(bone.name===name){
return bone;
}}
return undefined;
}});
function Bone(){
Object3D.call(this);
this.type='Bone';
}
Bone.prototype=Object.assign(Object.create(Object3D.prototype), {
constructor: Bone,
isBone: true
});
function SkinnedMesh(geometry, material){
Mesh.call(this, geometry, material);
this.type='SkinnedMesh';
this.bindMode='attached';
this.bindMatrix=new Matrix4();
this.bindMatrixInverse=new Matrix4();
var bones=this.initBones();
var skeleton=new Skeleton(bones);
this.bind(skeleton, this.matrixWorld);
this.normalizeSkinWeights();
}
SkinnedMesh.prototype=Object.assign(Object.create(Mesh.prototype), {
constructor: SkinnedMesh,
isSkinnedMesh: true,
initBones: function (){
var bones=[], bone, gbone;
var i, il;
if(this.geometry&&this.geometry.bones!==undefined){
for(i=0, il=this.geometry.bones.length; i < il; i ++){
gbone=this.geometry.bones[ i ];
bone=new Bone();
bones.push(bone);
bone.name=gbone.name;
bone.position.fromArray(gbone.pos);
bone.quaternion.fromArray(gbone.rotq);
if(gbone.scl!==undefined) bone.scale.fromArray(gbone.scl);
}
for(i=0, il=this.geometry.bones.length; i < il; i ++){
gbone=this.geometry.bones[ i ];
if(( gbone.parent!==- 1)&&(gbone.parent!==null)&&(bones[ gbone.parent ]!==undefined) ){
bones[ gbone.parent ].add(bones[ i ]);
}else{
this.add(bones[ i ]);
}}
}
this.updateMatrixWorld(true);
return bones;
},
bind: function(skeleton, bindMatrix){
this.skeleton=skeleton;
if(bindMatrix===undefined){
this.updateMatrixWorld(true);
this.skeleton.calculateInverses();
bindMatrix=this.matrixWorld;
}
this.bindMatrix.copy(bindMatrix);
this.bindMatrixInverse.getInverse(bindMatrix);
},
pose: function (){
this.skeleton.pose();
},
normalizeSkinWeights: function (){
var scale, i;
if(this.geometry&&this.geometry.isGeometry){
for(i=0; i < this.geometry.skinWeights.length; i ++){
var sw=this.geometry.skinWeights[ i ];
scale=1.0 / sw.manhattanLength();
if(scale!==Infinity){
sw.multiplyScalar(scale);
}else{
sw.set(1, 0, 0, 0);
}}
}else if(this.geometry&&this.geometry.isBufferGeometry){
var vec=new Vector4();
var skinWeight=this.geometry.attributes.skinWeight;
for(i=0; i < skinWeight.count; i ++){
vec.x=skinWeight.getX(i);
vec.y=skinWeight.getY(i);
vec.z=skinWeight.getZ(i);
vec.w=skinWeight.getW(i);
scale=1.0 / vec.manhattanLength();
if(scale!==Infinity){
vec.multiplyScalar(scale);
}else{
vec.set(1, 0, 0, 0);
}
skinWeight.setXYZW(i, vec.x, vec.y, vec.z, vec.w);
}}
},
updateMatrixWorld: function(force){
Mesh.prototype.updateMatrixWorld.call(this, force);
if(this.bindMode==='attached'){
this.bindMatrixInverse.getInverse(this.matrixWorld);
}else if(this.bindMode==='detached'){
this.bindMatrixInverse.getInverse(this.bindMatrix);
}else{
console.warn('THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode);
}},
clone: function (){
return new this.constructor(this.geometry, this.material).copy(this);
}});
function LineBasicMaterial(parameters){
Material.call(this);
this.type='LineBasicMaterial';
this.color=new Color(0xffffff);
this.linewidth=1;
this.linecap='round';
this.linejoin='round';
this.lights=false;
this.setValues(parameters);
}
LineBasicMaterial.prototype=Object.create(Material.prototype);
LineBasicMaterial.prototype.constructor=LineBasicMaterial;
LineBasicMaterial.prototype.isLineBasicMaterial=true;
LineBasicMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this, source);
this.color.copy(source.color);
this.linewidth=source.linewidth;
this.linecap=source.linecap;
this.linejoin=source.linejoin;
return this;
};
function Line(geometry, material, mode){
if(mode===1){
console.warn('THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.');
return new LineSegments(geometry, material);
}
Object3D.call(this);
this.type='Line';
this.geometry=geometry!==undefined ? geometry:new BufferGeometry();
this.material=material!==undefined ? material:new LineBasicMaterial( { color: Math.random() * 0xffffff });
}
Line.prototype=Object.assign(Object.create(Object3D.prototype), {
constructor: Line,
isLine: true,
computeLineDistances:(function (){
var start=new Vector3();
var end=new Vector3();
return function computeLineDistances(){
var geometry=this.geometry;
if(geometry.isBufferGeometry){
if(geometry.index===null){
var positionAttribute=geometry.attributes.position;
var lineDistances=[ 0 ];
for(var i=1, l=positionAttribute.count; i < l; i ++){
start.fromBufferAttribute(positionAttribute, i - 1);
end.fromBufferAttribute(positionAttribute, i);
lineDistances[ i ]=lineDistances[ i - 1 ];
lineDistances[ i ] +=start.distanceTo(end);
}
geometry.addAttribute('lineDistance', new Float32BufferAttribute(lineDistances, 1) );
}else{
console.warn('THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.');
}}else if(geometry.isGeometry){
var vertices=geometry.vertices;
var lineDistances=geometry.lineDistances;
lineDistances[ 0 ]=0;
for(var i=1, l=vertices.length; i < l; i ++){
lineDistances[ i ]=lineDistances[ i - 1 ];
lineDistances[ i ] +=vertices[ i - 1 ].distanceTo(vertices[ i ]);
}}
return this;
};}()),
raycast:(function (){
var inverseMatrix=new Matrix4();
var ray=new Ray();
var sphere=new Sphere();
return function raycast(raycaster, intersects){
var precision=raycaster.linePrecision;
var precisionSq=precision * precision;
var geometry=this.geometry;
var matrixWorld=this.matrixWorld;
if(geometry.boundingSphere===null) geometry.computeBoundingSphere();
sphere.copy(geometry.boundingSphere);
sphere.applyMatrix4(matrixWorld);
if(raycaster.ray.intersectsSphere(sphere)===false) return;
inverseMatrix.getInverse(matrixWorld);
ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);
var vStart=new Vector3();
var vEnd=new Vector3();
var interSegment=new Vector3();
var interRay=new Vector3();
var step=(this&&this.isLineSegments) ? 2:1;
if(geometry.isBufferGeometry){
var index=geometry.index;
var attributes=geometry.attributes;
var positions=attributes.position.array;
if(index!==null){
var indices=index.array;
for(var i=0, l=indices.length - 1; i < l; i +=step){
var a=indices[ i ];
var b=indices[ i + 1 ];
vStart.fromArray(positions, a * 3);
vEnd.fromArray(positions, b * 3);
var distSq=ray.distanceSqToSegment(vStart, vEnd, interRay, interSegment);
if(distSq > precisionSq) continue;
interRay.applyMatrix4(this.matrixWorld);
var distance=raycaster.ray.origin.distanceTo(interRay);
if(distance < raycaster.near||distance > raycaster.far) continue;
intersects.push({
distance: distance,
point: interSegment.clone().applyMatrix4(this.matrixWorld),
index: i,
face: null,
faceIndex: null,
object: this
});
}}else{
for(var i=0, l=positions.length / 3 - 1; i < l; i +=step){
vStart.fromArray(positions, 3 * i);
vEnd.fromArray(positions, 3 * i + 3);
var distSq=ray.distanceSqToSegment(vStart, vEnd, interRay, interSegment);
if(distSq > precisionSq) continue;
interRay.applyMatrix4(this.matrixWorld);
var distance=raycaster.ray.origin.distanceTo(interRay);
if(distance < raycaster.near||distance > raycaster.far) continue;
intersects.push({
distance: distance,
point: interSegment.clone().applyMatrix4(this.matrixWorld),
index: i,
face: null,
faceIndex: null,
object: this
});
}}
}else if(geometry.isGeometry){
var vertices=geometry.vertices;
var nbVertices=vertices.length;
for(var i=0; i < nbVertices - 1; i +=step){
var distSq=ray.distanceSqToSegment(vertices[ i ], vertices[ i + 1 ], interRay, interSegment);
if(distSq > precisionSq) continue;
interRay.applyMatrix4(this.matrixWorld);
var distance=raycaster.ray.origin.distanceTo(interRay);
if(distance < raycaster.near||distance > raycaster.far) continue;
intersects.push({
distance: distance,
point: interSegment.clone().applyMatrix4(this.matrixWorld),
index: i,
face: null,
faceIndex: null,
object: this
});
}}
};}()),
clone: function (){
return new this.constructor(this.geometry, this.material).copy(this);
}});
function LineSegments(geometry, material){
Line.call(this, geometry, material);
this.type='LineSegments';
}
LineSegments.prototype=Object.assign(Object.create(Line.prototype), {
constructor: LineSegments,
isLineSegments: true,
computeLineDistances:(function (){
var start=new Vector3();
var end=new Vector3();
return function computeLineDistances(){
var geometry=this.geometry;
if(geometry.isBufferGeometry){
if(geometry.index===null){
var positionAttribute=geometry.attributes.position;
var lineDistances=[];
for(var i=0, l=positionAttribute.count; i < l; i +=2){
start.fromBufferAttribute(positionAttribute, i);
end.fromBufferAttribute(positionAttribute, i + 1);
lineDistances[ i ]=(i===0) ? 0:lineDistances[ i - 1 ];
lineDistances[ i + 1 ]=lineDistances[ i ] + start.distanceTo(end);
}
geometry.addAttribute('lineDistance', new Float32BufferAttribute(lineDistances, 1) );
}else{
console.warn('THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.');
}}else if(geometry.isGeometry){
var vertices=geometry.vertices;
var lineDistances=geometry.lineDistances;
for(var i=0, l=vertices.length; i < l; i +=2){
start.copy(vertices[ i ]);
end.copy(vertices[ i + 1 ]);
lineDistances[ i ]=(i===0) ? 0:lineDistances[ i - 1 ];
lineDistances[ i + 1 ]=lineDistances[ i ] + start.distanceTo(end);
}}
return this;
};}())
});
function LineLoop(geometry, material){
Line.call(this, geometry, material);
this.type='LineLoop';
}
LineLoop.prototype=Object.assign(Object.create(Line.prototype), {
constructor: LineLoop,
isLineLoop: true,
});
function PointsMaterial(parameters){
Material.call(this);
this.type='PointsMaterial';
this.color=new Color(0xffffff);
this.map=null;
this.size=1;
this.sizeAttenuation=true;
this.morphTargets=false;
this.lights=false;
this.setValues(parameters);
}
PointsMaterial.prototype=Object.create(Material.prototype);
PointsMaterial.prototype.constructor=PointsMaterial;
PointsMaterial.prototype.isPointsMaterial=true;
PointsMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this, source);
this.color.copy(source.color);
this.map=source.map;
this.size=source.size;
this.sizeAttenuation=source.sizeAttenuation;
this.morphTargets=source.morphTargets;
return this;
};
function Points(geometry, material){
Object3D.call(this);
this.type='Points';
this.geometry=geometry!==undefined ? geometry:new BufferGeometry();
this.material=material!==undefined ? material:new PointsMaterial( { color: Math.random() * 0xffffff });
}
Points.prototype=Object.assign(Object.create(Object3D.prototype), {
constructor: Points,
isPoints: true,
raycast:(function (){
var inverseMatrix=new Matrix4();
var ray=new Ray();
var sphere=new Sphere();
return function raycast(raycaster, intersects){
var object=this;
var geometry=this.geometry;
var matrixWorld=this.matrixWorld;
var threshold=raycaster.params.Points.threshold;
if(geometry.boundingSphere===null) geometry.computeBoundingSphere();
sphere.copy(geometry.boundingSphere);
sphere.applyMatrix4(matrixWorld);
sphere.radius +=threshold;
if(raycaster.ray.intersectsSphere(sphere)===false) return;
inverseMatrix.getInverse(matrixWorld);
ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);
var localThreshold=threshold /(( this.scale.x + this.scale.y + this.scale.z) / 3);
var localThresholdSq=localThreshold * localThreshold;
var position=new Vector3();
var intersectPoint=new Vector3();
function testPoint(point, index){
var rayPointDistanceSq=ray.distanceSqToPoint(point);
if(rayPointDistanceSq < localThresholdSq){
ray.closestPointToPoint(point, intersectPoint);
intersectPoint.applyMatrix4(matrixWorld);
var distance=raycaster.ray.origin.distanceTo(intersectPoint);
if(distance < raycaster.near||distance > raycaster.far) return;
intersects.push({
distance: distance,
distanceToRay: Math.sqrt(rayPointDistanceSq),
point: intersectPoint.clone(),
index: index,
face: null,
object: object
});
}}
if(geometry.isBufferGeometry){
var index=geometry.index;
var attributes=geometry.attributes;
var positions=attributes.position.array;
if(index!==null){
var indices=index.array;
for(var i=0, il=indices.length; i < il; i ++){
var a=indices[ i ];
position.fromArray(positions, a * 3);
testPoint(position, a);
}}else{
for(var i=0, l=positions.length / 3; i < l; i ++){
position.fromArray(positions, i * 3);
testPoint(position, i);
}}
}else{
var vertices=geometry.vertices;
for(var i=0, l=vertices.length; i < l; i ++){
testPoint(vertices[ i ], i);
}}
};}()),
clone: function (){
return new this.constructor(this.geometry, this.material).copy(this);
}});
function Group(){
Object3D.call(this);
this.type='Group';
}
Group.prototype=Object.assign(Object.create(Object3D.prototype), {
constructor: Group,
isGroup: true
});
function VideoTexture(video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy){
Texture.call(this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy);
this.generateMipmaps=false;
}
VideoTexture.prototype=Object.assign(Object.create(Texture.prototype), {
constructor: VideoTexture,
isVideoTexture: true,
update: function (){
var video=this.image;
if(video.readyState >=video.HAVE_CURRENT_DATA){
this.needsUpdate=true;
}}
});
function CompressedTexture(mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding){
Texture.call(this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding);
this.image={ width: width, height: height };
this.mipmaps=mipmaps;
this.flipY=false;
this.generateMipmaps=false;
}
CompressedTexture.prototype=Object.create(Texture.prototype);
CompressedTexture.prototype.constructor=CompressedTexture;
CompressedTexture.prototype.isCompressedTexture=true;
function DepthTexture(width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format){
format=format!==undefined ? format:DepthFormat;
if(format!==DepthFormat&&format!==DepthStencilFormat){
throw new Error('DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat');
}
if(type===undefined&&format===DepthFormat) type=UnsignedShortType;
if(type===undefined&&format===DepthStencilFormat) type=UnsignedInt248Type;
Texture.call(this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy);
this.image={ width: width, height: height };
this.magFilter=magFilter!==undefined ? magFilter:NearestFilter;
this.minFilter=minFilter!==undefined ? minFilter:NearestFilter;
this.flipY=false;
this.generateMipmaps=false;
}
DepthTexture.prototype=Object.create(Texture.prototype);
DepthTexture.prototype.constructor=DepthTexture;
DepthTexture.prototype.isDepthTexture=true;
function WireframeGeometry(geometry){
BufferGeometry.call(this);
this.type='WireframeGeometry';
var vertices=[];
var i, j, l, o, ol;
var edge=[ 0, 0 ], edges={}, e, edge1, edge2;
var key, keys=[ 'a', 'b', 'c' ];
var vertex;
if(geometry&&geometry.isGeometry){
var faces=geometry.faces;
for(i=0, l=faces.length; i < l; i ++){
var face=faces[ i ];
for(j=0; j < 3; j ++){
edge1=face[ keys[ j ] ];
edge2=face[ keys[(j + 1) % 3 ] ];
edge[ 0 ]=Math.min(edge1, edge2);
edge[ 1 ]=Math.max(edge1, edge2);
key=edge[ 0 ] + ',' + edge[ 1 ];
if(edges[ key ]===undefined){
edges[ key ]={ index1: edge[ 0 ], index2: edge[ 1 ] };}}
}
for(key in edges){
e=edges[ key ];
vertex=geometry.vertices[ e.index1 ];
vertices.push(vertex.x, vertex.y, vertex.z);
vertex=geometry.vertices[ e.index2 ];
vertices.push(vertex.x, vertex.y, vertex.z);
}}else if(geometry&&geometry.isBufferGeometry){
var position, indices, groups;
var group, start, count;
var index1, index2;
vertex=new Vector3();
if(geometry.index!==null){
position=geometry.attributes.position;
indices=geometry.index;
groups=geometry.groups;
if(groups.length===0){
groups=[ { start: 0, count: indices.count, materialIndex: 0 } ];
}
for(o=0, ol=groups.length; o < ol; ++ o){
group=groups[ o ];
start=group.start;
count=group.count;
for(i=start, l=(start + count); i < l; i +=3){
for(j=0; j < 3; j ++){
edge1=indices.getX(i + j);
edge2=indices.getX(i +(j + 1) % 3);
edge[ 0 ]=Math.min(edge1, edge2);
edge[ 1 ]=Math.max(edge1, edge2);
key=edge[ 0 ] + ',' + edge[ 1 ];
if(edges[ key ]===undefined){
edges[ key ]={ index1: edge[ 0 ], index2: edge[ 1 ] };}}
}}
for(key in edges){
e=edges[ key ];
vertex.fromBufferAttribute(position, e.index1);
vertices.push(vertex.x, vertex.y, vertex.z);
vertex.fromBufferAttribute(position, e.index2);
vertices.push(vertex.x, vertex.y, vertex.z);
}}else{
position=geometry.attributes.position;
for(i=0, l=(position.count / 3); i < l; i ++){
for(j=0; j < 3; j ++){
index1=3 * i + j;
vertex.fromBufferAttribute(position, index1);
vertices.push(vertex.x, vertex.y, vertex.z);
index2=3 * i +(( j + 1) % 3);
vertex.fromBufferAttribute(position, index2);
vertices.push(vertex.x, vertex.y, vertex.z);
}}
}}
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
}
WireframeGeometry.prototype=Object.create(BufferGeometry.prototype);
WireframeGeometry.prototype.constructor=WireframeGeometry;
function ParametricGeometry(func, slices, stacks){
Geometry.call(this);
this.type='ParametricGeometry';
this.parameters={
func: func,
slices: slices,
stacks: stacks
};
this.fromBufferGeometry(new ParametricBufferGeometry(func, slices, stacks) );
this.mergeVertices();
}
ParametricGeometry.prototype=Object.create(Geometry.prototype);
ParametricGeometry.prototype.constructor=ParametricGeometry;
function ParametricBufferGeometry(func, slices, stacks){
BufferGeometry.call(this);
this.type='ParametricBufferGeometry';
this.parameters={
func: func,
slices: slices,
stacks: stacks
};
var indices=[];
var vertices=[];
var normals=[];
var uvs=[];
var EPS=0.00001;
var normal=new Vector3();
var p0=new Vector3(), p1=new Vector3();
var pu=new Vector3(), pv=new Vector3();
var i, j;
if(func.length < 3){
console.error('THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.');
}
var sliceCount=slices + 1;
for(i=0; i <=stacks; i ++){
var v=i / stacks;
for(j=0; j <=slices; j ++){
var u=j / slices;
func(u, v, p0);
vertices.push(p0.x, p0.y, p0.z);
if(u - EPS >=0){
func(u - EPS, v, p1);
pu.subVectors(p0, p1);
}else{
func(u + EPS, v, p1);
pu.subVectors(p1, p0);
}
if(v - EPS >=0){
func(u, v - EPS, p1);
pv.subVectors(p0, p1);
}else{
func(u, v + EPS, p1);
pv.subVectors(p1, p0);
}
normal.crossVectors(pu, pv).normalize();
normals.push(normal.x, normal.y, normal.z);
uvs.push(u, v);
}}
for(i=0; i < stacks; i ++){
for(j=0; j < slices; j ++){
var a=i * sliceCount + j;
var b=i * sliceCount + j + 1;
var c=(i + 1) * sliceCount + j + 1;
var d=(i + 1) * sliceCount + j;
indices.push(a, b, d);
indices.push(b, c, d);
}}
this.setIndex(indices);
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
this.addAttribute('normal', new Float32BufferAttribute(normals, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvs, 2) );
}
ParametricBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
ParametricBufferGeometry.prototype.constructor=ParametricBufferGeometry;
function PolyhedronGeometry(vertices, indices, radius, detail){
Geometry.call(this);
this.type='PolyhedronGeometry';
this.parameters={
vertices: vertices,
indices: indices,
radius: radius,
detail: detail
};
this.fromBufferGeometry(new PolyhedronBufferGeometry(vertices, indices, radius, detail) );
this.mergeVertices();
}
PolyhedronGeometry.prototype=Object.create(Geometry.prototype);
PolyhedronGeometry.prototype.constructor=PolyhedronGeometry;
function PolyhedronBufferGeometry(vertices, indices, radius, detail){
BufferGeometry.call(this);
this.type='PolyhedronBufferGeometry';
this.parameters={
vertices: vertices,
indices: indices,
radius: radius,
detail: detail
};
radius=radius||1;
detail=detail||0;
var vertexBuffer=[];
var uvBuffer=[];
subdivide(detail);
appplyRadius(radius);
generateUVs();
this.addAttribute('position', new Float32BufferAttribute(vertexBuffer, 3) );
this.addAttribute('normal', new Float32BufferAttribute(vertexBuffer.slice(), 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvBuffer, 2) );
if(detail===0){
this.computeVertexNormals();
}else{
this.normalizeNormals();
}
function subdivide(detail){
var a=new Vector3();
var b=new Vector3();
var c=new Vector3();
for(var i=0; i < indices.length; i +=3){
getVertexByIndex(indices[ i + 0 ], a);
getVertexByIndex(indices[ i + 1 ], b);
getVertexByIndex(indices[ i + 2 ], c);
subdivideFace(a, b, c, detail);
}}
function subdivideFace(a, b, c, detail){
var cols=Math.pow(2, detail);
var v=[];
var i, j;
for(i=0; i <=cols; i ++){
v[ i ]=[];
var aj=a.clone().lerp(c, i / cols);
var bj=b.clone().lerp(c, i / cols);
var rows=cols - i;
for(j=0; j <=rows; j ++){
if(j===0&&i===cols){
v[ i ][ j ]=aj;
}else{
v[ i ][ j ]=aj.clone().lerp(bj, j / rows);
}}
}
for(i=0; i < cols; i ++){
for(j=0; j < 2 *(cols - i) - 1; j ++){
var k=Math.floor(j / 2);
if(j % 2===0){
pushVertex(v[ i ][ k + 1 ]);
pushVertex(v[ i + 1 ][ k ]);
pushVertex(v[ i ][ k ]);
}else{
pushVertex(v[ i ][ k + 1 ]);
pushVertex(v[ i + 1 ][ k + 1 ]);
pushVertex(v[ i + 1 ][ k ]);
}}
}}
function appplyRadius(radius){
var vertex=new Vector3();
for(var i=0; i < vertexBuffer.length; i +=3){
vertex.x=vertexBuffer[ i + 0 ];
vertex.y=vertexBuffer[ i + 1 ];
vertex.z=vertexBuffer[ i + 2 ];
vertex.normalize().multiplyScalar(radius);
vertexBuffer[ i + 0 ]=vertex.x;
vertexBuffer[ i + 1 ]=vertex.y;
vertexBuffer[ i + 2 ]=vertex.z;
}}
function generateUVs(){
var vertex=new Vector3();
for(var i=0; i < vertexBuffer.length; i +=3){
vertex.x=vertexBuffer[ i + 0 ];
vertex.y=vertexBuffer[ i + 1 ];
vertex.z=vertexBuffer[ i + 2 ];
var u=azimuth(vertex) / 2 / Math.PI + 0.5;
var v=inclination(vertex) / Math.PI + 0.5;
uvBuffer.push(u, 1 - v);
}
correctUVs();
correctSeam();
}
function correctSeam(){
for(var i=0; i < uvBuffer.length; i +=6){
var x0=uvBuffer[ i + 0 ];
var x1=uvBuffer[ i + 2 ];
var x2=uvBuffer[ i + 4 ];
var max=Math.max(x0, x1, x2);
var min=Math.min(x0, x1, x2);
if(max > 0.9&&min < 0.1){
if(x0 < 0.2) uvBuffer[ i + 0 ] +=1;
if(x1 < 0.2) uvBuffer[ i + 2 ] +=1;
if(x2 < 0.2) uvBuffer[ i + 4 ] +=1;
}}
}
function pushVertex(vertex){
vertexBuffer.push(vertex.x, vertex.y, vertex.z);
}
function getVertexByIndex(index, vertex){
var stride=index * 3;
vertex.x=vertices[ stride + 0 ];
vertex.y=vertices[ stride + 1 ];
vertex.z=vertices[ stride + 2 ];
}
function correctUVs(){
var a=new Vector3();
var b=new Vector3();
var c=new Vector3();
var centroid=new Vector3();
var uvA=new Vector2();
var uvB=new Vector2();
var uvC=new Vector2();
for(var i=0, j=0; i < vertexBuffer.length; i +=9, j +=6){
a.set(vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ]);
b.set(vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ]);
c.set(vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ]);
uvA.set(uvBuffer[ j + 0 ], uvBuffer[ j + 1 ]);
uvB.set(uvBuffer[ j + 2 ], uvBuffer[ j + 3 ]);
uvC.set(uvBuffer[ j + 4 ], uvBuffer[ j + 5 ]);
centroid.copy(a).add(b).add(c).divideScalar(3);
var azi=azimuth(centroid);
correctUV(uvA, j + 0, a, azi);
correctUV(uvB, j + 2, b, azi);
correctUV(uvC, j + 4, c, azi);
}}
function correctUV(uv, stride, vector, azimuth){
if(( azimuth < 0)&&(uv.x===1) ){
uvBuffer[ stride ]=uv.x - 1;
}
if(( vector.x===0)&&(vector.z===0) ){
uvBuffer[ stride ]=azimuth / 2 / Math.PI + 0.5;
}}
function azimuth(vector){
return Math.atan2(vector.z, - vector.x);
}
function inclination(vector){
return Math.atan2(- vector.y, Math.sqrt(( vector.x * vector.x) +(vector.z * vector.z) ));
}}
PolyhedronBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
PolyhedronBufferGeometry.prototype.constructor=PolyhedronBufferGeometry;
function TetrahedronGeometry(radius, detail){
Geometry.call(this);
this.type='TetrahedronGeometry';
this.parameters={
radius: radius,
detail: detail
};
this.fromBufferGeometry(new TetrahedronBufferGeometry(radius, detail) );
this.mergeVertices();
}
TetrahedronGeometry.prototype=Object.create(Geometry.prototype);
TetrahedronGeometry.prototype.constructor=TetrahedronGeometry;
function TetrahedronBufferGeometry(radius, detail){
var vertices=[
1, 1, 1, 	- 1, - 1, 1, 	- 1, 1, - 1, 	1, - 1, - 1
];
var indices=[
2, 1, 0, 	0, 3, 2,	1, 3, 0,	2, 3, 1
];
PolyhedronBufferGeometry.call(this, vertices, indices, radius, detail);
this.type='TetrahedronBufferGeometry';
this.parameters={
radius: radius,
detail: detail
};}
TetrahedronBufferGeometry.prototype=Object.create(PolyhedronBufferGeometry.prototype);
TetrahedronBufferGeometry.prototype.constructor=TetrahedronBufferGeometry;
function OctahedronGeometry(radius, detail){
Geometry.call(this);
this.type='OctahedronGeometry';
this.parameters={
radius: radius,
detail: detail
};
this.fromBufferGeometry(new OctahedronBufferGeometry(radius, detail) );
this.mergeVertices();
}
OctahedronGeometry.prototype=Object.create(Geometry.prototype);
OctahedronGeometry.prototype.constructor=OctahedronGeometry;
function OctahedronBufferGeometry(radius, detail){
var vertices=[
1, 0, 0, 	- 1, 0, 0,	0, 1, 0,
0, - 1, 0, 	0, 0, 1,	0, 0, - 1
];
var indices=[
0, 2, 4,	0, 4, 3,	0, 3, 5,
0, 5, 2,	1, 2, 5,	1, 5, 3,
1, 3, 4,	1, 4, 2
];
PolyhedronBufferGeometry.call(this, vertices, indices, radius, detail);
this.type='OctahedronBufferGeometry';
this.parameters={
radius: radius,
detail: detail
};}
OctahedronBufferGeometry.prototype=Object.create(PolyhedronBufferGeometry.prototype);
OctahedronBufferGeometry.prototype.constructor=OctahedronBufferGeometry;
function IcosahedronGeometry(radius, detail){
Geometry.call(this);
this.type='IcosahedronGeometry';
this.parameters={
radius: radius,
detail: detail
};
this.fromBufferGeometry(new IcosahedronBufferGeometry(radius, detail) );
this.mergeVertices();
}
IcosahedronGeometry.prototype=Object.create(Geometry.prototype);
IcosahedronGeometry.prototype.constructor=IcosahedronGeometry;
function IcosahedronBufferGeometry(radius, detail){
var t=(1 + Math.sqrt(5) ) / 2;
var vertices=[
- 1, t, 0, 	1, t, 0, 	- 1, - t, 0, 	1, - t, 0,
0, - 1, t, 	0, 1, t,	0, - 1, - t, 	0, 1, - t,
t, 0, - 1, 	t, 0, 1, 	- t, 0, - 1, 	- t, 0, 1
];
var indices=[
0, 11, 5, 	0, 5, 1, 	0, 1, 7, 	0, 7, 10, 	0, 10, 11,
1, 5, 9, 	5, 11, 4,	11, 10, 2,	10, 7, 6,	7, 1, 8,
3, 9, 4, 	3, 4, 2,	3, 2, 6,	3, 6, 8,	3, 8, 9,
4, 9, 5, 	2, 4, 11,	6, 2, 10,	8, 6, 7,	9, 8, 1
];
PolyhedronBufferGeometry.call(this, vertices, indices, radius, detail);
this.type='IcosahedronBufferGeometry';
this.parameters={
radius: radius,
detail: detail
};}
IcosahedronBufferGeometry.prototype=Object.create(PolyhedronBufferGeometry.prototype);
IcosahedronBufferGeometry.prototype.constructor=IcosahedronBufferGeometry;
function DodecahedronGeometry(radius, detail){
Geometry.call(this);
this.type='DodecahedronGeometry';
this.parameters={
radius: radius,
detail: detail
};
this.fromBufferGeometry(new DodecahedronBufferGeometry(radius, detail) );
this.mergeVertices();
}
DodecahedronGeometry.prototype=Object.create(Geometry.prototype);
DodecahedronGeometry.prototype.constructor=DodecahedronGeometry;
function DodecahedronBufferGeometry(radius, detail){
var t=(1 + Math.sqrt(5) ) / 2;
var r=1 / t;
var vertices=[
- 1, - 1, - 1,	- 1, - 1, 1,
- 1, 1, - 1, - 1, 1, 1,
1, - 1, - 1, 1, - 1, 1,
1, 1, - 1, 1, 1, 1,
0, - r, - t, 0, - r, t,
0, r, - t, 0, r, t,
- r, - t, 0, - r, t, 0,
r, - t, 0, r, t, 0,
- t, 0, - r, t, 0, - r,
- t, 0, r, t, 0, r
];
var indices=[
3, 11, 7, 	3, 7, 15, 	3, 15, 13,
7, 19, 17, 	7, 17, 6, 	7, 6, 15,
17, 4, 8, 	17, 8, 10, 	17, 10, 6,
8, 0, 16, 	8, 16, 2, 	8, 2, 10,
0, 12, 1, 	0, 1, 18, 	0, 18, 16,
6, 10, 2, 	6, 2, 13, 	6, 13, 15,
2, 16, 18, 	2, 18, 3, 	2, 3, 13,
18, 1, 9, 	18, 9, 11, 	18, 11, 3,
4, 14, 12, 	4, 12, 0, 	4, 0, 8,
11, 9, 5, 	11, 5, 19, 	11, 19, 7,
19, 5, 14, 	19, 14, 4, 	19, 4, 17,
1, 12, 14, 	1, 14, 5, 	1, 5, 9
];
PolyhedronBufferGeometry.call(this, vertices, indices, radius, detail);
this.type='DodecahedronBufferGeometry';
this.parameters={
radius: radius,
detail: detail
};}
DodecahedronBufferGeometry.prototype=Object.create(PolyhedronBufferGeometry.prototype);
DodecahedronBufferGeometry.prototype.constructor=DodecahedronBufferGeometry;
function TubeGeometry(path, tubularSegments, radius, radialSegments, closed, taper){
Geometry.call(this);
this.type='TubeGeometry';
this.parameters={
path: path,
tubularSegments: tubularSegments,
radius: radius,
radialSegments: radialSegments,
closed: closed
};
if(taper!==undefined) console.warn('THREE.TubeGeometry: taper has been removed.');
var bufferGeometry=new TubeBufferGeometry(path, tubularSegments, radius, radialSegments, closed);
this.tangents=bufferGeometry.tangents;
this.normals=bufferGeometry.normals;
this.binormals=bufferGeometry.binormals;
this.fromBufferGeometry(bufferGeometry);
this.mergeVertices();
}
TubeGeometry.prototype=Object.create(Geometry.prototype);
TubeGeometry.prototype.constructor=TubeGeometry;
function TubeBufferGeometry(path, tubularSegments, radius, radialSegments, closed){
BufferGeometry.call(this);
this.type='TubeBufferGeometry';
this.parameters={
path: path,
tubularSegments: tubularSegments,
radius: radius,
radialSegments: radialSegments,
closed: closed
};
tubularSegments=tubularSegments||64;
radius=radius||1;
radialSegments=radialSegments||8;
closed=closed||false;
var frames=path.computeFrenetFrames(tubularSegments, closed);
this.tangents=frames.tangents;
this.normals=frames.normals;
this.binormals=frames.binormals;
var vertex=new Vector3();
var normal=new Vector3();
var uv=new Vector2();
var P=new Vector3();
var i, j;
var vertices=[];
var normals=[];
var uvs=[];
var indices=[];
generateBufferData();
this.setIndex(indices);
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
this.addAttribute('normal', new Float32BufferAttribute(normals, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvs, 2) );
function generateBufferData(){
for(i=0; i < tubularSegments; i ++){
generateSegment(i);
}
generateSegment(( closed===false) ? tubularSegments:0);
generateUVs();
generateIndices();
}
function generateSegment(i){
P=path.getPointAt(i / tubularSegments, P);
var N=frames.normals[ i ];
var B=frames.binormals[ i ];
for(j=0; j <=radialSegments; j ++){
var v=j / radialSegments * Math.PI * 2;
var sin=Math.sin(v);
var cos=- Math.cos(v);
normal.x=(cos * N.x + sin * B.x);
normal.y=(cos * N.y + sin * B.y);
normal.z=(cos * N.z + sin * B.z);
normal.normalize();
normals.push(normal.x, normal.y, normal.z);
vertex.x=P.x + radius * normal.x;
vertex.y=P.y + radius * normal.y;
vertex.z=P.z + radius * normal.z;
vertices.push(vertex.x, vertex.y, vertex.z);
}}
function generateIndices(){
for(j=1; j <=tubularSegments; j ++){
for(i=1; i <=radialSegments; i ++){
var a=(radialSegments + 1) *(j - 1) +(i - 1);
var b=(radialSegments + 1) * j +(i - 1);
var c=(radialSegments + 1) * j + i;
var d=(radialSegments + 1) *(j - 1) + i;
indices.push(a, b, d);
indices.push(b, c, d);
}}
}
function generateUVs(){
for(i=0; i <=tubularSegments; i ++){
for(j=0; j <=radialSegments; j ++){
uv.x=i / tubularSegments;
uv.y=j / radialSegments;
uvs.push(uv.x, uv.y);
}}
}}
TubeBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
TubeBufferGeometry.prototype.constructor=TubeBufferGeometry;
function TorusKnotGeometry(radius, tube, tubularSegments, radialSegments, p, q, heightScale){
Geometry.call(this);
this.type='TorusKnotGeometry';
this.parameters={
radius: radius,
tube: tube,
tubularSegments: tubularSegments,
radialSegments: radialSegments,
p: p,
q: q
};
if(heightScale!==undefined) console.warn('THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale(x, y, z) instead.');
this.fromBufferGeometry(new TorusKnotBufferGeometry(radius, tube, tubularSegments, radialSegments, p, q) );
this.mergeVertices();
}
TorusKnotGeometry.prototype=Object.create(Geometry.prototype);
TorusKnotGeometry.prototype.constructor=TorusKnotGeometry;
function TorusKnotBufferGeometry(radius, tube, tubularSegments, radialSegments, p, q){
BufferGeometry.call(this);
this.type='TorusKnotBufferGeometry';
this.parameters={
radius: radius,
tube: tube,
tubularSegments: tubularSegments,
radialSegments: radialSegments,
p: p,
q: q
};
radius=radius||1;
tube=tube||0.4;
tubularSegments=Math.floor(tubularSegments)||64;
radialSegments=Math.floor(radialSegments)||8;
p=p||2;
q=q||3;
var indices=[];
var vertices=[];
var normals=[];
var uvs=[];
var i, j;
var vertex=new Vector3();
var normal=new Vector3();
var P1=new Vector3();
var P2=new Vector3();
var B=new Vector3();
var T=new Vector3();
var N=new Vector3();
for(i=0; i <=tubularSegments; ++ i){
var u=i / tubularSegments * p * Math.PI * 2;
calculatePositionOnCurve(u, p, q, radius, P1);
calculatePositionOnCurve(u + 0.01, p, q, radius, P2);
T.subVectors(P2, P1);
N.addVectors(P2, P1);
B.crossVectors(T, N);
N.crossVectors(B, T);
B.normalize();
N.normalize();
for(j=0; j <=radialSegments; ++ j){
var v=j / radialSegments * Math.PI * 2;
var cx=- tube * Math.cos(v);
var cy=tube * Math.sin(v);
vertex.x=P1.x +(cx * N.x + cy * B.x);
vertex.y=P1.y +(cx * N.y + cy * B.y);
vertex.z=P1.z +(cx * N.z + cy * B.z);
vertices.push(vertex.x, vertex.y, vertex.z);
normal.subVectors(vertex, P1).normalize();
normals.push(normal.x, normal.y, normal.z);
uvs.push(i / tubularSegments);
uvs.push(j / radialSegments);
}}
for(j=1; j <=tubularSegments; j ++){
for(i=1; i <=radialSegments; i ++){
var a=(radialSegments + 1) *(j - 1) +(i - 1);
var b=(radialSegments + 1) * j +(i - 1);
var c=(radialSegments + 1) * j + i;
var d=(radialSegments + 1) *(j - 1) + i;
indices.push(a, b, d);
indices.push(b, c, d);
}}
this.setIndex(indices);
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
this.addAttribute('normal', new Float32BufferAttribute(normals, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvs, 2) );
function calculatePositionOnCurve(u, p, q, radius, position){
var cu=Math.cos(u);
var su=Math.sin(u);
var quOverP=q / p * u;
var cs=Math.cos(quOverP);
position.x=radius *(2 + cs) * 0.5 * cu;
position.y=radius *(2 + cs) * su * 0.5;
position.z=radius * Math.sin(quOverP) * 0.5;
}}
TorusKnotBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
TorusKnotBufferGeometry.prototype.constructor=TorusKnotBufferGeometry;
function TorusGeometry(radius, tube, radialSegments, tubularSegments, arc){
Geometry.call(this);
this.type='TorusGeometry';
this.parameters={
radius: radius,
tube: tube,
radialSegments: radialSegments,
tubularSegments: tubularSegments,
arc: arc
};
this.fromBufferGeometry(new TorusBufferGeometry(radius, tube, radialSegments, tubularSegments, arc) );
this.mergeVertices();
}
TorusGeometry.prototype=Object.create(Geometry.prototype);
TorusGeometry.prototype.constructor=TorusGeometry;
function TorusBufferGeometry(radius, tube, radialSegments, tubularSegments, arc){
BufferGeometry.call(this);
this.type='TorusBufferGeometry';
this.parameters={
radius: radius,
tube: tube,
radialSegments: radialSegments,
tubularSegments: tubularSegments,
arc: arc
};
radius=radius||1;
tube=tube||0.4;
radialSegments=Math.floor(radialSegments)||8;
tubularSegments=Math.floor(tubularSegments)||6;
arc=arc||Math.PI * 2;
var indices=[];
var vertices=[];
var normals=[];
var uvs=[];
var center=new Vector3();
var vertex=new Vector3();
var normal=new Vector3();
var j, i;
for(j=0; j <=radialSegments; j ++){
for(i=0; i <=tubularSegments; i ++){
var u=i / tubularSegments * arc;
var v=j / radialSegments * Math.PI * 2;
vertex.x=(radius + tube * Math.cos(v) ) * Math.cos(u);
vertex.y=(radius + tube * Math.cos(v) ) * Math.sin(u);
vertex.z=tube * Math.sin(v);
vertices.push(vertex.x, vertex.y, vertex.z);
center.x=radius * Math.cos(u);
center.y=radius * Math.sin(u);
normal.subVectors(vertex, center).normalize();
normals.push(normal.x, normal.y, normal.z);
uvs.push(i / tubularSegments);
uvs.push(j / radialSegments);
}}
for(j=1; j <=radialSegments; j ++){
for(i=1; i <=tubularSegments; i ++){
var a=(tubularSegments + 1) * j + i - 1;
var b=(tubularSegments + 1) *(j - 1) + i - 1;
var c=(tubularSegments + 1) *(j - 1) + i;
var d=(tubularSegments + 1) * j + i;
indices.push(a, b, d);
indices.push(b, c, d);
}}
this.setIndex(indices);
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
this.addAttribute('normal', new Float32BufferAttribute(normals, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvs, 2) );
}
TorusBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
TorusBufferGeometry.prototype.constructor=TorusBufferGeometry;
var Earcut={
triangulate: function(data, holeIndices, dim){
dim=dim||2;
var hasHoles=holeIndices&&holeIndices.length,
outerLen=hasHoles ? holeIndices[ 0 ] * dim:data.length,
outerNode=linkedList(data, 0, outerLen, dim, true),
triangles=[];
if(! outerNode) return triangles;
var minX, minY, maxX, maxY, x, y, invSize;
if(hasHoles) outerNode=eliminateHoles(data, holeIndices, outerNode, dim);
if(data.length > 80 * dim){
minX=maxX=data[ 0 ];
minY=maxY=data[ 1 ];
for(var i=dim; i < outerLen; i +=dim){
x=data[ i ];
y=data[ i + 1 ];
if(x < minX) minX=x;
if(y < minY) minY=y;
if(x > maxX) maxX=x;
if(y > maxY) maxY=y;
}
invSize=Math.max(maxX - minX, maxY - minY);
invSize=invSize!==0 ? 1 / invSize:0;
}
earcutLinked(outerNode, triangles, dim, minX, minY, invSize);
return triangles;
}};
function linkedList(data, start, end, dim, clockwise){
var i, last;
if(clockwise===(signedArea(data, start, end, dim) > 0) ){
for(i=start; i < end; i +=dim) last=insertNode(i, data[ i ], data[ i + 1 ], last);
}else{
for(i=end - dim; i >=start; i -=dim) last=insertNode(i, data[ i ], data[ i + 1 ], last);
}
if(last&&equals(last, last.next) ){
removeNode(last);
last=last.next;
}
return last;
}
function filterPoints(start, end){
if(! start) return start;
if(! end) end=start;
var p=start, again;
do {
again=false;
if(! p.steiner&&(equals(p, p.next)||area(p.prev, p, p.next)===0) ){
removeNode(p);
p=end=p.prev;
if(p===p.next) break;
again=true;
}else{
p=p.next;
}} while(again||p!==end);
return end;
}
function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass){
if(! ear) return;
if(! pass&&invSize) indexCurve(ear, minX, minY, invSize);
var stop=ear, prev, next;
while(ear.prev!==ear.next){
prev=ear.prev;
next=ear.next;
if(invSize ? isEarHashed(ear, minX, minY, invSize):isEar(ear) ){
triangles.push(prev.i / dim);
triangles.push(ear.i / dim);
triangles.push(next.i / dim);
removeNode(ear);
ear=next.next;
stop=next.next;
continue;
}
ear=next;
if(ear===stop){
if(! pass){
earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
}else if(pass===1){
ear=cureLocalIntersections(ear, triangles, dim);
earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
}else if(pass===2){
splitEarcut(ear, triangles, dim, minX, minY, invSize);
}
break;
}}
}
function isEar(ear){
var a=ear.prev,
b=ear,
c=ear.next;
if(area(a, b, c) >=0) return false;
var p=ear.next.next;
while(p!==ear.prev){
if(pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y)&&area(p.prev, p, p.next) >=0){
return false;
}
p=p.next;
}
return true;
}
function isEarHashed(ear, minX, minY, invSize){
var a=ear.prev,
b=ear,
c=ear.next;
if(area(a, b, c) >=0) return false;
var minTX=a.x < b.x ?(a.x < c.x ? a.x:c.x):(b.x < c.x ? b.x:c.x),
minTY=a.y < b.y ?(a.y < c.y ? a.y:c.y):(b.y < c.y ? b.y:c.y),
maxTX=a.x > b.x ?(a.x > c.x ? a.x:c.x):(b.x > c.x ? b.x:c.x),
maxTY=a.y > b.y ?(a.y > c.y ? a.y:c.y):(b.y > c.y ? b.y:c.y);
var minZ=zOrder(minTX, minTY, minX, minY, invSize),
maxZ=zOrder(maxTX, maxTY, minX, minY, invSize);
var p=ear.nextZ;
while(p&&p.z <=maxZ){
if(p!==ear.prev&&p!==ear.next &&
pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
area(p.prev, p, p.next) >=0) return false;
p=p.nextZ;
}
p=ear.prevZ;
while(p&&p.z >=minZ){
if(p!==ear.prev&&p!==ear.next &&
pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
area(p.prev, p, p.next) >=0) return false;
p=p.prevZ;
}
return true;
}
function cureLocalIntersections(start, triangles, dim){
var p=start;
do {
var a=p.prev, b=p.next.next;
if(! equals(a, b)&&intersects(a, p, p.next, b)&&locallyInside(a, b)&&locallyInside(b, a) ){
triangles.push(a.i / dim);
triangles.push(p.i / dim);
triangles.push(b.i / dim);
removeNode(p);
removeNode(p.next);
p=start=b;
}
p=p.next;
} while(p!==start);
return p;
}
function splitEarcut(start, triangles, dim, minX, minY, invSize){
var a=start;
do {
var b=a.next.next;
while(b!==a.prev){
if(a.i!==b.i&&isValidDiagonal(a, b) ){
var c=splitPolygon(a, b);
a=filterPoints(a, a.next);
c=filterPoints(c, c.next);
earcutLinked(a, triangles, dim, minX, minY, invSize);
earcutLinked(c, triangles, dim, minX, minY, invSize);
return;
}
b=b.next;
}
a=a.next;
} while(a!==start);
}
function eliminateHoles(data, holeIndices, outerNode, dim){
var queue=[], i, len, start, end, list;
for(i=0, len=holeIndices.length; i < len; i ++){
start=holeIndices[ i ] * dim;
end=i < len - 1 ? holeIndices[ i + 1 ] * dim:data.length;
list=linkedList(data, start, end, dim, false);
if(list===list.next) list.steiner=true;
queue.push(getLeftmost(list) );
}
queue.sort(compareX);
for(i=0; i < queue.length; i ++){
eliminateHole(queue[ i ], outerNode);
outerNode=filterPoints(outerNode, outerNode.next);
}
return outerNode;
}
function compareX(a, b){
return a.x - b.x;
}
function eliminateHole(hole, outerNode){
outerNode=findHoleBridge(hole, outerNode);
if(outerNode){
var b=splitPolygon(outerNode, hole);
filterPoints(b, b.next);
}}
function findHoleBridge(hole, outerNode){
var p=outerNode,
hx=hole.x,
hy=hole.y,
qx=- Infinity,
m;
do {
if(hy <=p.y&&hy >=p.next.y&&p.next.y!==p.y){
var x=p.x +(hy - p.y) *(p.next.x - p.x) /(p.next.y - p.y);
if(x <=hx&&x > qx){
qx=x;
if(x===hx){
if(hy===p.y) return p;
if(hy===p.next.y) return p.next;
}
m=p.x < p.next.x ? p:p.next;
}}
p=p.next;
} while(p!==outerNode);
if(! m) return null;
if(hx===qx) return m.prev;
var stop=m,
mx=m.x,
my=m.y,
tanMin=Infinity,
tan;
p=m.next;
while(p!==stop){
if(hx >=p.x&&p.x >=mx&&hx!==p.x &&
pointInTriangle(hy < my ? hx:qx, hy, mx, my, hy < my ? qx:hx, hy, p.x, p.y) ){
tan=Math.abs(hy - p.y) /(hx - p.x);
if(( tan < tanMin||(tan===tanMin&&p.x > m.x) )&&locallyInside(p, hole) ){
m=p;
tanMin=tan;
}}
p=p.next;
}
return m;
}
function indexCurve(start, minX, minY, invSize){
var p=start;
do {
if(p.z===null) p.z=zOrder(p.x, p.y, minX, minY, invSize);
p.prevZ=p.prev;
p.nextZ=p.next;
p=p.next;
} while(p!==start);
p.prevZ.nextZ=null;
p.prevZ=null;
sortLinked(p);
}
function sortLinked(list){
var i, p, q, e, tail, numMerges, pSize, qSize, inSize=1;
do {
p=list;
list=null;
tail=null;
numMerges=0;
while(p){
numMerges ++;
q=p;
pSize=0;
for(i=0; i < inSize; i ++){
pSize ++;
q=q.nextZ;
if(! q) break;
}
qSize=inSize;
while(pSize > 0||(qSize > 0&&q) ){
if(pSize!==0&&(qSize===0||! q||p.z <=q.z) ){
e=p;
p=p.nextZ;
pSize --;
}else{
e=q;
q=q.nextZ;
qSize --;
}
if(tail) tail.nextZ=e;
else list=e;
e.prevZ=tail;
tail=e;
}
p=q;
}
tail.nextZ=null;
inSize *=2;
} while(numMerges > 1);
return list;
}
function zOrder(x, y, minX, minY, invSize){
x=32767 *(x - minX) * invSize;
y=32767 *(y - minY) * invSize;
x=(x |(x << 8) ) & 0x00FF00FF;
x=(x |(x << 4) ) & 0x0F0F0F0F;
x=(x |(x << 2) ) & 0x33333333;
x=(x |(x << 1) ) & 0x55555555;
y=(y |(y << 8) ) & 0x00FF00FF;
y=(y |(y << 4) ) & 0x0F0F0F0F;
y=(y |(y << 2) ) & 0x33333333;
y=(y |(y << 1) ) & 0x55555555;
return x |(y << 1);
}
function getLeftmost(start){
var p=start, leftmost=start;
do {
if(p.x < leftmost.x) leftmost=p;
p=p.next;
} while(p!==start);
return leftmost;
}
function pointInTriangle(ax, ay, bx, by, cx, cy, px, py){
return(cx - px) *(ay - py) -(ax - px) *(cy - py) >=0 &&
(ax - px) *(by - py) -(bx - px) *(ay - py) >=0 &&
(bx - px) *(cy - py) -(cx - px) *(by - py) >=0;
}
function isValidDiagonal(a, b){
return a.next.i!==b.i&&a.prev.i!==b.i&&! intersectsPolygon(a, b) &&
locallyInside(a, b)&&locallyInside(b, a)&&middleInside(a, b);
}
function area(p, q, r){
return(q.y - p.y) *(r.x - q.x) -(q.x - p.x) *(r.y - q.y);
}
function equals(p1, p2){
return p1.x===p2.x&&p1.y===p2.y;
}
function intersects(p1, q1, p2, q2){
if(( equals(p1, q1)&&equals(p2, q2) ) ||
(equals(p1, q2)&&equals(p2, q1) )) return true;
return area(p1, q1, p2) > 0!==area(p1, q1, q2) > 0 &&
area(p2, q2, p1) > 0!==area(p2, q2, q1) > 0;
}
function intersectsPolygon(a, b){
var p=a;
do {
if(p.i!==a.i&&p.next.i!==a.i&&p.i!==b.i&&p.next.i!==b.i &&
intersects(p, p.next, a, b) ){
return true;
}
p=p.next;
} while(p!==a);
return false;
}
function locallyInside(a, b){
return area(a.prev, a, a.next) < 0 ?
area(a, b, a.next) >=0&&area(a, a.prev, b) >=0 :
area(a, b, a.prev) < 0||area(a, a.next, b) < 0;
}
function middleInside(a, b){
var p=a,
inside=false,
px=(a.x + b.x) / 2,
py=(a.y + b.y) / 2;
do {
if(((p.y > py)!==(p.next.y > py) )&&p.next.y!==p.y &&
(px <(p.next.x - p.x) *(py - p.y) /(p.next.y - p.y) + p.x) ){
inside = ! inside;
}
p=p.next;
} while(p!==a);
return inside;
}
function splitPolygon(a, b){
var a2=new Node(a.i, a.x, a.y),
b2=new Node(b.i, b.x, b.y),
an=a.next,
bp=b.prev;
a.next=b;
b.prev=a;
a2.next=an;
an.prev=a2;
b2.next=a2;
a2.prev=b2;
bp.next=b2;
b2.prev=bp;
return b2;
}
function insertNode(i, x, y, last){
var p=new Node(i, x, y);
if(! last){
p.prev=p;
p.next=p;
}else{
p.next=last.next;
p.prev=last;
last.next.prev=p;
last.next=p;
}
return p;
}
function removeNode(p){
p.next.prev=p.prev;
p.prev.next=p.next;
if(p.prevZ) p.prevZ.nextZ=p.nextZ;
if(p.nextZ) p.nextZ.prevZ=p.prevZ;
}
function Node(i, x, y){
this.i=i;
this.x=x;
this.y=y;
this.prev=null;
this.next=null;
this.z=null;
this.prevZ=null;
this.nextZ=null;
this.steiner=false;
}
function signedArea(data, start, end, dim){
var sum=0;
for(var i=start, j=end - dim; i < end; i +=dim){
sum +=(data[ j ] - data[ i ]) *(data[ i + 1 ] + data[ j + 1 ]);
j=i;
}
return sum;
}
var ShapeUtils={
area: function(contour){
var n=contour.length;
var a=0.0;
for(var p=n - 1, q=0; q < n; p=q ++){
a +=contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;
}
return a * 0.5;
},
isClockWise: function(pts){
return ShapeUtils.area(pts) < 0;
},
triangulateShape: function(contour, holes){
var vertices=[];
var holeIndices=[];
var faces=[];
removeDupEndPts(contour);
addContour(vertices, contour);
var holeIndex=contour.length;
holes.forEach(removeDupEndPts);
for(var i=0; i < holes.length; i ++){
holeIndices.push(holeIndex);
holeIndex +=holes[ i ].length;
addContour(vertices, holes[ i ]);
}
var triangles=Earcut.triangulate(vertices, holeIndices);
for(var i=0; i < triangles.length; i +=3){
faces.push(triangles.slice(i, i + 3) );
}
return faces;
}};
function removeDupEndPts(points){
var l=points.length;
if(l > 2&&points[ l - 1 ].equals(points[ 0 ]) ){
points.pop();
}}
function addContour(vertices, contour){
for(var i=0; i < contour.length; i ++){
vertices.push(contour[ i ].x);
vertices.push(contour[ i ].y);
}}
function ExtrudeGeometry(shapes, options){
Geometry.call(this);
this.type='ExtrudeGeometry';
this.parameters={
shapes: shapes,
options: options
};
this.fromBufferGeometry(new ExtrudeBufferGeometry(shapes, options) );
this.mergeVertices();
}
ExtrudeGeometry.prototype=Object.create(Geometry.prototype);
ExtrudeGeometry.prototype.constructor=ExtrudeGeometry;
ExtrudeGeometry.prototype.toJSON=function (){
var data=Geometry.prototype.toJSON.call(this);
var shapes=this.parameters.shapes;
var options=this.parameters.options;
return toJSON(shapes, options, data);
};
function ExtrudeBufferGeometry(shapes, options){
BufferGeometry.call(this);
this.type='ExtrudeBufferGeometry';
this.parameters={
shapes: shapes,
options: options
};
shapes=Array.isArray(shapes) ? shapes:[ shapes ];
var scope=this;
var verticesArray=[];
var uvArray=[];
for(var i=0, l=shapes.length; i < l; i ++){
var shape=shapes[ i ];
addShape(shape);
}
this.addAttribute('position', new Float32BufferAttribute(verticesArray, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvArray, 2) );
this.computeVertexNormals();
function addShape(shape){
var placeholder=[];
var curveSegments=options.curveSegments!==undefined ? options.curveSegments:12;
var steps=options.steps!==undefined ? options.steps:1;
var depth=options.depth!==undefined ? options.depth:100;
var bevelEnabled=options.bevelEnabled!==undefined ? options.bevelEnabled:true;
var bevelThickness=options.bevelThickness!==undefined ? options.bevelThickness:6;
var bevelSize=options.bevelSize!==undefined ? options.bevelSize:bevelThickness - 2;
var bevelSegments=options.bevelSegments!==undefined ? options.bevelSegments:3;
var extrudePath=options.extrudePath;
var uvgen=options.UVGenerator!==undefined ? options.UVGenerator:WorldUVGenerator;
if(options.amount!==undefined){
console.warn('THREE.ExtrudeBufferGeometry: amount has been renamed to depth.');
depth=options.amount;
}
var extrudePts, extrudeByPath=false;
var splineTube, binormal, normal, position2;
if(extrudePath){
extrudePts=extrudePath.getSpacedPoints(steps);
extrudeByPath=true;
bevelEnabled=false;
splineTube=extrudePath.computeFrenetFrames(steps, false);
binormal=new Vector3();
normal=new Vector3();
position2=new Vector3();
}
if(! bevelEnabled){
bevelSegments=0;
bevelThickness=0;
bevelSize=0;
}
var ahole, h, hl;
var shapePoints=shape.extractPoints(curveSegments);
var vertices=shapePoints.shape;
var holes=shapePoints.holes;
var reverse = ! ShapeUtils.isClockWise(vertices);
if(reverse){
vertices=vertices.reverse();
for(h=0, hl=holes.length; h < hl; h ++){
ahole=holes[ h ];
if(ShapeUtils.isClockWise(ahole) ){
holes[ h ]=ahole.reverse();
}}
}
var faces=ShapeUtils.triangulateShape(vertices, holes);
var contour=vertices;
for(h=0, hl=holes.length; h < hl; h ++){
ahole=holes[ h ];
vertices=vertices.concat(ahole);
}
function scalePt2(pt, vec, size){
if(! vec) console.error("THREE.ExtrudeGeometry: vec does not exist");
return vec.clone().multiplyScalar(size).add(pt);
}
var b, bs, t, z,
vert, vlen=vertices.length,
face, flen=faces.length;
function getBevelVec(inPt, inPrev, inNext){
var v_trans_x, v_trans_y, shrink_by;
var v_prev_x=inPt.x - inPrev.x,
v_prev_y=inPt.y - inPrev.y;
var v_next_x=inNext.x - inPt.x,
v_next_y=inNext.y - inPt.y;
var v_prev_lensq=(v_prev_x * v_prev_x + v_prev_y * v_prev_y);
var collinear0=(v_prev_x * v_next_y - v_prev_y * v_next_x);
if(Math.abs(collinear0) > Number.EPSILON){
var v_prev_len=Math.sqrt(v_prev_lensq);
var v_next_len=Math.sqrt(v_next_x * v_next_x + v_next_y * v_next_y);
var ptPrevShift_x=(inPrev.x - v_prev_y / v_prev_len);
var ptPrevShift_y=(inPrev.y + v_prev_x / v_prev_len);
var ptNextShift_x=(inNext.x - v_next_y / v_next_len);
var ptNextShift_y=(inNext.y + v_next_x / v_next_len);
var sf=(( ptNextShift_x - ptPrevShift_x) * v_next_y -
(ptNextShift_y - ptPrevShift_y) * v_next_x) /
(v_prev_x * v_next_y - v_prev_y * v_next_x);
v_trans_x=(ptPrevShift_x + v_prev_x * sf - inPt.x);
v_trans_y=(ptPrevShift_y + v_prev_y * sf - inPt.y);
var v_trans_lensq=(v_trans_x * v_trans_x + v_trans_y * v_trans_y);
if(v_trans_lensq <=2){
return new Vector2(v_trans_x, v_trans_y);
}else{
shrink_by=Math.sqrt(v_trans_lensq / 2);
}}else{
var direction_eq=false;
if(v_prev_x > Number.EPSILON){
if(v_next_x > Number.EPSILON){
direction_eq=true;
}}else{
if(v_prev_x < - Number.EPSILON){
if(v_next_x < - Number.EPSILON){
direction_eq=true;
}}else{
if(Math.sign(v_prev_y)===Math.sign(v_next_y) ){
direction_eq=true;
}}
}
if(direction_eq){
v_trans_x=- v_prev_y;
v_trans_y=v_prev_x;
shrink_by=Math.sqrt(v_prev_lensq);
}else{
v_trans_x=v_prev_x;
v_trans_y=v_prev_y;
shrink_by=Math.sqrt(v_prev_lensq / 2);
}}
return new Vector2(v_trans_x / shrink_by, v_trans_y / shrink_by);
}
var contourMovements=[];
for(var i=0, il=contour.length, j=il - 1, k=i + 1; i < il; i ++, j ++, k ++){
if(j===il) j=0;
if(k===il) k=0;
contourMovements[ i ]=getBevelVec(contour[ i ], contour[ j ], contour[ k ]);
}
var holesMovements=[],
oneHoleMovements, verticesMovements=contourMovements.concat();
for(h=0, hl=holes.length; h < hl; h ++){
ahole=holes[ h ];
oneHoleMovements=[];
for(i=0, il=ahole.length, j=il - 1, k=i + 1; i < il; i ++, j ++, k ++){
if(j===il) j=0;
if(k===il) k=0;
oneHoleMovements[ i ]=getBevelVec(ahole[ i ], ahole[ j ], ahole[ k ]);
}
holesMovements.push(oneHoleMovements);
verticesMovements=verticesMovements.concat(oneHoleMovements);
}
for(b=0; b < bevelSegments; b ++){
t=b / bevelSegments;
z=bevelThickness * Math.cos(t * Math.PI / 2);
bs=bevelSize * Math.sin(t * Math.PI / 2);
for(i=0, il=contour.length; i < il; i ++){
vert=scalePt2(contour[ i ], contourMovements[ i ], bs);
v(vert.x, vert.y, - z);
}
for(h=0, hl=holes.length; h < hl; h ++){
ahole=holes[ h ];
oneHoleMovements=holesMovements[ h ];
for(i=0, il=ahole.length; i < il; i ++){
vert=scalePt2(ahole[ i ], oneHoleMovements[ i ], bs);
v(vert.x, vert.y, - z);
}}
}
bs=bevelSize;
for(i=0; i < vlen; i ++){
vert=bevelEnabled ? scalePt2(vertices[ i ], verticesMovements[ i ], bs):vertices[ i ];
if(! extrudeByPath){
v(vert.x, vert.y, 0);
}else{
normal.copy(splineTube.normals[ 0 ]).multiplyScalar(vert.x);
binormal.copy(splineTube.binormals[ 0 ]).multiplyScalar(vert.y);
position2.copy(extrudePts[ 0 ]).add(normal).add(binormal);
v(position2.x, position2.y, position2.z);
}}
var s;
for(s=1; s <=steps; s ++){
for(i=0; i < vlen; i ++){
vert=bevelEnabled ? scalePt2(vertices[ i ], verticesMovements[ i ], bs):vertices[ i ];
if(! extrudeByPath){
v(vert.x, vert.y, depth / steps * s);
}else{
normal.copy(splineTube.normals[ s ]).multiplyScalar(vert.x);
binormal.copy(splineTube.binormals[ s ]).multiplyScalar(vert.y);
position2.copy(extrudePts[ s ]).add(normal).add(binormal);
v(position2.x, position2.y, position2.z);
}}
}
for(b=bevelSegments - 1; b >=0; b --){
t=b / bevelSegments;
z=bevelThickness * Math.cos(t * Math.PI / 2);
bs=bevelSize * Math.sin(t * Math.PI / 2);
for(i=0, il=contour.length; i < il; i ++){
vert=scalePt2(contour[ i ], contourMovements[ i ], bs);
v(vert.x, vert.y, depth + z);
}
for(h=0, hl=holes.length; h < hl; h ++){
ahole=holes[ h ];
oneHoleMovements=holesMovements[ h ];
for(i=0, il=ahole.length; i < il; i ++){
vert=scalePt2(ahole[ i ], oneHoleMovements[ i ], bs);
if(! extrudeByPath){
v(vert.x, vert.y, depth + z);
}else{
v(vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z);
}}
}}
buildLidFaces();
buildSideFaces();
function buildLidFaces(){
var start=verticesArray.length / 3;
if(bevelEnabled){
var layer=0;
var offset=vlen * layer;
for(i=0; i < flen; i ++){
face=faces[ i ];
f3(face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset);
}
layer=steps + bevelSegments * 2;
offset=vlen * layer;
for(i=0; i < flen; i ++){
face=faces[ i ];
f3(face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset);
}}else{
for(i=0; i < flen; i ++){
face=faces[ i ];
f3(face[ 2 ], face[ 1 ], face[ 0 ]);
}
for(i=0; i < flen; i ++){
face=faces[ i ];
f3(face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps);
}}
scope.addGroup(start, verticesArray.length / 3 - start, 0);
}
function buildSideFaces(){
var start=verticesArray.length / 3;
var layeroffset=0;
sidewalls(contour, layeroffset);
layeroffset +=contour.length;
for(h=0, hl=holes.length; h < hl; h ++){
ahole=holes[ h ];
sidewalls(ahole, layeroffset);
layeroffset +=ahole.length;
}
scope.addGroup(start, verticesArray.length / 3 - start, 1);
}
function sidewalls(contour, layeroffset){
var j, k;
i=contour.length;
while(-- i >=0){
j=i;
k=i - 1;
if(k < 0) k=contour.length - 1;
var s=0,
sl=steps + bevelSegments * 2;
for(s=0; s < sl; s ++){
var slen1=vlen * s;
var slen2=vlen *(s + 1);
var a=layeroffset + j + slen1,
b=layeroffset + k + slen1,
c=layeroffset + k + slen2,
d=layeroffset + j + slen2;
f4(a, b, c, d);
}}
}
function v(x, y, z){
placeholder.push(x);
placeholder.push(y);
placeholder.push(z);
}
function f3(a, b, c){
addVertex(a);
addVertex(b);
addVertex(c);
var nextIndex=verticesArray.length / 3;
var uvs=uvgen.generateTopUV(scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1);
addUV(uvs[ 0 ]);
addUV(uvs[ 1 ]);
addUV(uvs[ 2 ]);
}
function f4(a, b, c, d){
addVertex(a);
addVertex(b);
addVertex(d);
addVertex(b);
addVertex(c);
addVertex(d);
var nextIndex=verticesArray.length / 3;
var uvs=uvgen.generateSideWallUV(scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1);
addUV(uvs[ 0 ]);
addUV(uvs[ 1 ]);
addUV(uvs[ 3 ]);
addUV(uvs[ 1 ]);
addUV(uvs[ 2 ]);
addUV(uvs[ 3 ]);
}
function addVertex(index){
verticesArray.push(placeholder[ index * 3 + 0 ]);
verticesArray.push(placeholder[ index * 3 + 1 ]);
verticesArray.push(placeholder[ index * 3 + 2 ]);
}
function addUV(vector2){
uvArray.push(vector2.x);
uvArray.push(vector2.y);
}}
}
ExtrudeBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
ExtrudeBufferGeometry.prototype.constructor=ExtrudeBufferGeometry;
ExtrudeBufferGeometry.prototype.toJSON=function (){
var data=BufferGeometry.prototype.toJSON.call(this);
var shapes=this.parameters.shapes;
var options=this.parameters.options;
return toJSON(shapes, options, data);
};
var WorldUVGenerator={
generateTopUV: function(geometry, vertices, indexA, indexB, indexC){
var a_x=vertices[ indexA * 3 ];
var a_y=vertices[ indexA * 3 + 1 ];
var b_x=vertices[ indexB * 3 ];
var b_y=vertices[ indexB * 3 + 1 ];
var c_x=vertices[ indexC * 3 ];
var c_y=vertices[ indexC * 3 + 1 ];
return [
new Vector2(a_x, a_y),
new Vector2(b_x, b_y),
new Vector2(c_x, c_y)
];
},
generateSideWallUV: function(geometry, vertices, indexA, indexB, indexC, indexD){
var a_x=vertices[ indexA * 3 ];
var a_y=vertices[ indexA * 3 + 1 ];
var a_z=vertices[ indexA * 3 + 2 ];
var b_x=vertices[ indexB * 3 ];
var b_y=vertices[ indexB * 3 + 1 ];
var b_z=vertices[ indexB * 3 + 2 ];
var c_x=vertices[ indexC * 3 ];
var c_y=vertices[ indexC * 3 + 1 ];
var c_z=vertices[ indexC * 3 + 2 ];
var d_x=vertices[ indexD * 3 ];
var d_y=vertices[ indexD * 3 + 1 ];
var d_z=vertices[ indexD * 3 + 2 ];
if(Math.abs(a_y - b_y) < 0.01){
return [
new Vector2(a_x, 1 - a_z),
new Vector2(b_x, 1 - b_z),
new Vector2(c_x, 1 - c_z),
new Vector2(d_x, 1 - d_z)
];
}else{
return [
new Vector2(a_y, 1 - a_z),
new Vector2(b_y, 1 - b_z),
new Vector2(c_y, 1 - c_z),
new Vector2(d_y, 1 - d_z)
];
}}
};
function toJSON(shapes, options, data){
data.shapes=[];
if(Array.isArray(shapes) ){
for(var i=0, l=shapes.length; i < l; i ++){
var shape=shapes[ i ];
data.shapes.push(shape.uuid);
}}else{
data.shapes.push(shapes.uuid);
}
if(options.extrudePath!==undefined) data.options.extrudePath=options.extrudePath.toJSON();
return data;
}
function TextGeometry(text, parameters){
Geometry.call(this);
this.type='TextGeometry';
this.parameters={
text: text,
parameters: parameters
};
this.fromBufferGeometry(new TextBufferGeometry(text, parameters) );
this.mergeVertices();
}
TextGeometry.prototype=Object.create(Geometry.prototype);
TextGeometry.prototype.constructor=TextGeometry;
function TextBufferGeometry(text, parameters){
parameters=parameters||{};
var font=parameters.font;
if(!(font&&font.isFont) ){
console.error('THREE.TextGeometry: font parameter is not an instance of THREE.Font.');
return new Geometry();
}
var shapes=font.generateShapes(text, parameters.size, parameters.curveSegments);
parameters.depth=parameters.height!==undefined ? parameters.height:50;
if(parameters.bevelThickness===undefined) parameters.bevelThickness=10;
if(parameters.bevelSize===undefined) parameters.bevelSize=8;
if(parameters.bevelEnabled===undefined) parameters.bevelEnabled=false;
ExtrudeBufferGeometry.call(this, shapes, parameters);
this.type='TextBufferGeometry';
}
TextBufferGeometry.prototype=Object.create(ExtrudeBufferGeometry.prototype);
TextBufferGeometry.prototype.constructor=TextBufferGeometry;
function SphereGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength){
Geometry.call(this);
this.type='SphereGeometry';
this.parameters={
radius: radius,
widthSegments: widthSegments,
heightSegments: heightSegments,
phiStart: phiStart,
phiLength: phiLength,
thetaStart: thetaStart,
thetaLength: thetaLength
};
this.fromBufferGeometry(new SphereBufferGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength) );
this.mergeVertices();
}
SphereGeometry.prototype=Object.create(Geometry.prototype);
SphereGeometry.prototype.constructor=SphereGeometry;
function SphereBufferGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength){
BufferGeometry.call(this);
this.type='SphereBufferGeometry';
this.parameters={
radius: radius,
widthSegments: widthSegments,
heightSegments: heightSegments,
phiStart: phiStart,
phiLength: phiLength,
thetaStart: thetaStart,
thetaLength: thetaLength
};
radius=radius||1;
widthSegments=Math.max(3, Math.floor(widthSegments)||8);
heightSegments=Math.max(2, Math.floor(heightSegments)||6);
phiStart=phiStart!==undefined ? phiStart:0;
phiLength=phiLength!==undefined ? phiLength:Math.PI * 2;
thetaStart=thetaStart!==undefined ? thetaStart:0;
thetaLength=thetaLength!==undefined ? thetaLength:Math.PI;
var thetaEnd=thetaStart + thetaLength;
var ix, iy;
var index=0;
var grid=[];
var vertex=new Vector3();
var normal=new Vector3();
var indices=[];
var vertices=[];
var normals=[];
var uvs=[];
for(iy=0; iy <=heightSegments; iy ++){
var verticesRow=[];
var v=iy / heightSegments;
for(ix=0; ix <=widthSegments; ix ++){
var u=ix / widthSegments;
vertex.x=- radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);
vertex.y=radius * Math.cos(thetaStart + v * thetaLength);
vertex.z=radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);
vertices.push(vertex.x, vertex.y, vertex.z);
normal.set(vertex.x, vertex.y, vertex.z).normalize();
normals.push(normal.x, normal.y, normal.z);
uvs.push(u, 1 - v);
verticesRow.push(index ++);
}
grid.push(verticesRow);
}
for(iy=0; iy < heightSegments; iy ++){
for(ix=0; ix < widthSegments; ix ++){
var a=grid[ iy ][ ix + 1 ];
var b=grid[ iy ][ ix ];
var c=grid[ iy + 1 ][ ix ];
var d=grid[ iy + 1 ][ ix + 1 ];
if(iy!==0||thetaStart > 0) indices.push(a, b, d);
if(iy!==heightSegments - 1||thetaEnd < Math.PI) indices.push(b, c, d);
}}
this.setIndex(indices);
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
this.addAttribute('normal', new Float32BufferAttribute(normals, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvs, 2) );
}
SphereBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
SphereBufferGeometry.prototype.constructor=SphereBufferGeometry;
function RingGeometry(innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength){
Geometry.call(this);
this.type='RingGeometry';
this.parameters={
innerRadius: innerRadius,
outerRadius: outerRadius,
thetaSegments: thetaSegments,
phiSegments: phiSegments,
thetaStart: thetaStart,
thetaLength: thetaLength
};
this.fromBufferGeometry(new RingBufferGeometry(innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength) );
this.mergeVertices();
}
RingGeometry.prototype=Object.create(Geometry.prototype);
RingGeometry.prototype.constructor=RingGeometry;
function RingBufferGeometry(innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength){
BufferGeometry.call(this);
this.type='RingBufferGeometry';
this.parameters={
innerRadius: innerRadius,
outerRadius: outerRadius,
thetaSegments: thetaSegments,
phiSegments: phiSegments,
thetaStart: thetaStart,
thetaLength: thetaLength
};
innerRadius=innerRadius||0.5;
outerRadius=outerRadius||1;
thetaStart=thetaStart!==undefined ? thetaStart:0;
thetaLength=thetaLength!==undefined ? thetaLength:Math.PI * 2;
thetaSegments=thetaSegments!==undefined ? Math.max(3, thetaSegments):8;
phiSegments=phiSegments!==undefined ? Math.max(1, phiSegments):1;
var indices=[];
var vertices=[];
var normals=[];
var uvs=[];
var segment;
var radius=innerRadius;
var radiusStep=(( outerRadius - innerRadius) / phiSegments);
var vertex=new Vector3();
var uv=new Vector2();
var j, i;
for(j=0; j <=phiSegments; j ++){
for(i=0; i <=thetaSegments; i ++){
segment=thetaStart + i / thetaSegments * thetaLength;
vertex.x=radius * Math.cos(segment);
vertex.y=radius * Math.sin(segment);
vertices.push(vertex.x, vertex.y, vertex.z);
normals.push(0, 0, 1);
uv.x=(vertex.x / outerRadius + 1) / 2;
uv.y=(vertex.y / outerRadius + 1) / 2;
uvs.push(uv.x, uv.y);
}
radius +=radiusStep;
}
for(j=0; j < phiSegments; j ++){
var thetaSegmentLevel=j *(thetaSegments + 1);
for(i=0; i < thetaSegments; i ++){
segment=i + thetaSegmentLevel;
var a=segment;
var b=segment + thetaSegments + 1;
var c=segment + thetaSegments + 2;
var d=segment + 1;
indices.push(a, b, d);
indices.push(b, c, d);
}}
this.setIndex(indices);
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
this.addAttribute('normal', new Float32BufferAttribute(normals, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvs, 2) );
}
RingBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
RingBufferGeometry.prototype.constructor=RingBufferGeometry;
function LatheGeometry(points, segments, phiStart, phiLength){
Geometry.call(this);
this.type='LatheGeometry';
this.parameters={
points: points,
segments: segments,
phiStart: phiStart,
phiLength: phiLength
};
this.fromBufferGeometry(new LatheBufferGeometry(points, segments, phiStart, phiLength) );
this.mergeVertices();
}
LatheGeometry.prototype=Object.create(Geometry.prototype);
LatheGeometry.prototype.constructor=LatheGeometry;
function LatheBufferGeometry(points, segments, phiStart, phiLength){
BufferGeometry.call(this);
this.type='LatheBufferGeometry';
this.parameters={
points: points,
segments: segments,
phiStart: phiStart,
phiLength: phiLength
};
segments=Math.floor(segments)||12;
phiStart=phiStart||0;
phiLength=phiLength||Math.PI * 2;
phiLength=_Math.clamp(phiLength, 0, Math.PI * 2);
var indices=[];
var vertices=[];
var uvs=[];
var base;
var inverseSegments=1.0 / segments;
var vertex=new Vector3();
var uv=new Vector2();
var i, j;
for(i=0; i <=segments; i ++){
var phi=phiStart + i * inverseSegments * phiLength;
var sin=Math.sin(phi);
var cos=Math.cos(phi);
for(j=0; j <=(points.length - 1); j ++){
vertex.x=points[ j ].x * sin;
vertex.y=points[ j ].y;
vertex.z=points[ j ].x * cos;
vertices.push(vertex.x, vertex.y, vertex.z);
uv.x=i / segments;
uv.y=j /(points.length - 1);
uvs.push(uv.x, uv.y);
}}
for(i=0; i < segments; i ++){
for(j=0; j <(points.length - 1); j ++){
base=j + i * points.length;
var a=base;
var b=base + points.length;
var c=base + points.length + 1;
var d=base + 1;
indices.push(a, b, d);
indices.push(b, c, d);
}}
this.setIndex(indices);
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvs, 2) );
this.computeVertexNormals();
if(phiLength===Math.PI * 2){
var normals=this.attributes.normal.array;
var n1=new Vector3();
var n2=new Vector3();
var n=new Vector3();
base=segments * points.length * 3;
for(i=0, j=0; i < points.length; i ++, j +=3){
n1.x=normals[ j + 0 ];
n1.y=normals[ j + 1 ];
n1.z=normals[ j + 2 ];
n2.x=normals[ base + j + 0 ];
n2.y=normals[ base + j + 1 ];
n2.z=normals[ base + j + 2 ];
n.addVectors(n1, n2).normalize();
normals[ j + 0 ]=normals[ base + j + 0 ]=n.x;
normals[ j + 1 ]=normals[ base + j + 1 ]=n.y;
normals[ j + 2 ]=normals[ base + j + 2 ]=n.z;
}}
}
LatheBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
LatheBufferGeometry.prototype.constructor=LatheBufferGeometry;
function ShapeGeometry(shapes, curveSegments){
Geometry.call(this);
this.type='ShapeGeometry';
if(typeof curveSegments==='object'){
console.warn('THREE.ShapeGeometry: Options parameter has been removed.');
curveSegments=curveSegments.curveSegments;
}
this.parameters={
shapes: shapes,
curveSegments: curveSegments
};
this.fromBufferGeometry(new ShapeBufferGeometry(shapes, curveSegments) );
this.mergeVertices();
}
ShapeGeometry.prototype=Object.create(Geometry.prototype);
ShapeGeometry.prototype.constructor=ShapeGeometry;
ShapeGeometry.prototype.toJSON=function (){
var data=Geometry.prototype.toJSON.call(this);
var shapes=this.parameters.shapes;
return toJSON$1(shapes, data);
};
function ShapeBufferGeometry(shapes, curveSegments){
BufferGeometry.call(this);
this.type='ShapeBufferGeometry';
this.parameters={
shapes: shapes,
curveSegments: curveSegments
};
curveSegments=curveSegments||12;
var indices=[];
var vertices=[];
var normals=[];
var uvs=[];
var groupStart=0;
var groupCount=0;
if(Array.isArray(shapes)===false){
addShape(shapes);
}else{
for(var i=0; i < shapes.length; i ++){
addShape(shapes[ i ]);
this.addGroup(groupStart, groupCount, i);
groupStart +=groupCount;
groupCount=0;
}}
this.setIndex(indices);
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
this.addAttribute('normal', new Float32BufferAttribute(normals, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvs, 2) );
function addShape(shape){
var i, l, shapeHole;
var indexOffset=vertices.length / 3;
var points=shape.extractPoints(curveSegments);
var shapeVertices=points.shape;
var shapeHoles=points.holes;
if(ShapeUtils.isClockWise(shapeVertices)===false){
shapeVertices=shapeVertices.reverse();
for(i=0, l=shapeHoles.length; i < l; i ++){
shapeHole=shapeHoles[ i ];
if(ShapeUtils.isClockWise(shapeHole)===true){
shapeHoles[ i ]=shapeHole.reverse();
}}
}
var faces=ShapeUtils.triangulateShape(shapeVertices, shapeHoles);
for(i=0, l=shapeHoles.length; i < l; i ++){
shapeHole=shapeHoles[ i ];
shapeVertices=shapeVertices.concat(shapeHole);
}
for(i=0, l=shapeVertices.length; i < l; i ++){
var vertex=shapeVertices[ i ];
vertices.push(vertex.x, vertex.y, 0);
normals.push(0, 0, 1);
uvs.push(vertex.x, vertex.y);
}
for(i=0, l=faces.length; i < l; i ++){
var face=faces[ i ];
var a=face[ 0 ] + indexOffset;
var b=face[ 1 ] + indexOffset;
var c=face[ 2 ] + indexOffset;
indices.push(a, b, c);
groupCount +=3;
}}
}
ShapeBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
ShapeBufferGeometry.prototype.constructor=ShapeBufferGeometry;
ShapeBufferGeometry.prototype.toJSON=function (){
var data=BufferGeometry.prototype.toJSON.call(this);
var shapes=this.parameters.shapes;
return toJSON$1(shapes, data);
};
function toJSON$1(shapes, data){
data.shapes=[];
if(Array.isArray(shapes) ){
for(var i=0, l=shapes.length; i < l; i ++){
var shape=shapes[ i ];
data.shapes.push(shape.uuid);
}}else{
data.shapes.push(shapes.uuid);
}
return data;
}
function EdgesGeometry(geometry, thresholdAngle){
BufferGeometry.call(this);
this.type='EdgesGeometry';
this.parameters={
thresholdAngle: thresholdAngle
};
thresholdAngle=(thresholdAngle!==undefined) ? thresholdAngle:1;
var vertices=[];
var thresholdDot=Math.cos(_Math.DEG2RAD * thresholdAngle);
var edge=[ 0, 0 ], edges={}, edge1, edge2;
var key, keys=[ 'a', 'b', 'c' ];
var geometry2;
if(geometry.isBufferGeometry){
geometry2=new Geometry();
geometry2.fromBufferGeometry(geometry);
}else{
geometry2=geometry.clone();
}
geometry2.mergeVertices();
geometry2.computeFaceNormals();
var sourceVertices=geometry2.vertices;
var faces=geometry2.faces;
for(var i=0, l=faces.length; i < l; i ++){
var face=faces[ i ];
for(var j=0; j < 3; j ++){
edge1=face[ keys[ j ] ];
edge2=face[ keys[(j + 1) % 3 ] ];
edge[ 0 ]=Math.min(edge1, edge2);
edge[ 1 ]=Math.max(edge1, edge2);
key=edge[ 0 ] + ',' + edge[ 1 ];
if(edges[ key ]===undefined){
edges[ key ]={ index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };}else{
edges[ key ].face2=i;
}}
}
for(key in edges){
var e=edges[ key ];
if(e.face2===undefined||faces[ e.face1 ].normal.dot(faces[ e.face2 ].normal) <=thresholdDot){
var vertex=sourceVertices[ e.index1 ];
vertices.push(vertex.x, vertex.y, vertex.z);
vertex=sourceVertices[ e.index2 ];
vertices.push(vertex.x, vertex.y, vertex.z);
}}
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
}
EdgesGeometry.prototype=Object.create(BufferGeometry.prototype);
EdgesGeometry.prototype.constructor=EdgesGeometry;
function CylinderGeometry(radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength){
Geometry.call(this);
this.type='CylinderGeometry';
this.parameters={
radiusTop: radiusTop,
radiusBottom: radiusBottom,
height: height,
radialSegments: radialSegments,
heightSegments: heightSegments,
openEnded: openEnded,
thetaStart: thetaStart,
thetaLength: thetaLength
};
this.fromBufferGeometry(new CylinderBufferGeometry(radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength) );
this.mergeVertices();
}
CylinderGeometry.prototype=Object.create(Geometry.prototype);
CylinderGeometry.prototype.constructor=CylinderGeometry;
function CylinderBufferGeometry(radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength){
BufferGeometry.call(this);
this.type='CylinderBufferGeometry';
this.parameters={
radiusTop: radiusTop,
radiusBottom: radiusBottom,
height: height,
radialSegments: radialSegments,
heightSegments: heightSegments,
openEnded: openEnded,
thetaStart: thetaStart,
thetaLength: thetaLength
};
var scope=this;
radiusTop=radiusTop!==undefined ? radiusTop:1;
radiusBottom=radiusBottom!==undefined ? radiusBottom:1;
height=height||1;
radialSegments=Math.floor(radialSegments)||8;
heightSegments=Math.floor(heightSegments)||1;
openEnded=openEnded!==undefined ? openEnded:false;
thetaStart=thetaStart!==undefined ? thetaStart:0.0;
thetaLength=thetaLength!==undefined ? thetaLength:Math.PI * 2;
var indices=[];
var vertices=[];
var normals=[];
var uvs=[];
var index=0;
var indexArray=[];
var halfHeight=height / 2;
var groupStart=0;
generateTorso();
if(openEnded===false){
if(radiusTop > 0) generateCap(true);
if(radiusBottom > 0) generateCap(false);
}
this.setIndex(indices);
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
this.addAttribute('normal', new Float32BufferAttribute(normals, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvs, 2) );
function generateTorso(){
var x, y;
var normal=new Vector3();
var vertex=new Vector3();
var groupCount=0;
var slope=(radiusBottom - radiusTop) / height;
for(y=0; y <=heightSegments; y ++){
var indexRow=[];
var v=y / heightSegments;
var radius=v *(radiusBottom - radiusTop) + radiusTop;
for(x=0; x <=radialSegments; x ++){
var u=x / radialSegments;
var theta=u * thetaLength + thetaStart;
var sinTheta=Math.sin(theta);
var cosTheta=Math.cos(theta);
vertex.x=radius * sinTheta;
vertex.y=- v * height + halfHeight;
vertex.z=radius * cosTheta;
vertices.push(vertex.x, vertex.y, vertex.z);
normal.set(sinTheta, slope, cosTheta).normalize();
normals.push(normal.x, normal.y, normal.z);
uvs.push(u, 1 - v);
indexRow.push(index ++);
}
indexArray.push(indexRow);
}
for(x=0; x < radialSegments; x ++){
for(y=0; y < heightSegments; y ++){
var a=indexArray[ y ][ x ];
var b=indexArray[ y + 1 ][ x ];
var c=indexArray[ y + 1 ][ x + 1 ];
var d=indexArray[ y ][ x + 1 ];
indices.push(a, b, d);
indices.push(b, c, d);
groupCount +=6;
}}
scope.addGroup(groupStart, groupCount, 0);
groupStart +=groupCount;
}
function generateCap(top){
var x, centerIndexStart, centerIndexEnd;
var uv=new Vector2();
var vertex=new Vector3();
var groupCount=0;
var radius=(top===true) ? radiusTop:radiusBottom;
var sign=(top===true) ? 1:- 1;
centerIndexStart=index;
for(x=1; x <=radialSegments; x ++){
vertices.push(0, halfHeight * sign, 0);
normals.push(0, sign, 0);
uvs.push(0.5, 0.5);
index ++;
}
centerIndexEnd=index;
for(x=0; x <=radialSegments; x ++){
var u=x / radialSegments;
var theta=u * thetaLength + thetaStart;
var cosTheta=Math.cos(theta);
var sinTheta=Math.sin(theta);
vertex.x=radius * sinTheta;
vertex.y=halfHeight * sign;
vertex.z=radius * cosTheta;
vertices.push(vertex.x, vertex.y, vertex.z);
normals.push(0, sign, 0);
uv.x=(cosTheta * 0.5) + 0.5;
uv.y=(sinTheta * 0.5 * sign) + 0.5;
uvs.push(uv.x, uv.y);
index ++;
}
for(x=0; x < radialSegments; x ++){
var c=centerIndexStart + x;
var i=centerIndexEnd + x;
if(top===true){
indices.push(i, i + 1, c);
}else{
indices.push(i + 1, i, c);
}
groupCount +=3;
}
scope.addGroup(groupStart, groupCount, top===true ? 1:2);
groupStart +=groupCount;
}}
CylinderBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
CylinderBufferGeometry.prototype.constructor=CylinderBufferGeometry;
function ConeGeometry(radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength){
CylinderGeometry.call(this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength);
this.type='ConeGeometry';
this.parameters={
radius: radius,
height: height,
radialSegments: radialSegments,
heightSegments: heightSegments,
openEnded: openEnded,
thetaStart: thetaStart,
thetaLength: thetaLength
};}
ConeGeometry.prototype=Object.create(CylinderGeometry.prototype);
ConeGeometry.prototype.constructor=ConeGeometry;
function ConeBufferGeometry(radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength){
CylinderBufferGeometry.call(this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength);
this.type='ConeBufferGeometry';
this.parameters={
radius: radius,
height: height,
radialSegments: radialSegments,
heightSegments: heightSegments,
openEnded: openEnded,
thetaStart: thetaStart,
thetaLength: thetaLength
};}
ConeBufferGeometry.prototype=Object.create(CylinderBufferGeometry.prototype);
ConeBufferGeometry.prototype.constructor=ConeBufferGeometry;
function CircleGeometry(radius, segments, thetaStart, thetaLength){
Geometry.call(this);
this.type='CircleGeometry';
this.parameters={
radius: radius,
segments: segments,
thetaStart: thetaStart,
thetaLength: thetaLength
};
this.fromBufferGeometry(new CircleBufferGeometry(radius, segments, thetaStart, thetaLength) );
this.mergeVertices();
}
CircleGeometry.prototype=Object.create(Geometry.prototype);
CircleGeometry.prototype.constructor=CircleGeometry;
function CircleBufferGeometry(radius, segments, thetaStart, thetaLength){
BufferGeometry.call(this);
this.type='CircleBufferGeometry';
this.parameters={
radius: radius,
segments: segments,
thetaStart: thetaStart,
thetaLength: thetaLength
};
radius=radius||1;
segments=segments!==undefined ? Math.max(3, segments):8;
thetaStart=thetaStart!==undefined ? thetaStart:0;
thetaLength=thetaLength!==undefined ? thetaLength:Math.PI * 2;
var indices=[];
var vertices=[];
var normals=[];
var uvs=[];
var i, s;
var vertex=new Vector3();
var uv=new Vector2();
vertices.push(0, 0, 0);
normals.push(0, 0, 1);
uvs.push(0.5, 0.5);
for(s=0, i=3; s <=segments; s ++, i +=3){
var segment=thetaStart + s / segments * thetaLength;
vertex.x=radius * Math.cos(segment);
vertex.y=radius * Math.sin(segment);
vertices.push(vertex.x, vertex.y, vertex.z);
normals.push(0, 0, 1);
uv.x=(vertices[ i ] / radius + 1) / 2;
uv.y=(vertices[ i + 1 ] / radius + 1) / 2;
uvs.push(uv.x, uv.y);
}
for(i=1; i <=segments; i ++){
indices.push(i, i + 1, 0);
}
this.setIndex(indices);
this.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
this.addAttribute('normal', new Float32BufferAttribute(normals, 3) );
this.addAttribute('uv', new Float32BufferAttribute(uvs, 2) );
}
CircleBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
CircleBufferGeometry.prototype.constructor=CircleBufferGeometry;
var Geometries=Object.freeze({
WireframeGeometry: WireframeGeometry,
ParametricGeometry: ParametricGeometry,
ParametricBufferGeometry: ParametricBufferGeometry,
TetrahedronGeometry: TetrahedronGeometry,
TetrahedronBufferGeometry: TetrahedronBufferGeometry,
OctahedronGeometry: OctahedronGeometry,
OctahedronBufferGeometry: OctahedronBufferGeometry,
IcosahedronGeometry: IcosahedronGeometry,
IcosahedronBufferGeometry: IcosahedronBufferGeometry,
DodecahedronGeometry: DodecahedronGeometry,
DodecahedronBufferGeometry: DodecahedronBufferGeometry,
PolyhedronGeometry: PolyhedronGeometry,
PolyhedronBufferGeometry: PolyhedronBufferGeometry,
TubeGeometry: TubeGeometry,
TubeBufferGeometry: TubeBufferGeometry,
TorusKnotGeometry: TorusKnotGeometry,
TorusKnotBufferGeometry: TorusKnotBufferGeometry,
TorusGeometry: TorusGeometry,
TorusBufferGeometry: TorusBufferGeometry,
TextGeometry: TextGeometry,
TextBufferGeometry: TextBufferGeometry,
SphereGeometry: SphereGeometry,
SphereBufferGeometry: SphereBufferGeometry,
RingGeometry: RingGeometry,
RingBufferGeometry: RingBufferGeometry,
PlaneGeometry: PlaneGeometry,
PlaneBufferGeometry: PlaneBufferGeometry,
LatheGeometry: LatheGeometry,
LatheBufferGeometry: LatheBufferGeometry,
ShapeGeometry: ShapeGeometry,
ShapeBufferGeometry: ShapeBufferGeometry,
ExtrudeGeometry: ExtrudeGeometry,
ExtrudeBufferGeometry: ExtrudeBufferGeometry,
EdgesGeometry: EdgesGeometry,
ConeGeometry: ConeGeometry,
ConeBufferGeometry: ConeBufferGeometry,
CylinderGeometry: CylinderGeometry,
CylinderBufferGeometry: CylinderBufferGeometry,
CircleGeometry: CircleGeometry,
CircleBufferGeometry: CircleBufferGeometry,
BoxGeometry: BoxGeometry,
BoxBufferGeometry: BoxBufferGeometry
});
function ShadowMaterial(parameters){
Material.call(this);
this.type='ShadowMaterial';
this.color=new Color(0x000000);
this.transparent=true;
this.setValues(parameters);
}
ShadowMaterial.prototype=Object.create(Material.prototype);
ShadowMaterial.prototype.constructor=ShadowMaterial;
ShadowMaterial.prototype.isShadowMaterial=true;
ShadowMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this, source);
this.color.copy(source.color);
return this;
};
function RawShaderMaterial(parameters){
ShaderMaterial.call(this, parameters);
this.type='RawShaderMaterial';
}
RawShaderMaterial.prototype=Object.create(ShaderMaterial.prototype);
RawShaderMaterial.prototype.constructor=RawShaderMaterial;
RawShaderMaterial.prototype.isRawShaderMaterial=true;
function MeshStandardMaterial(parameters){
Material.call(this);
this.defines={ 'STANDARD': '' };
this.type='MeshStandardMaterial';
this.color=new Color(0xffffff);
this.roughness=0.5;
this.metalness=0.5;
this.map=null;
this.lightMap=null;
this.lightMapIntensity=1.0;
this.aoMap=null;
this.aoMapIntensity=1.0;
this.emissive=new Color(0x000000);
this.emissiveIntensity=1.0;
this.emissiveMap=null;
this.bumpMap=null;
this.bumpScale=1;
this.normalMap=null;
this.normalScale=new Vector2(1, 1);
this.displacementMap=null;
this.displacementScale=1;
this.displacementBias=0;
this.roughnessMap=null;
this.metalnessMap=null;
this.alphaMap=null;
this.envMap=null;
this.envMapIntensity=1.0;
this.refractionRatio=0.98;
this.wireframe=false;
this.wireframeLinewidth=1;
this.wireframeLinecap='round';
this.wireframeLinejoin='round';
this.skinning=false;
this.morphTargets=false;
this.morphNormals=false;
this.setValues(parameters);
}
MeshStandardMaterial.prototype=Object.create(Material.prototype);
MeshStandardMaterial.prototype.constructor=MeshStandardMaterial;
MeshStandardMaterial.prototype.isMeshStandardMaterial=true;
MeshStandardMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this, source);
this.defines={ 'STANDARD': '' };
this.color.copy(source.color);
this.roughness=source.roughness;
this.metalness=source.metalness;
this.map=source.map;
this.lightMap=source.lightMap;
this.lightMapIntensity=source.lightMapIntensity;
this.aoMap=source.aoMap;
this.aoMapIntensity=source.aoMapIntensity;
this.emissive.copy(source.emissive);
this.emissiveMap=source.emissiveMap;
this.emissiveIntensity=source.emissiveIntensity;
this.bumpMap=source.bumpMap;
this.bumpScale=source.bumpScale;
this.normalMap=source.normalMap;
this.normalScale.copy(source.normalScale);
this.displacementMap=source.displacementMap;
this.displacementScale=source.displacementScale;
this.displacementBias=source.displacementBias;
this.roughnessMap=source.roughnessMap;
this.metalnessMap=source.metalnessMap;
this.alphaMap=source.alphaMap;
this.envMap=source.envMap;
this.envMapIntensity=source.envMapIntensity;
this.refractionRatio=source.refractionRatio;
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
this.wireframeLinecap=source.wireframeLinecap;
this.wireframeLinejoin=source.wireframeLinejoin;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
this.morphNormals=source.morphNormals;
return this;
};
function MeshPhysicalMaterial(parameters){
MeshStandardMaterial.call(this);
this.defines={ 'PHYSICAL': '' };
this.type='MeshPhysicalMaterial';
this.reflectivity=0.5;
this.clearCoat=0.0;
this.clearCoatRoughness=0.0;
this.setValues(parameters);
}
MeshPhysicalMaterial.prototype=Object.create(MeshStandardMaterial.prototype);
MeshPhysicalMaterial.prototype.constructor=MeshPhysicalMaterial;
MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial=true;
MeshPhysicalMaterial.prototype.copy=function(source){
MeshStandardMaterial.prototype.copy.call(this, source);
this.defines={ 'PHYSICAL': '' };
this.reflectivity=source.reflectivity;
this.clearCoat=source.clearCoat;
this.clearCoatRoughness=source.clearCoatRoughness;
return this;
};
function MeshPhongMaterial(parameters){
Material.call(this);
this.type='MeshPhongMaterial';
this.color=new Color(0xffffff);
this.specular=new Color(0x111111);
this.shininess=30;
this.map=null;
this.lightMap=null;
this.lightMapIntensity=1.0;
this.aoMap=null;
this.aoMapIntensity=1.0;
this.emissive=new Color(0x000000);
this.emissiveIntensity=1.0;
this.emissiveMap=null;
this.bumpMap=null;
this.bumpScale=1;
this.normalMap=null;
this.normalScale=new Vector2(1, 1);
this.displacementMap=null;
this.displacementScale=1;
this.displacementBias=0;
this.specularMap=null;
this.alphaMap=null;
this.envMap=null;
this.combine=MultiplyOperation;
this.reflectivity=1;
this.refractionRatio=0.98;
this.wireframe=false;
this.wireframeLinewidth=1;
this.wireframeLinecap='round';
this.wireframeLinejoin='round';
this.skinning=false;
this.morphTargets=false;
this.morphNormals=false;
this.setValues(parameters);
}
MeshPhongMaterial.prototype=Object.create(Material.prototype);
MeshPhongMaterial.prototype.constructor=MeshPhongMaterial;
MeshPhongMaterial.prototype.isMeshPhongMaterial=true;
MeshPhongMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this, source);
this.color.copy(source.color);
this.specular.copy(source.specular);
this.shininess=source.shininess;
this.map=source.map;
this.lightMap=source.lightMap;
this.lightMapIntensity=source.lightMapIntensity;
this.aoMap=source.aoMap;
this.aoMapIntensity=source.aoMapIntensity;
this.emissive.copy(source.emissive);
this.emissiveMap=source.emissiveMap;
this.emissiveIntensity=source.emissiveIntensity;
this.bumpMap=source.bumpMap;
this.bumpScale=source.bumpScale;
this.normalMap=source.normalMap;
this.normalScale.copy(source.normalScale);
this.displacementMap=source.displacementMap;
this.displacementScale=source.displacementScale;
this.displacementBias=source.displacementBias;
this.specularMap=source.specularMap;
this.alphaMap=source.alphaMap;
this.envMap=source.envMap;
this.combine=source.combine;
this.reflectivity=source.reflectivity;
this.refractionRatio=source.refractionRatio;
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
this.wireframeLinecap=source.wireframeLinecap;
this.wireframeLinejoin=source.wireframeLinejoin;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
this.morphNormals=source.morphNormals;
return this;
};
function MeshToonMaterial(parameters){
MeshPhongMaterial.call(this);
this.defines={ 'TOON': '' };
this.type='MeshToonMaterial';
this.gradientMap=null;
this.setValues(parameters);
}
MeshToonMaterial.prototype=Object.create(MeshPhongMaterial.prototype);
MeshToonMaterial.prototype.constructor=MeshToonMaterial;
MeshToonMaterial.prototype.isMeshToonMaterial=true;
MeshToonMaterial.prototype.copy=function(source){
MeshPhongMaterial.prototype.copy.call(this, source);
this.gradientMap=source.gradientMap;
return this;
};
function MeshNormalMaterial(parameters){
Material.call(this);
this.type='MeshNormalMaterial';
this.bumpMap=null;
this.bumpScale=1;
this.normalMap=null;
this.normalScale=new Vector2(1, 1);
this.displacementMap=null;
this.displacementScale=1;
this.displacementBias=0;
this.wireframe=false;
this.wireframeLinewidth=1;
this.fog=false;
this.lights=false;
this.skinning=false;
this.morphTargets=false;
this.morphNormals=false;
this.setValues(parameters);
}
MeshNormalMaterial.prototype=Object.create(Material.prototype);
MeshNormalMaterial.prototype.constructor=MeshNormalMaterial;
MeshNormalMaterial.prototype.isMeshNormalMaterial=true;
MeshNormalMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this, source);
this.bumpMap=source.bumpMap;
this.bumpScale=source.bumpScale;
this.normalMap=source.normalMap;
this.normalScale.copy(source.normalScale);
this.displacementMap=source.displacementMap;
this.displacementScale=source.displacementScale;
this.displacementBias=source.displacementBias;
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
this.morphNormals=source.morphNormals;
return this;
};
function MeshLambertMaterial(parameters){
Material.call(this);
this.type='MeshLambertMaterial';
this.color=new Color(0xffffff);
this.map=null;
this.lightMap=null;
this.lightMapIntensity=1.0;
this.aoMap=null;
this.aoMapIntensity=1.0;
this.emissive=new Color(0x000000);
this.emissiveIntensity=1.0;
this.emissiveMap=null;
this.specularMap=null;
this.alphaMap=null;
this.envMap=null;
this.combine=MultiplyOperation;
this.reflectivity=1;
this.refractionRatio=0.98;
this.wireframe=false;
this.wireframeLinewidth=1;
this.wireframeLinecap='round';
this.wireframeLinejoin='round';
this.skinning=false;
this.morphTargets=false;
this.morphNormals=false;
this.setValues(parameters);
}
MeshLambertMaterial.prototype=Object.create(Material.prototype);
MeshLambertMaterial.prototype.constructor=MeshLambertMaterial;
MeshLambertMaterial.prototype.isMeshLambertMaterial=true;
MeshLambertMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this, source);
this.color.copy(source.color);
this.map=source.map;
this.lightMap=source.lightMap;
this.lightMapIntensity=source.lightMapIntensity;
this.aoMap=source.aoMap;
this.aoMapIntensity=source.aoMapIntensity;
this.emissive.copy(source.emissive);
this.emissiveMap=source.emissiveMap;
this.emissiveIntensity=source.emissiveIntensity;
this.specularMap=source.specularMap;
this.alphaMap=source.alphaMap;
this.envMap=source.envMap;
this.combine=source.combine;
this.reflectivity=source.reflectivity;
this.refractionRatio=source.refractionRatio;
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
this.wireframeLinecap=source.wireframeLinecap;
this.wireframeLinejoin=source.wireframeLinejoin;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
this.morphNormals=source.morphNormals;
return this;
};
function LineDashedMaterial(parameters){
LineBasicMaterial.call(this);
this.type='LineDashedMaterial';
this.scale=1;
this.dashSize=3;
this.gapSize=1;
this.setValues(parameters);
}
LineDashedMaterial.prototype=Object.create(LineBasicMaterial.prototype);
LineDashedMaterial.prototype.constructor=LineDashedMaterial;
LineDashedMaterial.prototype.isLineDashedMaterial=true;
LineDashedMaterial.prototype.copy=function(source){
LineBasicMaterial.prototype.copy.call(this, source);
this.scale=source.scale;
this.dashSize=source.dashSize;
this.gapSize=source.gapSize;
return this;
};
var Materials=Object.freeze({
ShadowMaterial: ShadowMaterial,
SpriteMaterial: SpriteMaterial,
RawShaderMaterial: RawShaderMaterial,
ShaderMaterial: ShaderMaterial,
PointsMaterial: PointsMaterial,
MeshPhysicalMaterial: MeshPhysicalMaterial,
MeshStandardMaterial: MeshStandardMaterial,
MeshPhongMaterial: MeshPhongMaterial,
MeshToonMaterial: MeshToonMaterial,
MeshNormalMaterial: MeshNormalMaterial,
MeshLambertMaterial: MeshLambertMaterial,
MeshDepthMaterial: MeshDepthMaterial,
MeshDistanceMaterial: MeshDistanceMaterial,
MeshBasicMaterial: MeshBasicMaterial,
LineDashedMaterial: LineDashedMaterial,
LineBasicMaterial: LineBasicMaterial,
Material: Material
});
var Cache={
enabled: false,
files: {},
add: function(key, file){
if(this.enabled===false) return;
this.files[ key ]=file;
},
get: function(key){
if(this.enabled===false) return;
return this.files[ key ];
},
remove: function(key){
delete this.files[ key ];
},
clear: function (){
this.files={};}};
function LoadingManager(onLoad, onProgress, onError){
var scope=this;
var isLoading=false;
var itemsLoaded=0;
var itemsTotal=0;
var urlModifier=undefined;
this.onStart=undefined;
this.onLoad=onLoad;
this.onProgress=onProgress;
this.onError=onError;
this.itemStart=function(url){
itemsTotal ++;
if(isLoading===false){
if(scope.onStart!==undefined){
scope.onStart(url, itemsLoaded, itemsTotal);
}}
isLoading=true;
};
this.itemEnd=function(url){
itemsLoaded ++;
if(scope.onProgress!==undefined){
scope.onProgress(url, itemsLoaded, itemsTotal);
}
if(itemsLoaded===itemsTotal){
isLoading=false;
if(scope.onLoad!==undefined){
scope.onLoad();
}}
};
this.itemError=function(url){
if(scope.onError!==undefined){
scope.onError(url);
}};
this.resolveURL=function(url){
if(urlModifier){
return urlModifier(url);
}
return url;
};
this.setURLModifier=function(transform){
urlModifier=transform;
return this;
};}
var DefaultLoadingManager=new LoadingManager();
var loading={};
function FileLoader(manager){
this.manager=(manager!==undefined) ? manager:DefaultLoadingManager;
}
Object.assign(FileLoader.prototype, {
load: function(url, onLoad, onProgress, onError){
if(url===undefined) url='';
if(this.path!==undefined) url=this.path + url;
url=this.manager.resolveURL(url);
var scope=this;
var cached=Cache.get(url);
if(cached!==undefined){
scope.manager.itemStart(url);
setTimeout(function (){
if(onLoad) onLoad(cached);
scope.manager.itemEnd(url);
}, 0);
return cached;
}
if(loading[ url ]!==undefined){
loading[ url ].push({
onLoad: onLoad,
onProgress: onProgress,
onError: onError
});
return;
}
var dataUriRegex=/^data:(.*?)(;base64)?,(.*)$/;
var dataUriRegexResult=url.match(dataUriRegex);
if(dataUriRegexResult){
var mimeType=dataUriRegexResult[ 1 ];
var isBase64 = !! dataUriRegexResult[ 2 ];
var data=dataUriRegexResult[ 3 ];
data=window.decodeURIComponent(data);
if(isBase64) data=window.atob(data);
try {
var response;
var responseType=(this.responseType||'').toLowerCase();
switch(responseType){
case 'arraybuffer':
case 'blob':
var view=new Uint8Array(data.length);
for(var i=0; i < data.length; i ++){
view[ i ]=data.charCodeAt(i);
}
if(responseType==='blob'){
response=new Blob([ view.buffer ], { type: mimeType });
}else{
response=view.buffer;
}
break;
case 'document':
var parser=new DOMParser();
response=parser.parseFromString(data, mimeType);
break;
case 'json':
response=JSON.parse(data);
break;
default: // 'text' or other
response=data;
break;
}
window.setTimeout(function (){
if(onLoad) onLoad(response);
scope.manager.itemEnd(url);
}, 0);
} catch(error){
window.setTimeout(function (){
if(onError) onError(error);
scope.manager.itemEnd(url);
scope.manager.itemError(url);
}, 0);
}}else{
loading[ url ]=[];
loading[ url ].push({
onLoad: onLoad,
onProgress: onProgress,
onError: onError
});
var request=new XMLHttpRequest();
request.open('GET', url, true);
request.addEventListener('load', function(event){
var response=this.response;
Cache.add(url, response);
var callbacks=loading[ url ];
delete loading[ url ];
if(this.status===200||this.status===0){
if(this.status===0) console.warn('THREE.FileLoader: HTTP Status 0 received.');
for(var i=0, il=callbacks.length; i < il; i ++){
var callback=callbacks[ i ];
if(callback.onLoad) callback.onLoad(response);
}
scope.manager.itemEnd(url);
}else{
for(var i=0, il=callbacks.length; i < il; i ++){
var callback=callbacks[ i ];
if(callback.onError) callback.onError(event);
}
scope.manager.itemEnd(url);
scope.manager.itemError(url);
}}, false);
request.addEventListener('progress', function(event){
var callbacks=loading[ url ];
for(var i=0, il=callbacks.length; i < il; i ++){
var callback=callbacks[ i ];
if(callback.onProgress) callback.onProgress(event);
}}, false);
request.addEventListener('error', function(event){
var callbacks=loading[ url ];
delete loading[ url ];
for(var i=0, il=callbacks.length; i < il; i ++){
var callback=callbacks[ i ];
if(callback.onError) callback.onError(event);
}
scope.manager.itemEnd(url);
scope.manager.itemError(url);
}, false);
if(this.responseType!==undefined) request.responseType=this.responseType;
if(this.withCredentials!==undefined) request.withCredentials=this.withCredentials;
if(request.overrideMimeType) request.overrideMimeType(this.mimeType!==undefined ? this.mimeType:'text/plain');
for(var header in this.requestHeader){
request.setRequestHeader(header, this.requestHeader[ header ]);
}
request.send(null);
}
scope.manager.itemStart(url);
return request;
},
setPath: function(value){
this.path=value;
return this;
},
setResponseType: function(value){
this.responseType=value;
return this;
},
setWithCredentials: function(value){
this.withCredentials=value;
return this;
},
setMimeType: function(value){
this.mimeType=value;
return this;
},
setRequestHeader: function(value){
this.requestHeader=value;
return this;
}});
function CompressedTextureLoader(manager){
this.manager=(manager!==undefined) ? manager:DefaultLoadingManager;
this._parser=null;
}
Object.assign(CompressedTextureLoader.prototype, {
load: function(url, onLoad, onProgress, onError){
var scope=this;
var images=[];
var texture=new CompressedTexture();
texture.image=images;
var loader=new FileLoader(this.manager);
loader.setPath(this.path);
loader.setResponseType('arraybuffer');
function loadTexture(i){
loader.load(url[ i ], function(buffer){
var texDatas=scope._parser(buffer, true);
images[ i ]={
width: texDatas.width,
height: texDatas.height,
format: texDatas.format,
mipmaps: texDatas.mipmaps
};
loaded +=1;
if(loaded===6){
if(texDatas.mipmapCount===1)
texture.minFilter=LinearFilter;
texture.format=texDatas.format;
texture.needsUpdate=true;
if(onLoad) onLoad(texture);
}}, onProgress, onError);
}
if(Array.isArray(url) ){
var loaded=0;
for(var i=0, il=url.length; i < il; ++ i){
loadTexture(i);
}}else{
loader.load(url, function(buffer){
var texDatas=scope._parser(buffer, true);
if(texDatas.isCubemap){
var faces=texDatas.mipmaps.length / texDatas.mipmapCount;
for(var f=0; f < faces; f ++){
images[ f ]={ mipmaps: [] };
for(var i=0; i < texDatas.mipmapCount; i ++){
images[ f ].mipmaps.push(texDatas.mipmaps[ f * texDatas.mipmapCount + i ]);
images[ f ].format=texDatas.format;
images[ f ].width=texDatas.width;
images[ f ].height=texDatas.height;
}}
}else{
texture.image.width=texDatas.width;
texture.image.height=texDatas.height;
texture.mipmaps=texDatas.mipmaps;
}
if(texDatas.mipmapCount===1){
texture.minFilter=LinearFilter;
}
texture.format=texDatas.format;
texture.needsUpdate=true;
if(onLoad) onLoad(texture);
}, onProgress, onError);
}
return texture;
},
setPath: function(value){
this.path=value;
return this;
}});
function DataTextureLoader(manager){
this.manager=(manager!==undefined) ? manager:DefaultLoadingManager;
this._parser=null;
}
Object.assign(DataTextureLoader.prototype, {
load: function(url, onLoad, onProgress, onError){
var scope=this;
var texture=new DataTexture();
var loader=new FileLoader(this.manager);
loader.setResponseType('arraybuffer');
loader.load(url, function(buffer){
var texData=scope._parser(buffer);
if(! texData) return;
if(undefined!==texData.image){
texture.image=texData.image;
}else if(undefined!==texData.data){
texture.image.width=texData.width;
texture.image.height=texData.height;
texture.image.data=texData.data;
}
texture.wrapS=undefined!==texData.wrapS ? texData.wrapS:ClampToEdgeWrapping;
texture.wrapT=undefined!==texData.wrapT ? texData.wrapT:ClampToEdgeWrapping;
texture.magFilter=undefined!==texData.magFilter ? texData.magFilter:LinearFilter;
texture.minFilter=undefined!==texData.minFilter ? texData.minFilter:LinearMipMapLinearFilter;
texture.anisotropy=undefined!==texData.anisotropy ? texData.anisotropy:1;
if(undefined!==texData.format){
texture.format=texData.format;
}
if(undefined!==texData.type){
texture.type=texData.type;
}
if(undefined!==texData.mipmaps){
texture.mipmaps=texData.mipmaps;
}
if(1===texData.mipmapCount){
texture.minFilter=LinearFilter;
}
texture.needsUpdate=true;
if(onLoad) onLoad(texture, texData);
}, onProgress, onError);
return texture;
}});
function ImageLoader(manager){
this.manager=(manager!==undefined) ? manager:DefaultLoadingManager;
}
Object.assign(ImageLoader.prototype, {
crossOrigin: 'Anonymous',
load: function(url, onLoad, onProgress, onError){
if(url===undefined) url='';
if(this.path!==undefined) url=this.path + url;
url=this.manager.resolveURL(url);
var scope=this;
var cached=Cache.get(url);
if(cached!==undefined){
scope.manager.itemStart(url);
setTimeout(function (){
if(onLoad) onLoad(cached);
scope.manager.itemEnd(url);
}, 0);
return cached;
}
var image=document.createElementNS('http://www.w3.org/1999/xhtml', 'img');
function onImageLoad(){
image.removeEventListener('load', onImageLoad, false);
image.removeEventListener('error', onImageError, false);
Cache.add(url, this);
if(onLoad) onLoad(this);
scope.manager.itemEnd(url);
}
function onImageError(event){
image.removeEventListener('load', onImageLoad, false);
image.removeEventListener('error', onImageError, false);
if(onError) onError(event);
scope.manager.itemEnd(url);
scope.manager.itemError(url);
}
image.addEventListener('load', onImageLoad, false);
image.addEventListener('error', onImageError, false);
if(url.substr(0, 5)!=='data:'){
if(this.crossOrigin!==undefined) image.crossOrigin=this.crossOrigin;
}
scope.manager.itemStart(url);
image.src=url;
return image;
},
setCrossOrigin: function(value){
this.crossOrigin=value;
return this;
},
setPath: function(value){
this.path=value;
return this;
}});
function CubeTextureLoader(manager){
this.manager=(manager!==undefined) ? manager:DefaultLoadingManager;
}
Object.assign(CubeTextureLoader.prototype, {
crossOrigin: 'Anonymous',
load: function(urls, onLoad, onProgress, onError){
var texture=new CubeTexture();
var loader=new ImageLoader(this.manager);
loader.setCrossOrigin(this.crossOrigin);
loader.setPath(this.path);
var loaded=0;
function loadTexture(i){
loader.load(urls[ i ], function(image){
texture.images[ i ]=image;
loaded ++;
if(loaded===6){
texture.needsUpdate=true;
if(onLoad) onLoad(texture);
}}, undefined, onError);
}
for(var i=0; i < urls.length; ++ i){
loadTexture(i);
}
return texture;
},
setCrossOrigin: function(value){
this.crossOrigin=value;
return this;
},
setPath: function(value){
this.path=value;
return this;
}});
function TextureLoader(manager){
this.manager=(manager!==undefined) ? manager:DefaultLoadingManager;
}
Object.assign(TextureLoader.prototype, {
crossOrigin: 'Anonymous',
load: function(url, onLoad, onProgress, onError){
var texture=new Texture();
var loader=new ImageLoader(this.manager);
loader.setCrossOrigin(this.crossOrigin);
loader.setPath(this.path);
loader.load(url, function(image){
texture.image=image;
var isJPEG=url.search(/\.(jpg|jpeg)$/) > 0||url.search(/^data\:image\/jpeg/)===0;
texture.format=isJPEG ? RGBFormat:RGBAFormat;
texture.needsUpdate=true;
if(onLoad!==undefined){
onLoad(texture);
}}, onProgress, onError);
return texture;
},
setCrossOrigin: function(value){
this.crossOrigin=value;
return this;
},
setPath: function(value){
this.path=value;
return this;
}});
function Curve(){
this.type='Curve';
this.arcLengthDivisions=200;
}
Object.assign(Curve.prototype, {
getPoint: function(){
console.warn('THREE.Curve: .getPoint() not implemented.');
return null;
},
getPointAt: function(u, optionalTarget){
var t=this.getUtoTmapping(u);
return this.getPoint(t, optionalTarget);
},
getPoints: function(divisions){
if(divisions===undefined) divisions=5;
var points=[];
for(var d=0; d <=divisions; d ++){
points.push(this.getPoint(d / divisions) );
}
return points;
},
getSpacedPoints: function(divisions){
if(divisions===undefined) divisions=5;
var points=[];
for(var d=0; d <=divisions; d ++){
points.push(this.getPointAt(d / divisions) );
}
return points;
},
getLength: function (){
var lengths=this.getLengths();
return lengths[ lengths.length - 1 ];
},
getLengths: function(divisions){
if(divisions===undefined) divisions=this.arcLengthDivisions;
if(this.cacheArcLengths &&
(this.cacheArcLengths.length===divisions + 1) &&
! this.needsUpdate){
return this.cacheArcLengths;
}
this.needsUpdate=false;
var cache=[];
var current, last=this.getPoint(0);
var p, sum=0;
cache.push(0);
for(p=1; p <=divisions; p ++){
current=this.getPoint(p / divisions);
sum +=current.distanceTo(last);
cache.push(sum);
last=current;
}
this.cacheArcLengths=cache;
return cache;
},
updateArcLengths: function (){
this.needsUpdate=true;
this.getLengths();
},
getUtoTmapping: function(u, distance){
var arcLengths=this.getLengths();
var i=0, il=arcLengths.length;
var targetArcLength;
if(distance){
targetArcLength=distance;
}else{
targetArcLength=u * arcLengths[ il - 1 ];
}
var low=0, high=il - 1, comparison;
while(low <=high){
i=Math.floor(low +(high - low) / 2);
comparison=arcLengths[ i ] - targetArcLength;
if(comparison < 0){
low=i + 1;
}else if(comparison > 0){
high=i - 1;
}else{
high=i;
break;
}}
i=high;
if(arcLengths[ i ]===targetArcLength){
return i /(il - 1);
}
var lengthBefore=arcLengths[ i ];
var lengthAfter=arcLengths[ i + 1 ];
var segmentLength=lengthAfter - lengthBefore;
var segmentFraction=(targetArcLength - lengthBefore) / segmentLength;
var t=(i + segmentFraction) /(il - 1);
return t;
},
getTangent: function(t){
var delta=0.0001;
var t1=t - delta;
var t2=t + delta;
if(t1 < 0) t1=0;
if(t2 > 1) t2=1;
var pt1=this.getPoint(t1);
var pt2=this.getPoint(t2);
var vec=pt2.clone().sub(pt1);
return vec.normalize();
},
getTangentAt: function(u){
var t=this.getUtoTmapping(u);
return this.getTangent(t);
},
computeFrenetFrames: function(segments, closed){
var normal=new Vector3();
var tangents=[];
var normals=[];
var binormals=[];
var vec=new Vector3();
var mat=new Matrix4();
var i, u, theta;
for(i=0; i <=segments; i ++){
u=i / segments;
tangents[ i ]=this.getTangentAt(u);
tangents[ i ].normalize();
}
normals[ 0 ]=new Vector3();
binormals[ 0 ]=new Vector3();
var min=Number.MAX_VALUE;
var tx=Math.abs(tangents[ 0 ].x);
var ty=Math.abs(tangents[ 0 ].y);
var tz=Math.abs(tangents[ 0 ].z);
if(tx <=min){
min=tx;
normal.set(1, 0, 0);
}
if(ty <=min){
min=ty;
normal.set(0, 1, 0);
}
if(tz <=min){
normal.set(0, 0, 1);
}
vec.crossVectors(tangents[ 0 ], normal).normalize();
normals[ 0 ].crossVectors(tangents[ 0 ], vec);
binormals[ 0 ].crossVectors(tangents[ 0 ], normals[ 0 ]);
for(i=1; i <=segments; i ++){
normals[ i ]=normals[ i - 1 ].clone();
binormals[ i ]=binormals[ i - 1 ].clone();
vec.crossVectors(tangents[ i - 1 ], tangents[ i ]);
if(vec.length() > Number.EPSILON){
vec.normalize();
theta=Math.acos(_Math.clamp(tangents[ i - 1 ].dot(tangents[ i ]), - 1, 1) );
normals[ i ].applyMatrix4(mat.makeRotationAxis(vec, theta) );
}
binormals[ i ].crossVectors(tangents[ i ], normals[ i ]);
}
if(closed===true){
theta=Math.acos(_Math.clamp(normals[ 0 ].dot(normals[ segments ]), - 1, 1) );
theta /=segments;
if(tangents[ 0 ].dot(vec.crossVectors(normals[ 0 ], normals[ segments ]) ) > 0){
theta=- theta;
}
for(i=1; i <=segments; i ++){
normals[ i ].applyMatrix4(mat.makeRotationAxis(tangents[ i ], theta * i) );
binormals[ i ].crossVectors(tangents[ i ], normals[ i ]);
}}
return {
tangents: tangents,
normals: normals,
binormals: binormals
};},
clone: function (){
return new this.constructor().copy(this);
},
copy: function(source){
this.arcLengthDivisions=source.arcLengthDivisions;
return this;
},
toJSON: function (){
var data={
metadata: {
version: 4.5,
type: 'Curve',
generator: 'Curve.toJSON'
}};
data.arcLengthDivisions=this.arcLengthDivisions;
data.type=this.type;
return data;
},
fromJSON: function(json){
this.arcLengthDivisions=json.arcLengthDivisions;
return this;
}});
function EllipseCurve(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation){
Curve.call(this);
this.type='EllipseCurve';
this.aX=aX||0;
this.aY=aY||0;
this.xRadius=xRadius||1;
this.yRadius=yRadius||1;
this.aStartAngle=aStartAngle||0;
this.aEndAngle=aEndAngle||2 * Math.PI;
this.aClockwise=aClockwise||false;
this.aRotation=aRotation||0;
}
EllipseCurve.prototype=Object.create(Curve.prototype);
EllipseCurve.prototype.constructor=EllipseCurve;
EllipseCurve.prototype.isEllipseCurve=true;
EllipseCurve.prototype.getPoint=function(t, optionalTarget){
var point=optionalTarget||new Vector2();
var twoPi=Math.PI * 2;
var deltaAngle=this.aEndAngle - this.aStartAngle;
var samePoints=Math.abs(deltaAngle) < Number.EPSILON;
while(deltaAngle < 0) deltaAngle +=twoPi;
while(deltaAngle > twoPi) deltaAngle -=twoPi;
if(deltaAngle < Number.EPSILON){
if(samePoints){
deltaAngle=0;
}else{
deltaAngle=twoPi;
}}
if(this.aClockwise===true&&! samePoints){
if(deltaAngle===twoPi){
deltaAngle=- twoPi;
}else{
deltaAngle=deltaAngle - twoPi;
}}
var angle=this.aStartAngle + t * deltaAngle;
var x=this.aX + this.xRadius * Math.cos(angle);
var y=this.aY + this.yRadius * Math.sin(angle);
if(this.aRotation!==0){
var cos=Math.cos(this.aRotation);
var sin=Math.sin(this.aRotation);
var tx=x - this.aX;
var ty=y - this.aY;
x=tx * cos - ty * sin + this.aX;
y=tx * sin + ty * cos + this.aY;
}
return point.set(x, y);
};
EllipseCurve.prototype.copy=function(source){
Curve.prototype.copy.call(this, source);
this.aX=source.aX;
this.aY=source.aY;
this.xRadius=source.xRadius;
this.yRadius=source.yRadius;
this.aStartAngle=source.aStartAngle;
this.aEndAngle=source.aEndAngle;
this.aClockwise=source.aClockwise;
this.aRotation=source.aRotation;
return this;
};
EllipseCurve.prototype.toJSON=function (){
var data=Curve.prototype.toJSON.call(this);
data.aX=this.aX;
data.aY=this.aY;
data.xRadius=this.xRadius;
data.yRadius=this.yRadius;
data.aStartAngle=this.aStartAngle;
data.aEndAngle=this.aEndAngle;
data.aClockwise=this.aClockwise;
data.aRotation=this.aRotation;
return data;
};
EllipseCurve.prototype.fromJSON=function(json){
Curve.prototype.fromJSON.call(this, json);
this.aX=json.aX;
this.aY=json.aY;
this.xRadius=json.xRadius;
this.yRadius=json.yRadius;
this.aStartAngle=json.aStartAngle;
this.aEndAngle=json.aEndAngle;
this.aClockwise=json.aClockwise;
this.aRotation=json.aRotation;
return this;
};
function ArcCurve(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise){
EllipseCurve.call(this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise);
this.type='ArcCurve';
}
ArcCurve.prototype=Object.create(EllipseCurve.prototype);
ArcCurve.prototype.constructor=ArcCurve;
ArcCurve.prototype.isArcCurve=true;
function CubicPoly(){
var c0=0, c1=0, c2=0, c3=0;
function init(x0, x1, t0, t1){
c0=x0;
c1=t0;
c2=- 3 * x0 + 3 * x1 - 2 * t0 - t1;
c3=2 * x0 - 2 * x1 + t0 + t1;
}
return {
initCatmullRom: function(x0, x1, x2, x3, tension){
init(x1, x2, tension *(x2 - x0), tension *(x3 - x1) );
},
initNonuniformCatmullRom: function(x0, x1, x2, x3, dt0, dt1, dt2){
var t1=(x1 - x0) / dt0 -(x2 - x0) /(dt0 + dt1) +(x2 - x1) / dt1;
var t2=(x2 - x1) / dt1 -(x3 - x1) /(dt1 + dt2) +(x3 - x2) / dt2;
t1 *=dt1;
t2 *=dt1;
init(x1, x2, t1, t2);
},
calc: function(t){
var t2=t * t;
var t3=t2 * t;
return c0 + c1 * t + c2 * t2 + c3 * t3;
}};}
var tmp=new Vector3();
var px=new CubicPoly(), py=new CubicPoly(), pz=new CubicPoly();
function CatmullRomCurve3(points, closed, curveType, tension){
Curve.call(this);
this.type='CatmullRomCurve3';
this.points=points||[];
this.closed=closed||false;
this.curveType=curveType||'centripetal';
this.tension=tension||0.5;
}
CatmullRomCurve3.prototype=Object.create(Curve.prototype);
CatmullRomCurve3.prototype.constructor=CatmullRomCurve3;
CatmullRomCurve3.prototype.isCatmullRomCurve3=true;
CatmullRomCurve3.prototype.getPoint=function(t, optionalTarget){
var point=optionalTarget||new Vector3();
var points=this.points;
var l=points.length;
var p=(l -(this.closed ? 0:1) ) * t;
var intPoint=Math.floor(p);
var weight=p - intPoint;
if(this.closed){
intPoint +=intPoint > 0 ? 0:(Math.floor(Math.abs(intPoint) / l) + 1) * l;
}else if(weight===0&&intPoint===l - 1){
intPoint=l - 2;
weight=1;
}
var p0, p1, p2, p3;
if(this.closed||intPoint > 0){
p0=points[(intPoint - 1) % l ];
}else{
tmp.subVectors(points[ 0 ], points[ 1 ]).add(points[ 0 ]);
p0=tmp;
}
p1=points[ intPoint % l ];
p2=points[(intPoint + 1) % l ];
if(this.closed||intPoint + 2 < l){
p3=points[(intPoint + 2) % l ];
}else{
tmp.subVectors(points[ l - 1 ], points[ l - 2 ]).add(points[ l - 1 ]);
p3=tmp;
}
if(this.curveType==='centripetal'||this.curveType==='chordal'){
var pow=this.curveType==='chordal' ? 0.5:0.25;
var dt0=Math.pow(p0.distanceToSquared(p1), pow);
var dt1=Math.pow(p1.distanceToSquared(p2), pow);
var dt2=Math.pow(p2.distanceToSquared(p3), pow);
if(dt1 < 1e-4) dt1=1.0;
if(dt0 < 1e-4) dt0=dt1;
if(dt2 < 1e-4) dt2=dt1;
px.initNonuniformCatmullRom(p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2);
py.initNonuniformCatmullRom(p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2);
pz.initNonuniformCatmullRom(p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2);
}else if(this.curveType==='catmullrom'){
px.initCatmullRom(p0.x, p1.x, p2.x, p3.x, this.tension);
py.initCatmullRom(p0.y, p1.y, p2.y, p3.y, this.tension);
pz.initCatmullRom(p0.z, p1.z, p2.z, p3.z, this.tension);
}
point.set(px.calc(weight),
py.calc(weight),
pz.calc(weight)
);
return point;
};
CatmullRomCurve3.prototype.copy=function(source){
Curve.prototype.copy.call(this, source);
this.points=[];
for(var i=0, l=source.points.length; i < l; i ++){
var point=source.points[ i ];
this.points.push(point.clone());
}
this.closed=source.closed;
this.curveType=source.curveType;
this.tension=source.tension;
return this;
};
CatmullRomCurve3.prototype.toJSON=function (){
var data=Curve.prototype.toJSON.call(this);
data.points=[];
for(var i=0, l=this.points.length; i < l; i ++){
var point=this.points[ i ];
data.points.push(point.toArray());
}
data.closed=this.closed;
data.curveType=this.curveType;
data.tension=this.tension;
return data;
};
CatmullRomCurve3.prototype.fromJSON=function(json){
Curve.prototype.fromJSON.call(this, json);
this.points=[];
for(var i=0, l=json.points.length; i < l; i ++){
var point=json.points[ i ];
this.points.push(new Vector3().fromArray(point) );
}
this.closed=json.closed;
this.curveType=json.curveType;
this.tension=json.tension;
return this;
};
function CatmullRom(t, p0, p1, p2, p3){
var v0=(p2 - p0) * 0.5;
var v1=(p3 - p1) * 0.5;
var t2=t * t;
var t3=t * t2;
return(2 * p1 - 2 * p2 + v0 + v1) * t3 +(- 3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;
}
function QuadraticBezierP0(t, p){
var k=1 - t;
return k * k * p;
}
function QuadraticBezierP1(t, p){
return 2 *(1 - t) * t * p;
}
function QuadraticBezierP2(t, p){
return t * t * p;
}
function QuadraticBezier(t, p0, p1, p2){
return QuadraticBezierP0(t, p0) + QuadraticBezierP1(t, p1) +
QuadraticBezierP2(t, p2);
}
function CubicBezierP0(t, p){
var k=1 - t;
return k * k * k * p;
}
function CubicBezierP1(t, p){
var k=1 - t;
return 3 * k * k * t * p;
}
function CubicBezierP2(t, p){
return 3 *(1 - t) * t * t * p;
}
function CubicBezierP3(t, p){
return t * t * t * p;
}
function CubicBezier(t, p0, p1, p2, p3){
return CubicBezierP0(t, p0) + CubicBezierP1(t, p1) + CubicBezierP2(t, p2) +
CubicBezierP3(t, p3);
}
function CubicBezierCurve(v0, v1, v2, v3){
Curve.call(this);
this.type='CubicBezierCurve';
this.v0=v0||new Vector2();
this.v1=v1||new Vector2();
this.v2=v2||new Vector2();
this.v3=v3||new Vector2();
}
CubicBezierCurve.prototype=Object.create(Curve.prototype);
CubicBezierCurve.prototype.constructor=CubicBezierCurve;
CubicBezierCurve.prototype.isCubicBezierCurve=true;
CubicBezierCurve.prototype.getPoint=function(t, optionalTarget){
var point=optionalTarget||new Vector2();
var v0=this.v0, v1=this.v1, v2=this.v2, v3=this.v3;
point.set(CubicBezier(t, v0.x, v1.x, v2.x, v3.x),
CubicBezier(t, v0.y, v1.y, v2.y, v3.y)
);
return point;
};
CubicBezierCurve.prototype.copy=function(source){
Curve.prototype.copy.call(this, source);
this.v0.copy(source.v0);
this.v1.copy(source.v1);
this.v2.copy(source.v2);
this.v3.copy(source.v3);
return this;
};
CubicBezierCurve.prototype.toJSON=function (){
var data=Curve.prototype.toJSON.call(this);
data.v0=this.v0.toArray();
data.v1=this.v1.toArray();
data.v2=this.v2.toArray();
data.v3=this.v3.toArray();
return data;
};
CubicBezierCurve.prototype.fromJSON=function(json){
Curve.prototype.fromJSON.call(this, json);
this.v0.fromArray(json.v0);
this.v1.fromArray(json.v1);
this.v2.fromArray(json.v2);
this.v3.fromArray(json.v3);
return this;
};
function CubicBezierCurve3(v0, v1, v2, v3){
Curve.call(this);
this.type='CubicBezierCurve3';
this.v0=v0||new Vector3();
this.v1=v1||new Vector3();
this.v2=v2||new Vector3();
this.v3=v3||new Vector3();
}
CubicBezierCurve3.prototype=Object.create(Curve.prototype);
CubicBezierCurve3.prototype.constructor=CubicBezierCurve3;
CubicBezierCurve3.prototype.isCubicBezierCurve3=true;
CubicBezierCurve3.prototype.getPoint=function(t, optionalTarget){
var point=optionalTarget||new Vector3();
var v0=this.v0, v1=this.v1, v2=this.v2, v3=this.v3;
point.set(CubicBezier(t, v0.x, v1.x, v2.x, v3.x),
CubicBezier(t, v0.y, v1.y, v2.y, v3.y),
CubicBezier(t, v0.z, v1.z, v2.z, v3.z)
);
return point;
};
CubicBezierCurve3.prototype.copy=function(source){
Curve.prototype.copy.call(this, source);
this.v0.copy(source.v0);
this.v1.copy(source.v1);
this.v2.copy(source.v2);
this.v3.copy(source.v3);
return this;
};
CubicBezierCurve3.prototype.toJSON=function (){
var data=Curve.prototype.toJSON.call(this);
data.v0=this.v0.toArray();
data.v1=this.v1.toArray();
data.v2=this.v2.toArray();
data.v3=this.v3.toArray();
return data;
};
CubicBezierCurve3.prototype.fromJSON=function(json){
Curve.prototype.fromJSON.call(this, json);
this.v0.fromArray(json.v0);
this.v1.fromArray(json.v1);
this.v2.fromArray(json.v2);
this.v3.fromArray(json.v3);
return this;
};
function LineCurve(v1, v2){
Curve.call(this);
this.type='LineCurve';
this.v1=v1||new Vector2();
this.v2=v2||new Vector2();
}
LineCurve.prototype=Object.create(Curve.prototype);
LineCurve.prototype.constructor=LineCurve;
LineCurve.prototype.isLineCurve=true;
LineCurve.prototype.getPoint=function(t, optionalTarget){
var point=optionalTarget||new Vector2();
if(t===1){
point.copy(this.v2);
}else{
point.copy(this.v2).sub(this.v1);
point.multiplyScalar(t).add(this.v1);
}
return point;
};
LineCurve.prototype.getPointAt=function(u, optionalTarget){
return this.getPoint(u, optionalTarget);
};
LineCurve.prototype.getTangent=function(){
var tangent=this.v2.clone().sub(this.v1);
return tangent.normalize();
};
LineCurve.prototype.copy=function(source){
Curve.prototype.copy.call(this, source);
this.v1.copy(source.v1);
this.v2.copy(source.v2);
return this;
};
LineCurve.prototype.toJSON=function (){
var data=Curve.prototype.toJSON.call(this);
data.v1=this.v1.toArray();
data.v2=this.v2.toArray();
return data;
};
LineCurve.prototype.fromJSON=function(json){
Curve.prototype.fromJSON.call(this, json);
this.v1.fromArray(json.v1);
this.v2.fromArray(json.v2);
return this;
};
function LineCurve3(v1, v2){
Curve.call(this);
this.type='LineCurve3';
this.v1=v1||new Vector3();
this.v2=v2||new Vector3();
}
LineCurve3.prototype=Object.create(Curve.prototype);
LineCurve3.prototype.constructor=LineCurve3;
LineCurve3.prototype.isLineCurve3=true;
LineCurve3.prototype.getPoint=function(t, optionalTarget){
var point=optionalTarget||new Vector3();
if(t===1){
point.copy(this.v2);
}else{
point.copy(this.v2).sub(this.v1);
point.multiplyScalar(t).add(this.v1);
}
return point;
};
LineCurve3.prototype.getPointAt=function(u, optionalTarget){
return this.getPoint(u, optionalTarget);
};
LineCurve3.prototype.copy=function(source){
Curve.prototype.copy.call(this, source);
this.v1.copy(source.v1);
this.v2.copy(source.v2);
return this;
};
LineCurve3.prototype.toJSON=function (){
var data=Curve.prototype.toJSON.call(this);
data.v1=this.v1.toArray();
data.v2=this.v2.toArray();
return data;
};
LineCurve3.prototype.fromJSON=function(json){
Curve.prototype.fromJSON.call(this, json);
this.v1.fromArray(json.v1);
this.v2.fromArray(json.v2);
return this;
};
function QuadraticBezierCurve(v0, v1, v2){
Curve.call(this);
this.type='QuadraticBezierCurve';
this.v0=v0||new Vector2();
this.v1=v1||new Vector2();
this.v2=v2||new Vector2();
}
QuadraticBezierCurve.prototype=Object.create(Curve.prototype);
QuadraticBezierCurve.prototype.constructor=QuadraticBezierCurve;
QuadraticBezierCurve.prototype.isQuadraticBezierCurve=true;
QuadraticBezierCurve.prototype.getPoint=function(t, optionalTarget){
var point=optionalTarget||new Vector2();
var v0=this.v0, v1=this.v1, v2=this.v2;
point.set(QuadraticBezier(t, v0.x, v1.x, v2.x),
QuadraticBezier(t, v0.y, v1.y, v2.y)
);
return point;
};
QuadraticBezierCurve.prototype.copy=function(source){
Curve.prototype.copy.call(this, source);
this.v0.copy(source.v0);
this.v1.copy(source.v1);
this.v2.copy(source.v2);
return this;
};
QuadraticBezierCurve.prototype.toJSON=function (){
var data=Curve.prototype.toJSON.call(this);
data.v0=this.v0.toArray();
data.v1=this.v1.toArray();
data.v2=this.v2.toArray();
return data;
};
QuadraticBezierCurve.prototype.fromJSON=function(json){
Curve.prototype.fromJSON.call(this, json);
this.v0.fromArray(json.v0);
this.v1.fromArray(json.v1);
this.v2.fromArray(json.v2);
return this;
};
function QuadraticBezierCurve3(v0, v1, v2){
Curve.call(this);
this.type='QuadraticBezierCurve3';
this.v0=v0||new Vector3();
this.v1=v1||new Vector3();
this.v2=v2||new Vector3();
}
QuadraticBezierCurve3.prototype=Object.create(Curve.prototype);
QuadraticBezierCurve3.prototype.constructor=QuadraticBezierCurve3;
QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3=true;
QuadraticBezierCurve3.prototype.getPoint=function(t, optionalTarget){
var point=optionalTarget||new Vector3();
var v0=this.v0, v1=this.v1, v2=this.v2;
point.set(QuadraticBezier(t, v0.x, v1.x, v2.x),
QuadraticBezier(t, v0.y, v1.y, v2.y),
QuadraticBezier(t, v0.z, v1.z, v2.z)
);
return point;
};
QuadraticBezierCurve3.prototype.copy=function(source){
Curve.prototype.copy.call(this, source);
this.v0.copy(source.v0);
this.v1.copy(source.v1);
this.v2.copy(source.v2);
return this;
};
QuadraticBezierCurve3.prototype.toJSON=function (){
var data=Curve.prototype.toJSON.call(this);
data.v0=this.v0.toArray();
data.v1=this.v1.toArray();
data.v2=this.v2.toArray();
return data;
};
QuadraticBezierCurve3.prototype.fromJSON=function(json){
Curve.prototype.fromJSON.call(this, json);
this.v0.fromArray(json.v0);
this.v1.fromArray(json.v1);
this.v2.fromArray(json.v2);
return this;
};
function SplineCurve(points ){
Curve.call(this);
this.type='SplineCurve';
this.points=points||[];
}
SplineCurve.prototype=Object.create(Curve.prototype);
SplineCurve.prototype.constructor=SplineCurve;
SplineCurve.prototype.isSplineCurve=true;
SplineCurve.prototype.getPoint=function(t, optionalTarget){
var point=optionalTarget||new Vector2();
var points=this.points;
var p=(points.length - 1) * t;
var intPoint=Math.floor(p);
var weight=p - intPoint;
var p0=points[ intPoint===0 ? intPoint:intPoint - 1 ];
var p1=points[ intPoint ];
var p2=points[ intPoint > points.length - 2 ? points.length - 1:intPoint + 1 ];
var p3=points[ intPoint > points.length - 3 ? points.length - 1:intPoint + 2 ];
point.set(CatmullRom(weight, p0.x, p1.x, p2.x, p3.x),
CatmullRom(weight, p0.y, p1.y, p2.y, p3.y)
);
return point;
};
SplineCurve.prototype.copy=function(source){
Curve.prototype.copy.call(this, source);
this.points=[];
for(var i=0, l=source.points.length; i < l; i ++){
var point=source.points[ i ];
this.points.push(point.clone());
}
return this;
};
SplineCurve.prototype.toJSON=function (){
var data=Curve.prototype.toJSON.call(this);
data.points=[];
for(var i=0, l=this.points.length; i < l; i ++){
var point=this.points[ i ];
data.points.push(point.toArray());
}
return data;
};
SplineCurve.prototype.fromJSON=function(json){
Curve.prototype.fromJSON.call(this, json);
this.points=[];
for(var i=0, l=json.points.length; i < l; i ++){
var point=json.points[ i ];
this.points.push(new Vector2().fromArray(point) );
}
return this;
};
var Curves=Object.freeze({
ArcCurve: ArcCurve,
CatmullRomCurve3: CatmullRomCurve3,
CubicBezierCurve: CubicBezierCurve,
CubicBezierCurve3: CubicBezierCurve3,
EllipseCurve: EllipseCurve,
LineCurve: LineCurve,
LineCurve3: LineCurve3,
QuadraticBezierCurve: QuadraticBezierCurve,
QuadraticBezierCurve3: QuadraticBezierCurve3,
SplineCurve: SplineCurve
});
function CurvePath(){
Curve.call(this);
this.type='CurvePath';
this.curves=[];
this.autoClose=false;
}
CurvePath.prototype=Object.assign(Object.create(Curve.prototype), {
constructor: CurvePath,
add: function(curve){
this.curves.push(curve);
},
closePath: function (){
var startPoint=this.curves[ 0 ].getPoint(0);
var endPoint=this.curves[ this.curves.length - 1 ].getPoint(1);
if(! startPoint.equals(endPoint) ){
this.curves.push(new LineCurve(endPoint, startPoint) );
}},
getPoint: function(t){
var d=t * this.getLength();
var curveLengths=this.getCurveLengths();
var i=0;
while(i < curveLengths.length){
if(curveLengths[ i ] >=d){
var diff=curveLengths[ i ] - d;
var curve=this.curves[ i ];
var segmentLength=curve.getLength();
var u=segmentLength===0 ? 0:1 - diff / segmentLength;
return curve.getPointAt(u);
}
i ++;
}
return null;
},
getLength: function (){
var lens=this.getCurveLengths();
return lens[ lens.length - 1 ];
},
updateArcLengths: function (){
this.needsUpdate=true;
this.cacheLengths=null;
this.getCurveLengths();
},
getCurveLengths: function (){
if(this.cacheLengths&&this.cacheLengths.length===this.curves.length){
return this.cacheLengths;
}
var lengths=[], sums=0;
for(var i=0, l=this.curves.length; i < l; i ++){
sums +=this.curves[ i ].getLength();
lengths.push(sums);
}
this.cacheLengths=lengths;
return lengths;
},
getSpacedPoints: function(divisions){
if(divisions===undefined) divisions=40;
var points=[];
for(var i=0; i <=divisions; i ++){
points.push(this.getPoint(i / divisions) );
}
if(this.autoClose){
points.push(points[ 0 ]);
}
return points;
},
getPoints: function(divisions){
divisions=divisions||12;
var points=[], last;
for(var i=0, curves=this.curves; i < curves.length; i ++){
var curve=curves[ i ];
var resolution=(curve&&curve.isEllipseCurve) ? divisions * 2
:(curve&&curve.isLineCurve) ? 1
:(curve&&curve.isSplineCurve) ? divisions * curve.points.length
: divisions;
var pts=curve.getPoints(resolution);
for(var j=0; j < pts.length; j ++){
var point=pts[ j ];
if(last&&last.equals(point) ) continue;
points.push(point);
last=point;
}}
if(this.autoClose&&points.length > 1&&! points[ points.length - 1 ].equals(points[ 0 ]) ){
points.push(points[ 0 ]);
}
return points;
},
copy: function(source){
Curve.prototype.copy.call(this, source);
this.curves=[];
for(var i=0, l=source.curves.length; i < l; i ++){
var curve=source.curves[ i ];
this.curves.push(curve.clone());
}
this.autoClose=source.autoClose;
return this;
},
toJSON: function (){
var data=Curve.prototype.toJSON.call(this);
data.autoClose=this.autoClose;
data.curves=[];
for(var i=0, l=this.curves.length; i < l; i ++){
var curve=this.curves[ i ];
data.curves.push(curve.toJSON());
}
return data;
},
fromJSON: function(json){
Curve.prototype.fromJSON.call(this, json);
this.autoClose=json.autoClose;
this.curves=[];
for(var i=0, l=json.curves.length; i < l; i ++){
var curve=json.curves[ i ];
this.curves.push(new Curves[ curve.type ]().fromJSON(curve) );
}
return this;
}});
function Path(points){
CurvePath.call(this);
this.type='Path';
this.currentPoint=new Vector2();
if(points){
this.setFromPoints(points);
}}
Path.prototype=Object.assign(Object.create(CurvePath.prototype), {
constructor: Path,
setFromPoints: function(points){
this.moveTo(points[ 0 ].x, points[ 0 ].y);
for(var i=1, l=points.length; i < l; i ++){
this.lineTo(points[ i ].x, points[ i ].y);
}},
moveTo: function(x, y){
this.currentPoint.set(x, y);
},
lineTo: function(x, y){
var curve=new LineCurve(this.currentPoint.clone(), new Vector2(x, y) );
this.curves.push(curve);
this.currentPoint.set(x, y);
},
quadraticCurveTo: function(aCPx, aCPy, aX, aY){
var curve=new QuadraticBezierCurve(
this.currentPoint.clone(),
new Vector2(aCPx, aCPy),
new Vector2(aX, aY)
);
this.curves.push(curve);
this.currentPoint.set(aX, aY);
},
bezierCurveTo: function(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY){
var curve=new CubicBezierCurve(
this.currentPoint.clone(),
new Vector2(aCP1x, aCP1y),
new Vector2(aCP2x, aCP2y),
new Vector2(aX, aY)
);
this.curves.push(curve);
this.currentPoint.set(aX, aY);
},
splineThru: function(pts ){
var npts=[ this.currentPoint.clone() ].concat(pts);
var curve=new SplineCurve(npts);
this.curves.push(curve);
this.currentPoint.copy(pts[ pts.length - 1 ]);
},
arc: function(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise){
var x0=this.currentPoint.x;
var y0=this.currentPoint.y;
this.absarc(aX + x0, aY + y0, aRadius,
aStartAngle, aEndAngle, aClockwise);
},
absarc: function(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise){
this.absellipse(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise);
},
ellipse: function(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation){
var x0=this.currentPoint.x;
var y0=this.currentPoint.y;
this.absellipse(aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation);
},
absellipse: function(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation){
var curve=new EllipseCurve(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation);
if(this.curves.length > 0){
var firstPoint=curve.getPoint(0);
if(! firstPoint.equals(this.currentPoint) ){
this.lineTo(firstPoint.x, firstPoint.y);
}}
this.curves.push(curve);
var lastPoint=curve.getPoint(1);
this.currentPoint.copy(lastPoint);
},
copy: function(source){
CurvePath.prototype.copy.call(this, source);
this.currentPoint.copy(source.currentPoint);
return this;
},
toJSON: function (){
var data=CurvePath.prototype.toJSON.call(this);
data.currentPoint=this.currentPoint.toArray();
return data;
},
fromJSON: function(json){
CurvePath.prototype.fromJSON.call(this, json);
this.currentPoint.fromArray(json.currentPoint);
return this;
}});
function Shape(points){
Path.call(this, points);
this.uuid=_Math.generateUUID();
this.type='Shape';
this.holes=[];
}
Shape.prototype=Object.assign(Object.create(Path.prototype), {
constructor: Shape,
getPointsHoles: function(divisions){
var holesPts=[];
for(var i=0, l=this.holes.length; i < l; i ++){
holesPts[ i ]=this.holes[ i ].getPoints(divisions);
}
return holesPts;
},
extractPoints: function(divisions){
return {
shape: this.getPoints(divisions),
holes: this.getPointsHoles(divisions)
};},
copy: function(source){
Path.prototype.copy.call(this, source);
this.holes=[];
for(var i=0, l=source.holes.length; i < l; i ++){
var hole=source.holes[ i ];
this.holes.push(hole.clone());
}
return this;
},
toJSON: function (){
var data=Path.prototype.toJSON.call(this);
data.uuid=this.uuid;
data.holes=[];
for(var i=0, l=this.holes.length; i < l; i ++){
var hole=this.holes[ i ];
data.holes.push(hole.toJSON());
}
return data;
},
fromJSON: function(json){
Path.prototype.fromJSON.call(this, json);
this.uuid=json.uuid;
this.holes=[];
for(var i=0, l=json.holes.length; i < l; i ++){
var hole=json.holes[ i ];
this.holes.push(new Path().fromJSON(hole) );
}
return this;
}});
function Light(color, intensity){
Object3D.call(this);
this.type='Light';
this.color=new Color(color);
this.intensity=intensity!==undefined ? intensity:1;
this.receiveShadow=undefined;
}
Light.prototype=Object.assign(Object.create(Object3D.prototype), {
constructor: Light,
isLight: true,
copy: function(source){
Object3D.prototype.copy.call(this, source);
this.color.copy(source.color);
this.intensity=source.intensity;
return this;
},
toJSON: function(meta){
var data=Object3D.prototype.toJSON.call(this, meta);
data.object.color=this.color.getHex();
data.object.intensity=this.intensity;
if(this.groundColor!==undefined) data.object.groundColor=this.groundColor.getHex();
if(this.distance!==undefined) data.object.distance=this.distance;
if(this.angle!==undefined) data.object.angle=this.angle;
if(this.decay!==undefined) data.object.decay=this.decay;
if(this.penumbra!==undefined) data.object.penumbra=this.penumbra;
if(this.shadow!==undefined) data.object.shadow=this.shadow.toJSON();
return data;
}});
function HemisphereLight(skyColor, groundColor, intensity){
Light.call(this, skyColor, intensity);
this.type='HemisphereLight';
this.castShadow=undefined;
this.position.copy(Object3D.DefaultUp);
this.updateMatrix();
this.groundColor=new Color(groundColor);
}
HemisphereLight.prototype=Object.assign(Object.create(Light.prototype), {
constructor: HemisphereLight,
isHemisphereLight: true,
copy: function(source){
Light.prototype.copy.call(this, source);
this.groundColor.copy(source.groundColor);
return this;
}});
function LightShadow(camera){
this.camera=camera;
this.bias=0;
this.radius=1;
this.mapSize=new Vector2(512, 512);
this.map=null;
this.matrix=new Matrix4();
}
Object.assign(LightShadow.prototype, {
copy: function(source){
this.camera=source.camera.clone();
this.bias=source.bias;
this.radius=source.radius;
this.mapSize.copy(source.mapSize);
return this;
},
clone: function (){
return new this.constructor().copy(this);
},
toJSON: function (){
var object={};
if(this.bias!==0) object.bias=this.bias;
if(this.radius!==1) object.radius=this.radius;
if(this.mapSize.x!==512||this.mapSize.y!==512) object.mapSize=this.mapSize.toArray();
object.camera=this.camera.toJSON(false).object;
delete object.camera.matrix;
return object;
}});
function SpotLightShadow(){
LightShadow.call(this, new PerspectiveCamera(50, 1, 0.5, 500) );
}
SpotLightShadow.prototype=Object.assign(Object.create(LightShadow.prototype), {
constructor: SpotLightShadow,
isSpotLightShadow: true,
update: function(light){
var camera=this.camera;
var fov=_Math.RAD2DEG * 2 * light.angle;
var aspect=this.mapSize.width / this.mapSize.height;
var far=light.distance||camera.far;
if(fov!==camera.fov||aspect!==camera.aspect||far!==camera.far){
camera.fov=fov;
camera.aspect=aspect;
camera.far=far;
camera.updateProjectionMatrix();
}}
});
function SpotLight(color, intensity, distance, angle, penumbra, decay){
Light.call(this, color, intensity);
this.type='SpotLight';
this.position.copy(Object3D.DefaultUp);
this.updateMatrix();
this.target=new Object3D();
Object.defineProperty(this, 'power', {
get: function (){
return this.intensity * Math.PI;
},
set: function(power){
this.intensity=power / Math.PI;
}});
this.distance=(distance!==undefined) ? distance:0;
this.angle=(angle!==undefined) ? angle:Math.PI / 3;
this.penumbra=(penumbra!==undefined) ? penumbra:0;
this.decay=(decay!==undefined) ? decay:1;
this.shadow=new SpotLightShadow();
}
SpotLight.prototype=Object.assign(Object.create(Light.prototype), {
constructor: SpotLight,
isSpotLight: true,
copy: function(source){
Light.prototype.copy.call(this, source);
this.distance=source.distance;
this.angle=source.angle;
this.penumbra=source.penumbra;
this.decay=source.decay;
this.target=source.target.clone();
this.shadow=source.shadow.clone();
return this;
}});
function PointLight(color, intensity, distance, decay){
Light.call(this, color, intensity);
this.type='PointLight';
Object.defineProperty(this, 'power', {
get: function (){
return this.intensity * 4 * Math.PI;
},
set: function(power){
this.intensity=power /(4 * Math.PI);
}});
this.distance=(distance!==undefined) ? distance:0;
this.decay=(decay!==undefined) ? decay:1;
this.shadow=new LightShadow(new PerspectiveCamera(90, 1, 0.5, 500) );
}
PointLight.prototype=Object.assign(Object.create(Light.prototype), {
constructor: PointLight,
isPointLight: true,
copy: function(source){
Light.prototype.copy.call(this, source);
this.distance=source.distance;
this.decay=source.decay;
this.shadow=source.shadow.clone();
return this;
}});
function DirectionalLightShadow(){
LightShadow.call(this, new OrthographicCamera(- 5, 5, 5, - 5, 0.5, 500) );
}
DirectionalLightShadow.prototype=Object.assign(Object.create(LightShadow.prototype), {
constructor: DirectionalLightShadow
});
function DirectionalLight(color, intensity){
Light.call(this, color, intensity);
this.type='DirectionalLight';
this.position.copy(Object3D.DefaultUp);
this.updateMatrix();
this.target=new Object3D();
this.shadow=new DirectionalLightShadow();
}
DirectionalLight.prototype=Object.assign(Object.create(Light.prototype), {
constructor: DirectionalLight,
isDirectionalLight: true,
copy: function(source){
Light.prototype.copy.call(this, source);
this.target=source.target.clone();
this.shadow=source.shadow.clone();
return this;
}});
function AmbientLight(color, intensity){
Light.call(this, color, intensity);
this.type='AmbientLight';
this.castShadow=undefined;
}
AmbientLight.prototype=Object.assign(Object.create(Light.prototype), {
constructor: AmbientLight,
isAmbientLight: true
});
function RectAreaLight(color, intensity, width, height){
Light.call(this, color, intensity);
this.type='RectAreaLight';
this.width=(width!==undefined) ? width:10;
this.height=(height!==undefined) ? height:10;
}
RectAreaLight.prototype=Object.assign(Object.create(Light.prototype), {
constructor: RectAreaLight,
isRectAreaLight: true,
copy: function(source){
Light.prototype.copy.call(this, source);
this.width=source.width;
this.height=source.height;
return this;
},
toJSON: function(meta){
var data=Light.prototype.toJSON.call(this, meta);
data.object.width=this.width;
data.object.height=this.height;
return data;
}});
function StringKeyframeTrack(name, times, values, interpolation){
KeyframeTrack.call(this, name, times, values, interpolation);
}
StringKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype), {
constructor: StringKeyframeTrack,
ValueTypeName: 'string',
ValueBufferType: Array,
DefaultInterpolation: InterpolateDiscrete,
InterpolantFactoryMethodLinear: undefined,
InterpolantFactoryMethodSmooth: undefined
});
function BooleanKeyframeTrack(name, times, values){
KeyframeTrack.call(this, name, times, values);
}
BooleanKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype), {
constructor: BooleanKeyframeTrack,
ValueTypeName: 'bool',
ValueBufferType: Array,
DefaultInterpolation: InterpolateDiscrete,
InterpolantFactoryMethodLinear: undefined,
InterpolantFactoryMethodSmooth: undefined
});
function Interpolant(parameterPositions, sampleValues, sampleSize, resultBuffer){
this.parameterPositions=parameterPositions;
this._cachedIndex=0;
this.resultBuffer=resultBuffer!==undefined ?
resultBuffer:new sampleValues.constructor(sampleSize);
this.sampleValues=sampleValues;
this.valueSize=sampleSize;
}
Object.assign(Interpolant.prototype, {
evaluate: function(t){
var pp=this.parameterPositions,
i1=this._cachedIndex,
t1=pp[ i1 ],
t0=pp[ i1 - 1 ];
validate_interval: {
seek: {
var right;
linear_scan: {
forward_scan: if(!(t < t1) ){
for(var giveUpAt=i1 + 2; ;){
if(t1===undefined){
if(t < t0) break forward_scan;
i1=pp.length;
this._cachedIndex=i1;
return this.afterEnd_(i1 - 1, t, t0);
}
if(i1===giveUpAt) break;
t0=t1;
t1=pp[ ++ i1 ];
if(t < t1){
break seek;
}}
right=pp.length;
break linear_scan;
}
if(!(t >=t0) ){
var t1global=pp[ 1 ];
if(t < t1global){
i1=2;
t0=t1global;
}
for(var giveUpAt=i1 - 2; ;){
if(t0===undefined){
this._cachedIndex=0;
return this.beforeStart_(0, t, t1);
}
if(i1===giveUpAt) break;
t1=t0;
t0=pp[ -- i1 - 1 ];
if(t >=t0){
break seek;
}}
right=i1;
i1=0;
break linear_scan;
}
break validate_interval;
}
while(i1 < right){
var mid=(i1 + right) >>> 1;
if(t < pp[ mid ]){
right=mid;
}else{
i1=mid + 1;
}}
t1=pp[ i1 ];
t0=pp[ i1 - 1 ];
if(t0===undefined){
this._cachedIndex=0;
return this.beforeStart_(0, t, t1);
}
if(t1===undefined){
i1=pp.length;
this._cachedIndex=i1;
return this.afterEnd_(i1 - 1, t0, t);
}}
this._cachedIndex=i1;
this.intervalChanged_(i1, t0, t1);
}
return this.interpolate_(i1, t0, t, t1);
},
settings: null,
DefaultSettings_: {},
getSettings_: function (){
return this.settings||this.DefaultSettings_;
},
copySampleValue_: function(index){
var result=this.resultBuffer,
values=this.sampleValues,
stride=this.valueSize,
offset=index * stride;
for(var i=0; i!==stride; ++ i){
result[ i ]=values[ offset + i ];
}
return result;
},
interpolate_: function(){
throw new Error('call to abstract method');
},
intervalChanged_: function(){
}});
Object.assign(Interpolant.prototype, {
beforeStart_: Interpolant.prototype.copySampleValue_,
afterEnd_: Interpolant.prototype.copySampleValue_,
});
function QuaternionLinearInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer){
Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer);
}
QuaternionLinearInterpolant.prototype=Object.assign(Object.create(Interpolant.prototype), {
constructor: QuaternionLinearInterpolant,
interpolate_: function(i1, t0, t, t1){
var result=this.resultBuffer,
values=this.sampleValues,
stride=this.valueSize,
offset=i1 * stride,
alpha=(t - t0) /(t1 - t0);
for(var end=offset + stride; offset!==end; offset +=4){
Quaternion.slerpFlat(result, 0, values, offset - stride, values, offset, alpha);
}
return result;
}});
function QuaternionKeyframeTrack(name, times, values, interpolation){
KeyframeTrack.call(this, name, times, values, interpolation);
}
QuaternionKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype), {
constructor: QuaternionKeyframeTrack,
ValueTypeName: 'quaternion',
DefaultInterpolation: InterpolateLinear,
InterpolantFactoryMethodLinear: function(result){
return new QuaternionLinearInterpolant(this.times, this.values, this.getValueSize(), result);
},
InterpolantFactoryMethodSmooth: undefined
});
function ColorKeyframeTrack(name, times, values, interpolation){
KeyframeTrack.call(this, name, times, values, interpolation);
}
ColorKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype), {
constructor: ColorKeyframeTrack,
ValueTypeName: 'color'
});
function NumberKeyframeTrack(name, times, values, interpolation){
KeyframeTrack.call(this, name, times, values, interpolation);
}
NumberKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype), {
constructor: NumberKeyframeTrack,
ValueTypeName: 'number'
});
function CubicInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer){
Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer);
this._weightPrev=- 0;
this._offsetPrev=- 0;
this._weightNext=- 0;
this._offsetNext=- 0;
}
CubicInterpolant.prototype=Object.assign(Object.create(Interpolant.prototype), {
constructor: CubicInterpolant,
DefaultSettings_: {
endingStart: ZeroCurvatureEnding,
endingEnd: ZeroCurvatureEnding
},
intervalChanged_: function(i1, t0, t1){
var pp=this.parameterPositions,
iPrev=i1 - 2,
iNext=i1 + 1,
tPrev=pp[ iPrev ],
tNext=pp[ iNext ];
if(tPrev===undefined){
switch(this.getSettings_().endingStart){
case ZeroSlopeEnding:
iPrev=i1;
tPrev=2 * t0 - t1;
break;
case WrapAroundEnding:
iPrev=pp.length - 2;
tPrev=t0 + pp[ iPrev ] - pp[ iPrev + 1 ];
break;
default:
iPrev=i1;
tPrev=t1;
}}
if(tNext===undefined){
switch(this.getSettings_().endingEnd){
case ZeroSlopeEnding:
iNext=i1;
tNext=2 * t1 - t0;
break;
case WrapAroundEnding:
iNext=1;
tNext=t1 + pp[ 1 ] - pp[ 0 ];
break;
default:
iNext=i1 - 1;
tNext=t0;
}}
var halfDt=(t1 - t0) * 0.5,
stride=this.valueSize;
this._weightPrev=halfDt /(t0 - tPrev);
this._weightNext=halfDt /(tNext - t1);
this._offsetPrev=iPrev * stride;
this._offsetNext=iNext * stride;
},
interpolate_: function(i1, t0, t, t1){
var result=this.resultBuffer,
values=this.sampleValues,
stride=this.valueSize,
o1=i1 * stride,		o0=o1 - stride,
oP=this._offsetPrev, 	oN=this._offsetNext,
wP=this._weightPrev,	wN=this._weightNext,
p=(t - t0) /(t1 - t0),
pp=p * p,
ppp=pp * p;
var sP=- wP * ppp + 2 * wP * pp - wP * p;
var s0=(1 + wP) * ppp +(- 1.5 - 2 * wP) * pp +(- 0.5 + wP) * p + 1;
var s1=(- 1 - wN) * ppp +(1.5 + wN) * pp + 0.5 * p;
var sN=wN * ppp - wN * pp;
for(var i=0; i!==stride; ++ i){
result[ i ] =
sP * values[ oP + i ] +
s0 * values[ o0 + i ] +
s1 * values[ o1 + i ] +
sN * values[ oN + i ];
}
return result;
}});
function LinearInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer){
Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer);
}
LinearInterpolant.prototype=Object.assign(Object.create(Interpolant.prototype), {
constructor: LinearInterpolant,
interpolate_: function(i1, t0, t, t1){
var result=this.resultBuffer,
values=this.sampleValues,
stride=this.valueSize,
offset1=i1 * stride,
offset0=offset1 - stride,
weight1=(t - t0) /(t1 - t0),
weight0=1 - weight1;
for(var i=0; i!==stride; ++ i){
result[ i ] =
values[ offset0 + i ] * weight0 +
values[ offset1 + i ] * weight1;
}
return result;
}});
function DiscreteInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer){
Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer);
}
DiscreteInterpolant.prototype=Object.assign(Object.create(Interpolant.prototype), {
constructor: DiscreteInterpolant,
interpolate_: function(i1 ){
return this.copySampleValue_(i1 - 1);
}});
var AnimationUtils={
arraySlice: function(array, from, to){
if(AnimationUtils.isTypedArray(array) ){
return new array.constructor(array.subarray(from, to!==undefined ? to:array.length) );
}
return array.slice(from, to);
},
convertArray: function(array, type, forceClone){
if(! array ||
! forceClone&&array.constructor===type) return array;
if(typeof type.BYTES_PER_ELEMENT==='number'){
return new type(array);
}
return Array.prototype.slice.call(array);
},
isTypedArray: function(object){
return ArrayBuffer.isView(object) &&
!(object instanceof DataView);
},
getKeyframeOrder: function(times){
function compareTime(i, j){
return times[ i ] - times[ j ];
}
var n=times.length;
var result=new Array(n);
for(var i=0; i!==n; ++ i) result[ i ]=i;
result.sort(compareTime);
return result;
},
sortedArray: function(values, stride, order){
var nValues=values.length;
var result=new values.constructor(nValues);
for(var i=0, dstOffset=0; dstOffset!==nValues; ++ i){
var srcOffset=order[ i ] * stride;
for(var j=0; j!==stride; ++ j){
result[ dstOffset ++ ]=values[ srcOffset + j ];
}}
return result;
},
flattenJSON: function(jsonKeys, times, values, valuePropertyName){
var i=1, key=jsonKeys[ 0 ];
while(key!==undefined&&key[ valuePropertyName ]===undefined){
key=jsonKeys[ i ++ ];
}
if(key===undefined) return;
var value=key[ valuePropertyName ];
if(value===undefined) return;
if(Array.isArray(value) ){
do {
value=key[ valuePropertyName ];
if(value!==undefined){
times.push(key.time);
values.push.apply(values, value);
}
key=jsonKeys[ i ++ ];
} while(key!==undefined);
}else if(value.toArray!==undefined){
do {
value=key[ valuePropertyName ];
if(value!==undefined){
times.push(key.time);
value.toArray(values, values.length);
}
key=jsonKeys[ i ++ ];
} while(key!==undefined);
}else{
do {
value=key[ valuePropertyName ];
if(value!==undefined){
times.push(key.time);
values.push(value);
}
key=jsonKeys[ i ++ ];
} while(key!==undefined);
}}
};
function KeyframeTrack(name, times, values, interpolation){
if(name===undefined) throw new Error('THREE.KeyframeTrack: track name is undefined');
if(times===undefined||times.length===0) throw new Error('THREE.KeyframeTrack: no keyframes in track named ' + name);
this.name=name;
this.times=AnimationUtils.convertArray(times, this.TimeBufferType);
this.values=AnimationUtils.convertArray(values, this.ValueBufferType);
this.setInterpolation(interpolation||this.DefaultInterpolation);
this.validate();
this.optimize();
}
Object.assign(KeyframeTrack, {
parse: function(json){
if(json.type===undefined){
throw new Error('THREE.KeyframeTrack: track type undefined, can not parse');
}
var trackType=KeyframeTrack._getTrackTypeForValueTypeName(json.type);
if(json.times===undefined){
var times=[], values=[];
AnimationUtils.flattenJSON(json.keys, times, values, 'value');
json.times=times;
json.values=values;
}
if(trackType.parse!==undefined){
return trackType.parse(json);
}else{
return new trackType(json.name, json.times, json.values, json.interpolation);
}},
toJSON: function(track){
var trackType=track.constructor;
var json;
if(trackType.toJSON!==undefined){
json=trackType.toJSON(track);
}else{
json={
'name': track.name,
'times': AnimationUtils.convertArray(track.times, Array),
'values': AnimationUtils.convertArray(track.values, Array)
};
var interpolation=track.getInterpolation();
if(interpolation!==track.DefaultInterpolation){
json.interpolation=interpolation;
}}
json.type=track.ValueTypeName;
return json;
},
_getTrackTypeForValueTypeName: function(typeName){
switch(typeName.toLowerCase()){
case 'scalar':
case 'double':
case 'float':
case 'number':
case 'integer':
return NumberKeyframeTrack;
case 'vector':
case 'vector2':
case 'vector3':
case 'vector4':
return VectorKeyframeTrack;
case 'color':
return ColorKeyframeTrack;
case 'quaternion':
return QuaternionKeyframeTrack;
case 'bool':
case 'boolean':
return BooleanKeyframeTrack;
case 'string':
return StringKeyframeTrack;
}
throw new Error('THREE.KeyframeTrack: Unsupported typeName: ' + typeName);
}});
Object.assign(KeyframeTrack.prototype, {
constructor: KeyframeTrack,
TimeBufferType: Float32Array,
ValueBufferType: Float32Array,
DefaultInterpolation: InterpolateLinear,
InterpolantFactoryMethodDiscrete: function(result){
return new DiscreteInterpolant(this.times, this.values, this.getValueSize(), result);
},
InterpolantFactoryMethodLinear: function(result){
return new LinearInterpolant(this.times, this.values, this.getValueSize(), result);
},
InterpolantFactoryMethodSmooth: function(result){
return new CubicInterpolant(this.times, this.values, this.getValueSize(), result);
},
setInterpolation: function(interpolation){
var factoryMethod;
switch(interpolation){
case InterpolateDiscrete:
factoryMethod=this.InterpolantFactoryMethodDiscrete;
break;
case InterpolateLinear:
factoryMethod=this.InterpolantFactoryMethodLinear;
break;
case InterpolateSmooth:
factoryMethod=this.InterpolantFactoryMethodSmooth;
break;
}
if(factoryMethod===undefined){
var message="unsupported interpolation for " +
this.ValueTypeName + " keyframe track named " + this.name;
if(this.createInterpolant===undefined){
if(interpolation!==this.DefaultInterpolation){
this.setInterpolation(this.DefaultInterpolation);
}else{
throw new Error(message);
}}
console.warn('THREE.KeyframeTrack:', message);
return;
}
this.createInterpolant=factoryMethod;
},
getInterpolation: function (){
switch(this.createInterpolant){
case this.InterpolantFactoryMethodDiscrete:
return InterpolateDiscrete;
case this.InterpolantFactoryMethodLinear:
return InterpolateLinear;
case this.InterpolantFactoryMethodSmooth:
return InterpolateSmooth;
}},
getValueSize: function (){
return this.values.length / this.times.length;
},
shift: function(timeOffset){
if(timeOffset!==0.0){
var times=this.times;
for(var i=0, n=times.length; i!==n; ++ i){
times[ i ] +=timeOffset;
}}
return this;
},
scale: function(timeScale){
if(timeScale!==1.0){
var times=this.times;
for(var i=0, n=times.length; i!==n; ++ i){
times[ i ] *=timeScale;
}}
return this;
},
trim: function(startTime, endTime){
var times=this.times,
nKeys=times.length,
from=0,
to=nKeys - 1;
while(from!==nKeys&&times[ from ] < startTime){
++ from;
}
while(to!==- 1&&times[ to ] > endTime){
-- to;
}
++ to;
if(from!==0||to!==nKeys){
if(from >=to) to=Math.max(to, 1), from=to - 1;
var stride=this.getValueSize();
this.times=AnimationUtils.arraySlice(times, from, to);
this.values=AnimationUtils.arraySlice(this.values, from * stride, to * stride);
}
return this;
},
validate: function (){
var valid=true;
var valueSize=this.getValueSize();
if(valueSize - Math.floor(valueSize)!==0){
console.error('THREE.KeyframeTrack: Invalid value size in track.', this);
valid=false;
}
var times=this.times,
values=this.values,
nKeys=times.length;
if(nKeys===0){
console.error('THREE.KeyframeTrack: Track is empty.', this);
valid=false;
}
var prevTime=null;
for(var i=0; i!==nKeys; i ++){
var currTime=times[ i ];
if(typeof currTime==='number'&&isNaN(currTime) ){
console.error('THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime);
valid=false;
break;
}
if(prevTime!==null&&prevTime > currTime){
console.error('THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime);
valid=false;
break;
}
prevTime=currTime;
}
if(values!==undefined){
if(AnimationUtils.isTypedArray(values) ){
for(var i=0, n=values.length; i!==n; ++ i){
var value=values[ i ];
if(isNaN(value) ){
console.error('THREE.KeyframeTrack: Value is not a valid number.', this, i, value);
valid=false;
break;
}}
}}
return valid;
},
optimize: function (){
var times=this.times,
values=this.values,
stride=this.getValueSize(),
smoothInterpolation=this.getInterpolation()===InterpolateSmooth,
writeIndex=1,
lastIndex=times.length - 1;
for(var i=1; i < lastIndex; ++ i){
var keep=false;
var time=times[ i ];
var timeNext=times[ i + 1 ];
if(time!==timeNext&&(i!==1||time!==time[ 0 ]) ){
if(! smoothInterpolation){
var offset=i * stride,
offsetP=offset - stride,
offsetN=offset + stride;
for(var j=0; j!==stride; ++ j){
var value=values[ offset + j ];
if(value!==values[ offsetP + j ] ||
value!==values[ offsetN + j ]){
keep=true;
break;
}}
}else{
keep=true;
}}
if(keep){
if(i!==writeIndex){
times[ writeIndex ]=times[ i ];
var readOffset=i * stride,
writeOffset=writeIndex * stride;
for(var j=0; j!==stride; ++ j){
values[ writeOffset + j ]=values[ readOffset + j ];
}}
++ writeIndex;
}}
if(lastIndex > 0){
times[ writeIndex ]=times[ lastIndex ];
for(var readOffset=lastIndex * stride, writeOffset=writeIndex * stride, j=0; j!==stride; ++ j){
values[ writeOffset + j ]=values[ readOffset + j ];
}
++ writeIndex;
}
if(writeIndex!==times.length){
this.times=AnimationUtils.arraySlice(times, 0, writeIndex);
this.values=AnimationUtils.arraySlice(values, 0, writeIndex * stride);
}
return this;
}});
function VectorKeyframeTrack(name, times, values, interpolation){
KeyframeTrack.call(this, name, times, values, interpolation);
}
VectorKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype), {
constructor: VectorKeyframeTrack,
ValueTypeName: 'vector'
});
function AnimationClip(name, duration, tracks){
this.name=name;
this.tracks=tracks;
this.duration=(duration!==undefined) ? duration:- 1;
this.uuid=_Math.generateUUID();
if(this.duration < 0){
this.resetDuration();
}
this.optimize();
}
Object.assign(AnimationClip, {
parse: function(json){
var tracks=[],
jsonTracks=json.tracks,
frameTime=1.0 /(json.fps||1.0);
for(var i=0, n=jsonTracks.length; i!==n; ++ i){
tracks.push(KeyframeTrack.parse(jsonTracks[ i ]).scale(frameTime) );
}
return new AnimationClip(json.name, json.duration, tracks);
},
toJSON: function(clip){
var tracks=[],
clipTracks=clip.tracks;
var json={
'name': clip.name,
'duration': clip.duration,
'tracks': tracks,
'uuid': clip.uuid
};
for(var i=0, n=clipTracks.length; i!==n; ++ i){
tracks.push(KeyframeTrack.toJSON(clipTracks[ i ]) );
}
return json;
},
CreateFromMorphTargetSequence: function(name, morphTargetSequence, fps, noLoop){
var numMorphTargets=morphTargetSequence.length;
var tracks=[];
for(var i=0; i < numMorphTargets; i ++){
var times=[];
var values=[];
times.push((i + numMorphTargets - 1) % numMorphTargets,
i,
(i + 1) % numMorphTargets);
values.push(0, 1, 0);
var order=AnimationUtils.getKeyframeOrder(times);
times=AnimationUtils.sortedArray(times, 1, order);
values=AnimationUtils.sortedArray(values, 1, order);
if(! noLoop&&times[ 0 ]===0){
times.push(numMorphTargets);
values.push(values[ 0 ]);
}
tracks.push(new NumberKeyframeTrack(
'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',
times, values
).scale(1.0 / fps) );
}
return new AnimationClip(name, - 1, tracks);
},
findByName: function(objectOrClipArray, name){
var clipArray=objectOrClipArray;
if(! Array.isArray(objectOrClipArray) ){
var o=objectOrClipArray;
clipArray=o.geometry&&o.geometry.animations||o.animations;
}
for(var i=0; i < clipArray.length; i ++){
if(clipArray[ i ].name===name){
return clipArray[ i ];
}}
return null;
},
CreateClipsFromMorphTargetSequences: function(morphTargets, fps, noLoop){
var animationToMorphTargets={};
var pattern=/^([\w-]*?)([\d]+)$/;
for(var i=0, il=morphTargets.length; i < il; i ++){
var morphTarget=morphTargets[ i ];
var parts=morphTarget.name.match(pattern);
if(parts&&parts.length > 1){
var name=parts[ 1 ];
var animationMorphTargets=animationToMorphTargets[ name ];
if(! animationMorphTargets){
animationToMorphTargets[ name ]=animationMorphTargets=[];
}
animationMorphTargets.push(morphTarget);
}}
var clips=[];
for(var name in animationToMorphTargets){
clips.push(AnimationClip.CreateFromMorphTargetSequence(name, animationToMorphTargets[ name ], fps, noLoop) );
}
return clips;
},
parseAnimation: function(animation, bones){
if(! animation){
console.error('THREE.AnimationClip: No animation in JSONLoader data.');
return null;
}
var addNonemptyTrack=function(trackType, trackName, animationKeys, propertyName, destTracks){
if(animationKeys.length!==0){
var times=[];
var values=[];
AnimationUtils.flattenJSON(animationKeys, times, values, propertyName);
if(times.length!==0){
destTracks.push(new trackType(trackName, times, values) );
}}
};
var tracks=[];
var clipName=animation.name||'default';
var duration=animation.length||- 1;
var fps=animation.fps||30;
var hierarchyTracks=animation.hierarchy||[];
for(var h=0; h < hierarchyTracks.length; h ++){
var animationKeys=hierarchyTracks[ h ].keys;
if(! animationKeys||animationKeys.length===0) continue;
if(animationKeys[ 0 ].morphTargets){
var morphTargetNames={};
for(var k=0; k < animationKeys.length; k ++){
if(animationKeys[ k ].morphTargets){
for(var m=0; m < animationKeys[ k ].morphTargets.length; m ++){
morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ]=- 1;
}}
}
for(var morphTargetName in morphTargetNames){
var times=[];
var values=[];
for(var m=0; m!==animationKeys[ k ].morphTargets.length; ++ m){
var animationKey=animationKeys[ k ];
times.push(animationKey.time);
values.push(( animationKey.morphTarget===morphTargetName) ? 1:0);
}
tracks.push(new NumberKeyframeTrack('.morphTargetInfluence[' + morphTargetName + ']', times, values) );
}
duration=morphTargetNames.length *(fps||1.0);
}else{
var boneName='.bones[' + bones[ h ].name + ']';
addNonemptyTrack(
VectorKeyframeTrack, boneName + '.position',
animationKeys, 'pos', tracks);
addNonemptyTrack(
QuaternionKeyframeTrack, boneName + '.quaternion',
animationKeys, 'rot', tracks);
addNonemptyTrack(
VectorKeyframeTrack, boneName + '.scale',
animationKeys, 'scl', tracks);
}}
if(tracks.length===0){
return null;
}
var clip=new AnimationClip(clipName, duration, tracks);
return clip;
}});
Object.assign(AnimationClip.prototype, {
resetDuration: function (){
var tracks=this.tracks, duration=0;
for(var i=0, n=tracks.length; i!==n; ++ i){
var track=this.tracks[ i ];
duration=Math.max(duration, track.times[ track.times.length - 1 ]);
}
this.duration=duration;
},
trim: function (){
for(var i=0; i < this.tracks.length; i ++){
this.tracks[ i ].trim(0, this.duration);
}
return this;
},
optimize: function (){
for(var i=0; i < this.tracks.length; i ++){
this.tracks[ i ].optimize();
}
return this;
}});
function MaterialLoader(manager){
this.manager=(manager!==undefined) ? manager:DefaultLoadingManager;
this.textures={};}
Object.assign(MaterialLoader.prototype, {
load: function(url, onLoad, onProgress, onError){
var scope=this;
var loader=new FileLoader(scope.manager);
loader.load(url, function(text){
onLoad(scope.parse(JSON.parse(text) ));
}, onProgress, onError);
},
setTextures: function(value){
this.textures=value;
},
parse: function(json){
var textures=this.textures;
function getTexture(name){
if(textures[ name ]===undefined){
console.warn('THREE.MaterialLoader: Undefined texture', name);
}
return textures[ name ];
}
var material=new Materials[ json.type ]();
if(json.uuid!==undefined) material.uuid=json.uuid;
if(json.name!==undefined) material.name=json.name;
if(json.color!==undefined) material.color.setHex(json.color);
if(json.roughness!==undefined) material.roughness=json.roughness;
if(json.metalness!==undefined) material.metalness=json.metalness;
if(json.emissive!==undefined) material.emissive.setHex(json.emissive);
if(json.specular!==undefined) material.specular.setHex(json.specular);
if(json.shininess!==undefined) material.shininess=json.shininess;
if(json.clearCoat!==undefined) material.clearCoat=json.clearCoat;
if(json.clearCoatRoughness!==undefined) material.clearCoatRoughness=json.clearCoatRoughness;
if(json.uniforms!==undefined) material.uniforms=json.uniforms;
if(json.vertexShader!==undefined) material.vertexShader=json.vertexShader;
if(json.fragmentShader!==undefined) material.fragmentShader=json.fragmentShader;
if(json.vertexColors!==undefined) material.vertexColors=json.vertexColors;
if(json.fog!==undefined) material.fog=json.fog;
if(json.flatShading!==undefined) material.flatShading=json.flatShading;
if(json.blending!==undefined) material.blending=json.blending;
if(json.side!==undefined) material.side=json.side;
if(json.opacity!==undefined) material.opacity=json.opacity;
if(json.transparent!==undefined) material.transparent=json.transparent;
if(json.alphaTest!==undefined) material.alphaTest=json.alphaTest;
if(json.depthTest!==undefined) material.depthTest=json.depthTest;
if(json.depthWrite!==undefined) material.depthWrite=json.depthWrite;
if(json.colorWrite!==undefined) material.colorWrite=json.colorWrite;
if(json.wireframe!==undefined) material.wireframe=json.wireframe;
if(json.wireframeLinewidth!==undefined) material.wireframeLinewidth=json.wireframeLinewidth;
if(json.wireframeLinecap!==undefined) material.wireframeLinecap=json.wireframeLinecap;
if(json.wireframeLinejoin!==undefined) material.wireframeLinejoin=json.wireframeLinejoin;
if(json.rotation!==undefined) material.rotation=json.rotation;
if(json.linewidth!==1) material.linewidth=json.linewidth;
if(json.dashSize!==undefined) material.dashSize=json.dashSize;
if(json.gapSize!==undefined) material.gapSize=json.gapSize;
if(json.scale!==undefined) material.scale=json.scale;
if(json.polygonOffset!==undefined) material.polygonOffset=json.polygonOffset;
if(json.polygonOffsetFactor!==undefined) material.polygonOffsetFactor=json.polygonOffsetFactor;
if(json.polygonOffsetUnits!==undefined) material.polygonOffsetUnits=json.polygonOffsetUnits;
if(json.skinning!==undefined) material.skinning=json.skinning;
if(json.morphTargets!==undefined) material.morphTargets=json.morphTargets;
if(json.dithering!==undefined) material.dithering=json.dithering;
if(json.visible!==undefined) material.visible=json.visible;
if(json.userData!==undefined) material.userData=json.userData;
if(json.shading!==undefined) material.flatShading=json.shading===1;
if(json.size!==undefined) material.size=json.size;
if(json.sizeAttenuation!==undefined) material.sizeAttenuation=json.sizeAttenuation;
if(json.map!==undefined) material.map=getTexture(json.map);
if(json.alphaMap!==undefined){
material.alphaMap=getTexture(json.alphaMap);
material.transparent=true;
}
if(json.bumpMap!==undefined) material.bumpMap=getTexture(json.bumpMap);
if(json.bumpScale!==undefined) material.bumpScale=json.bumpScale;
if(json.normalMap!==undefined) material.normalMap=getTexture(json.normalMap);
if(json.normalScale!==undefined){
var normalScale=json.normalScale;
if(Array.isArray(normalScale)===false){
normalScale=[ normalScale, normalScale ];
}
material.normalScale=new Vector2().fromArray(normalScale);
}
if(json.displacementMap!==undefined) material.displacementMap=getTexture(json.displacementMap);
if(json.displacementScale!==undefined) material.displacementScale=json.displacementScale;
if(json.displacementBias!==undefined) material.displacementBias=json.displacementBias;
if(json.roughnessMap!==undefined) material.roughnessMap=getTexture(json.roughnessMap);
if(json.metalnessMap!==undefined) material.metalnessMap=getTexture(json.metalnessMap);
if(json.emissiveMap!==undefined) material.emissiveMap=getTexture(json.emissiveMap);
if(json.emissiveIntensity!==undefined) material.emissiveIntensity=json.emissiveIntensity;
if(json.specularMap!==undefined) material.specularMap=getTexture(json.specularMap);
if(json.envMap!==undefined) material.envMap=getTexture(json.envMap);
if(json.reflectivity!==undefined) material.reflectivity=json.reflectivity;
if(json.lightMap!==undefined) material.lightMap=getTexture(json.lightMap);
if(json.lightMapIntensity!==undefined) material.lightMapIntensity=json.lightMapIntensity;
if(json.aoMap!==undefined) material.aoMap=getTexture(json.aoMap);
if(json.aoMapIntensity!==undefined) material.aoMapIntensity=json.aoMapIntensity;
if(json.gradientMap!==undefined) material.gradientMap=getTexture(json.gradientMap);
return material;
}});
function BufferGeometryLoader(manager){
this.manager=(manager!==undefined) ? manager:DefaultLoadingManager;
}
Object.assign(BufferGeometryLoader.prototype, {
load: function(url, onLoad, onProgress, onError){
var scope=this;
var loader=new FileLoader(scope.manager);
loader.load(url, function(text){
onLoad(scope.parse(JSON.parse(text) ));
}, onProgress, onError);
},
parse: function(json){
var geometry=new BufferGeometry();
var index=json.data.index;
if(index!==undefined){
var typedArray=new TYPED_ARRAYS[ index.type ](index.array);
geometry.setIndex(new BufferAttribute(typedArray, 1) );
}
var attributes=json.data.attributes;
for(var key in attributes){
var attribute=attributes[ key ];
var typedArray=new TYPED_ARRAYS[ attribute.type ](attribute.array);
geometry.addAttribute(key, new BufferAttribute(typedArray, attribute.itemSize, attribute.normalized) );
}
var groups=json.data.groups||json.data.drawcalls||json.data.offsets;
if(groups!==undefined){
for(var i=0, n=groups.length; i!==n; ++ i){
var group=groups[ i ];
geometry.addGroup(group.start, group.count, group.materialIndex);
}}
var boundingSphere=json.data.boundingSphere;
if(boundingSphere!==undefined){
var center=new Vector3();
if(boundingSphere.center!==undefined){
center.fromArray(boundingSphere.center);
}
geometry.boundingSphere=new Sphere(center, boundingSphere.radius);
}
return geometry;
}});
var TYPED_ARRAYS={
Int8Array: Int8Array,
Uint8Array: Uint8Array,
Uint8ClampedArray: typeof Uint8ClampedArray!=='undefined' ? Uint8ClampedArray:Uint8Array,
Int16Array: Int16Array,
Uint16Array: Uint16Array,
Int32Array: Int32Array,
Uint32Array: Uint32Array,
Float32Array: Float32Array,
Float64Array: Float64Array
};
function Loader(){}
Loader.Handlers={
handlers: [],
add: function(regex, loader){
this.handlers.push(regex, loader);
},
get: function(file){
var handlers=this.handlers;
for(var i=0, l=handlers.length; i < l; i +=2){
var regex=handlers[ i ];
var loader=handlers[ i + 1 ];
if(regex.test(file) ){
return loader;
}}
return null;
}};
Object.assign(Loader.prototype, {
crossOrigin: undefined,
onLoadStart: function (){},
onLoadProgress: function (){},
onLoadComplete: function (){},
initMaterials: function(materials, texturePath, crossOrigin){
var array=[];
for(var i=0; i < materials.length; ++ i){
array[ i ]=this.createMaterial(materials[ i ], texturePath, crossOrigin);
}
return array;
},
createMaterial:(function (){
var BlendingMode={
NoBlending: NoBlending,
NormalBlending: NormalBlending,
AdditiveBlending: AdditiveBlending,
SubtractiveBlending: SubtractiveBlending,
MultiplyBlending: MultiplyBlending,
CustomBlending: CustomBlending
};
var color=new Color();
var textureLoader=new TextureLoader();
var materialLoader=new MaterialLoader();
return function createMaterial(m, texturePath, crossOrigin){
var textures={};
function loadTexture(path, repeat, offset, wrap, anisotropy){
var fullPath=texturePath + path;
var loader=Loader.Handlers.get(fullPath);
var texture;
if(loader!==null){
texture=loader.load(fullPath);
}else{
textureLoader.setCrossOrigin(crossOrigin);
texture=textureLoader.load(fullPath);
}
if(repeat!==undefined){
texture.repeat.fromArray(repeat);
if(repeat[ 0 ]!==1) texture.wrapS=RepeatWrapping;
if(repeat[ 1 ]!==1) texture.wrapT=RepeatWrapping;
}
if(offset!==undefined){
texture.offset.fromArray(offset);
}
if(wrap!==undefined){
if(wrap[ 0 ]==='repeat') texture.wrapS=RepeatWrapping;
if(wrap[ 0 ]==='mirror') texture.wrapS=MirroredRepeatWrapping;
if(wrap[ 1 ]==='repeat') texture.wrapT=RepeatWrapping;
if(wrap[ 1 ]==='mirror') texture.wrapT=MirroredRepeatWrapping;
}
if(anisotropy!==undefined){
texture.anisotropy=anisotropy;
}
var uuid=_Math.generateUUID();
textures[ uuid ]=texture;
return uuid;
}
var json={
uuid: _Math.generateUUID(),
type: 'MeshLambertMaterial'
};
for(var name in m){
var value=m[ name ];
switch(name){
case 'DbgColor':
case 'DbgIndex':
case 'opticalDensity':
case 'illumination':
break;
case 'DbgName':
json.name=value;
break;
case 'blending':
json.blending=BlendingMode[ value ];
break;
case 'colorAmbient':
case 'mapAmbient':
console.warn('THREE.Loader.createMaterial:', name, 'is no longer supported.');
break;
case 'colorDiffuse':
json.color=color.fromArray(value).getHex();
break;
case 'colorSpecular':
json.specular=color.fromArray(value).getHex();
break;
case 'colorEmissive':
json.emissive=color.fromArray(value).getHex();
break;
case 'specularCoef':
json.shininess=value;
break;
case 'shading':
if(value.toLowerCase()==='basic') json.type='MeshBasicMaterial';
if(value.toLowerCase()==='phong') json.type='MeshPhongMaterial';
if(value.toLowerCase()==='standard') json.type='MeshStandardMaterial';
break;
case 'mapDiffuse':
json.map=loadTexture(value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy);
break;
case 'mapDiffuseRepeat':
case 'mapDiffuseOffset':
case 'mapDiffuseWrap':
case 'mapDiffuseAnisotropy':
break;
case 'mapEmissive':
json.emissiveMap=loadTexture(value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy);
break;
case 'mapEmissiveRepeat':
case 'mapEmissiveOffset':
case 'mapEmissiveWrap':
case 'mapEmissiveAnisotropy':
break;
case 'mapLight':
json.lightMap=loadTexture(value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy);
break;
case 'mapLightRepeat':
case 'mapLightOffset':
case 'mapLightWrap':
case 'mapLightAnisotropy':
break;
case 'mapAO':
json.aoMap=loadTexture(value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy);
break;
case 'mapAORepeat':
case 'mapAOOffset':
case 'mapAOWrap':
case 'mapAOAnisotropy':
break;
case 'mapBump':
json.bumpMap=loadTexture(value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy);
break;
case 'mapBumpScale':
json.bumpScale=value;
break;
case 'mapBumpRepeat':
case 'mapBumpOffset':
case 'mapBumpWrap':
case 'mapBumpAnisotropy':
break;
case 'mapNormal':
json.normalMap=loadTexture(value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy);
break;
case 'mapNormalFactor':
json.normalScale=value;
break;
case 'mapNormalRepeat':
case 'mapNormalOffset':
case 'mapNormalWrap':
case 'mapNormalAnisotropy':
break;
case 'mapSpecular':
json.specularMap=loadTexture(value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy);
break;
case 'mapSpecularRepeat':
case 'mapSpecularOffset':
case 'mapSpecularWrap':
case 'mapSpecularAnisotropy':
break;
case 'mapMetalness':
json.metalnessMap=loadTexture(value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy);
break;
case 'mapMetalnessRepeat':
case 'mapMetalnessOffset':
case 'mapMetalnessWrap':
case 'mapMetalnessAnisotropy':
break;
case 'mapRoughness':
json.roughnessMap=loadTexture(value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy);
break;
case 'mapRoughnessRepeat':
case 'mapRoughnessOffset':
case 'mapRoughnessWrap':
case 'mapRoughnessAnisotropy':
break;
case 'mapAlpha':
json.alphaMap=loadTexture(value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy);
break;
case 'mapAlphaRepeat':
case 'mapAlphaOffset':
case 'mapAlphaWrap':
case 'mapAlphaAnisotropy':
break;
case 'flipSided':
json.side=BackSide;
break;
case 'doubleSided':
json.side=DoubleSide;
break;
case 'transparency':
console.warn('THREE.Loader.createMaterial: transparency has been renamed to opacity');
json.opacity=value;
break;
case 'depthTest':
case 'depthWrite':
case 'colorWrite':
case 'opacity':
case 'reflectivity':
case 'transparent':
case 'visible':
case 'wireframe':
json[ name ]=value;
break;
case 'vertexColors':
if(value===true) json.vertexColors=VertexColors;
if(value==='face') json.vertexColors=FaceColors;
break;
default:
console.error('THREE.Loader.createMaterial: Unsupported', name, value);
break;
}}
if(json.type==='MeshBasicMaterial') delete json.emissive;
if(json.type!=='MeshPhongMaterial') delete json.specular;
if(json.opacity < 1) json.transparent=true;
materialLoader.setTextures(textures);
return materialLoader.parse(json);
};})()
});
var LoaderUtils={
decodeText: function(array){
if(typeof TextDecoder!=='undefined'){
return new TextDecoder().decode(array);
}
var s='';
for(var i=0, il=array.length; i < il; i ++){
s +=String.fromCharCode(array[ i ]);
}
return decodeURIComponent(escape(s) );
},
extractUrlBase: function(url){
var index=url.lastIndexOf('/');
if(index===- 1) return './';
return url.substr(0, index + 1);
}};
function JSONLoader(manager){
if(typeof manager==='boolean'){
console.warn('THREE.JSONLoader: showStatus parameter has been removed from constructor.');
manager=undefined;
}
this.manager=(manager!==undefined) ? manager:DefaultLoadingManager;
this.withCredentials=false;
}
Object.assign(JSONLoader.prototype, {
load: function(url, onLoad, onProgress, onError){
var scope=this;
var texturePath=this.texturePath&&(typeof this.texturePath==='string') ? this.texturePath:LoaderUtils.extractUrlBase(url);
var loader=new FileLoader(this.manager);
loader.setWithCredentials(this.withCredentials);
loader.load(url, function(text){
var json=JSON.parse(text);
var metadata=json.metadata;
if(metadata!==undefined){
var type=metadata.type;
if(type!==undefined){
if(type.toLowerCase()==='object'){
console.error('THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.');
return;
}}
}
var object=scope.parse(json, texturePath);
onLoad(object.geometry, object.materials);
}, onProgress, onError);
},
setTexturePath: function(value){
this.texturePath=value;
},
parse:(function (){
function parseModel(json, geometry){
function isBitSet(value, position){
return value &(1 << position);
}
var i, j, fi,
offset, zLength,
colorIndex, normalIndex, uvIndex, materialIndex,
type,
isQuad,
hasMaterial,
hasFaceVertexUv,
hasFaceNormal, hasFaceVertexNormal,
hasFaceColor, hasFaceVertexColor,
vertex, face, faceA, faceB, hex, normal,
uvLayer, uv, u, v,
faces=json.faces,
vertices=json.vertices,
normals=json.normals,
colors=json.colors,
scale=json.scale,
nUvLayers=0;
if(json.uvs!==undefined){
for(i=0; i < json.uvs.length; i ++){
if(json.uvs[ i ].length) nUvLayers ++;
}
for(i=0; i < nUvLayers; i ++){
geometry.faceVertexUvs[ i ]=[];
}}
offset=0;
zLength=vertices.length;
while(offset < zLength){
vertex=new Vector3();
vertex.x=vertices[ offset ++ ] * scale;
vertex.y=vertices[ offset ++ ] * scale;
vertex.z=vertices[ offset ++ ] * scale;
geometry.vertices.push(vertex);
}
offset=0;
zLength=faces.length;
while(offset < zLength){
type=faces[ offset ++ ];
isQuad=isBitSet(type, 0);
hasMaterial=isBitSet(type, 1);
hasFaceVertexUv=isBitSet(type, 3);
hasFaceNormal=isBitSet(type, 4);
hasFaceVertexNormal=isBitSet(type, 5);
hasFaceColor=isBitSet(type, 6);
hasFaceVertexColor=isBitSet(type, 7);
if(isQuad){
faceA=new Face3();
faceA.a=faces[ offset ];
faceA.b=faces[ offset + 1 ];
faceA.c=faces[ offset + 3 ];
faceB=new Face3();
faceB.a=faces[ offset + 1 ];
faceB.b=faces[ offset + 2 ];
faceB.c=faces[ offset + 3 ];
offset +=4;
if(hasMaterial){
materialIndex=faces[ offset ++ ];
faceA.materialIndex=materialIndex;
faceB.materialIndex=materialIndex;
}
fi=geometry.faces.length;
if(hasFaceVertexUv){
for(i=0; i < nUvLayers; i ++){
uvLayer=json.uvs[ i ];
geometry.faceVertexUvs[ i ][ fi ]=[];
geometry.faceVertexUvs[ i ][ fi + 1 ]=[];
for(j=0; j < 4; j ++){
uvIndex=faces[ offset ++ ];
u=uvLayer[ uvIndex * 2 ];
v=uvLayer[ uvIndex * 2 + 1 ];
uv=new Vector2(u, v);
if(j!==2) geometry.faceVertexUvs[ i ][ fi ].push(uv);
if(j!==0) geometry.faceVertexUvs[ i ][ fi + 1 ].push(uv);
}}
}
if(hasFaceNormal){
normalIndex=faces[ offset ++ ] * 3;
faceA.normal.set(normals[ normalIndex ++ ],
normals[ normalIndex ++ ],
normals[ normalIndex ]
);
faceB.normal.copy(faceA.normal);
}
if(hasFaceVertexNormal){
for(i=0; i < 4; i ++){
normalIndex=faces[ offset ++ ] * 3;
normal=new Vector3(
normals[ normalIndex ++ ],
normals[ normalIndex ++ ],
normals[ normalIndex ]
);
if(i!==2) faceA.vertexNormals.push(normal);
if(i!==0) faceB.vertexNormals.push(normal);
}}
if(hasFaceColor){
colorIndex=faces[ offset ++ ];
hex=colors[ colorIndex ];
faceA.color.setHex(hex);
faceB.color.setHex(hex);
}
if(hasFaceVertexColor){
for(i=0; i < 4; i ++){
colorIndex=faces[ offset ++ ];
hex=colors[ colorIndex ];
if(i!==2) faceA.vertexColors.push(new Color(hex) );
if(i!==0) faceB.vertexColors.push(new Color(hex) );
}}
geometry.faces.push(faceA);
geometry.faces.push(faceB);
}else{
face=new Face3();
face.a=faces[ offset ++ ];
face.b=faces[ offset ++ ];
face.c=faces[ offset ++ ];
if(hasMaterial){
materialIndex=faces[ offset ++ ];
face.materialIndex=materialIndex;
}
fi=geometry.faces.length;
if(hasFaceVertexUv){
for(i=0; i < nUvLayers; i ++){
uvLayer=json.uvs[ i ];
geometry.faceVertexUvs[ i ][ fi ]=[];
for(j=0; j < 3; j ++){
uvIndex=faces[ offset ++ ];
u=uvLayer[ uvIndex * 2 ];
v=uvLayer[ uvIndex * 2 + 1 ];
uv=new Vector2(u, v);
geometry.faceVertexUvs[ i ][ fi ].push(uv);
}}
}
if(hasFaceNormal){
normalIndex=faces[ offset ++ ] * 3;
face.normal.set(normals[ normalIndex ++ ],
normals[ normalIndex ++ ],
normals[ normalIndex ]
);
}
if(hasFaceVertexNormal){
for(i=0; i < 3; i ++){
normalIndex=faces[ offset ++ ] * 3;
normal=new Vector3(
normals[ normalIndex ++ ],
normals[ normalIndex ++ ],
normals[ normalIndex ]
);
face.vertexNormals.push(normal);
}}
if(hasFaceColor){
colorIndex=faces[ offset ++ ];
face.color.setHex(colors[ colorIndex ]);
}
if(hasFaceVertexColor){
for(i=0; i < 3; i ++){
colorIndex=faces[ offset ++ ];
face.vertexColors.push(new Color(colors[ colorIndex ]) );
}}
geometry.faces.push(face);
}}
}
function parseSkin(json, geometry){
var influencesPerVertex=(json.influencesPerVertex!==undefined) ? json.influencesPerVertex:2;
if(json.skinWeights){
for(var i=0, l=json.skinWeights.length; i < l; i +=influencesPerVertex){
var x=json.skinWeights[ i ];
var y=(influencesPerVertex > 1) ? json.skinWeights[ i + 1 ]:0;
var z=(influencesPerVertex > 2) ? json.skinWeights[ i + 2 ]:0;
var w=(influencesPerVertex > 3) ? json.skinWeights[ i + 3 ]:0;
geometry.skinWeights.push(new Vector4(x, y, z, w) );
}}
if(json.skinIndices){
for(var i=0, l=json.skinIndices.length; i < l; i +=influencesPerVertex){
var a=json.skinIndices[ i ];
var b=(influencesPerVertex > 1) ? json.skinIndices[ i + 1 ]:0;
var c=(influencesPerVertex > 2) ? json.skinIndices[ i + 2 ]:0;
var d=(influencesPerVertex > 3) ? json.skinIndices[ i + 3 ]:0;
geometry.skinIndices.push(new Vector4(a, b, c, d) );
}}
geometry.bones=json.bones;
if(geometry.bones&&geometry.bones.length > 0&&(geometry.skinWeights.length!==geometry.skinIndices.length||geometry.skinIndices.length!==geometry.vertices.length) ){
console.warn('When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +
geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.');
}}
function parseMorphing(json, geometry){
var scale=json.scale;
if(json.morphTargets!==undefined){
for(var i=0, l=json.morphTargets.length; i < l; i ++){
geometry.morphTargets[ i ]={};
geometry.morphTargets[ i ].name=json.morphTargets[ i ].name;
geometry.morphTargets[ i ].vertices=[];
var dstVertices=geometry.morphTargets[ i ].vertices;
var srcVertices=json.morphTargets[ i ].vertices;
for(var v=0, vl=srcVertices.length; v < vl; v +=3){
var vertex=new Vector3();
vertex.x=srcVertices[ v ] * scale;
vertex.y=srcVertices[ v + 1 ] * scale;
vertex.z=srcVertices[ v + 2 ] * scale;
dstVertices.push(vertex);
}}
}
if(json.morphColors!==undefined&&json.morphColors.length > 0){
console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.');
var faces=geometry.faces;
var morphColors=json.morphColors[ 0 ].colors;
for(var i=0, l=faces.length; i < l; i ++){
faces[ i ].color.fromArray(morphColors, i * 3);
}}
}
function parseAnimations(json, geometry){
var outputAnimations=[];
var animations=[];
if(json.animation!==undefined){
animations.push(json.animation);
}
if(json.animations!==undefined){
if(json.animations.length){
animations=animations.concat(json.animations);
}else{
animations.push(json.animations);
}}
for(var i=0; i < animations.length; i ++){
var clip=AnimationClip.parseAnimation(animations[ i ], geometry.bones);
if(clip) outputAnimations.push(clip);
}
if(geometry.morphTargets){
var morphAnimationClips=AnimationClip.CreateClipsFromMorphTargetSequences(geometry.morphTargets, 10);
outputAnimations=outputAnimations.concat(morphAnimationClips);
}
if(outputAnimations.length > 0) geometry.animations=outputAnimations;
}
return function parse(json, texturePath){
if(json.data!==undefined){
json=json.data;
}
if(json.scale!==undefined){
json.scale=1.0 / json.scale;
}else{
json.scale=1.0;
}
var geometry=new Geometry();
parseModel(json, geometry);
parseSkin(json, geometry);
parseMorphing(json, geometry);
parseAnimations(json, geometry);
geometry.computeFaceNormals();
geometry.computeBoundingSphere();
if(json.materials===undefined||json.materials.length===0){
return { geometry: geometry };}else{
var materials=Loader.prototype.initMaterials(json.materials, texturePath, this.crossOrigin);
return { geometry: geometry, materials: materials };}};})()
});
function ObjectLoader(manager){
this.manager=(manager!==undefined) ? manager:DefaultLoadingManager;
this.texturePath='';
}
Object.assign(ObjectLoader.prototype, {
load: function(url, onLoad, onProgress, onError){
if(this.texturePath===''){
this.texturePath=url.substring(0, url.lastIndexOf('/') + 1);
}
var scope=this;
var loader=new FileLoader(scope.manager);
loader.load(url, function(text){
var json=null;
try {
json=JSON.parse(text);
} catch(error){
if(onError!==undefined) onError(error);
console.error('THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message);
return;
}
var metadata=json.metadata;
if(metadata===undefined||metadata.type===undefined||metadata.type.toLowerCase()==='geometry'){
console.error('THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.');
return;
}
scope.parse(json, onLoad);
}, onProgress, onError);
},
setTexturePath: function(value){
this.texturePath=value;
return this;
},
setCrossOrigin: function(value){
this.crossOrigin=value;
return this;
},
parse: function(json, onLoad){
var shapes=this.parseShape(json.shapes);
var geometries=this.parseGeometries(json.geometries, shapes);
var images=this.parseImages(json.images, function (){
if(onLoad!==undefined) onLoad(object);
});
var textures=this.parseTextures(json.textures, images);
var materials=this.parseMaterials(json.materials, textures);
var object=this.parseObject(json.object, geometries, materials);
if(json.animations){
object.animations=this.parseAnimations(json.animations);
}
if(json.images===undefined||json.images.length===0){
if(onLoad!==undefined) onLoad(object);
}
return object;
},
parseShape: function(json){
var shapes={};
if(json!==undefined){
for(var i=0, l=json.length; i < l; i ++){
var shape=new Shape().fromJSON(json[ i ]);
shapes[ shape.uuid ]=shape;
}}
return shapes;
},
parseGeometries: function(json, shapes){
var geometries={};
if(json!==undefined){
var geometryLoader=new JSONLoader();
var bufferGeometryLoader=new BufferGeometryLoader();
for(var i=0, l=json.length; i < l; i ++){
var geometry;
var data=json[ i ];
switch(data.type){
case 'PlaneGeometry':
case 'PlaneBufferGeometry':
geometry=new Geometries[ data.type ](
data.width,
data.height,
data.widthSegments,
data.heightSegments
);
break;
case 'BoxGeometry':
case 'BoxBufferGeometry':
case 'CubeGeometry':
geometry=new Geometries[ data.type ](
data.width,
data.height,
data.depth,
data.widthSegments,
data.heightSegments,
data.depthSegments
);
break;
case 'CircleGeometry':
case 'CircleBufferGeometry':
geometry=new Geometries[ data.type ](
data.radius,
data.segments,
data.thetaStart,
data.thetaLength
);
break;
case 'CylinderGeometry':
case 'CylinderBufferGeometry':
geometry=new Geometries[ data.type ](
data.radiusTop,
data.radiusBottom,
data.height,
data.radialSegments,
data.heightSegments,
data.openEnded,
data.thetaStart,
data.thetaLength
);
break;
case 'ConeGeometry':
case 'ConeBufferGeometry':
geometry=new Geometries[ data.type ](
data.radius,
data.height,
data.radialSegments,
data.heightSegments,
data.openEnded,
data.thetaStart,
data.thetaLength
);
break;
case 'SphereGeometry':
case 'SphereBufferGeometry':
geometry=new Geometries[ data.type ](
data.radius,
data.widthSegments,
data.heightSegments,
data.phiStart,
data.phiLength,
data.thetaStart,
data.thetaLength
);
break;
case 'DodecahedronGeometry':
case 'DodecahedronBufferGeometry':
case 'IcosahedronGeometry':
case 'IcosahedronBufferGeometry':
case 'OctahedronGeometry':
case 'OctahedronBufferGeometry':
case 'TetrahedronGeometry':
case 'TetrahedronBufferGeometry':
geometry=new Geometries[ data.type ](
data.radius,
data.detail
);
break;
case 'RingGeometry':
case 'RingBufferGeometry':
geometry=new Geometries[ data.type ](
data.innerRadius,
data.outerRadius,
data.thetaSegments,
data.phiSegments,
data.thetaStart,
data.thetaLength
);
break;
case 'TorusGeometry':
case 'TorusBufferGeometry':
geometry=new Geometries[ data.type ](
data.radius,
data.tube,
data.radialSegments,
data.tubularSegments,
data.arc
);
break;
case 'TorusKnotGeometry':
case 'TorusKnotBufferGeometry':
geometry=new Geometries[ data.type ](
data.radius,
data.tube,
data.tubularSegments,
data.radialSegments,
data.p,
data.q
);
break;
case 'LatheGeometry':
case 'LatheBufferGeometry':
geometry=new Geometries[ data.type ](
data.points,
data.segments,
data.phiStart,
data.phiLength
);
break;
case 'PolyhedronGeometry':
case 'PolyhedronBufferGeometry':
geometry=new Geometries[ data.type ](
data.vertices,
data.indices,
data.radius,
data.details
);
break;
case 'ShapeGeometry':
case 'ShapeBufferGeometry':
var geometryShapes=[];
for(var j=0, jl=data.shapes.length; j < jl; j ++){
var shape=shapes[ data.shapes[ j ] ];
geometryShapes.push(shape);
}
geometry=new Geometries[ data.type ](
geometryShapes,
data.curveSegments
);
break;
case 'ExtrudeGeometry':
case 'ExtrudeBufferGeometry':
var geometryShapes=[];
for(var j=0, jl=data.shapes.length; j < jl; j ++){
var shape=shapes[ data.shapes[ j ] ];
geometryShapes.push(shape);
}
var extrudePath=data.options.extrudePath;
if(extrudePath!==undefined){
data.options.extrudePath=new Curves[ extrudePath.type ]().fromJSON(extrudePath);
}
geometry=new Geometries[ data.type ](
geometryShapes,
data.options
);
break;
case 'BufferGeometry':
geometry=bufferGeometryLoader.parse(data);
break;
case 'Geometry':
geometry=geometryLoader.parse(data, this.texturePath).geometry;
break;
default:
console.warn('THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"');
continue;
}
geometry.uuid=data.uuid;
if(data.name!==undefined) geometry.name=data.name;
if(geometry.isBufferGeometry===true&&data.userData!==undefined) geometry.userData=data.userData;
geometries[ data.uuid ]=geometry;
}}
return geometries;
},
parseMaterials: function(json, textures){
var materials={};
if(json!==undefined){
var loader=new MaterialLoader();
loader.setTextures(textures);
for(var i=0, l=json.length; i < l; i ++){
var data=json[ i ];
if(data.type==='MultiMaterial'){
var array=[];
for(var j=0; j < data.materials.length; j ++){
array.push(loader.parse(data.materials[ j ]) );
}
materials[ data.uuid ]=array;
}else{
materials[ data.uuid ]=loader.parse(data);
}}
}
return materials;
},
parseAnimations: function(json){
var animations=[];
for(var i=0; i < json.length; i ++){
var data=json[ i ];
var clip=AnimationClip.parse(data);
if(data.uuid!==undefined) clip.uuid=data.uuid;
animations.push(clip);
}
return animations;
},
parseImages: function(json, onLoad){
var scope=this;
var images={};
function loadImage(url){
scope.manager.itemStart(url);
return loader.load(url, function (){
scope.manager.itemEnd(url);
}, undefined, function (){
scope.manager.itemEnd(url);
scope.manager.itemError(url);
});
}
if(json!==undefined&&json.length > 0){
var manager=new LoadingManager(onLoad);
var loader=new ImageLoader(manager);
loader.setCrossOrigin(this.crossOrigin);
for(var i=0, l=json.length; i < l; i ++){
var image=json[ i ];
var path=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(image.url) ? image.url:scope.texturePath + image.url;
images[ image.uuid ]=loadImage(path);
}}
return images;
},
parseTextures: function(json, images){
function parseConstant(value, type){
if(typeof value==='number') return value;
console.warn('THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value);
return type[ value ];
}
var textures={};
if(json!==undefined){
for(var i=0, l=json.length; i < l; i ++){
var data=json[ i ];
if(data.image===undefined){
console.warn('THREE.ObjectLoader: No "image" specified for', data.uuid);
}
if(images[ data.image ]===undefined){
console.warn('THREE.ObjectLoader: Undefined image', data.image);
}
var texture=new Texture(images[ data.image ]);
texture.needsUpdate=true;
texture.uuid=data.uuid;
if(data.name!==undefined) texture.name=data.name;
if(data.mapping!==undefined) texture.mapping=parseConstant(data.mapping, TEXTURE_MAPPING);
if(data.offset!==undefined) texture.offset.fromArray(data.offset);
if(data.repeat!==undefined) texture.repeat.fromArray(data.repeat);
if(data.center!==undefined) texture.center.fromArray(data.center);
if(data.rotation!==undefined) texture.rotation=data.rotation;
if(data.wrap!==undefined){
texture.wrapS=parseConstant(data.wrap[ 0 ], TEXTURE_WRAPPING);
texture.wrapT=parseConstant(data.wrap[ 1 ], TEXTURE_WRAPPING);
}
if(data.format!==undefined) texture.format=data.format;
if(data.minFilter!==undefined) texture.minFilter=parseConstant(data.minFilter, TEXTURE_FILTER);
if(data.magFilter!==undefined) texture.magFilter=parseConstant(data.magFilter, TEXTURE_FILTER);
if(data.anisotropy!==undefined) texture.anisotropy=data.anisotropy;
if(data.flipY!==undefined) texture.flipY=data.flipY;
textures[ data.uuid ]=texture;
}}
return textures;
},
parseObject: function(data, geometries, materials){
var object;
function getGeometry(name){
if(geometries[ name ]===undefined){
console.warn('THREE.ObjectLoader: Undefined geometry', name);
}
return geometries[ name ];
}
function getMaterial(name){
if(name===undefined) return undefined;
if(Array.isArray(name) ){
var array=[];
for(var i=0, l=name.length; i < l; i ++){
var uuid=name[ i ];
if(materials[ uuid ]===undefined){
console.warn('THREE.ObjectLoader: Undefined material', uuid);
}
array.push(materials[ uuid ]);
}
return array;
}
if(materials[ name ]===undefined){
console.warn('THREE.ObjectLoader: Undefined material', name);
}
return materials[ name ];
}
switch(data.type){
case 'Scene':
object=new Scene();
if(data.background!==undefined){
if(Number.isInteger(data.background) ){
object.background=new Color(data.background);
}}
if(data.fog!==undefined){
if(data.fog.type==='Fog'){
object.fog=new Fog(data.fog.color, data.fog.near, data.fog.far);
}else if(data.fog.type==='FogExp2'){
object.fog=new FogExp2(data.fog.color, data.fog.density);
}}
break;
case 'PerspectiveCamera':
object=new PerspectiveCamera(data.fov, data.aspect, data.near, data.far);
if(data.focus!==undefined) object.focus=data.focus;
if(data.zoom!==undefined) object.zoom=data.zoom;
if(data.filmGauge!==undefined) object.filmGauge=data.filmGauge;
if(data.filmOffset!==undefined) object.filmOffset=data.filmOffset;
if(data.view!==undefined) object.view=Object.assign({}, data.view);
break;
case 'OrthographicCamera':
object=new OrthographicCamera(data.left, data.right, data.top, data.bottom, data.near, data.far);
if(data.zoom!==undefined) object.zoom=data.zoom;
if(data.view!==undefined) object.view=Object.assign({}, data.view);
break;
case 'AmbientLight':
object=new AmbientLight(data.color, data.intensity);
break;
case 'DirectionalLight':
object=new DirectionalLight(data.color, data.intensity);
break;
case 'PointLight':
object=new PointLight(data.color, data.intensity, data.distance, data.decay);
break;
case 'RectAreaLight':
object=new RectAreaLight(data.color, data.intensity, data.width, data.height);
break;
case 'SpotLight':
object=new SpotLight(data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay);
break;
case 'HemisphereLight':
object=new HemisphereLight(data.color, data.groundColor, data.intensity);
break;
case 'SkinnedMesh':
console.warn('THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.');
case 'Mesh':
var geometry=getGeometry(data.geometry);
var material=getMaterial(data.material);
if(geometry.bones&&geometry.bones.length > 0){
object=new SkinnedMesh(geometry, material);
}else{
object=new Mesh(geometry, material);
}
break;
case 'LOD':
object=new LOD();
break;
case 'Line':
object=new Line(getGeometry(data.geometry), getMaterial(data.material), data.mode);
break;
case 'LineLoop':
object=new LineLoop(getGeometry(data.geometry), getMaterial(data.material) );
break;
case 'LineSegments':
object=new LineSegments(getGeometry(data.geometry), getMaterial(data.material) );
break;
case 'PointCloud':
case 'Points':
object=new Points(getGeometry(data.geometry), getMaterial(data.material) );
break;
case 'Sprite':
object=new Sprite(getMaterial(data.material) );
break;
case 'Group':
object=new Group();
break;
default:
object=new Object3D();
}
object.uuid=data.uuid;
if(data.name!==undefined) object.name=data.name;
if(data.matrix!==undefined){
object.matrix.fromArray(data.matrix);
if(data.matrixAutoUpdate!==undefined) object.matrixAutoUpdate=data.matrixAutoUpdate;
if(object.matrixAutoUpdate) object.matrix.decompose(object.position, object.quaternion, object.scale);
}else{
if(data.position!==undefined) object.position.fromArray(data.position);
if(data.rotation!==undefined) object.rotation.fromArray(data.rotation);
if(data.quaternion!==undefined) object.quaternion.fromArray(data.quaternion);
if(data.scale!==undefined) object.scale.fromArray(data.scale);
}
if(data.castShadow!==undefined) object.castShadow=data.castShadow;
if(data.receiveShadow!==undefined) object.receiveShadow=data.receiveShadow;
if(data.shadow){
if(data.shadow.bias!==undefined) object.shadow.bias=data.shadow.bias;
if(data.shadow.radius!==undefined) object.shadow.radius=data.shadow.radius;
if(data.shadow.mapSize!==undefined) object.shadow.mapSize.fromArray(data.shadow.mapSize);
if(data.shadow.camera!==undefined) object.shadow.camera=this.parseObject(data.shadow.camera);
}
if(data.visible!==undefined) object.visible=data.visible;
if(data.frustumCulled!==undefined) object.frustumCulled=data.frustumCulled;
if(data.renderOrder!==undefined) object.renderOrder=data.renderOrder;
if(data.userData!==undefined) object.userData=data.userData;
if(data.children!==undefined){
var children=data.children;
for(var i=0; i < children.length; i ++){
object.add(this.parseObject(children[ i ], geometries, materials) );
}}
if(data.type==='LOD'){
var levels=data.levels;
for(var l=0; l < levels.length; l ++){
var level=levels[ l ];
var child=object.getObjectByProperty('uuid', level.object);
if(child!==undefined){
object.addLevel(child, level.distance);
}}
}
return object;
}});
var TEXTURE_MAPPING={
UVMapping: UVMapping,
CubeReflectionMapping: CubeReflectionMapping,
CubeRefractionMapping: CubeRefractionMapping,
EquirectangularReflectionMapping: EquirectangularReflectionMapping,
EquirectangularRefractionMapping: EquirectangularRefractionMapping,
SphericalReflectionMapping: SphericalReflectionMapping,
CubeUVReflectionMapping: CubeUVReflectionMapping,
CubeUVRefractionMapping: CubeUVRefractionMapping
};
var TEXTURE_WRAPPING={
RepeatWrapping: RepeatWrapping,
ClampToEdgeWrapping: ClampToEdgeWrapping,
MirroredRepeatWrapping: MirroredRepeatWrapping
};
var TEXTURE_FILTER={
NearestFilter: NearestFilter,
NearestMipMapNearestFilter: NearestMipMapNearestFilter,
NearestMipMapLinearFilter: NearestMipMapLinearFilter,
LinearFilter: LinearFilter,
LinearMipMapNearestFilter: LinearMipMapNearestFilter,
LinearMipMapLinearFilter: LinearMipMapLinearFilter
};
function ShapePath(){
this.type='ShapePath';
this.color=new Color();
this.subPaths=[];
this.currentPath=null;
}
Object.assign(ShapePath.prototype, {
moveTo: function(x, y){
this.currentPath=new Path();
this.subPaths.push(this.currentPath);
this.currentPath.moveTo(x, y);
},
lineTo: function(x, y){
this.currentPath.lineTo(x, y);
},
quadraticCurveTo: function(aCPx, aCPy, aX, aY){
this.currentPath.quadraticCurveTo(aCPx, aCPy, aX, aY);
},
bezierCurveTo: function(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY){
this.currentPath.bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY);
},
splineThru: function(pts){
this.currentPath.splineThru(pts);
},
toShapes: function(isCCW, noHoles){
function toShapesNoHoles(inSubpaths){
var shapes=[];
for(var i=0, l=inSubpaths.length; i < l; i ++){
var tmpPath=inSubpaths[ i ];
var tmpShape=new Shape();
tmpShape.curves=tmpPath.curves;
shapes.push(tmpShape);
}
return shapes;
}
function isPointInsidePolygon(inPt, inPolygon){
var polyLen=inPolygon.length;
var inside=false;
for(var p=polyLen - 1, q=0; q < polyLen; p=q ++){
var edgeLowPt=inPolygon[ p ];
var edgeHighPt=inPolygon[ q ];
var edgeDx=edgeHighPt.x - edgeLowPt.x;
var edgeDy=edgeHighPt.y - edgeLowPt.y;
if(Math.abs(edgeDy) > Number.EPSILON){
if(edgeDy < 0){
edgeLowPt=inPolygon[ q ]; edgeDx=- edgeDx;
edgeHighPt=inPolygon[ p ]; edgeDy=- edgeDy;
}
if(( inPt.y < edgeLowPt.y)||(inPt.y > edgeHighPt.y) ) 		continue;
if(inPt.y===edgeLowPt.y){
if(inPt.x===edgeLowPt.x)		return	true;
}else{
var perpEdge=edgeDy *(inPt.x - edgeLowPt.x) - edgeDx *(inPt.y - edgeLowPt.y);
if(perpEdge===0)				return	true;
if(perpEdge < 0) 				continue;
inside = ! inside;
}}else{
if(inPt.y!==edgeLowPt.y) 		continue;
if(((edgeHighPt.x <=inPt.x)&&(inPt.x <=edgeLowPt.x) ) ||
(( edgeLowPt.x <=inPt.x)&&(inPt.x <=edgeHighPt.x) ))		return	true;
}}
return	inside;
}
var isClockWise=ShapeUtils.isClockWise;
var subPaths=this.subPaths;
if(subPaths.length===0) return [];
if(noHoles===true)	return	toShapesNoHoles(subPaths);
var solid, tmpPath, tmpShape, shapes=[];
if(subPaths.length===1){
tmpPath=subPaths[ 0 ];
tmpShape=new Shape();
tmpShape.curves=tmpPath.curves;
shapes.push(tmpShape);
return shapes;
}
var holesFirst = ! isClockWise(subPaths[ 0 ].getPoints());
holesFirst=isCCW ? ! holesFirst:holesFirst;
var betterShapeHoles=[];
var newShapes=[];
var newShapeHoles=[];
var mainIdx=0;
var tmpPoints;
newShapes[ mainIdx ]=undefined;
newShapeHoles[ mainIdx ]=[];
for(var i=0, l=subPaths.length; i < l; i ++){
tmpPath=subPaths[ i ];
tmpPoints=tmpPath.getPoints();
solid=isClockWise(tmpPoints);
solid=isCCW ? ! solid:solid;
if(solid){
if(( ! holesFirst)&&(newShapes[ mainIdx ]) )	mainIdx ++;
newShapes[ mainIdx ]={ s: new Shape(), p: tmpPoints };
newShapes[ mainIdx ].s.curves=tmpPath.curves;
if(holesFirst)	mainIdx ++;
newShapeHoles[ mainIdx ]=[];
}else{
newShapeHoles[ mainIdx ].push({ h: tmpPath, p: tmpPoints[ 0 ] });
}}
if(! newShapes[ 0 ])	return	toShapesNoHoles(subPaths);
if(newShapes.length > 1){
var ambiguous=false;
var toChange=[];
for(var sIdx=0, sLen=newShapes.length; sIdx < sLen; sIdx ++){
betterShapeHoles[ sIdx ]=[];
}
for(var sIdx=0, sLen=newShapes.length; sIdx < sLen; sIdx ++){
var sho=newShapeHoles[ sIdx ];
for(var hIdx=0; hIdx < sho.length; hIdx ++){
var ho=sho[ hIdx ];
var hole_unassigned=true;
for(var s2Idx=0; s2Idx < newShapes.length; s2Idx ++){
if(isPointInsidePolygon(ho.p, newShapes[ s2Idx ].p) ){
if(sIdx!==s2Idx)	toChange.push({ froms: sIdx, tos: s2Idx, hole: hIdx });
if(hole_unassigned){
hole_unassigned=false;
betterShapeHoles[ s2Idx ].push(ho);
}else{
ambiguous=true;
}}
}
if(hole_unassigned){
betterShapeHoles[ sIdx ].push(ho);
}}
}
if(toChange.length > 0){
if(! ambiguous)	newShapeHoles=betterShapeHoles;
}}
var tmpHoles;
for(var i=0, il=newShapes.length; i < il; i ++){
tmpShape=newShapes[ i ].s;
shapes.push(tmpShape);
tmpHoles=newShapeHoles[ i ];
for(var j=0, jl=tmpHoles.length; j < jl; j ++){
tmpShape.holes.push(tmpHoles[ j ].h);
}}
return shapes;
}});
function Font(data){
this.type='Font';
this.data=data;
}
Object.assign(Font.prototype, {
isFont: true,
generateShapes: function(text, size, divisions){
if(size===undefined) size=100;
if(divisions===undefined) divisions=4;
var shapes=[];
var paths=createPaths(text, size, divisions, this.data);
for(var p=0, pl=paths.length; p < pl; p ++){
Array.prototype.push.apply(shapes, paths[ p ].toShapes());
}
return shapes;
}});
function createPaths(text, size, divisions, data){
var chars=Array.from ? Array.from(text):String(text).split('');
var scale=size / data.resolution;
var line_height=(data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness) * scale;
var paths=[];
var offsetX=0, offsetY=0;
for(var i=0; i < chars.length; i ++){
var char=chars[ i ];
if(char==='\n'){
offsetX=0;
offsetY -=line_height;
}else{
var ret=createPath(char, divisions, scale, offsetX, offsetY, data);
offsetX +=ret.offsetX;
paths.push(ret.path);
}}
return paths;
}
function createPath(char, divisions, scale, offsetX, offsetY, data){
var glyph=data.glyphs[ char ]||data.glyphs[ '?' ];
if(! glyph) return;
var path=new ShapePath();
var x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;
if(glyph.o){
var outline=glyph._cachedOutline||(glyph._cachedOutline=glyph.o.split(' ') );
for(var i=0, l=outline.length; i < l;){
var action=outline[ i ++ ];
switch(action){
case 'm':
x=outline[ i ++ ] * scale + offsetX;
y=outline[ i ++ ] * scale + offsetY;
path.moveTo(x, y);
break;
case 'l':
x=outline[ i ++ ] * scale + offsetX;
y=outline[ i ++ ] * scale + offsetY;
path.lineTo(x, y);
break;
case 'q':
cpx=outline[ i ++ ] * scale + offsetX;
cpy=outline[ i ++ ] * scale + offsetY;
cpx1=outline[ i ++ ] * scale + offsetX;
cpy1=outline[ i ++ ] * scale + offsetY;
path.quadraticCurveTo(cpx1, cpy1, cpx, cpy);
break;
case 'b':
cpx=outline[ i ++ ] * scale + offsetX;
cpy=outline[ i ++ ] * scale + offsetY;
cpx1=outline[ i ++ ] * scale + offsetX;
cpy1=outline[ i ++ ] * scale + offsetY;
cpx2=outline[ i ++ ] * scale + offsetX;
cpy2=outline[ i ++ ] * scale + offsetY;
path.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, cpx, cpy);
break;
}}
}
return { offsetX: glyph.ha * scale, path: path };}
function FontLoader(manager){
this.manager=(manager!==undefined) ? manager:DefaultLoadingManager;
}
Object.assign(FontLoader.prototype, {
load: function(url, onLoad, onProgress, onError){
var scope=this;
var loader=new FileLoader(this.manager);
loader.setPath(this.path);
loader.load(url, function(text){
var json;
try {
json=JSON.parse(text);
} catch(e){
console.warn('THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.');
json=JSON.parse(text.substring(65, text.length - 2) );
}
var font=scope.parse(json);
if(onLoad) onLoad(font);
}, onProgress, onError);
},
parse: function(json){
return new Font(json);
},
setPath: function(value){
this.path=value;
return this;
}});
var context;
var AudioContext={
getContext: function (){
if(context===undefined){
context=new(window.AudioContext||window.webkitAudioContext)();
}
return context;
},
setContext: function(value){
context=value;
}};
function AudioLoader(manager){
this.manager=(manager!==undefined) ? manager:DefaultLoadingManager;
}
Object.assign(AudioLoader.prototype, {
load: function(url, onLoad, onProgress, onError){
var loader=new FileLoader(this.manager);
loader.setResponseType('arraybuffer');
loader.load(url, function(buffer){
var context=AudioContext.getContext();
context.decodeAudioData(buffer, function(audioBuffer){
onLoad(audioBuffer);
});
}, onProgress, onError);
}});
function StereoCamera(){
this.type='StereoCamera';
this.aspect=1;
this.eyeSep=0.064;
this.cameraL=new PerspectiveCamera();
this.cameraL.layers.enable(1);
this.cameraL.matrixAutoUpdate=false;
this.cameraR=new PerspectiveCamera();
this.cameraR.layers.enable(2);
this.cameraR.matrixAutoUpdate=false;
}
Object.assign(StereoCamera.prototype, {
update:(function (){
var instance, focus, fov, aspect, near, far, zoom, eyeSep;
var eyeRight=new Matrix4();
var eyeLeft=new Matrix4();
return function update(camera){
var needsUpdate=instance!==this||focus!==camera.focus||fov!==camera.fov ||
aspect!==camera.aspect * this.aspect||near!==camera.near ||
far!==camera.far||zoom!==camera.zoom||eyeSep!==this.eyeSep;
if(needsUpdate){
instance=this;
focus=camera.focus;
fov=camera.fov;
aspect=camera.aspect * this.aspect;
near=camera.near;
far=camera.far;
zoom=camera.zoom;
var projectionMatrix=camera.projectionMatrix.clone();
eyeSep=this.eyeSep / 2;
var eyeSepOnProjection=eyeSep * near / focus;
var ymax=(near * Math.tan(_Math.DEG2RAD * fov * 0.5) ) / zoom;
var xmin, xmax;
eyeLeft.elements[ 12 ]=- eyeSep;
eyeRight.elements[ 12 ]=eyeSep;
xmin=- ymax * aspect + eyeSepOnProjection;
xmax=ymax * aspect + eyeSepOnProjection;
projectionMatrix.elements[ 0 ]=2 * near /(xmax - xmin);
projectionMatrix.elements[ 8 ]=(xmax + xmin) /(xmax - xmin);
this.cameraL.projectionMatrix.copy(projectionMatrix);
xmin=- ymax * aspect - eyeSepOnProjection;
xmax=ymax * aspect - eyeSepOnProjection;
projectionMatrix.elements[ 0 ]=2 * near /(xmax - xmin);
projectionMatrix.elements[ 8 ]=(xmax + xmin) /(xmax - xmin);
this.cameraR.projectionMatrix.copy(projectionMatrix);
}
this.cameraL.matrixWorld.copy(camera.matrixWorld).multiply(eyeLeft);
this.cameraR.matrixWorld.copy(camera.matrixWorld).multiply(eyeRight);
};})()
});
function CubeCamera(near, far, cubeResolution){
Object3D.call(this);
this.type='CubeCamera';
var fov=90, aspect=1;
var cameraPX=new PerspectiveCamera(fov, aspect, near, far);
cameraPX.up.set(0, - 1, 0);
cameraPX.lookAt(new Vector3(1, 0, 0) );
this.add(cameraPX);
var cameraNX=new PerspectiveCamera(fov, aspect, near, far);
cameraNX.up.set(0, - 1, 0);
cameraNX.lookAt(new Vector3(- 1, 0, 0) );
this.add(cameraNX);
var cameraPY=new PerspectiveCamera(fov, aspect, near, far);
cameraPY.up.set(0, 0, 1);
cameraPY.lookAt(new Vector3(0, 1, 0) );
this.add(cameraPY);
var cameraNY=new PerspectiveCamera(fov, aspect, near, far);
cameraNY.up.set(0, 0, - 1);
cameraNY.lookAt(new Vector3(0, - 1, 0) );
this.add(cameraNY);
var cameraPZ=new PerspectiveCamera(fov, aspect, near, far);
cameraPZ.up.set(0, - 1, 0);
cameraPZ.lookAt(new Vector3(0, 0, 1) );
this.add(cameraPZ);
var cameraNZ=new PerspectiveCamera(fov, aspect, near, far);
cameraNZ.up.set(0, - 1, 0);
cameraNZ.lookAt(new Vector3(0, 0, - 1) );
this.add(cameraNZ);
var options={ format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };
this.renderTarget=new WebGLRenderTargetCube(cubeResolution, cubeResolution, options);
this.renderTarget.texture.name="CubeCamera";
this.update=function(renderer, scene){
if(this.parent===null) this.updateMatrixWorld();
var renderTarget=this.renderTarget;
var generateMipmaps=renderTarget.texture.generateMipmaps;
renderTarget.texture.generateMipmaps=false;
renderTarget.activeCubeFace=0;
renderer.render(scene, cameraPX, renderTarget);
renderTarget.activeCubeFace=1;
renderer.render(scene, cameraNX, renderTarget);
renderTarget.activeCubeFace=2;
renderer.render(scene, cameraPY, renderTarget);
renderTarget.activeCubeFace=3;
renderer.render(scene, cameraNY, renderTarget);
renderTarget.activeCubeFace=4;
renderer.render(scene, cameraPZ, renderTarget);
renderTarget.texture.generateMipmaps=generateMipmaps;
renderTarget.activeCubeFace=5;
renderer.render(scene, cameraNZ, renderTarget);
renderer.setRenderTarget(null);
};
this.clear=function(renderer, color, depth, stencil){
var renderTarget=this.renderTarget;
for(var i=0; i < 6; i ++){
renderTarget.activeCubeFace=i;
renderer.setRenderTarget(renderTarget);
renderer.clear(color, depth, stencil);
}
renderer.setRenderTarget(null);
};}
CubeCamera.prototype=Object.create(Object3D.prototype);
CubeCamera.prototype.constructor=CubeCamera;
function AudioListener(){
Object3D.call(this);
this.type='AudioListener';
this.context=AudioContext.getContext();
this.gain=this.context.createGain();
this.gain.connect(this.context.destination);
this.filter=null;
}
AudioListener.prototype=Object.assign(Object.create(Object3D.prototype), {
constructor: AudioListener,
getInput: function (){
return this.gain;
},
removeFilter: function(){
if(this.filter!==null){
this.gain.disconnect(this.filter);
this.filter.disconnect(this.context.destination);
this.gain.connect(this.context.destination);
this.filter=null;
}},
getFilter: function (){
return this.filter;
},
setFilter: function(value){
if(this.filter!==null){
this.gain.disconnect(this.filter);
this.filter.disconnect(this.context.destination);
}else{
this.gain.disconnect(this.context.destination);
}
this.filter=value;
this.gain.connect(this.filter);
this.filter.connect(this.context.destination);
},
getMasterVolume: function (){
return this.gain.gain.value;
},
setMasterVolume: function(value){
this.gain.gain.setTargetAtTime(value, this.context.currentTime, 0.01);
},
updateMatrixWorld:(function (){
var position=new Vector3();
var quaternion=new Quaternion();
var scale=new Vector3();
var orientation=new Vector3();
return function updateMatrixWorld(force){
Object3D.prototype.updateMatrixWorld.call(this, force);
var listener=this.context.listener;
var up=this.up;
this.matrixWorld.decompose(position, quaternion, scale);
orientation.set(0, 0, - 1).applyQuaternion(quaternion);
if(listener.positionX){
listener.positionX.setValueAtTime(position.x, this.context.currentTime);
listener.positionY.setValueAtTime(position.y, this.context.currentTime);
listener.positionZ.setValueAtTime(position.z, this.context.currentTime);
listener.forwardX.setValueAtTime(orientation.x, this.context.currentTime);
listener.forwardY.setValueAtTime(orientation.y, this.context.currentTime);
listener.forwardZ.setValueAtTime(orientation.z, this.context.currentTime);
listener.upX.setValueAtTime(up.x, this.context.currentTime);
listener.upY.setValueAtTime(up.y, this.context.currentTime);
listener.upZ.setValueAtTime(up.z, this.context.currentTime);
}else{
listener.setPosition(position.x, position.y, position.z);
listener.setOrientation(orientation.x, orientation.y, orientation.z, up.x, up.y, up.z);
}};})()
});
function Audio(listener){
Object3D.call(this);
this.type='Audio';
this.context=listener.context;
this.gain=this.context.createGain();
this.gain.connect(listener.getInput());
this.autoplay=false;
this.buffer=null;
this.loop=false;
this.startTime=0;
this.offset=0;
this.playbackRate=1;
this.isPlaying=false;
this.hasPlaybackControl=true;
this.sourceType='empty';
this.filters=[];
}
Audio.prototype=Object.assign(Object.create(Object3D.prototype), {
constructor: Audio,
getOutput: function (){
return this.gain;
},
setNodeSource: function(audioNode){
this.hasPlaybackControl=false;
this.sourceType='audioNode';
this.source=audioNode;
this.connect();
return this;
},
setMediaElementSource: function(mediaElement){
this.hasPlaybackControl=false;
this.sourceType='mediaNode';
this.source=this.context.createMediaElementSource(mediaElement);
this.connect();
return this;
},
setBuffer: function(audioBuffer){
this.buffer=audioBuffer;
this.sourceType='buffer';
if(this.autoplay) this.play();
return this;
},
play: function (){
if(this.isPlaying===true){
console.warn('THREE.Audio: Audio is already playing.');
return;
}
if(this.hasPlaybackControl===false){
console.warn('THREE.Audio: this Audio has no playback control.');
return;
}
var source=this.context.createBufferSource();
source.buffer=this.buffer;
source.loop=this.loop;
source.onended=this.onEnded.bind(this);
source.playbackRate.setValueAtTime(this.playbackRate, this.startTime);
this.startTime=this.context.currentTime;
source.start(this.startTime, this.offset);
this.isPlaying=true;
this.source=source;
return this.connect();
},
pause: function (){
if(this.hasPlaybackControl===false){
console.warn('THREE.Audio: this Audio has no playback control.');
return;
}
if(this.isPlaying===true){
this.source.stop();
this.offset +=(this.context.currentTime - this.startTime) * this.playbackRate;
this.isPlaying=false;
}
return this;
},
stop: function (){
if(this.hasPlaybackControl===false){
console.warn('THREE.Audio: this Audio has no playback control.');
return;
}
this.source.stop();
this.offset=0;
this.isPlaying=false;
return this;
},
connect: function (){
if(this.filters.length > 0){
this.source.connect(this.filters[ 0 ]);
for(var i=1, l=this.filters.length; i < l; i ++){
this.filters[ i - 1 ].connect(this.filters[ i ]);
}
this.filters[ this.filters.length - 1 ].connect(this.getOutput());
}else{
this.source.connect(this.getOutput());
}
return this;
},
disconnect: function (){
if(this.filters.length > 0){
this.source.disconnect(this.filters[ 0 ]);
for(var i=1, l=this.filters.length; i < l; i ++){
this.filters[ i - 1 ].disconnect(this.filters[ i ]);
}
this.filters[ this.filters.length - 1 ].disconnect(this.getOutput());
}else{
this.source.disconnect(this.getOutput());
}
return this;
},
getFilters: function (){
return this.filters;
},
setFilters: function(value){
if(! value) value=[];
if(this.isPlaying===true){
this.disconnect();
this.filters=value;
this.connect();
}else{
this.filters=value;
}
return this;
},
getFilter: function (){
return this.getFilters()[ 0 ];
},
setFilter: function(filter){
return this.setFilters(filter ? [ filter ]:[]);
},
setPlaybackRate: function(value){
if(this.hasPlaybackControl===false){
console.warn('THREE.Audio: this Audio has no playback control.');
return;
}
this.playbackRate=value;
if(this.isPlaying===true){
this.source.playbackRate.setValueAtTime(this.playbackRate, this.context.currentTime);
}
return this;
},
getPlaybackRate: function (){
return this.playbackRate;
},
onEnded: function (){
this.isPlaying=false;
},
getLoop: function (){
if(this.hasPlaybackControl===false){
console.warn('THREE.Audio: this Audio has no playback control.');
return false;
}
return this.loop;
},
setLoop: function(value){
if(this.hasPlaybackControl===false){
console.warn('THREE.Audio: this Audio has no playback control.');
return;
}
this.loop=value;
if(this.isPlaying===true){
this.source.loop=this.loop;
}
return this;
},
getVolume: function (){
return this.gain.gain.value;
},
setVolume: function(value){
this.gain.gain.setTargetAtTime(value, this.context.currentTime, 0.01);
return this;
}});
function PositionalAudio(listener){
Audio.call(this, listener);
this.panner=this.context.createPanner();
this.panner.connect(this.gain);
}
PositionalAudio.prototype=Object.assign(Object.create(Audio.prototype), {
constructor: PositionalAudio,
getOutput: function (){
return this.panner;
},
getRefDistance: function (){
return this.panner.refDistance;
},
setRefDistance: function(value){
this.panner.refDistance=value;
},
getRolloffFactor: function (){
return this.panner.rolloffFactor;
},
setRolloffFactor: function(value){
this.panner.rolloffFactor=value;
},
getDistanceModel: function (){
return this.panner.distanceModel;
},
setDistanceModel: function(value){
this.panner.distanceModel=value;
},
getMaxDistance: function (){
return this.panner.maxDistance;
},
setMaxDistance: function(value){
this.panner.maxDistance=value;
},
updateMatrixWorld:(function (){
var position=new Vector3();
return function updateMatrixWorld(force){
Object3D.prototype.updateMatrixWorld.call(this, force);
position.setFromMatrixPosition(this.matrixWorld);
this.panner.setPosition(position.x, position.y, position.z);
};})()
});
function AudioAnalyser(audio, fftSize){
this.analyser=audio.context.createAnalyser();
this.analyser.fftSize=fftSize!==undefined ? fftSize:2048;
this.data=new Uint8Array(this.analyser.frequencyBinCount);
audio.getOutput().connect(this.analyser);
}
Object.assign(AudioAnalyser.prototype, {
getFrequencyData: function (){
this.analyser.getByteFrequencyData(this.data);
return this.data;
},
getAverageFrequency: function (){
var value=0, data=this.getFrequencyData();
for(var i=0; i < data.length; i ++){
value +=data[ i ];
}
return value / data.length;
}});
function PropertyMixer(binding, typeName, valueSize){
this.binding=binding;
this.valueSize=valueSize;
var bufferType=Float64Array,
mixFunction;
switch(typeName){
case 'quaternion':
mixFunction=this._slerp;
break;
case 'string':
case 'bool':
bufferType=Array;
mixFunction=this._select;
break;
default:
mixFunction=this._lerp;
}
this.buffer=new bufferType(valueSize * 4);
this._mixBufferRegion=mixFunction;
this.cumulativeWeight=0;
this.useCount=0;
this.referenceCount=0;
}
Object.assign(PropertyMixer.prototype, {
accumulate: function(accuIndex, weight){
var buffer=this.buffer,
stride=this.valueSize,
offset=accuIndex * stride + stride,
currentWeight=this.cumulativeWeight;
if(currentWeight===0){
for(var i=0; i!==stride; ++ i){
buffer[ offset + i ]=buffer[ i ];
}
currentWeight=weight;
}else{
currentWeight +=weight;
var mix=weight / currentWeight;
this._mixBufferRegion(buffer, offset, 0, mix, stride);
}
this.cumulativeWeight=currentWeight;
},
apply: function(accuIndex){
var stride=this.valueSize,
buffer=this.buffer,
offset=accuIndex * stride + stride,
weight=this.cumulativeWeight,
binding=this.binding;
this.cumulativeWeight=0;
if(weight < 1){
var originalValueOffset=stride * 3;
this._mixBufferRegion(buffer, offset, originalValueOffset, 1 - weight, stride);
}
for(var i=stride, e=stride + stride; i!==e; ++ i){
if(buffer[ i ]!==buffer[ i + stride ]){
binding.setValue(buffer, offset);
break;
}}
},
saveOriginalState: function (){
var binding=this.binding;
var buffer=this.buffer,
stride=this.valueSize,
originalValueOffset=stride * 3;
binding.getValue(buffer, originalValueOffset);
for(var i=stride, e=originalValueOffset; i!==e; ++ i){
buffer[ i ]=buffer[ originalValueOffset +(i % stride) ];
}
this.cumulativeWeight=0;
},
restoreOriginalState: function (){
var originalValueOffset=this.valueSize * 3;
this.binding.setValue(this.buffer, originalValueOffset);
},
_select: function(buffer, dstOffset, srcOffset, t, stride){
if(t >=0.5){
for(var i=0; i!==stride; ++ i){
buffer[ dstOffset + i ]=buffer[ srcOffset + i ];
}}
},
_slerp: function(buffer, dstOffset, srcOffset, t){
Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t);
},
_lerp: function(buffer, dstOffset, srcOffset, t, stride){
var s=1 - t;
for(var i=0; i!==stride; ++ i){
var j=dstOffset + i;
buffer[ j ]=buffer[ j ] * s + buffer[ srcOffset + i ] * t;
}}
});
var RESERVED_CHARS_RE='\\[\\]\\.:\\/';
function Composite(targetGroup, path, optionalParsedPath){
var parsedPath=optionalParsedPath||PropertyBinding.parseTrackName(path);
this._targetGroup=targetGroup;
this._bindings=targetGroup.subscribe_(path, parsedPath);
}
Object.assign(Composite.prototype, {
getValue: function(array, offset){
this.bind();
var firstValidIndex=this._targetGroup.nCachedObjects_,
binding=this._bindings[ firstValidIndex ];
if(binding!==undefined) binding.getValue(array, offset);
},
setValue: function(array, offset){
var bindings=this._bindings;
for(var i=this._targetGroup.nCachedObjects_,
n=bindings.length; i!==n; ++ i){
bindings[ i ].setValue(array, offset);
}},
bind: function (){
var bindings=this._bindings;
for(var i=this._targetGroup.nCachedObjects_,
n=bindings.length; i!==n; ++ i){
bindings[ i ].bind();
}},
unbind: function (){
var bindings=this._bindings;
for(var i=this._targetGroup.nCachedObjects_,
n=bindings.length; i!==n; ++ i){
bindings[ i ].unbind();
}}
});
function PropertyBinding(rootNode, path, parsedPath){
this.path=path;
this.parsedPath=parsedPath||PropertyBinding.parseTrackName(path);
this.node=PropertyBinding.findNode(rootNode, this.parsedPath.nodeName)||rootNode;
this.rootNode=rootNode;
}
Object.assign(PropertyBinding, {
Composite: Composite,
create: function(root, path, parsedPath){
if(!(root&&root.isAnimationObjectGroup) ){
return new PropertyBinding(root, path, parsedPath);
}else{
return new PropertyBinding.Composite(root, path, parsedPath);
}},
sanitizeNodeName:(function (){
var reservedRe=new RegExp('[' + RESERVED_CHARS_RE + ']', 'g');
return function sanitizeNodeName(name){
return name.replace(/\s/g, '_').replace(reservedRe, '');
};}()),
parseTrackName: function (){
var wordChar='[^' + RESERVED_CHARS_RE + ']';
var wordCharOrDot='[^' + RESERVED_CHARS_RE.replace('\\.', '') + ']';
var directoryRe=/((?:WC+[\/:])*)/.source.replace('WC', wordChar);
var nodeRe=/(WCOD+)?/.source.replace('WCOD', wordCharOrDot);
var objectRe=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace('WC', wordChar);
var propertyRe=/\.(WC+)(?:\[(.+)\])?/.source.replace('WC', wordChar);
var trackRe=new RegExp(''
+ '^'
+ directoryRe
+ nodeRe
+ objectRe
+ propertyRe
+ '$'
);
var supportedObjectNames=[ 'material', 'materials', 'bones' ];
return function parseTrackName(trackName){
var matches=trackRe.exec(trackName);
if(! matches){
throw new Error('PropertyBinding: Cannot parse trackName: ' + trackName);
}
var results={
nodeName: matches[ 2 ],
objectName: matches[ 3 ],
objectIndex: matches[ 4 ],
propertyName: matches[ 5 ],
propertyIndex: matches[ 6 ]
};
var lastDot=results.nodeName&&results.nodeName.lastIndexOf('.');
if(lastDot!==undefined&&lastDot!==- 1){
var objectName=results.nodeName.substring(lastDot + 1);
if(supportedObjectNames.indexOf(objectName)!==- 1){
results.nodeName=results.nodeName.substring(0, lastDot);
results.objectName=objectName;
}}
if(results.propertyName===null||results.propertyName.length===0){
throw new Error('PropertyBinding: can not parse propertyName from trackName: ' + trackName);
}
return results;
};}(),
findNode: function(root, nodeName){
if(! nodeName||nodeName===""||nodeName==="root"||nodeName==="."||nodeName===- 1||nodeName===root.name||nodeName===root.uuid){
return root;
}
if(root.skeleton){
var bone=root.skeleton.getBoneByName(nodeName);
if(bone!==undefined){
return bone;
}}
if(root.children){
var searchNodeSubtree=function(children){
for(var i=0; i < children.length; i ++){
var childNode=children[ i ];
if(childNode.name===nodeName||childNode.uuid===nodeName){
return childNode;
}
var result=searchNodeSubtree(childNode.children);
if(result) return result;
}
return null;
};
var subTreeNode=searchNodeSubtree(root.children);
if(subTreeNode){
return subTreeNode;
}}
return null;
}});
Object.assign(PropertyBinding.prototype, {
_getValue_unavailable: function (){},
_setValue_unavailable: function (){},
BindingType: {
Direct: 0,
EntireArray: 1,
ArrayElement: 2,
HasFromToArray: 3
},
Versioning: {
None: 0,
NeedsUpdate: 1,
MatrixWorldNeedsUpdate: 2
},
GetterByBindingType: [
function getValue_direct(buffer, offset){
buffer[ offset ]=this.node[ this.propertyName ];
},
function getValue_array(buffer, offset){
var source=this.resolvedProperty;
for(var i=0, n=source.length; i!==n; ++ i){
buffer[ offset ++ ]=source[ i ];
}},
function getValue_arrayElement(buffer, offset){
buffer[ offset ]=this.resolvedProperty[ this.propertyIndex ];
},
function getValue_toArray(buffer, offset){
this.resolvedProperty.toArray(buffer, offset);
}
],
SetterByBindingTypeAndVersioning: [
[
function setValue_direct(buffer, offset){
this.targetObject[ this.propertyName ]=buffer[ offset ];
},
function setValue_direct_setNeedsUpdate(buffer, offset){
this.targetObject[ this.propertyName ]=buffer[ offset ];
this.targetObject.needsUpdate=true;
},
function setValue_direct_setMatrixWorldNeedsUpdate(buffer, offset){
this.targetObject[ this.propertyName ]=buffer[ offset ];
this.targetObject.matrixWorldNeedsUpdate=true;
}
], [
function setValue_array(buffer, offset){
var dest=this.resolvedProperty;
for(var i=0, n=dest.length; i!==n; ++ i){
dest[ i ]=buffer[ offset ++ ];
}},
function setValue_array_setNeedsUpdate(buffer, offset){
var dest=this.resolvedProperty;
for(var i=0, n=dest.length; i!==n; ++ i){
dest[ i ]=buffer[ offset ++ ];
}
this.targetObject.needsUpdate=true;
},
function setValue_array_setMatrixWorldNeedsUpdate(buffer, offset){
var dest=this.resolvedProperty;
for(var i=0, n=dest.length; i!==n; ++ i){
dest[ i ]=buffer[ offset ++ ];
}
this.targetObject.matrixWorldNeedsUpdate=true;
}
], [
function setValue_arrayElement(buffer, offset){
this.resolvedProperty[ this.propertyIndex ]=buffer[ offset ];
},
function setValue_arrayElement_setNeedsUpdate(buffer, offset){
this.resolvedProperty[ this.propertyIndex ]=buffer[ offset ];
this.targetObject.needsUpdate=true;
},
function setValue_arrayElement_setMatrixWorldNeedsUpdate(buffer, offset){
this.resolvedProperty[ this.propertyIndex ]=buffer[ offset ];
this.targetObject.matrixWorldNeedsUpdate=true;
}
], [
function setValue_fromArray(buffer, offset){
this.resolvedProperty.fromArray(buffer, offset);
},
function setValue_fromArray_setNeedsUpdate(buffer, offset){
this.resolvedProperty.fromArray(buffer, offset);
this.targetObject.needsUpdate=true;
},
function setValue_fromArray_setMatrixWorldNeedsUpdate(buffer, offset){
this.resolvedProperty.fromArray(buffer, offset);
this.targetObject.matrixWorldNeedsUpdate=true;
}
]
],
getValue: function getValue_unbound(targetArray, offset){
this.bind();
this.getValue(targetArray, offset);
},
setValue: function getValue_unbound(sourceArray, offset){
this.bind();
this.setValue(sourceArray, offset);
},
bind: function (){
var targetObject=this.node,
parsedPath=this.parsedPath,
objectName=parsedPath.objectName,
propertyName=parsedPath.propertyName,
propertyIndex=parsedPath.propertyIndex;
if(! targetObject){
targetObject=PropertyBinding.findNode(this.rootNode, parsedPath.nodeName)||this.rootNode;
this.node=targetObject;
}
this.getValue=this._getValue_unavailable;
this.setValue=this._setValue_unavailable;
if(! targetObject){
console.error('THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.');
return;
}
if(objectName){
var objectIndex=parsedPath.objectIndex;
switch(objectName){
case 'materials':
if(! targetObject.material){
console.error('THREE.PropertyBinding: Can not bind to material as node does not have a material.', this);
return;
}
if(! targetObject.material.materials){
console.error('THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this);
return;
}
targetObject=targetObject.material.materials;
break;
case 'bones':
if(! targetObject.skeleton){
console.error('THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this);
return;
}
targetObject=targetObject.skeleton.bones;
for(var i=0; i < targetObject.length; i ++){
if(targetObject[ i ].name===objectIndex){
objectIndex=i;
break;
}}
break;
default:
if(targetObject[ objectName ]===undefined){
console.error('THREE.PropertyBinding: Can not bind to objectName of node undefined.', this);
return;
}
targetObject=targetObject[ objectName ];
}
if(objectIndex!==undefined){
if(targetObject[ objectIndex ]===undefined){
console.error('THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject);
return;
}
targetObject=targetObject[ objectIndex ];
}}
var nodeProperty=targetObject[ propertyName ];
if(nodeProperty===undefined){
var nodeName=parsedPath.nodeName;
console.error('THREE.PropertyBinding: Trying to update property for track: ' + nodeName +
'.' + propertyName + ' but it wasn\'t found.', targetObject);
return;
}
var versioning=this.Versioning.None;
if(targetObject.needsUpdate!==undefined){
versioning=this.Versioning.NeedsUpdate;
this.targetObject=targetObject;
}else if(targetObject.matrixWorldNeedsUpdate!==undefined){
versioning=this.Versioning.MatrixWorldNeedsUpdate;
this.targetObject=targetObject;
}
var bindingType=this.BindingType.Direct;
if(propertyIndex!==undefined){
if(propertyName==="morphTargetInfluences"){
if(! targetObject.geometry){
console.error('THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this);
return;
}
if(targetObject.geometry.isBufferGeometry){
if(! targetObject.geometry.morphAttributes){
console.error('THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this);
return;
}
for(var i=0; i < this.node.geometry.morphAttributes.position.length; i ++){
if(targetObject.geometry.morphAttributes.position[ i ].name===propertyIndex){
propertyIndex=i;
break;
}}
}else{
if(! targetObject.geometry.morphTargets){
console.error('THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this);
return;
}
for(var i=0; i < this.node.geometry.morphTargets.length; i ++){
if(targetObject.geometry.morphTargets[ i ].name===propertyIndex){
propertyIndex=i;
break;
}}
}}
bindingType=this.BindingType.ArrayElement;
this.resolvedProperty=nodeProperty;
this.propertyIndex=propertyIndex;
}else if(nodeProperty.fromArray!==undefined&&nodeProperty.toArray!==undefined){
bindingType=this.BindingType.HasFromToArray;
this.resolvedProperty=nodeProperty;
}else if(Array.isArray(nodeProperty) ){
bindingType=this.BindingType.EntireArray;
this.resolvedProperty=nodeProperty;
}else{
this.propertyName=propertyName;
}
this.getValue=this.GetterByBindingType[ bindingType ];
this.setValue=this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];
},
unbind: function (){
this.node=null;
this.getValue=this._getValue_unbound;
this.setValue=this._setValue_unbound;
}});
Object.assign(PropertyBinding.prototype, {
_getValue_unbound: PropertyBinding.prototype.getValue,
_setValue_unbound: PropertyBinding.prototype.setValue,
});
function AnimationObjectGroup(){
this.uuid=_Math.generateUUID();
this._objects=Array.prototype.slice.call(arguments);
this.nCachedObjects_=0;
var indices={};
this._indicesByUUID=indices;
for(var i=0, n=arguments.length; i!==n; ++ i){
indices[ arguments[ i ].uuid ]=i;
}
this._paths=[];
this._parsedPaths=[];
this._bindings=[];
this._bindingsIndicesByPath={};
var scope=this;
this.stats={
objects: {
get total(){
return scope._objects.length;
},
get inUse(){
return this.total - scope.nCachedObjects_;
}},
get bindingsPerObject(){
return scope._bindings.length;
}};}
Object.assign(AnimationObjectGroup.prototype, {
isAnimationObjectGroup: true,
add: function (){
var objects=this._objects,
nObjects=objects.length,
nCachedObjects=this.nCachedObjects_,
indicesByUUID=this._indicesByUUID,
paths=this._paths,
parsedPaths=this._parsedPaths,
bindings=this._bindings,
nBindings=bindings.length,
knownObject=undefined;
for(var i=0, n=arguments.length; i!==n; ++ i){
var object=arguments[ i ],
uuid=object.uuid,
index=indicesByUUID[ uuid ];
if(index===undefined){
index=nObjects ++;
indicesByUUID[ uuid ]=index;
objects.push(object);
for(var j=0, m=nBindings; j!==m; ++ j){
bindings[ j ].push(new PropertyBinding(object, paths[ j ], parsedPaths[ j ]) );
}}else if(index < nCachedObjects){
knownObject=objects[ index ];
var firstActiveIndex=-- nCachedObjects,
lastCachedObject=objects[ firstActiveIndex ];
indicesByUUID[ lastCachedObject.uuid ]=index;
objects[ index ]=lastCachedObject;
indicesByUUID[ uuid ]=firstActiveIndex;
objects[ firstActiveIndex ]=object;
for(var j=0, m=nBindings; j!==m; ++ j){
var bindingsForPath=bindings[ j ],
lastCached=bindingsForPath[ firstActiveIndex ],
binding=bindingsForPath[ index ];
bindingsForPath[ index ]=lastCached;
if(binding===undefined){
binding=new PropertyBinding(object, paths[ j ], parsedPaths[ j ]);
}
bindingsForPath[ firstActiveIndex ]=binding;
}}else if(objects[ index ]!==knownObject){
console.error('THREE.AnimationObjectGroup: Different objects with the same UUID ' +
'detected. Clean the caches or recreate your infrastructure when reloading scenes.');
}}
this.nCachedObjects_=nCachedObjects;
},
remove: function (){
var objects=this._objects,
nCachedObjects=this.nCachedObjects_,
indicesByUUID=this._indicesByUUID,
bindings=this._bindings,
nBindings=bindings.length;
for(var i=0, n=arguments.length; i!==n; ++ i){
var object=arguments[ i ],
uuid=object.uuid,
index=indicesByUUID[ uuid ];
if(index!==undefined&&index >=nCachedObjects){
var lastCachedIndex=nCachedObjects ++,
firstActiveObject=objects[ lastCachedIndex ];
indicesByUUID[ firstActiveObject.uuid ]=index;
objects[ index ]=firstActiveObject;
indicesByUUID[ uuid ]=lastCachedIndex;
objects[ lastCachedIndex ]=object;
for(var j=0, m=nBindings; j!==m; ++ j){
var bindingsForPath=bindings[ j ],
firstActive=bindingsForPath[ lastCachedIndex ],
binding=bindingsForPath[ index ];
bindingsForPath[ index ]=firstActive;
bindingsForPath[ lastCachedIndex ]=binding;
}}
}
this.nCachedObjects_=nCachedObjects;
},
uncache: function (){
var objects=this._objects,
nObjects=objects.length,
nCachedObjects=this.nCachedObjects_,
indicesByUUID=this._indicesByUUID,
bindings=this._bindings,
nBindings=bindings.length;
for(var i=0, n=arguments.length; i!==n; ++ i){
var object=arguments[ i ],
uuid=object.uuid,
index=indicesByUUID[ uuid ];
if(index!==undefined){
delete indicesByUUID[ uuid ];
if(index < nCachedObjects){
var firstActiveIndex=-- nCachedObjects,
lastCachedObject=objects[ firstActiveIndex ],
lastIndex=-- nObjects,
lastObject=objects[ lastIndex ];
indicesByUUID[ lastCachedObject.uuid ]=index;
objects[ index ]=lastCachedObject;
indicesByUUID[ lastObject.uuid ]=firstActiveIndex;
objects[ firstActiveIndex ]=lastObject;
objects.pop();
for(var j=0, m=nBindings; j!==m; ++ j){
var bindingsForPath=bindings[ j ],
lastCached=bindingsForPath[ firstActiveIndex ],
last=bindingsForPath[ lastIndex ];
bindingsForPath[ index ]=lastCached;
bindingsForPath[ firstActiveIndex ]=last;
bindingsForPath.pop();
}}else{
var lastIndex=-- nObjects,
lastObject=objects[ lastIndex ];
indicesByUUID[ lastObject.uuid ]=index;
objects[ index ]=lastObject;
objects.pop();
for(var j=0, m=nBindings; j!==m; ++ j){
var bindingsForPath=bindings[ j ];
bindingsForPath[ index ]=bindingsForPath[ lastIndex ];
bindingsForPath.pop();
}}
}}
this.nCachedObjects_=nCachedObjects;
},
subscribe_: function(path, parsedPath){
var indicesByPath=this._bindingsIndicesByPath,
index=indicesByPath[ path ],
bindings=this._bindings;
if(index!==undefined) return bindings[ index ];
var paths=this._paths,
parsedPaths=this._parsedPaths,
objects=this._objects,
nObjects=objects.length,
nCachedObjects=this.nCachedObjects_,
bindingsForPath=new Array(nObjects);
index=bindings.length;
indicesByPath[ path ]=index;
paths.push(path);
parsedPaths.push(parsedPath);
bindings.push(bindingsForPath);
for(var i=nCachedObjects, n=objects.length; i!==n; ++ i){
var object=objects[ i ];
bindingsForPath[ i ]=new PropertyBinding(object, path, parsedPath);
}
return bindingsForPath;
},
unsubscribe_: function(path){
var indicesByPath=this._bindingsIndicesByPath,
index=indicesByPath[ path ];
if(index!==undefined){
var paths=this._paths,
parsedPaths=this._parsedPaths,
bindings=this._bindings,
lastBindingsIndex=bindings.length - 1,
lastBindings=bindings[ lastBindingsIndex ],
lastBindingsPath=path[ lastBindingsIndex ];
indicesByPath[ lastBindingsPath ]=index;
bindings[ index ]=lastBindings;
bindings.pop();
parsedPaths[ index ]=parsedPaths[ lastBindingsIndex ];
parsedPaths.pop();
paths[ index ]=paths[ lastBindingsIndex ];
paths.pop();
}}
});
function AnimationAction(mixer, clip, localRoot){
this._mixer=mixer;
this._clip=clip;
this._localRoot=localRoot||null;
var tracks=clip.tracks,
nTracks=tracks.length,
interpolants=new Array(nTracks);
var interpolantSettings={
endingStart: ZeroCurvatureEnding,
endingEnd: ZeroCurvatureEnding
};
for(var i=0; i!==nTracks; ++ i){
var interpolant=tracks[ i ].createInterpolant(null);
interpolants[ i ]=interpolant;
interpolant.settings=interpolantSettings;
}
this._interpolantSettings=interpolantSettings;
this._interpolants=interpolants;
this._propertyBindings=new Array(nTracks);
this._cacheIndex=null;
this._byClipCacheIndex=null;
this._timeScaleInterpolant=null;
this._weightInterpolant=null;
this.loop=LoopRepeat;
this._loopCount=- 1;
this._startTime=null;
this.time=0;
this.timeScale=1;
this._effectiveTimeScale=1;
this.weight=1;
this._effectiveWeight=1;
this.repetitions=Infinity;
this.paused=false;
this.enabled=true;
this.clampWhenFinished=false;
this.zeroSlopeAtStart=true;
this.zeroSlopeAtEnd=true;
}
Object.assign(AnimationAction.prototype, {
play: function (){
this._mixer._activateAction(this);
return this;
},
stop: function (){
this._mixer._deactivateAction(this);
return this.reset();
},
reset: function (){
this.paused=false;
this.enabled=true;
this.time=0;
this._loopCount=- 1;
this._startTime=null;
return this.stopFading().stopWarping();
},
isRunning: function (){
return this.enabled&&! this.paused&&this.timeScale!==0 &&
this._startTime===null&&this._mixer._isActiveAction(this);
},
isScheduled: function (){
return this._mixer._isActiveAction(this);
},
startAt: function(time){
this._startTime=time;
return this;
},
setLoop: function(mode, repetitions){
this.loop=mode;
this.repetitions=repetitions;
return this;
},
setEffectiveWeight: function(weight){
this.weight=weight;
this._effectiveWeight=this.enabled ? weight:0;
return this.stopFading();
},
getEffectiveWeight: function (){
return this._effectiveWeight;
},
fadeIn: function(duration){
return this._scheduleFading(duration, 0, 1);
},
fadeOut: function(duration){
return this._scheduleFading(duration, 1, 0);
},
crossFadeFrom: function(fadeOutAction, duration, warp){
fadeOutAction.fadeOut(duration);
this.fadeIn(duration);
if(warp){
var fadeInDuration=this._clip.duration,
fadeOutDuration=fadeOutAction._clip.duration,
startEndRatio=fadeOutDuration / fadeInDuration,
endStartRatio=fadeInDuration / fadeOutDuration;
fadeOutAction.warp(1.0, startEndRatio, duration);
this.warp(endStartRatio, 1.0, duration);
}
return this;
},
crossFadeTo: function(fadeInAction, duration, warp){
return fadeInAction.crossFadeFrom(this, duration, warp);
},
stopFading: function (){
var weightInterpolant=this._weightInterpolant;
if(weightInterpolant!==null){
this._weightInterpolant=null;
this._mixer._takeBackControlInterpolant(weightInterpolant);
}
return this;
},
setEffectiveTimeScale: function(timeScale){
this.timeScale=timeScale;
this._effectiveTimeScale=this.paused ? 0:timeScale;
return this.stopWarping();
},
getEffectiveTimeScale: function (){
return this._effectiveTimeScale;
},
setDuration: function(duration){
this.timeScale=this._clip.duration / duration;
return this.stopWarping();
},
syncWith: function(action){
this.time=action.time;
this.timeScale=action.timeScale;
return this.stopWarping();
},
halt: function(duration){
return this.warp(this._effectiveTimeScale, 0, duration);
},
warp: function(startTimeScale, endTimeScale, duration){
var mixer=this._mixer, now=mixer.time,
interpolant=this._timeScaleInterpolant,
timeScale=this.timeScale;
if(interpolant===null){
interpolant=mixer._lendControlInterpolant();
this._timeScaleInterpolant=interpolant;
}
var times=interpolant.parameterPositions,
values=interpolant.sampleValues;
times[ 0 ]=now;
times[ 1 ]=now + duration;
values[ 0 ]=startTimeScale / timeScale;
values[ 1 ]=endTimeScale / timeScale;
return this;
},
stopWarping: function (){
var timeScaleInterpolant=this._timeScaleInterpolant;
if(timeScaleInterpolant!==null){
this._timeScaleInterpolant=null;
this._mixer._takeBackControlInterpolant(timeScaleInterpolant);
}
return this;
},
getMixer: function (){
return this._mixer;
},
getClip: function (){
return this._clip;
},
getRoot: function (){
return this._localRoot||this._mixer._root;
},
_update: function(time, deltaTime, timeDirection, accuIndex){
if(! this.enabled){
this._updateWeight(time);
return;
}
var startTime=this._startTime;
if(startTime!==null){
var timeRunning=(time - startTime) * timeDirection;
if(timeRunning < 0||timeDirection===0){
return;
}
this._startTime=null;
deltaTime=timeDirection * timeRunning;
}
deltaTime *=this._updateTimeScale(time);
var clipTime=this._updateTime(deltaTime);
var weight=this._updateWeight(time);
if(weight > 0){
var interpolants=this._interpolants;
var propertyMixers=this._propertyBindings;
for(var j=0, m=interpolants.length; j!==m; ++ j){
interpolants[ j ].evaluate(clipTime);
propertyMixers[ j ].accumulate(accuIndex, weight);
}}
},
_updateWeight: function(time){
var weight=0;
if(this.enabled){
weight=this.weight;
var interpolant=this._weightInterpolant;
if(interpolant!==null){
var interpolantValue=interpolant.evaluate(time)[ 0 ];
weight *=interpolantValue;
if(time > interpolant.parameterPositions[ 1 ]){
this.stopFading();
if(interpolantValue===0){
this.enabled=false;
}}
}}
this._effectiveWeight=weight;
return weight;
},
_updateTimeScale: function(time){
var timeScale=0;
if(! this.paused){
timeScale=this.timeScale;
var interpolant=this._timeScaleInterpolant;
if(interpolant!==null){
var interpolantValue=interpolant.evaluate(time)[ 0 ];
timeScale *=interpolantValue;
if(time > interpolant.parameterPositions[ 1 ]){
this.stopWarping();
if(timeScale===0){
this.paused=true;
}else{
this.timeScale=timeScale;
}}
}}
this._effectiveTimeScale=timeScale;
return timeScale;
},
_updateTime: function(deltaTime){
var time=this.time + deltaTime;
if(deltaTime===0) return time;
var duration=this._clip.duration,
loop=this.loop,
loopCount=this._loopCount;
if(loop===LoopOnce){
if(loopCount===- 1){
this._loopCount=0;
this._setEndings(true, true, false);
}
handle_stop: {
if(time >=duration){
time=duration;
}else if(time < 0){
time=0;
} else break handle_stop;
if(this.clampWhenFinished) this.paused=true;
else this.enabled=false;
this._mixer.dispatchEvent({
type: 'finished', action: this,
direction: deltaTime < 0 ? - 1:1
});
}}else{
var pingPong=(loop===LoopPingPong);
if(loopCount===- 1){
if(deltaTime >=0){
loopCount=0;
this._setEndings(true, this.repetitions===0, pingPong);
}else{
this._setEndings(this.repetitions===0, true, pingPong);
}}
if(time >=duration||time < 0){
var loopDelta=Math.floor(time / duration);
time -=duration * loopDelta;
loopCount +=Math.abs(loopDelta);
var pending=this.repetitions - loopCount;
if(pending <=0){
if(this.clampWhenFinished) this.paused=true;
else this.enabled=false;
time=deltaTime > 0 ? duration:0;
this._mixer.dispatchEvent({
type: 'finished', action: this,
direction: deltaTime > 0 ? 1:- 1
});
}else{
if(pending===1){
var atStart=deltaTime < 0;
this._setEndings(atStart, ! atStart, pingPong);
}else{
this._setEndings(false, false, pingPong);
}
this._loopCount=loopCount;
this._mixer.dispatchEvent({
type: 'loop', action: this, loopDelta: loopDelta
});
}}
if(pingPong&&(loopCount & 1)===1){
this.time=time;
return duration - time;
}}
this.time=time;
return time;
},
_setEndings: function(atStart, atEnd, pingPong){
var settings=this._interpolantSettings;
if(pingPong){
settings.endingStart=ZeroSlopeEnding;
settings.endingEnd=ZeroSlopeEnding;
}else{
if(atStart){
settings.endingStart=this.zeroSlopeAtStart ? ZeroSlopeEnding:ZeroCurvatureEnding;
}else{
settings.endingStart=WrapAroundEnding;
}
if(atEnd){
settings.endingEnd=this.zeroSlopeAtEnd ? ZeroSlopeEnding:ZeroCurvatureEnding;
}else{
settings.endingEnd=WrapAroundEnding;
}}
},
_scheduleFading: function(duration, weightNow, weightThen){
var mixer=this._mixer, now=mixer.time,
interpolant=this._weightInterpolant;
if(interpolant===null){
interpolant=mixer._lendControlInterpolant();
this._weightInterpolant=interpolant;
}
var times=interpolant.parameterPositions,
values=interpolant.sampleValues;
times[ 0 ]=now; 				values[ 0 ]=weightNow;
times[ 1 ]=now + duration;	values[ 1 ]=weightThen;
return this;
}});
function AnimationMixer(root){
this._root=root;
this._initMemoryManager();
this._accuIndex=0;
this.time=0;
this.timeScale=1.0;
}
AnimationMixer.prototype=Object.assign(Object.create(EventDispatcher.prototype), {
constructor: AnimationMixer,
_bindAction: function(action, prototypeAction){
var root=action._localRoot||this._root,
tracks=action._clip.tracks,
nTracks=tracks.length,
bindings=action._propertyBindings,
interpolants=action._interpolants,
rootUuid=root.uuid,
bindingsByRoot=this._bindingsByRootAndName,
bindingsByName=bindingsByRoot[ rootUuid ];
if(bindingsByName===undefined){
bindingsByName={};
bindingsByRoot[ rootUuid ]=bindingsByName;
}
for(var i=0; i!==nTracks; ++ i){
var track=tracks[ i ],
trackName=track.name,
binding=bindingsByName[ trackName ];
if(binding!==undefined){
bindings[ i ]=binding;
}else{
binding=bindings[ i ];
if(binding!==undefined){
if(binding._cacheIndex===null){
++ binding.referenceCount;
this._addInactiveBinding(binding, rootUuid, trackName);
}
continue;
}
var path=prototypeAction&&prototypeAction.
_propertyBindings[ i ].binding.parsedPath;
binding=new PropertyMixer(
PropertyBinding.create(root, trackName, path),
track.ValueTypeName, track.getValueSize());
++ binding.referenceCount;
this._addInactiveBinding(binding, rootUuid, trackName);
bindings[ i ]=binding;
}
interpolants[ i ].resultBuffer=binding.buffer;
}},
_activateAction: function(action){
if(! this._isActiveAction(action) ){
if(action._cacheIndex===null){
var rootUuid=(action._localRoot||this._root).uuid,
clipUuid=action._clip.uuid,
actionsForClip=this._actionsByClip[ clipUuid ];
this._bindAction(action,
actionsForClip&&actionsForClip.knownActions[ 0 ]);
this._addInactiveAction(action, clipUuid, rootUuid);
}
var bindings=action._propertyBindings;
for(var i=0, n=bindings.length; i!==n; ++ i){
var binding=bindings[ i ];
if(binding.useCount ++===0){
this._lendBinding(binding);
binding.saveOriginalState();
}}
this._lendAction(action);
}},
_deactivateAction: function(action){
if(this._isActiveAction(action) ){
var bindings=action._propertyBindings;
for(var i=0, n=bindings.length; i!==n; ++ i){
var binding=bindings[ i ];
if(-- binding.useCount===0){
binding.restoreOriginalState();
this._takeBackBinding(binding);
}}
this._takeBackAction(action);
}},
_initMemoryManager: function (){
this._actions=[]; // 'nActiveActions' followed by inactive ones
this._nActiveActions=0;
this._actionsByClip={};
this._bindings=[]; // 'nActiveBindings' followed by inactive ones
this._nActiveBindings=0;
this._bindingsByRootAndName={};
this._controlInterpolants=[];
this._nActiveControlInterpolants=0;
var scope=this;
this.stats={
actions: {
get total(){
return scope._actions.length;
},
get inUse(){
return scope._nActiveActions;
}},
bindings: {
get total(){
return scope._bindings.length;
},
get inUse(){
return scope._nActiveBindings;
}},
controlInterpolants: {
get total(){
return scope._controlInterpolants.length;
},
get inUse(){
return scope._nActiveControlInterpolants;
}}
};},
_isActiveAction: function(action){
var index=action._cacheIndex;
return index!==null&&index < this._nActiveActions;
},
_addInactiveAction: function(action, clipUuid, rootUuid){
var actions=this._actions,
actionsByClip=this._actionsByClip,
actionsForClip=actionsByClip[ clipUuid ];
if(actionsForClip===undefined){
actionsForClip={
knownActions: [ action ],
actionByRoot: {}};
action._byClipCacheIndex=0;
actionsByClip[ clipUuid ]=actionsForClip;
}else{
var knownActions=actionsForClip.knownActions;
action._byClipCacheIndex=knownActions.length;
knownActions.push(action);
}
action._cacheIndex=actions.length;
actions.push(action);
actionsForClip.actionByRoot[ rootUuid ]=action;
},
_removeInactiveAction: function(action){
var actions=this._actions,
lastInactiveAction=actions[ actions.length - 1 ],
cacheIndex=action._cacheIndex;
lastInactiveAction._cacheIndex=cacheIndex;
actions[ cacheIndex ]=lastInactiveAction;
actions.pop();
action._cacheIndex=null;
var clipUuid=action._clip.uuid,
actionsByClip=this._actionsByClip,
actionsForClip=actionsByClip[ clipUuid ],
knownActionsForClip=actionsForClip.knownActions,
lastKnownAction =
knownActionsForClip[ knownActionsForClip.length - 1 ],
byClipCacheIndex=action._byClipCacheIndex;
lastKnownAction._byClipCacheIndex=byClipCacheIndex;
knownActionsForClip[ byClipCacheIndex ]=lastKnownAction;
knownActionsForClip.pop();
action._byClipCacheIndex=null;
var actionByRoot=actionsForClip.actionByRoot,
rootUuid=(action._localRoot||this._root).uuid;
delete actionByRoot[ rootUuid ];
if(knownActionsForClip.length===0){
delete actionsByClip[ clipUuid ];
}
this._removeInactiveBindingsForAction(action);
},
_removeInactiveBindingsForAction: function(action){
var bindings=action._propertyBindings;
for(var i=0, n=bindings.length; i!==n; ++ i){
var binding=bindings[ i ];
if(-- binding.referenceCount===0){
this._removeInactiveBinding(binding);
}}
},
_lendAction: function(action){
var actions=this._actions,
prevIndex=action._cacheIndex,
lastActiveIndex=this._nActiveActions ++,
firstInactiveAction=actions[ lastActiveIndex ];
action._cacheIndex=lastActiveIndex;
actions[ lastActiveIndex ]=action;
firstInactiveAction._cacheIndex=prevIndex;
actions[ prevIndex ]=firstInactiveAction;
},
_takeBackAction: function(action){
var actions=this._actions,
prevIndex=action._cacheIndex,
firstInactiveIndex=-- this._nActiveActions,
lastActiveAction=actions[ firstInactiveIndex ];
action._cacheIndex=firstInactiveIndex;
actions[ firstInactiveIndex ]=action;
lastActiveAction._cacheIndex=prevIndex;
actions[ prevIndex ]=lastActiveAction;
},
_addInactiveBinding: function(binding, rootUuid, trackName){
var bindingsByRoot=this._bindingsByRootAndName,
bindingByName=bindingsByRoot[ rootUuid ],
bindings=this._bindings;
if(bindingByName===undefined){
bindingByName={};
bindingsByRoot[ rootUuid ]=bindingByName;
}
bindingByName[ trackName ]=binding;
binding._cacheIndex=bindings.length;
bindings.push(binding);
},
_removeInactiveBinding: function(binding){
var bindings=this._bindings,
propBinding=binding.binding,
rootUuid=propBinding.rootNode.uuid,
trackName=propBinding.path,
bindingsByRoot=this._bindingsByRootAndName,
bindingByName=bindingsByRoot[ rootUuid ],
lastInactiveBinding=bindings[ bindings.length - 1 ],
cacheIndex=binding._cacheIndex;
lastInactiveBinding._cacheIndex=cacheIndex;
bindings[ cacheIndex ]=lastInactiveBinding;
bindings.pop();
delete bindingByName[ trackName ];
remove_empty_map: {
for(var _ in bindingByName) break remove_empty_map;
delete bindingsByRoot[ rootUuid ];
}},
_lendBinding: function(binding){
var bindings=this._bindings,
prevIndex=binding._cacheIndex,
lastActiveIndex=this._nActiveBindings ++,
firstInactiveBinding=bindings[ lastActiveIndex ];
binding._cacheIndex=lastActiveIndex;
bindings[ lastActiveIndex ]=binding;
firstInactiveBinding._cacheIndex=prevIndex;
bindings[ prevIndex ]=firstInactiveBinding;
},
_takeBackBinding: function(binding){
var bindings=this._bindings,
prevIndex=binding._cacheIndex,
firstInactiveIndex=-- this._nActiveBindings,
lastActiveBinding=bindings[ firstInactiveIndex ];
binding._cacheIndex=firstInactiveIndex;
bindings[ firstInactiveIndex ]=binding;
lastActiveBinding._cacheIndex=prevIndex;
bindings[ prevIndex ]=lastActiveBinding;
},
_lendControlInterpolant: function (){
var interpolants=this._controlInterpolants,
lastActiveIndex=this._nActiveControlInterpolants ++,
interpolant=interpolants[ lastActiveIndex ];
if(interpolant===undefined){
interpolant=new LinearInterpolant(
new Float32Array(2), new Float32Array(2),
1, this._controlInterpolantsResultBuffer);
interpolant.__cacheIndex=lastActiveIndex;
interpolants[ lastActiveIndex ]=interpolant;
}
return interpolant;
},
_takeBackControlInterpolant: function(interpolant){
var interpolants=this._controlInterpolants,
prevIndex=interpolant.__cacheIndex,
firstInactiveIndex=-- this._nActiveControlInterpolants,
lastActiveInterpolant=interpolants[ firstInactiveIndex ];
interpolant.__cacheIndex=firstInactiveIndex;
interpolants[ firstInactiveIndex ]=interpolant;
lastActiveInterpolant.__cacheIndex=prevIndex;
interpolants[ prevIndex ]=lastActiveInterpolant;
},
_controlInterpolantsResultBuffer: new Float32Array(1),
clipAction: function(clip, optionalRoot){
var root=optionalRoot||this._root,
rootUuid=root.uuid,
clipObject=typeof clip==='string' ?
AnimationClip.findByName(root, clip):clip,
clipUuid=clipObject!==null ? clipObject.uuid:clip,
actionsForClip=this._actionsByClip[ clipUuid ],
prototypeAction=null;
if(actionsForClip!==undefined){
var existingAction =
actionsForClip.actionByRoot[ rootUuid ];
if(existingAction!==undefined){
return existingAction;
}
prototypeAction=actionsForClip.knownActions[ 0 ];
if(clipObject===null)
clipObject=prototypeAction._clip;
}
if(clipObject===null) return null;
var newAction=new AnimationAction(this, clipObject, optionalRoot);
this._bindAction(newAction, prototypeAction);
this._addInactiveAction(newAction, clipUuid, rootUuid);
return newAction;
},
existingAction: function(clip, optionalRoot){
var root=optionalRoot||this._root,
rootUuid=root.uuid,
clipObject=typeof clip==='string' ?
AnimationClip.findByName(root, clip):clip,
clipUuid=clipObject ? clipObject.uuid:clip,
actionsForClip=this._actionsByClip[ clipUuid ];
if(actionsForClip!==undefined){
return actionsForClip.actionByRoot[ rootUuid ]||null;
}
return null;
},
stopAllAction: function (){
var actions=this._actions,
nActions=this._nActiveActions,
bindings=this._bindings,
nBindings=this._nActiveBindings;
this._nActiveActions=0;
this._nActiveBindings=0;
for(var i=0; i!==nActions; ++ i){
actions[ i ].reset();
}
for(var i=0; i!==nBindings; ++ i){
bindings[ i ].useCount=0;
}
return this;
},
update: function(deltaTime){
deltaTime *=this.timeScale;
var actions=this._actions,
nActions=this._nActiveActions,
time=this.time +=deltaTime,
timeDirection=Math.sign(deltaTime),
accuIndex=this._accuIndex ^=1;
for(var i=0; i!==nActions; ++ i){
var action=actions[ i ];
action._update(time, deltaTime, timeDirection, accuIndex);
}
var bindings=this._bindings,
nBindings=this._nActiveBindings;
for(var i=0; i!==nBindings; ++ i){
bindings[ i ].apply(accuIndex);
}
return this;
},
getRoot: function (){
return this._root;
},
uncacheClip: function(clip){
var actions=this._actions,
clipUuid=clip.uuid,
actionsByClip=this._actionsByClip,
actionsForClip=actionsByClip[ clipUuid ];
if(actionsForClip!==undefined){
var actionsToRemove=actionsForClip.knownActions;
for(var i=0, n=actionsToRemove.length; i!==n; ++ i){
var action=actionsToRemove[ i ];
this._deactivateAction(action);
var cacheIndex=action._cacheIndex,
lastInactiveAction=actions[ actions.length - 1 ];
action._cacheIndex=null;
action._byClipCacheIndex=null;
lastInactiveAction._cacheIndex=cacheIndex;
actions[ cacheIndex ]=lastInactiveAction;
actions.pop();
this._removeInactiveBindingsForAction(action);
}
delete actionsByClip[ clipUuid ];
}},
uncacheRoot: function(root){
var rootUuid=root.uuid,
actionsByClip=this._actionsByClip;
for(var clipUuid in actionsByClip){
var actionByRoot=actionsByClip[ clipUuid ].actionByRoot,
action=actionByRoot[ rootUuid ];
if(action!==undefined){
this._deactivateAction(action);
this._removeInactiveAction(action);
}}
var bindingsByRoot=this._bindingsByRootAndName,
bindingByName=bindingsByRoot[ rootUuid ];
if(bindingByName!==undefined){
for(var trackName in bindingByName){
var binding=bindingByName[ trackName ];
binding.restoreOriginalState();
this._removeInactiveBinding(binding);
}}
},
uncacheAction: function(clip, optionalRoot){
var action=this.existingAction(clip, optionalRoot);
if(action!==null){
this._deactivateAction(action);
this._removeInactiveAction(action);
}}
});
function Uniform(value){
if(typeof value==='string'){
console.warn('THREE.Uniform: Type parameter is no longer needed.');
value=arguments[ 1 ];
}
this.value=value;
}
Uniform.prototype.clone=function (){
return new Uniform(this.value.clone===undefined ? this.value:this.value.clone());
};
function InstancedBufferGeometry(){
BufferGeometry.call(this);
this.type='InstancedBufferGeometry';
this.maxInstancedCount=undefined;
}
InstancedBufferGeometry.prototype=Object.assign(Object.create(BufferGeometry.prototype), {
constructor: InstancedBufferGeometry,
isInstancedBufferGeometry: true,
copy: function(source){
BufferGeometry.prototype.copy.call(this, source);
this.maxInstancedCount=source.maxInstancedCount;
return this;
},
clone: function (){
return new this.constructor().copy(this);
}});
function InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, normalized){
this.data=interleavedBuffer;
this.itemSize=itemSize;
this.offset=offset;
this.normalized=normalized===true;
}
Object.defineProperties(InterleavedBufferAttribute.prototype, {
count: {
get: function (){
return this.data.count;
}},
array: {
get: function (){
return this.data.array;
}}
});
Object.assign(InterleavedBufferAttribute.prototype, {
isInterleavedBufferAttribute: true,
setX: function(index, x){
this.data.array[ index * this.data.stride + this.offset ]=x;
return this;
},
setY: function(index, y){
this.data.array[ index * this.data.stride + this.offset + 1 ]=y;
return this;
},
setZ: function(index, z){
this.data.array[ index * this.data.stride + this.offset + 2 ]=z;
return this;
},
setW: function(index, w){
this.data.array[ index * this.data.stride + this.offset + 3 ]=w;
return this;
},
getX: function(index){
return this.data.array[ index * this.data.stride + this.offset ];
},
getY: function(index){
return this.data.array[ index * this.data.stride + this.offset + 1 ];
},
getZ: function(index){
return this.data.array[ index * this.data.stride + this.offset + 2 ];
},
getW: function(index){
return this.data.array[ index * this.data.stride + this.offset + 3 ];
},
setXY: function(index, x, y){
index=index * this.data.stride + this.offset;
this.data.array[ index + 0 ]=x;
this.data.array[ index + 1 ]=y;
return this;
},
setXYZ: function(index, x, y, z){
index=index * this.data.stride + this.offset;
this.data.array[ index + 0 ]=x;
this.data.array[ index + 1 ]=y;
this.data.array[ index + 2 ]=z;
return this;
},
setXYZW: function(index, x, y, z, w){
index=index * this.data.stride + this.offset;
this.data.array[ index + 0 ]=x;
this.data.array[ index + 1 ]=y;
this.data.array[ index + 2 ]=z;
this.data.array[ index + 3 ]=w;
return this;
}});
function InterleavedBuffer(array, stride){
this.array=array;
this.stride=stride;
this.count=array!==undefined ? array.length / stride:0;
this.dynamic=false;
this.updateRange={ offset: 0, count: - 1 };
this.version=0;
}
Object.defineProperty(InterleavedBuffer.prototype, 'needsUpdate', {
set: function(value){
if(value===true) this.version ++;
}});
Object.assign(InterleavedBuffer.prototype, {
isInterleavedBuffer: true,
onUploadCallback: function (){},
setArray: function(array){
if(Array.isArray(array) ){
throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');
}
this.count=array!==undefined ? array.length / this.stride:0;
this.array=array;
return this;
},
setDynamic: function(value){
this.dynamic=value;
return this;
},
copy: function(source){
this.array=new source.array.constructor(source.array);
this.count=source.count;
this.stride=source.stride;
this.dynamic=source.dynamic;
return this;
},
copyAt: function(index1, attribute, index2){
index1 *=this.stride;
index2 *=attribute.stride;
for(var i=0, l=this.stride; i < l; i ++){
this.array[ index1 + i ]=attribute.array[ index2 + i ];
}
return this;
},
set: function(value, offset){
if(offset===undefined) offset=0;
this.array.set(value, offset);
return this;
},
clone: function (){
return new this.constructor().copy(this);
},
onUpload: function(callback){
this.onUploadCallback=callback;
return this;
}});
function InstancedInterleavedBuffer(array, stride, meshPerAttribute){
InterleavedBuffer.call(this, array, stride);
this.meshPerAttribute=meshPerAttribute||1;
}
InstancedInterleavedBuffer.prototype=Object.assign(Object.create(InterleavedBuffer.prototype), {
constructor: InstancedInterleavedBuffer,
isInstancedInterleavedBuffer: true,
copy: function(source){
InterleavedBuffer.prototype.copy.call(this, source);
this.meshPerAttribute=source.meshPerAttribute;
return this;
}});
function InstancedBufferAttribute(array, itemSize, meshPerAttribute){
BufferAttribute.call(this, array, itemSize);
this.meshPerAttribute=meshPerAttribute||1;
}
InstancedBufferAttribute.prototype=Object.assign(Object.create(BufferAttribute.prototype), {
constructor: InstancedBufferAttribute,
isInstancedBufferAttribute: true,
copy: function(source){
BufferAttribute.prototype.copy.call(this, source);
this.meshPerAttribute=source.meshPerAttribute;
return this;
}});
function Raycaster(origin, direction, near, far){
this.ray=new Ray(origin, direction);
this.near=near||0;
this.far=far||Infinity;
this.params={
Mesh: {},
Line: {},
LOD: {},
Points: { threshold: 1 },
Sprite: {}};
Object.defineProperties(this.params, {
PointCloud: {
get: function (){
console.warn('THREE.Raycaster: params.PointCloud has been renamed to params.Points.');
return this.Points;
}}
});
}
function ascSort(a, b){
return a.distance - b.distance;
}
function intersectObject(object, raycaster, intersects, recursive){
if(object.visible===false) return;
object.raycast(raycaster, intersects);
if(recursive===true){
var children=object.children;
for(var i=0, l=children.length; i < l; i ++){
intersectObject(children[ i ], raycaster, intersects, true);
}}
}
Object.assign(Raycaster.prototype, {
linePrecision: 1,
set: function(origin, direction){
this.ray.set(origin, direction);
},
setFromCamera: function(coords, camera){
if(( camera&&camera.isPerspectiveCamera) ){
this.ray.origin.setFromMatrixPosition(camera.matrixWorld);
this.ray.direction.set(coords.x, coords.y, 0.5).unproject(camera).sub(this.ray.origin).normalize();
}else if(( camera&&camera.isOrthographicCamera) ){
this.ray.origin.set(coords.x, coords.y,(camera.near + camera.far) /(camera.near - camera.far) ).unproject(camera);
this.ray.direction.set(0, 0, - 1).transformDirection(camera.matrixWorld);
}else{
console.error('THREE.Raycaster: Unsupported camera type.');
}},
intersectObject: function(object, recursive, optionalTarget){
var intersects=optionalTarget||[];
intersectObject(object, this, intersects, recursive);
intersects.sort(ascSort);
return intersects;
},
intersectObjects: function(objects, recursive, optionalTarget){
var intersects=optionalTarget||[];
if(Array.isArray(objects)===false){
console.warn('THREE.Raycaster.intersectObjects: objects is not an Array.');
return intersects;
}
for(var i=0, l=objects.length; i < l; i ++){
intersectObject(objects[ i ], this, intersects, recursive);
}
intersects.sort(ascSort);
return intersects;
}});
function Clock(autoStart){
this.autoStart=(autoStart!==undefined) ? autoStart:true;
this.startTime=0;
this.oldTime=0;
this.elapsedTime=0;
this.running=false;
}
Object.assign(Clock.prototype, {
start: function (){
this.startTime=(typeof performance==='undefined' ? Date:performance).now();
this.oldTime=this.startTime;
this.elapsedTime=0;
this.running=true;
},
stop: function (){
this.getElapsedTime();
this.running=false;
this.autoStart=false;
},
getElapsedTime: function (){
this.getDelta();
return this.elapsedTime;
},
getDelta: function (){
var diff=0;
if(this.autoStart&&! this.running){
this.start();
return 0;
}
if(this.running){
var newTime=(typeof performance==='undefined' ? Date:performance).now();
diff=(newTime - this.oldTime) / 1000;
this.oldTime=newTime;
this.elapsedTime +=diff;
}
return diff;
}});
function Spherical(radius, phi, theta){
this.radius=(radius!==undefined) ? radius:1.0;
this.phi=(phi!==undefined) ? phi:0;
this.theta=(theta!==undefined) ? theta:0;
return this;
}
Object.assign(Spherical.prototype, {
set: function(radius, phi, theta){
this.radius=radius;
this.phi=phi;
this.theta=theta;
return this;
},
clone: function (){
return new this.constructor().copy(this);
},
copy: function(other){
this.radius=other.radius;
this.phi=other.phi;
this.theta=other.theta;
return this;
},
makeSafe: function (){
var EPS=0.000001;
this.phi=Math.max(EPS, Math.min(Math.PI - EPS, this.phi) );
return this;
},
setFromVector3: function(vec3){
this.radius=vec3.length();
if(this.radius===0){
this.theta=0;
this.phi=0;
}else{
this.theta=Math.atan2(vec3.x, vec3.z);
this.phi=Math.acos(_Math.clamp(vec3.y / this.radius, - 1, 1) );
}
return this;
}});
function Cylindrical(radius, theta, y){
this.radius=(radius!==undefined) ? radius:1.0;
this.theta=(theta!==undefined) ? theta:0;
this.y=(y!==undefined) ? y:0;
return this;
}
Object.assign(Cylindrical.prototype, {
set: function(radius, theta, y){
this.radius=radius;
this.theta=theta;
this.y=y;
return this;
},
clone: function (){
return new this.constructor().copy(this);
},
copy: function(other){
this.radius=other.radius;
this.theta=other.theta;
this.y=other.y;
return this;
},
setFromVector3: function(vec3){
this.radius=Math.sqrt(vec3.x * vec3.x + vec3.z * vec3.z);
this.theta=Math.atan2(vec3.x, vec3.z);
this.y=vec3.y;
return this;
}});
function Box2(min, max){
this.min=(min!==undefined) ? min:new Vector2( + Infinity, + Infinity);
this.max=(max!==undefined) ? max:new Vector2(- Infinity, - Infinity);
}
Object.assign(Box2.prototype, {
set: function(min, max){
this.min.copy(min);
this.max.copy(max);
return this;
},
setFromPoints: function(points){
this.makeEmpty();
for(var i=0, il=points.length; i < il; i ++){
this.expandByPoint(points[ i ]);
}
return this;
},
setFromCenterAndSize: function (){
var v1=new Vector2();
return function setFromCenterAndSize(center, size){
var halfSize=v1.copy(size).multiplyScalar(0.5);
this.min.copy(center).sub(halfSize);
this.max.copy(center).add(halfSize);
return this;
};}(),
clone: function (){
return new this.constructor().copy(this);
},
copy: function(box){
this.min.copy(box.min);
this.max.copy(box.max);
return this;
},
makeEmpty: function (){
this.min.x=this.min.y=+ Infinity;
this.max.x=this.max.y=- Infinity;
return this;
},
isEmpty: function (){
return(this.max.x < this.min.x)||(this.max.y < this.min.y);
},
getCenter: function(target){
if(target===undefined){
console.warn('THREE.Box2: .getCenter() target is now required');
target=new Vector2();
}
return this.isEmpty() ? target.set(0, 0):target.addVectors(this.min, this.max).multiplyScalar(0.5);
},
getSize: function(target){
if(target===undefined){
console.warn('THREE.Box2: .getSize() target is now required');
target=new Vector2();
}
return this.isEmpty() ? target.set(0, 0):target.subVectors(this.max, this.min);
},
expandByPoint: function(point){
this.min.min(point);
this.max.max(point);
return this;
},
expandByVector: function(vector){
this.min.sub(vector);
this.max.add(vector);
return this;
},
expandByScalar: function(scalar){
this.min.addScalar(- scalar);
this.max.addScalar(scalar);
return this;
},
containsPoint: function(point){
return point.x < this.min.x||point.x > this.max.x ||
point.y < this.min.y||point.y > this.max.y ? false:true;
},
containsBox: function(box){
return this.min.x <=box.min.x&&box.max.x <=this.max.x &&
this.min.y <=box.min.y&&box.max.y <=this.max.y;
},
getParameter: function(point, target){
if(target===undefined){
console.warn('THREE.Box2: .getParameter() target is now required');
target=new Vector2();
}
return target.set((point.x - this.min.x) /(this.max.x - this.min.x),
(point.y - this.min.y) /(this.max.y - this.min.y)
);
},
intersectsBox: function(box){
return box.max.x < this.min.x||box.min.x > this.max.x ||
box.max.y < this.min.y||box.min.y > this.max.y ? false:true;
},
clampPoint: function(point, target){
if(target===undefined){
console.warn('THREE.Box2: .clampPoint() target is now required');
target=new Vector2();
}
return target.copy(point).clamp(this.min, this.max);
},
distanceToPoint: function (){
var v1=new Vector2();
return function distanceToPoint(point){
var clampedPoint=v1.copy(point).clamp(this.min, this.max);
return clampedPoint.sub(point).length();
};}(),
intersect: function(box){
this.min.max(box.min);
this.max.min(box.max);
return this;
},
union: function(box){
this.min.min(box.min);
this.max.max(box.max);
return this;
},
translate: function(offset){
this.min.add(offset);
this.max.add(offset);
return this;
},
equals: function(box){
return box.min.equals(this.min)&&box.max.equals(this.max);
}});
function ImmediateRenderObject(material){
Object3D.call(this);
this.material=material;
this.render=function(){};}
ImmediateRenderObject.prototype=Object.create(Object3D.prototype);
ImmediateRenderObject.prototype.constructor=ImmediateRenderObject;
ImmediateRenderObject.prototype.isImmediateRenderObject=true;
function VertexNormalsHelper(object, size, hex, linewidth){
this.object=object;
this.size=(size!==undefined) ? size:1;
var color=(hex!==undefined) ? hex:0xff0000;
var width=(linewidth!==undefined) ? linewidth:1;
var nNormals=0;
var objGeometry=this.object.geometry;
if(objGeometry&&objGeometry.isGeometry){
nNormals=objGeometry.faces.length * 3;
}else if(objGeometry&&objGeometry.isBufferGeometry){
nNormals=objGeometry.attributes.normal.count;
}
var geometry=new BufferGeometry();
var positions=new Float32BufferAttribute(nNormals * 2 * 3, 3);
geometry.addAttribute('position', positions);
LineSegments.call(this, geometry, new LineBasicMaterial( { color: color, linewidth: width }) );
this.matrixAutoUpdate=false;
this.update();
}
VertexNormalsHelper.prototype=Object.create(LineSegments.prototype);
VertexNormalsHelper.prototype.constructor=VertexNormalsHelper;
VertexNormalsHelper.prototype.update=(function (){
var v1=new Vector3();
var v2=new Vector3();
var normalMatrix=new Matrix3();
return function update(){
var keys=[ 'a', 'b', 'c' ];
this.object.updateMatrixWorld(true);
normalMatrix.getNormalMatrix(this.object.matrixWorld);
var matrixWorld=this.object.matrixWorld;
var position=this.geometry.attributes.position;
var objGeometry=this.object.geometry;
if(objGeometry&&objGeometry.isGeometry){
var vertices=objGeometry.vertices;
var faces=objGeometry.faces;
var idx=0;
for(var i=0, l=faces.length; i < l; i ++){
var face=faces[ i ];
for(var j=0, jl=face.vertexNormals.length; j < jl; j ++){
var vertex=vertices[ face[ keys[ j ] ] ];
var normal=face.vertexNormals[ j ];
v1.copy(vertex).applyMatrix4(matrixWorld);
v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1);
position.setXYZ(idx, v1.x, v1.y, v1.z);
idx=idx + 1;
position.setXYZ(idx, v2.x, v2.y, v2.z);
idx=idx + 1;
}}
}else if(objGeometry&&objGeometry.isBufferGeometry){
var objPos=objGeometry.attributes.position;
var objNorm=objGeometry.attributes.normal;
var idx=0;
for(var j=0, jl=objPos.count; j < jl; j ++){
v1.set(objPos.getX(j), objPos.getY(j), objPos.getZ(j) ).applyMatrix4(matrixWorld);
v2.set(objNorm.getX(j), objNorm.getY(j), objNorm.getZ(j) );
v2.applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1);
position.setXYZ(idx, v1.x, v1.y, v1.z);
idx=idx + 1;
position.setXYZ(idx, v2.x, v2.y, v2.z);
idx=idx + 1;
}}
position.needsUpdate=true;
};}());
function SpotLightHelper(light, color){
Object3D.call(this);
this.light=light;
this.light.updateMatrixWorld();
this.matrix=light.matrixWorld;
this.matrixAutoUpdate=false;
this.color=color;
var geometry=new BufferGeometry();
var positions=[
0, 0, 0, 	0, 0, 1,
0, 0, 0, 	1, 0, 1,
0, 0, 0,	- 1, 0, 1,
0, 0, 0, 	0, 1, 1,
0, 0, 0, 	0, - 1, 1
];
for(var i=0, j=1, l=32; i < l; i ++, j ++){
var p1=(i / l) * Math.PI * 2;
var p2=(j / l) * Math.PI * 2;
positions.push(Math.cos(p1), Math.sin(p1), 1,
Math.cos(p2), Math.sin(p2), 1
);
}
geometry.addAttribute('position', new Float32BufferAttribute(positions, 3) );
var material=new LineBasicMaterial( { fog: false });
this.cone=new LineSegments(geometry, material);
this.add(this.cone);
this.update();
}
SpotLightHelper.prototype=Object.create(Object3D.prototype);
SpotLightHelper.prototype.constructor=SpotLightHelper;
SpotLightHelper.prototype.dispose=function (){
this.cone.geometry.dispose();
this.cone.material.dispose();
};
SpotLightHelper.prototype.update=function (){
var vector=new Vector3();
var vector2=new Vector3();
return function update(){
this.light.updateMatrixWorld();
var coneLength=this.light.distance ? this.light.distance:1000;
var coneWidth=coneLength * Math.tan(this.light.angle);
this.cone.scale.set(coneWidth, coneWidth, coneLength);
vector.setFromMatrixPosition(this.light.matrixWorld);
vector2.setFromMatrixPosition(this.light.target.matrixWorld);
this.cone.lookAt(vector2.sub(vector) );
if(this.color!==undefined){
this.cone.material.color.set(this.color);
}else{
this.cone.material.color.copy(this.light.color);
}};}();
function getBoneList(object){
var boneList=[];
if(object&&object.isBone){
boneList.push(object);
}
for(var i=0; i < object.children.length; i ++){
boneList.push.apply(boneList, getBoneList(object.children[ i ]) );
}
return boneList;
}
function SkeletonHelper(object){
var bones=getBoneList(object);
var geometry=new BufferGeometry();
var vertices=[];
var colors=[];
var color1=new Color(0, 0, 1);
var color2=new Color(0, 1, 0);
for(var i=0; i < bones.length; i ++){
var bone=bones[ i ];
if(bone.parent&&bone.parent.isBone){
vertices.push(0, 0, 0);
vertices.push(0, 0, 0);
colors.push(color1.r, color1.g, color1.b);
colors.push(color2.r, color2.g, color2.b);
}}
geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
geometry.addAttribute('color', new Float32BufferAttribute(colors, 3) );
var material=new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true });
LineSegments.call(this, geometry, material);
this.root=object;
this.bones=bones;
this.matrix=object.matrixWorld;
this.matrixAutoUpdate=false;
}
SkeletonHelper.prototype=Object.create(LineSegments.prototype);
SkeletonHelper.prototype.constructor=SkeletonHelper;
SkeletonHelper.prototype.updateMatrixWorld=function (){
var vector=new Vector3();
var boneMatrix=new Matrix4();
var matrixWorldInv=new Matrix4();
return function updateMatrixWorld(force){
var bones=this.bones;
var geometry=this.geometry;
var position=geometry.getAttribute('position');
matrixWorldInv.getInverse(this.root.matrixWorld);
for(var i=0, j=0; i < bones.length; i ++){
var bone=bones[ i ];
if(bone.parent&&bone.parent.isBone){
boneMatrix.multiplyMatrices(matrixWorldInv, bone.matrixWorld);
vector.setFromMatrixPosition(boneMatrix);
position.setXYZ(j, vector.x, vector.y, vector.z);
boneMatrix.multiplyMatrices(matrixWorldInv, bone.parent.matrixWorld);
vector.setFromMatrixPosition(boneMatrix);
position.setXYZ(j + 1, vector.x, vector.y, vector.z);
j +=2;
}}
geometry.getAttribute('position').needsUpdate=true;
Object3D.prototype.updateMatrixWorld.call(this, force);
};}();
function PointLightHelper(light, sphereSize, color){
this.light=light;
this.light.updateMatrixWorld();
this.color=color;
var geometry=new SphereBufferGeometry(sphereSize, 4, 2);
var material=new MeshBasicMaterial( { wireframe: true, fog: false });
Mesh.call(this, geometry, material);
this.matrix=this.light.matrixWorld;
this.matrixAutoUpdate=false;
this.update();
}
PointLightHelper.prototype=Object.create(Mesh.prototype);
PointLightHelper.prototype.constructor=PointLightHelper;
PointLightHelper.prototype.dispose=function (){
this.geometry.dispose();
this.material.dispose();
};
PointLightHelper.prototype.update=function (){
if(this.color!==undefined){
this.material.color.set(this.color);
}else{
this.material.color.copy(this.light.color);
}
};
function RectAreaLightHelper(light, color){
Object3D.call(this);
this.light=light;
this.light.updateMatrixWorld();
this.matrix=light.matrixWorld;
this.matrixAutoUpdate=false;
this.color=color;
var material=new LineBasicMaterial( { fog: false });
var geometry=new BufferGeometry();
geometry.addAttribute('position', new BufferAttribute(new Float32Array(5 * 3), 3) );
this.line=new Line(geometry, material);
this.add(this.line);
this.update();
}
RectAreaLightHelper.prototype=Object.create(Object3D.prototype);
RectAreaLightHelper.prototype.constructor=RectAreaLightHelper;
RectAreaLightHelper.prototype.dispose=function (){
this.children[ 0 ].geometry.dispose();
this.children[ 0 ].material.dispose();
};
RectAreaLightHelper.prototype.update=function (){
var hx=this.light.width * 0.5;
var hy=this.light.height * 0.5;
var position=this.line.geometry.attributes.position;
var array=position.array;
array[ 0 ]=hx; array[ 1 ]=- hy; array[ 2 ]=0;
array[ 3 ]=hx; array[ 4 ]=hy; array[ 5 ]=0;
array[ 6 ]=- hx; array[ 7 ]=hy; array[ 8 ]=0;
array[ 9 ]=- hx; array[ 10 ]=- hy; array[ 11 ]=0;
array[ 12 ]=hx; array[ 13 ]=- hy; array[ 14 ]=0;
position.needsUpdate=true;
if(this.color!==undefined){
this.line.material.color.set(this.color);
}else{
this.line.material.color.copy(this.light.color);
}};
function HemisphereLightHelper(light, size, color){
Object3D.call(this);
this.light=light;
this.light.updateMatrixWorld();
this.matrix=light.matrixWorld;
this.matrixAutoUpdate=false;
this.color=color;
var geometry=new OctahedronBufferGeometry(size);
geometry.rotateY(Math.PI * 0.5);
this.material=new MeshBasicMaterial( { wireframe: true, fog: false });
if(this.color===undefined) this.material.vertexColors=VertexColors;
var position=geometry.getAttribute('position');
var colors=new Float32Array(position.count * 3);
geometry.addAttribute('color', new BufferAttribute(colors, 3) );
this.add(new Mesh(geometry, this.material) );
this.update();
}
HemisphereLightHelper.prototype=Object.create(Object3D.prototype);
HemisphereLightHelper.prototype.constructor=HemisphereLightHelper;
HemisphereLightHelper.prototype.dispose=function (){
this.children[ 0 ].geometry.dispose();
this.children[ 0 ].material.dispose();
};
HemisphereLightHelper.prototype.update=function (){
var vector=new Vector3();
var color1=new Color();
var color2=new Color();
return function update(){
var mesh=this.children[ 0 ];
if(this.color!==undefined){
this.material.color.set(this.color);
}else{
var colors=mesh.geometry.getAttribute('color');
color1.copy(this.light.color);
color2.copy(this.light.groundColor);
for(var i=0, l=colors.count; i < l; i ++){
var color=(i <(l / 2) ) ? color1:color2;
colors.setXYZ(i, color.r, color.g, color.b);
}
colors.needsUpdate=true;
}
mesh.lookAt(vector.setFromMatrixPosition(this.light.matrixWorld).negate());
};}();
function GridHelper(size, divisions, color1, color2){
size=size||10;
divisions=divisions||10;
color1=new Color(color1!==undefined ? color1:0x444444);
color2=new Color(color2!==undefined ? color2:0x888888);
var center=divisions / 2;
var step=size / divisions;
var halfSize=size / 2;
var vertices=[], colors=[];
for(var i=0, j=0, k=- halfSize; i <=divisions; i ++, k +=step){
vertices.push(- halfSize, 0, k, halfSize, 0, k);
vertices.push(k, 0, - halfSize, k, 0, halfSize);
var color=i===center ? color1:color2;
color.toArray(colors, j); j +=3;
color.toArray(colors, j); j +=3;
color.toArray(colors, j); j +=3;
color.toArray(colors, j); j +=3;
}
var geometry=new BufferGeometry();
geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
geometry.addAttribute('color', new Float32BufferAttribute(colors, 3) );
var material=new LineBasicMaterial( { vertexColors: VertexColors });
LineSegments.call(this, geometry, material);
}
GridHelper.prototype=Object.create(LineSegments.prototype);
GridHelper.prototype.constructor=GridHelper;
function PolarGridHelper(radius, radials, circles, divisions, color1, color2){
radius=radius||10;
radials=radials||16;
circles=circles||8;
divisions=divisions||64;
color1=new Color(color1!==undefined ? color1:0x444444);
color2=new Color(color2!==undefined ? color2:0x888888);
var vertices=[];
var colors=[];
var x, z;
var v, i, j, r, color;
for(i=0; i <=radials; i ++){
v=(i / radials) *(Math.PI * 2);
x=Math.sin(v) * radius;
z=Math.cos(v) * radius;
vertices.push(0, 0, 0);
vertices.push(x, 0, z);
color=(i & 1) ? color1:color2;
colors.push(color.r, color.g, color.b);
colors.push(color.r, color.g, color.b);
}
for(i=0; i <=circles; i ++){
color=(i & 1) ? color1:color2;
r=radius -(radius / circles * i);
for(j=0; j < divisions; j ++){
v=(j / divisions) *(Math.PI * 2);
x=Math.sin(v) * r;
z=Math.cos(v) * r;
vertices.push(x, 0, z);
colors.push(color.r, color.g, color.b);
v=(( j + 1) / divisions) *(Math.PI * 2);
x=Math.sin(v) * r;
z=Math.cos(v) * r;
vertices.push(x, 0, z);
colors.push(color.r, color.g, color.b);
}}
var geometry=new BufferGeometry();
geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
geometry.addAttribute('color', new Float32BufferAttribute(colors, 3) );
var material=new LineBasicMaterial( { vertexColors: VertexColors });
LineSegments.call(this, geometry, material);
}
PolarGridHelper.prototype=Object.create(LineSegments.prototype);
PolarGridHelper.prototype.constructor=PolarGridHelper;
function FaceNormalsHelper(object, size, hex, linewidth){
this.object=object;
this.size=(size!==undefined) ? size:1;
var color=(hex!==undefined) ? hex:0xffff00;
var width=(linewidth!==undefined) ? linewidth:1;
var nNormals=0;
var objGeometry=this.object.geometry;
if(objGeometry&&objGeometry.isGeometry){
nNormals=objGeometry.faces.length;
}else{
console.warn('THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.');
}
var geometry=new BufferGeometry();
var positions=new Float32BufferAttribute(nNormals * 2 * 3, 3);
geometry.addAttribute('position', positions);
LineSegments.call(this, geometry, new LineBasicMaterial( { color: color, linewidth: width }) );
this.matrixAutoUpdate=false;
this.update();
}
FaceNormalsHelper.prototype=Object.create(LineSegments.prototype);
FaceNormalsHelper.prototype.constructor=FaceNormalsHelper;
FaceNormalsHelper.prototype.update=(function (){
var v1=new Vector3();
var v2=new Vector3();
var normalMatrix=new Matrix3();
return function update(){
this.object.updateMatrixWorld(true);
normalMatrix.getNormalMatrix(this.object.matrixWorld);
var matrixWorld=this.object.matrixWorld;
var position=this.geometry.attributes.position;
var objGeometry=this.object.geometry;
var vertices=objGeometry.vertices;
var faces=objGeometry.faces;
var idx=0;
for(var i=0, l=faces.length; i < l; i ++){
var face=faces[ i ];
var normal=face.normal;
v1.copy(vertices[ face.a ])
.add(vertices[ face.b ])
.add(vertices[ face.c ])
.divideScalar(3)
.applyMatrix4(matrixWorld);
v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1);
position.setXYZ(idx, v1.x, v1.y, v1.z);
idx=idx + 1;
position.setXYZ(idx, v2.x, v2.y, v2.z);
idx=idx + 1;
}
position.needsUpdate=true;
};}());
function DirectionalLightHelper(light, size, color){
Object3D.call(this);
this.light=light;
this.light.updateMatrixWorld();
this.matrix=light.matrixWorld;
this.matrixAutoUpdate=false;
this.color=color;
if(size===undefined) size=1;
var geometry=new BufferGeometry();
geometry.addAttribute('position', new Float32BufferAttribute([
- size, size, 0,
size, size, 0,
size, - size, 0,
- size, - size, 0,
- size, size, 0
], 3) );
var material=new LineBasicMaterial( { fog: false });
this.lightPlane=new Line(geometry, material);
this.add(this.lightPlane);
geometry=new BufferGeometry();
geometry.addAttribute('position', new Float32BufferAttribute([ 0, 0, 0, 0, 0, 1 ], 3) );
this.targetLine=new Line(geometry, material);
this.add(this.targetLine);
this.update();
}
DirectionalLightHelper.prototype=Object.create(Object3D.prototype);
DirectionalLightHelper.prototype.constructor=DirectionalLightHelper;
DirectionalLightHelper.prototype.dispose=function (){
this.lightPlane.geometry.dispose();
this.lightPlane.material.dispose();
this.targetLine.geometry.dispose();
this.targetLine.material.dispose();
};
DirectionalLightHelper.prototype.update=function (){
var v1=new Vector3();
var v2=new Vector3();
var v3=new Vector3();
return function update(){
v1.setFromMatrixPosition(this.light.matrixWorld);
v2.setFromMatrixPosition(this.light.target.matrixWorld);
v3.subVectors(v2, v1);
this.lightPlane.lookAt(v3);
if(this.color!==undefined){
this.lightPlane.material.color.set(this.color);
this.targetLine.material.color.set(this.color);
}else{
this.lightPlane.material.color.copy(this.light.color);
this.targetLine.material.color.copy(this.light.color);
}
this.targetLine.lookAt(v3);
this.targetLine.scale.z=v3.length();
};}();
function CameraHelper(camera){
var geometry=new BufferGeometry();
var material=new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors });
var vertices=[];
var colors=[];
var pointMap={};
var colorFrustum=new Color(0xffaa00);
var colorCone=new Color(0xff0000);
var colorUp=new Color(0x00aaff);
var colorTarget=new Color(0xffffff);
var colorCross=new Color(0x333333);
addLine('n1', 'n2', colorFrustum);
addLine('n2', 'n4', colorFrustum);
addLine('n4', 'n3', colorFrustum);
addLine('n3', 'n1', colorFrustum);
addLine('f1', 'f2', colorFrustum);
addLine('f2', 'f4', colorFrustum);
addLine('f4', 'f3', colorFrustum);
addLine('f3', 'f1', colorFrustum);
addLine('n1', 'f1', colorFrustum);
addLine('n2', 'f2', colorFrustum);
addLine('n3', 'f3', colorFrustum);
addLine('n4', 'f4', colorFrustum);
addLine('p', 'n1', colorCone);
addLine('p', 'n2', colorCone);
addLine('p', 'n3', colorCone);
addLine('p', 'n4', colorCone);
addLine('u1', 'u2', colorUp);
addLine('u2', 'u3', colorUp);
addLine('u3', 'u1', colorUp);
addLine('c', 't', colorTarget);
addLine('p', 'c', colorCross);
addLine('cn1', 'cn2', colorCross);
addLine('cn3', 'cn4', colorCross);
addLine('cf1', 'cf2', colorCross);
addLine('cf3', 'cf4', colorCross);
function addLine(a, b, color){
addPoint(a, color);
addPoint(b, color);
}
function addPoint(id, color){
vertices.push(0, 0, 0);
colors.push(color.r, color.g, color.b);
if(pointMap[ id ]===undefined){
pointMap[ id ]=[];
}
pointMap[ id ].push(( vertices.length / 3) - 1);
}
geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
geometry.addAttribute('color', new Float32BufferAttribute(colors, 3) );
LineSegments.call(this, geometry, material);
this.camera=camera;
if(this.camera.updateProjectionMatrix) this.camera.updateProjectionMatrix();
this.matrix=camera.matrixWorld;
this.matrixAutoUpdate=false;
this.pointMap=pointMap;
this.update();
}
CameraHelper.prototype=Object.create(LineSegments.prototype);
CameraHelper.prototype.constructor=CameraHelper;
CameraHelper.prototype.update=function (){
var geometry, pointMap;
var vector=new Vector3();
var camera=new Camera();
function setPoint(point, x, y, z){
vector.set(x, y, z).unproject(camera);
var points=pointMap[ point ];
if(points!==undefined){
var position=geometry.getAttribute('position');
for(var i=0, l=points.length; i < l; i ++){
position.setXYZ(points[ i ], vector.x, vector.y, vector.z);
}}
}
return function update(){
geometry=this.geometry;
pointMap=this.pointMap;
var w=1, h=1;
camera.projectionMatrix.copy(this.camera.projectionMatrix);
setPoint('c', 0, 0, - 1);
setPoint('t', 0, 0, 1);
setPoint('n1', - w, - h, - 1);
setPoint('n2', w, - h, - 1);
setPoint('n3', - w, h, - 1);
setPoint('n4', w, h, - 1);
setPoint('f1', - w, - h, 1);
setPoint('f2', w, - h, 1);
setPoint('f3', - w, h, 1);
setPoint('f4', w, h, 1);
setPoint('u1', w * 0.7, h * 1.1, - 1);
setPoint('u2', - w * 0.7, h * 1.1, - 1);
setPoint('u3', 0, h * 2, - 1);
setPoint('cf1', - w, 0, 1);
setPoint('cf2', w, 0, 1);
setPoint('cf3', 0, - h, 1);
setPoint('cf4', 0, h, 1);
setPoint('cn1', - w, 0, - 1);
setPoint('cn2', w, 0, - 1);
setPoint('cn3', 0, - h, - 1);
setPoint('cn4', 0, h, - 1);
geometry.getAttribute('position').needsUpdate=true;
};}();
function BoxHelper(object, color){
this.object=object;
if(color===undefined) color=0xffff00;
var indices=new Uint16Array([ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ]);
var positions=new Float32Array(8 * 3);
var geometry=new BufferGeometry();
geometry.setIndex(new BufferAttribute(indices, 1) );
geometry.addAttribute('position', new BufferAttribute(positions, 3) );
LineSegments.call(this, geometry, new LineBasicMaterial( { color: color }) );
this.matrixAutoUpdate=false;
this.update();
}
BoxHelper.prototype=Object.create(LineSegments.prototype);
BoxHelper.prototype.constructor=BoxHelper;
BoxHelper.prototype.update=(function (){
var box=new Box3();
return function update(object){
if(object!==undefined){
console.warn('THREE.BoxHelper: .update() has no longer arguments.');
}
if(this.object!==undefined){
box.setFromObject(this.object);
}
if(box.isEmpty()) return;
var min=box.min;
var max=box.max;
var position=this.geometry.attributes.position;
var array=position.array;
array[ 0 ]=max.x; array[ 1 ]=max.y; array[ 2 ]=max.z;
array[ 3 ]=min.x; array[ 4 ]=max.y; array[ 5 ]=max.z;
array[ 6 ]=min.x; array[ 7 ]=min.y; array[ 8 ]=max.z;
array[ 9 ]=max.x; array[ 10 ]=min.y; array[ 11 ]=max.z;
array[ 12 ]=max.x; array[ 13 ]=max.y; array[ 14 ]=min.z;
array[ 15 ]=min.x; array[ 16 ]=max.y; array[ 17 ]=min.z;
array[ 18 ]=min.x; array[ 19 ]=min.y; array[ 20 ]=min.z;
array[ 21 ]=max.x; array[ 22 ]=min.y; array[ 23 ]=min.z;
position.needsUpdate=true;
this.geometry.computeBoundingSphere();
};})();
BoxHelper.prototype.setFromObject=function(object){
this.object=object;
this.update();
return this;
};
function Box3Helper(box, hex){
this.type='Box3Helper';
this.box=box;
var color=(hex!==undefined) ? hex:0xffff00;
var indices=new Uint16Array([ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ]);
var positions=[ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];
var geometry=new BufferGeometry();
geometry.setIndex(new BufferAttribute(indices, 1) );
geometry.addAttribute('position', new Float32BufferAttribute(positions, 3) );
LineSegments.call(this, geometry, new LineBasicMaterial( { color: color }) );
this.geometry.computeBoundingSphere();
}
Box3Helper.prototype=Object.create(LineSegments.prototype);
Box3Helper.prototype.constructor=Box3Helper;
Box3Helper.prototype.updateMatrixWorld=function(force){
var box=this.box;
if(box.isEmpty()) return;
box.getCenter(this.position);
box.getSize(this.scale);
this.scale.multiplyScalar(0.5);
Object3D.prototype.updateMatrixWorld.call(this, force);
};
function PlaneHelper(plane, size, hex){
this.type='PlaneHelper';
this.plane=plane;
this.size=(size===undefined) ? 1:size;
var color=(hex!==undefined) ? hex:0xffff00;
var positions=[ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ];
var geometry=new BufferGeometry();
geometry.addAttribute('position', new Float32BufferAttribute(positions, 3) );
geometry.computeBoundingSphere();
Line.call(this, geometry, new LineBasicMaterial( { color: color }) );
var positions2=[ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];
var geometry2=new BufferGeometry();
geometry2.addAttribute('position', new Float32BufferAttribute(positions2, 3) );
geometry2.computeBoundingSphere();
this.add(new Mesh(geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false }) ));
}
PlaneHelper.prototype=Object.create(Line.prototype);
PlaneHelper.prototype.constructor=PlaneHelper;
PlaneHelper.prototype.updateMatrixWorld=function(force){
var scale=- this.plane.constant;
if(Math.abs(scale) < 1e-8) scale=1e-8;
this.scale.set(0.5 * this.size, 0.5 * this.size, scale);
this.children[ 0 ].material.side=(scale < 0) ? BackSide:FrontSide;
this.lookAt(this.plane.normal);
Object3D.prototype.updateMatrixWorld.call(this, force);
};
var lineGeometry, coneGeometry;
function ArrowHelper(dir, origin, length, color, headLength, headWidth){
Object3D.call(this);
if(color===undefined) color=0xffff00;
if(length===undefined) length=1;
if(headLength===undefined) headLength=0.2 * length;
if(headWidth===undefined) headWidth=0.2 * headLength;
if(lineGeometry===undefined){
lineGeometry=new BufferGeometry();
lineGeometry.addAttribute('position', new Float32BufferAttribute([ 0, 0, 0, 0, 1, 0 ], 3) );
coneGeometry=new CylinderBufferGeometry(0, 0.5, 1, 5, 1);
coneGeometry.translate(0, - 0.5, 0);
}
this.position.copy(origin);
this.line=new Line(lineGeometry, new LineBasicMaterial( { color: color }) );
this.line.matrixAutoUpdate=false;
this.add(this.line);
this.cone=new Mesh(coneGeometry, new MeshBasicMaterial( { color: color }) );
this.cone.matrixAutoUpdate=false;
this.add(this.cone);
this.setDirection(dir);
this.setLength(length, headLength, headWidth);
}
ArrowHelper.prototype=Object.create(Object3D.prototype);
ArrowHelper.prototype.constructor=ArrowHelper;
ArrowHelper.prototype.setDirection=(function (){
var axis=new Vector3();
var radians;
return function setDirection(dir){
if(dir.y > 0.99999){
this.quaternion.set(0, 0, 0, 1);
}else if(dir.y < - 0.99999){
this.quaternion.set(1, 0, 0, 0);
}else{
axis.set(dir.z, 0, - dir.x).normalize();
radians=Math.acos(dir.y);
this.quaternion.setFromAxisAngle(axis, radians);
}};}());
ArrowHelper.prototype.setLength=function(length, headLength, headWidth){
if(headLength===undefined) headLength=0.2 * length;
if(headWidth===undefined) headWidth=0.2 * headLength;
this.line.scale.set(1, Math.max(0, length - headLength), 1);
this.line.updateMatrix();
this.cone.scale.set(headWidth, headLength, headWidth);
this.cone.position.y=length;
this.cone.updateMatrix();
};
ArrowHelper.prototype.setColor=function(color){
this.line.material.color.copy(color);
this.cone.material.color.copy(color);
};
function AxesHelper(size){
size=size||1;
var vertices=[
0, 0, 0,	size, 0, 0,
0, 0, 0,	0, size, 0,
0, 0, 0,	0, 0, size
];
var colors=[
1, 0, 0,	1, 0.6, 0,
0, 1, 0,	0.6, 1, 0,
0, 0, 1,	0, 0.6, 1
];
var geometry=new BufferGeometry();
geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3) );
geometry.addAttribute('color', new Float32BufferAttribute(colors, 3) );
var material=new LineBasicMaterial( { vertexColors: VertexColors });
LineSegments.call(this, geometry, material);
}
AxesHelper.prototype=Object.create(LineSegments.prototype);
AxesHelper.prototype.constructor=AxesHelper;
Curve.create=function(construct, getPoint){
console.log('THREE.Curve.create() has been deprecated');
construct.prototype=Object.create(Curve.prototype);
construct.prototype.constructor=construct;
construct.prototype.getPoint=getPoint;
return construct;
};
Object.assign(CurvePath.prototype, {
createPointsGeometry: function(divisions){
console.warn('THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints(points) instead.');
var pts=this.getPoints(divisions);
return this.createGeometry(pts);
},
createSpacedPointsGeometry: function(divisions){
console.warn('THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints(points) instead.');
var pts=this.getSpacedPoints(divisions);
return this.createGeometry(pts);
},
createGeometry: function(points){
console.warn('THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints(points) instead.');
var geometry=new Geometry();
for(var i=0, l=points.length; i < l; i ++){
var point=points[ i ];
geometry.vertices.push(new Vector3(point.x, point.y, point.z||0) );
}
return geometry;
}});
Object.assign(Path.prototype, {
fromPoints: function(points){
console.warn('THREE.Path: .fromPoints() has been renamed to .setFromPoints().');
this.setFromPoints(points);
}});
function Spline(points){
console.warn('THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.');
CatmullRomCurve3.call(this, points);
this.type='catmullrom';
}
Spline.prototype=Object.create(CatmullRomCurve3.prototype);
Object.assign(Spline.prototype, {
initFromArray: function(){
console.error('THREE.Spline: .initFromArray() has been removed.');
},
getControlPointsArray: function(){
console.error('THREE.Spline: .getControlPointsArray() has been removed.');
},
reparametrizeByArcLength: function(){
console.error('THREE.Spline: .reparametrizeByArcLength() has been removed.');
}});
GridHelper.prototype.setColors=function (){
console.error('THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.');
};
SkeletonHelper.prototype.update=function (){
console.error('THREE.SkeletonHelper: update() no longer needs to be called.');
};
Object.assign(Loader.prototype, {
extractUrlBase: function(url){
console.warn('THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.');
return LoaderUtils.extractUrlBase(url);
}});
Object.assign(Box2.prototype, {
center: function(optionalTarget){
console.warn('THREE.Box2: .center() has been renamed to .getCenter().');
return this.getCenter(optionalTarget);
},
empty: function (){
console.warn('THREE.Box2: .empty() has been renamed to .isEmpty().');
return this.isEmpty();
},
isIntersectionBox: function(box){
console.warn('THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().');
return this.intersectsBox(box);
},
size: function(optionalTarget){
console.warn('THREE.Box2: .size() has been renamed to .getSize().');
return this.getSize(optionalTarget);
}});
Object.assign(Box3.prototype, {
center: function(optionalTarget){
console.warn('THREE.Box3: .center() has been renamed to .getCenter().');
return this.getCenter(optionalTarget);
},
empty: function (){
console.warn('THREE.Box3: .empty() has been renamed to .isEmpty().');
return this.isEmpty();
},
isIntersectionBox: function(box){
console.warn('THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().');
return this.intersectsBox(box);
},
isIntersectionSphere: function(sphere){
console.warn('THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().');
return this.intersectsSphere(sphere);
},
size: function(optionalTarget){
console.warn('THREE.Box3: .size() has been renamed to .getSize().');
return this.getSize(optionalTarget);
}});
Line3.prototype.center=function(optionalTarget){
console.warn('THREE.Line3: .center() has been renamed to .getCenter().');
return this.getCenter(optionalTarget);
};
Object.assign(_Math, {
random16: function (){
console.warn('THREE.Math: .random16() has been deprecated. Use Math.random() instead.');
return Math.random();
},
nearestPowerOfTwo: function(value){
console.warn('THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().');
return _Math.floorPowerOfTwo(value);
},
nextPowerOfTwo: function(value){
console.warn('THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().');
return _Math.ceilPowerOfTwo(value);
}});
Object.assign(Matrix3.prototype, {
flattenToArrayOffset: function(array, offset){
console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");
return this.toArray(array, offset);
},
multiplyVector3: function(vector){
console.warn('THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3(matrix) instead.');
return vector.applyMatrix3(this);
},
multiplyVector3Array: function(){
console.error('THREE.Matrix3: .multiplyVector3Array() has been removed.');
},
applyToBuffer: function(buffer ){
console.warn('THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute(attribute) instead.');
return this.applyToBufferAttribute(buffer);
},
applyToVector3Array: function(){
console.error('THREE.Matrix3: .applyToVector3Array() has been removed.');
}});
Object.assign(Matrix4.prototype, {
extractPosition: function(m){
console.warn('THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().');
return this.copyPosition(m);
},
flattenToArrayOffset: function(array, offset){
console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");
return this.toArray(array, offset);
},
getPosition: function (){
var v1;
return function getPosition(){
if(v1===undefined) v1=new Vector3();
console.warn('THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition(matrix) instead.');
return v1.setFromMatrixColumn(this, 3);
};}(),
setRotationFromQuaternion: function(q){
console.warn('THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().');
return this.makeRotationFromQuaternion(q);
},
multiplyToArray: function (){
console.warn('THREE.Matrix4: .multiplyToArray() has been removed.');
},
multiplyVector3: function(vector){
console.warn('THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4(matrix) instead.');
return vector.applyMatrix4(this);
},
multiplyVector4: function(vector){
console.warn('THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4(matrix) instead.');
return vector.applyMatrix4(this);
},
multiplyVector3Array: function(){
console.error('THREE.Matrix4: .multiplyVector3Array() has been removed.');
},
rotateAxis: function(v){
console.warn('THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection(matrix) instead.');
v.transformDirection(this);
},
crossVector: function(vector){
console.warn('THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4(matrix) instead.');
return vector.applyMatrix4(this);
},
translate: function (){
console.error('THREE.Matrix4: .translate() has been removed.');
},
rotateX: function (){
console.error('THREE.Matrix4: .rotateX() has been removed.');
},
rotateY: function (){
console.error('THREE.Matrix4: .rotateY() has been removed.');
},
rotateZ: function (){
console.error('THREE.Matrix4: .rotateZ() has been removed.');
},
rotateByAxis: function (){
console.error('THREE.Matrix4: .rotateByAxis() has been removed.');
},
applyToBuffer: function(buffer ){
console.warn('THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute(attribute) instead.');
return this.applyToBufferAttribute(buffer);
},
applyToVector3Array: function(){
console.error('THREE.Matrix4: .applyToVector3Array() has been removed.');
},
makeFrustum: function(left, right, bottom, top, near, far){
console.warn('THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective(left, right, top, bottom, near, far) instead.');
return this.makePerspective(left, right, top, bottom, near, far);
}});
Plane.prototype.isIntersectionLine=function(line){
console.warn('THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().');
return this.intersectsLine(line);
};
Quaternion.prototype.multiplyVector3=function(vector){
console.warn('THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion(quaternion) instead.');
return vector.applyQuaternion(this);
};
Object.assign(Ray.prototype, {
isIntersectionBox: function(box){
console.warn('THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().');
return this.intersectsBox(box);
},
isIntersectionPlane: function(plane){
console.warn('THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().');
return this.intersectsPlane(plane);
},
isIntersectionSphere: function(sphere){
console.warn('THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().');
return this.intersectsSphere(sphere);
}});
Object.assign(Triangle.prototype, {
area: function (){
console.warn('THREE.Triangle: .area() has been renamed to .getArea().');
return this.getArea();
},
barycoordFromPoint: function(point, target){
console.warn('THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().');
return this.getBarycoord(point, target);
},
midpoint: function(target){
console.warn('THREE.Triangle: .midpoint() has been renamed to .getMidpoint().');
return this.getMidpoint(target);
},
normal: function(target){
console.warn('THREE.Triangle: .normal() has been renamed to .getNormal().');
return this.getNormal(target);
},
plane: function(target){
console.warn('THREE.Triangle: .plane() has been renamed to .getPlane().');
return this.getPlane(target);
}});
Object.assign(Triangle, {
barycoordFromPoint: function(point, a, b, c, target){
console.warn('THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().');
return Triangle.getBarycoord(point, a, b, c, target);
},
normal: function(a, b, c, target){
console.warn('THREE.Triangle: .normal() has been renamed to .getNormal().');
return Triangle.getNormal(a, b, c, target);
}});
Object.assign(Shape.prototype, {
extractAllPoints: function(divisions){
console.warn('THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.');
return this.extractPoints(divisions);
},
extrude: function(options){
console.warn('THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.');
return new ExtrudeGeometry(this, options);
},
makeGeometry: function(options){
console.warn('THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.');
return new ShapeGeometry(this, options);
}});
Object.assign(Vector2.prototype, {
fromAttribute: function(attribute, index, offset){
console.warn('THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().');
return this.fromBufferAttribute(attribute, index, offset);
},
distanceToManhattan: function(v){
console.warn('THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().');
return this.manhattanDistanceTo(v);
},
lengthManhattan: function (){
console.warn('THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().');
return this.manhattanLength();
}});
Object.assign(Vector3.prototype, {
setEulerFromRotationMatrix: function (){
console.error('THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.');
},
setEulerFromQuaternion: function (){
console.error('THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.');
},
getPositionFromMatrix: function(m){
console.warn('THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().');
return this.setFromMatrixPosition(m);
},
getScaleFromMatrix: function(m){
console.warn('THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().');
return this.setFromMatrixScale(m);
},
getColumnFromMatrix: function(index, matrix){
console.warn('THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().');
return this.setFromMatrixColumn(matrix, index);
},
applyProjection: function(m){
console.warn('THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4(m) instead.');
return this.applyMatrix4(m);
},
fromAttribute: function(attribute, index, offset){
console.warn('THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().');
return this.fromBufferAttribute(attribute, index, offset);
},
distanceToManhattan: function(v){
console.warn('THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().');
return this.manhattanDistanceTo(v);
},
lengthManhattan: function (){
console.warn('THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().');
return this.manhattanLength();
}});
Object.assign(Vector4.prototype, {
fromAttribute: function(attribute, index, offset){
console.warn('THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().');
return this.fromBufferAttribute(attribute, index, offset);
},
lengthManhattan: function (){
console.warn('THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().');
return this.manhattanLength();
}});
Object.assign(Geometry.prototype, {
computeTangents: function (){
console.error('THREE.Geometry: .computeTangents() has been removed.');
},
computeLineDistances: function (){
console.error('THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.');
}});
Object.assign(Object3D.prototype, {
getChildByName: function(name){
console.warn('THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().');
return this.getObjectByName(name);
},
renderDepth: function (){
console.warn('THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.');
},
translate: function(distance, axis){
console.warn('THREE.Object3D: .translate() has been removed. Use .translateOnAxis(axis, distance) instead.');
return this.translateOnAxis(axis, distance);
},
getWorldRotation: function (){
console.error('THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion(target) instead.');
}});
Object.defineProperties(Object3D.prototype, {
eulerOrder: {
get: function (){
console.warn('THREE.Object3D: .eulerOrder is now .rotation.order.');
return this.rotation.order;
},
set: function(value){
console.warn('THREE.Object3D: .eulerOrder is now .rotation.order.');
this.rotation.order=value;
}},
useQuaternion: {
get: function (){
console.warn('THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.');
},
set: function (){
console.warn('THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.');
}}
});
Object.defineProperties(LOD.prototype, {
objects: {
get: function (){
console.warn('THREE.LOD: .objects has been renamed to .levels.');
return this.levels;
}}
});
Object.defineProperty(Skeleton.prototype, 'useVertexTexture', {
get: function (){
console.warn('THREE.Skeleton: useVertexTexture has been removed.');
},
set: function (){
console.warn('THREE.Skeleton: useVertexTexture has been removed.');
}});
Object.defineProperty(Curve.prototype, '__arcLengthDivisions', {
get: function (){
console.warn('THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.');
return this.arcLengthDivisions;
},
set: function(value){
console.warn('THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.');
this.arcLengthDivisions=value;
}});
PerspectiveCamera.prototype.setLens=function(focalLength, filmGauge){
console.warn("THREE.PerspectiveCamera.setLens is deprecated. " +
"Use .setFocalLength and .filmGauge for a photographic setup.");
if(filmGauge!==undefined) this.filmGauge=filmGauge;
this.setFocalLength(focalLength);
};
Object.defineProperties(Light.prototype, {
onlyShadow: {
set: function (){
console.warn('THREE.Light: .onlyShadow has been removed.');
}},
shadowCameraFov: {
set: function(value){
console.warn('THREE.Light: .shadowCameraFov is now .shadow.camera.fov.');
this.shadow.camera.fov=value;
}},
shadowCameraLeft: {
set: function(value){
console.warn('THREE.Light: .shadowCameraLeft is now .shadow.camera.left.');
this.shadow.camera.left=value;
}},
shadowCameraRight: {
set: function(value){
console.warn('THREE.Light: .shadowCameraRight is now .shadow.camera.right.');
this.shadow.camera.right=value;
}},
shadowCameraTop: {
set: function(value){
console.warn('THREE.Light: .shadowCameraTop is now .shadow.camera.top.');
this.shadow.camera.top=value;
}},
shadowCameraBottom: {
set: function(value){
console.warn('THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.');
this.shadow.camera.bottom=value;
}},
shadowCameraNear: {
set: function(value){
console.warn('THREE.Light: .shadowCameraNear is now .shadow.camera.near.');
this.shadow.camera.near=value;
}},
shadowCameraFar: {
set: function(value){
console.warn('THREE.Light: .shadowCameraFar is now .shadow.camera.far.');
this.shadow.camera.far=value;
}},
shadowCameraVisible: {
set: function (){
console.warn('THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper(light.shadow.camera) instead.');
}},
shadowBias: {
set: function(value){
console.warn('THREE.Light: .shadowBias is now .shadow.bias.');
this.shadow.bias=value;
}},
shadowDarkness: {
set: function (){
console.warn('THREE.Light: .shadowDarkness has been removed.');
}},
shadowMapWidth: {
set: function(value){
console.warn('THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.');
this.shadow.mapSize.width=value;
}},
shadowMapHeight: {
set: function(value){
console.warn('THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.');
this.shadow.mapSize.height=value;
}}
});
Object.defineProperties(BufferAttribute.prototype, {
length: {
get: function (){
console.warn('THREE.BufferAttribute: .length has been deprecated. Use .count instead.');
return this.array.length;
}},
copyIndicesArray: function(){
console.error('THREE.BufferAttribute: .copyIndicesArray() has been removed.');
}});
Object.assign(BufferGeometry.prototype, {
addIndex: function(index){
console.warn('THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().');
this.setIndex(index);
},
addDrawCall: function(start, count, indexOffset){
if(indexOffset!==undefined){
console.warn('THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.');
}
console.warn('THREE.BufferGeometry: .addDrawCall() is now .addGroup().');
this.addGroup(start, count);
},
clearDrawCalls: function (){
console.warn('THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().');
this.clearGroups();
},
computeTangents: function (){
console.warn('THREE.BufferGeometry: .computeTangents() has been removed.');
},
computeOffsets: function (){
console.warn('THREE.BufferGeometry: .computeOffsets() has been removed.');
}});
Object.defineProperties(BufferGeometry.prototype, {
drawcalls: {
get: function (){
console.error('THREE.BufferGeometry: .drawcalls has been renamed to .groups.');
return this.groups;
}},
offsets: {
get: function (){
console.warn('THREE.BufferGeometry: .offsets has been renamed to .groups.');
return this.groups;
}}
});
Object.assign(ExtrudeBufferGeometry.prototype, {
getArrays: function (){
console.error('THREE.ExtrudeBufferGeometry: .getArrays() has been removed.');
},
addShapeList: function (){
console.error('THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.');
},
addShape: function (){
console.error('THREE.ExtrudeBufferGeometry: .addShape() has been removed.');
}});
Object.defineProperties(Uniform.prototype, {
dynamic: {
set: function (){
console.warn('THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.');
}},
onUpdate: {
value: function (){
console.warn('THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.');
return this;
}}
});
Object.defineProperties(Material.prototype, {
wrapAround: {
get: function (){
console.warn('THREE.Material: .wrapAround has been removed.');
},
set: function (){
console.warn('THREE.Material: .wrapAround has been removed.');
}},
wrapRGB: {
get: function (){
console.warn('THREE.Material: .wrapRGB has been removed.');
return new Color();
}},
shading: {
get: function (){
console.error('THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.');
},
set: function(value){
console.warn('THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.');
this.flatShading=(value===FlatShading);
}}
});
Object.defineProperties(MeshPhongMaterial.prototype, {
metal: {
get: function (){
console.warn('THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.');
return false;
},
set: function (){
console.warn('THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead');
}}
});
Object.defineProperties(ShaderMaterial.prototype, {
derivatives: {
get: function (){
console.warn('THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.');
return this.extensions.derivatives;
},
set: function(value){
console.warn('THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.');
this.extensions.derivatives=value;
}}
});
Object.assign(WebGLRenderer.prototype, {
animate: function(callback){
console.warn('THREE.WebGLRenderer: .animate() is now .setAnimationLoop().');
this.setAnimationLoop(callback);
},
getCurrentRenderTarget: function (){
console.warn('THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().');
return this.getRenderTarget();
},
getMaxAnisotropy: function (){
console.warn('THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().');
return this.capabilities.getMaxAnisotropy();
},
getPrecision: function (){
console.warn('THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.');
return this.capabilities.precision;
},
resetGLState: function (){
console.warn('THREE.WebGLRenderer: .resetGLState() is now .state.reset().');
return this.state.reset();
},
supportsFloatTextures: function (){
console.warn('THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get(\'OES_texture_float\').');
return this.extensions.get('OES_texture_float');
},
supportsHalfFloatTextures: function (){
console.warn('THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get(\'OES_texture_half_float\').');
return this.extensions.get('OES_texture_half_float');
},
supportsStandardDerivatives: function (){
console.warn('THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get(\'OES_standard_derivatives\').');
return this.extensions.get('OES_standard_derivatives');
},
supportsCompressedTextureS3TC: function (){
console.warn('THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get(\'WEBGL_compressed_texture_s3tc\').');
return this.extensions.get('WEBGL_compressed_texture_s3tc');
},
supportsCompressedTexturePVRTC: function (){
console.warn('THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get(\'WEBGL_compressed_texture_pvrtc\').');
return this.extensions.get('WEBGL_compressed_texture_pvrtc');
},
supportsBlendMinMax: function (){
console.warn('THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get(\'EXT_blend_minmax\').');
return this.extensions.get('EXT_blend_minmax');
},
supportsVertexTextures: function (){
console.warn('THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.');
return this.capabilities.vertexTextures;
},
supportsInstancedArrays: function (){
console.warn('THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get(\'ANGLE_instanced_arrays\').');
return this.extensions.get('ANGLE_instanced_arrays');
},
enableScissorTest: function(boolean){
console.warn('THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().');
this.setScissorTest(boolean);
},
initMaterial: function (){
console.warn('THREE.WebGLRenderer: .initMaterial() has been removed.');
},
addPrePlugin: function (){
console.warn('THREE.WebGLRenderer: .addPrePlugin() has been removed.');
},
addPostPlugin: function (){
console.warn('THREE.WebGLRenderer: .addPostPlugin() has been removed.');
},
updateShadowMap: function (){
console.warn('THREE.WebGLRenderer: .updateShadowMap() has been removed.');
},
setFaceCulling: function (){
console.warn('THREE.WebGLRenderer: .setFaceCulling() has been removed.');
}});
Object.defineProperties(WebGLRenderer.prototype, {
shadowMapEnabled: {
get: function (){
return this.shadowMap.enabled;
},
set: function(value){
console.warn('THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.');
this.shadowMap.enabled=value;
}},
shadowMapType: {
get: function (){
return this.shadowMap.type;
},
set: function(value){
console.warn('THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.');
this.shadowMap.type=value;
}},
shadowMapCullFace: {
get: function (){
console.warn('THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.');
return undefined;
},
set: function(){
console.warn('THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.');
}}
});
Object.defineProperties(WebGLShadowMap.prototype, {
cullFace: {
get: function (){
console.warn('THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.');
return undefined;
},
set: function(){
console.warn('THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.');
}},
renderReverseSided: {
get: function (){
console.warn('THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.');
return undefined;
},
set: function (){
console.warn('THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.');
}},
renderSingleSided: {
get: function (){
console.warn('THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.');
return undefined;
},
set: function (){
console.warn('THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.');
}}
});
Object.defineProperties(WebGLRenderTarget.prototype, {
wrapS: {
get: function (){
console.warn('THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.');
return this.texture.wrapS;
},
set: function(value){
console.warn('THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.');
this.texture.wrapS=value;
}},
wrapT: {
get: function (){
console.warn('THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.');
return this.texture.wrapT;
},
set: function(value){
console.warn('THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.');
this.texture.wrapT=value;
}},
magFilter: {
get: function (){
console.warn('THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.');
return this.texture.magFilter;
},
set: function(value){
console.warn('THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.');
this.texture.magFilter=value;
}},
minFilter: {
get: function (){
console.warn('THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.');
return this.texture.minFilter;
},
set: function(value){
console.warn('THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.');
this.texture.minFilter=value;
}},
anisotropy: {
get: function (){
console.warn('THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.');
return this.texture.anisotropy;
},
set: function(value){
console.warn('THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.');
this.texture.anisotropy=value;
}},
offset: {
get: function (){
console.warn('THREE.WebGLRenderTarget: .offset is now .texture.offset.');
return this.texture.offset;
},
set: function(value){
console.warn('THREE.WebGLRenderTarget: .offset is now .texture.offset.');
this.texture.offset=value;
}},
repeat: {
get: function (){
console.warn('THREE.WebGLRenderTarget: .repeat is now .texture.repeat.');
return this.texture.repeat;
},
set: function(value){
console.warn('THREE.WebGLRenderTarget: .repeat is now .texture.repeat.');
this.texture.repeat=value;
}},
format: {
get: function (){
console.warn('THREE.WebGLRenderTarget: .format is now .texture.format.');
return this.texture.format;
},
set: function(value){
console.warn('THREE.WebGLRenderTarget: .format is now .texture.format.');
this.texture.format=value;
}},
type: {
get: function (){
console.warn('THREE.WebGLRenderTarget: .type is now .texture.type.');
return this.texture.type;
},
set: function(value){
console.warn('THREE.WebGLRenderTarget: .type is now .texture.type.');
this.texture.type=value;
}},
generateMipmaps: {
get: function (){
console.warn('THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.');
return this.texture.generateMipmaps;
},
set: function(value){
console.warn('THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.');
this.texture.generateMipmaps=value;
}}
});
Object.defineProperties(WebVRManager.prototype, {
standing: {
set: function(){
console.warn('THREE.WebVRManager: .standing has been removed.');
}}
});
Audio.prototype.load=function(file){
console.warn('THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.');
var scope=this;
var audioLoader=new AudioLoader();
audioLoader.load(file, function(buffer){
scope.setBuffer(buffer);
});
return this;
};
AudioAnalyser.prototype.getData=function (){
console.warn('THREE.AudioAnalyser: .getData() is now .getFrequencyData().');
return this.getFrequencyData();
};
CubeCamera.prototype.updateCubeMap=function(renderer, scene){
console.warn('THREE.CubeCamera: .updateCubeMap() is now .update().');
return this.update(renderer, scene);
};
var VRControls=function(object, onError){
var scope=this;
var vrDisplay, vrDisplays;
var standingMatrix=new Matrix4();
var frameData=null;
if('VRFrameData' in window){
frameData=new VRFrameData();
}
function gotVRDisplays(displays){
vrDisplays=displays;
if(displays.length > 0){
vrDisplay=displays[ 0 ];
}else{
if(onError) onError('VR input not available.');
}}
if(navigator.getVRDisplays){
navigator.getVRDisplays().then(gotVRDisplays).catch(function (){
console.warn('VRControls: Unable to get VR Displays');
});
}
this.scale=1;
this.standing=false;
this.userHeight=1.6;
this.getVRDisplay=function (){
return vrDisplay;
};
this.setVRDisplay=function(value){
vrDisplay=value;
};
this.getVRDisplays=function (){
console.warn('VRControls: getVRDisplays() is being deprecated.');
return vrDisplays;
};
this.getStandingMatrix=function (){
return standingMatrix;
};
this.update=function (){
if(vrDisplay){
var pose;
if(vrDisplay.getFrameData){
vrDisplay.getFrameData(frameData);
pose=frameData.pose;
}else if(vrDisplay.getPose){
pose=vrDisplay.getPose();
}
if(pose.orientation!==null){
object.quaternion.fromArray(pose.orientation);
}
if(pose.position!==null){
object.position.fromArray(pose.position);
}else{
object.position.set(0, 0, 0);
}
if(this.standing){
if(vrDisplay.stageParameters){
object.updateMatrix();
standingMatrix.fromArray(vrDisplay.stageParameters.sittingToStandingTransform);
object.applyMatrix(standingMatrix);
}else{
object.position.setY(object.position.y + this.userHeight);
}}
object.position.multiplyScalar(scope.scale);
}};
this.dispose=function (){
vrDisplay=null;
};};
var VREffect=function(renderer, onError){
var vrDisplay, vrDisplays;
var eyeTranslationL=new Vector3();
var eyeTranslationR=new Vector3();
var renderRectL, renderRectR;
var headMatrix=new Matrix4();
var eyeMatrixL=new Matrix4();
var eyeMatrixR=new Matrix4();
var frameData=null;
if('VRFrameData' in window){
frameData=new window.VRFrameData();
}
function gotVRDisplays(displays){
vrDisplays=displays;
if(displays.length > 0){
vrDisplay=displays[ 0 ];
}else{
if(onError) onError('HMD not available');
}}
if(navigator.getVRDisplays){
navigator.getVRDisplays().then(gotVRDisplays).catch(function (){
console.warn('VREffect: Unable to get VR Displays');
});
}
this.isPresenting=false;
var scope=this;
var rendererSize=renderer.getSize();
var rendererUpdateStyle=false;
var rendererPixelRatio=renderer.getPixelRatio();
this.getVRDisplay=function (){
return vrDisplay;
};
this.setVRDisplay=function(value){
vrDisplay=value;
};
this.getVRDisplays=function (){
console.warn('VREffect: getVRDisplays() is being deprecated.');
return vrDisplays;
};
this.setSize=function(width, height, updateStyle){
rendererSize={ width: width, height: height };
rendererUpdateStyle=updateStyle;
if(scope.isPresenting){
var eyeParamsL=vrDisplay.getEyeParameters('left');
renderer.setPixelRatio(1);
renderer.setSize(eyeParamsL.renderWidth * 2, eyeParamsL.renderHeight, false);
}else{
renderer.setPixelRatio(rendererPixelRatio);
renderer.setSize(width, height, updateStyle);
}};
var canvas=renderer.domElement;
var defaultLeftBounds=[ 0.0, 0.0, 0.5, 1.0 ];
var defaultRightBounds=[ 0.5, 0.0, 0.5, 1.0 ];
function onVRDisplayPresentChange(){
var wasPresenting=scope.isPresenting;
scope.isPresenting=vrDisplay!==undefined&&vrDisplay.isPresenting;
if(scope.isPresenting){
var eyeParamsL=vrDisplay.getEyeParameters('left');
var eyeWidth=eyeParamsL.renderWidth;
var eyeHeight=eyeParamsL.renderHeight;
if(! wasPresenting){
rendererPixelRatio=renderer.getPixelRatio();
rendererSize=renderer.getSize();
renderer.setPixelRatio(1);
renderer.setSize(eyeWidth * 2, eyeHeight, false);
}}else if(wasPresenting){
renderer.setPixelRatio(rendererPixelRatio);
renderer.setSize(rendererSize.width, rendererSize.height, rendererUpdateStyle);
}}
window.addEventListener('vrdisplaypresentchange', onVRDisplayPresentChange, false);
this.setFullScreen=function(boolean){
return new Promise(function(resolve, reject){
if(vrDisplay===undefined){
reject(new Error('No VR hardware found.') );
return;
}
if(scope.isPresenting===boolean){
resolve();
return;
}
if(boolean){
resolve(vrDisplay.requestPresent([ { source: canvas } ]) );
}else{
resolve(vrDisplay.exitPresent());
}});
};
this.requestPresent=function (){
return this.setFullScreen(true);
};
this.exitPresent=function (){
return this.setFullScreen(false);
};
this.requestAnimationFrame=function(f){
if(vrDisplay!==undefined){
return vrDisplay.requestAnimationFrame(f);
}else{
return window.requestAnimationFrame(f);
}};
this.cancelAnimationFrame=function(h){
if(vrDisplay!==undefined){
vrDisplay.cancelAnimationFrame(h);
}else{
window.cancelAnimationFrame(h);
}};
this.submitFrame=function (){
if(vrDisplay!==undefined&&scope.isPresenting){
vrDisplay.submitFrame();
}};
this.autoSubmitFrame=true;
var cameraL=new PerspectiveCamera();
cameraL.layers.enable(1);
var cameraR=new PerspectiveCamera();
cameraR.layers.enable(2);
this.render=function(scene, camera, renderTarget, forceClear){
if(vrDisplay&&scope.isPresenting){
var autoUpdate=scene.autoUpdate;
if(autoUpdate){
scene.updateMatrixWorld();
scene.autoUpdate=false;
}
if(Array.isArray(scene) ){
console.warn('VREffect.render() no longer supports arrays. Use object.layers instead.');
scene=scene[ 0 ];
}
var size=renderer.getSize();
var layers=vrDisplay.getLayers();
var leftBounds;
var rightBounds;
if(layers.length){
var layer=layers[ 0 ];
leftBounds=layer.leftBounds!==null&&layer.leftBounds.length===4 ? layer.leftBounds:defaultLeftBounds;
rightBounds=layer.rightBounds!==null&&layer.rightBounds.length===4 ? layer.rightBounds:defaultRightBounds;
}else{
leftBounds=defaultLeftBounds;
rightBounds=defaultRightBounds;
}
renderRectL={
x: Math.round(size.width * leftBounds[ 0 ]),
y: Math.round(size.height * leftBounds[ 1 ]),
width: Math.round(size.width * leftBounds[ 2 ]),
height: Math.round(size.height * leftBounds[ 3 ])
};
renderRectR={
x: Math.round(size.width * rightBounds[ 0 ]),
y: Math.round(size.height * rightBounds[ 1 ]),
width: Math.round(size.width * rightBounds[ 2 ]),
height: Math.round(size.height * rightBounds[ 3 ])
};
if(renderTarget){
renderer.setRenderTarget(renderTarget);
renderTarget.scissorTest=true;
}else{
renderer.setRenderTarget(null);
renderer.setScissorTest(true);
}
if(renderer.autoClear||forceClear) renderer.clear();
if(camera.parent===null) camera.updateMatrixWorld();
camera.matrixWorld.decompose(cameraL.position, cameraL.quaternion, cameraL.scale);
cameraR.position.copy(cameraL.position);
cameraR.quaternion.copy(cameraL.quaternion);
cameraR.scale.copy(cameraL.scale);
if(vrDisplay.getFrameData){
vrDisplay.depthNear=camera.near;
vrDisplay.depthFar=camera.far;
vrDisplay.getFrameData(frameData);
cameraL.projectionMatrix.elements=frameData.leftProjectionMatrix;
cameraR.projectionMatrix.elements=frameData.rightProjectionMatrix;
getEyeMatrices(frameData);
cameraL.updateMatrix();
cameraL.matrix.multiply(eyeMatrixL);
cameraL.matrix.decompose(cameraL.position, cameraL.quaternion, cameraL.scale);
cameraR.updateMatrix();
cameraR.matrix.multiply(eyeMatrixR);
cameraR.matrix.decompose(cameraR.position, cameraR.quaternion, cameraR.scale);
}else{
var eyeParamsL=vrDisplay.getEyeParameters('left');
var eyeParamsR=vrDisplay.getEyeParameters('right');
cameraL.projectionMatrix=fovToProjection(eyeParamsL.fieldOfView, true, camera.near, camera.far);
cameraR.projectionMatrix=fovToProjection(eyeParamsR.fieldOfView, true, camera.near, camera.far);
eyeTranslationL.fromArray(eyeParamsL.offset);
eyeTranslationR.fromArray(eyeParamsR.offset);
cameraL.translateOnAxis(eyeTranslationL, cameraL.scale.x);
cameraR.translateOnAxis(eyeTranslationR, cameraR.scale.x);
}
if(renderTarget){
renderTarget.viewport.set(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height);
renderTarget.scissor.set(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height);
}else{
renderer.setViewport(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height);
renderer.setScissor(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height);
}
renderer.render(scene, cameraL, renderTarget, forceClear);
if(renderTarget){
renderTarget.viewport.set(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height);
renderTarget.scissor.set(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height);
}else{
renderer.setViewport(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height);
renderer.setScissor(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height);
}
renderer.render(scene, cameraR, renderTarget, forceClear);
if(renderTarget){
renderTarget.viewport.set(0, 0, size.width, size.height);
renderTarget.scissor.set(0, 0, size.width, size.height);
renderTarget.scissorTest=false;
renderer.setRenderTarget(null);
}else{
renderer.setViewport(0, 0, size.width, size.height);
renderer.setScissorTest(false);
}
if(autoUpdate){
scene.autoUpdate=true;
}
if(scope.autoSubmitFrame){
scope.submitFrame();
}
return;
}
renderer.render(scene, camera, renderTarget, forceClear);
};
this.dispose=function (){
window.removeEventListener('vrdisplaypresentchange', onVRDisplayPresentChange, false);
};
var poseOrientation=new Quaternion();
var posePosition=new Vector3();
function getEyeMatrices(frameData){
if(frameData.pose.orientation){
poseOrientation.fromArray(frameData.pose.orientation);
headMatrix.makeRotationFromQuaternion(poseOrientation);
}else{
headMatrix.identity();
}
if(frameData.pose.position){
posePosition.fromArray(frameData.pose.position);
headMatrix.setPosition(posePosition);
}
eyeMatrixL.fromArray(frameData.leftViewMatrix);
eyeMatrixL.multiply(headMatrix);
eyeMatrixR.fromArray(frameData.rightViewMatrix);
eyeMatrixR.multiply(headMatrix);
eyeMatrixL.getInverse(eyeMatrixL);
eyeMatrixR.getInverse(eyeMatrixR);
}
function fovToNDCScaleOffset(fov){
var pxscale=2.0 /(fov.leftTan + fov.rightTan);
var pxoffset=(fov.leftTan - fov.rightTan) * pxscale * 0.5;
var pyscale=2.0 /(fov.upTan + fov.downTan);
var pyoffset=(fov.upTan - fov.downTan) * pyscale * 0.5;
return { scale: [ pxscale, pyscale ], offset: [ pxoffset, pyoffset ] };}
function fovPortToProjection(fov, rightHanded, zNear, zFar){
rightHanded=rightHanded===undefined ? true:rightHanded;
zNear=zNear===undefined ? 0.01:zNear;
zFar=zFar===undefined ? 10000.0:zFar;
var handednessScale=rightHanded ? - 1.0:1.0;
var mobj=new Matrix4();
var m=mobj.elements;
var scaleAndOffset=fovToNDCScaleOffset(fov);
m[ 0 * 4 + 0 ]=scaleAndOffset.scale[ 0 ];
m[ 0 * 4 + 1 ]=0.0;
m[ 0 * 4 + 2 ]=scaleAndOffset.offset[ 0 ] * handednessScale;
m[ 0 * 4 + 3 ]=0.0;
m[ 1 * 4 + 0 ]=0.0;
m[ 1 * 4 + 1 ]=scaleAndOffset.scale[ 1 ];
m[ 1 * 4 + 2 ]=- scaleAndOffset.offset[ 1 ] * handednessScale;
m[ 1 * 4 + 3 ]=0.0;
m[ 2 * 4 + 0 ]=0.0;
m[ 2 * 4 + 1 ]=0.0;
m[ 2 * 4 + 2 ]=zFar /(zNear - zFar) * - handednessScale;
m[ 2 * 4 + 3 ]=(zFar * zNear) /(zNear - zFar);
m[ 3 * 4 + 0 ]=0.0;
m[ 3 * 4 + 1 ]=0.0;
m[ 3 * 4 + 2 ]=handednessScale;
m[ 3 * 4 + 3 ]=0.0;
mobj.transpose();
return mobj;
}
function fovToProjection(fov, rightHanded, zNear, zFar){
var DEG2RAD=Math.PI / 180.0;
var fovPort={
upTan: Math.tan(fov.upDegrees * DEG2RAD),
downTan: Math.tan(fov.downDegrees * DEG2RAD),
leftTan: Math.tan(fov.leftDegrees * DEG2RAD),
rightTan: Math.tan(fov.rightDegrees * DEG2RAD)
};
return fovPortToProjection(fovPort, rightHanded, zNear, zFar);
}};
var OrbitControls=function(object, domElement){
this.object=object;
this.domElement=(domElement!==undefined) ? domElement:document;
this.enabled=true;
this.target=new Vector3();
this.minDistance=0;
this.maxDistance=Infinity;
this.minZoom=0;
this.maxZoom=Infinity;
this.minPolarAngle=0;
this.maxPolarAngle=Math.PI;
this.minAzimuthAngle=- Infinity;
this.maxAzimuthAngle=Infinity;
this.enableDamping=false;
this.dampingFactor=0.25;
this.enableZoom=true;
this.zoomSpeed=1.0;
this.enableRotate=true;
this.rotateSpeed=1.0;
this.enablePan=true;
this.panSpeed=1.0;
this.screenSpacePanning=false;
this.keyPanSpeed=7.0;
this.autoRotate=false;
this.autoRotateSpeed=2.0;
this.enableKeys=true;
this.keys={ LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };
this.mouseButtons={ ORBIT: MOUSE.LEFT, ZOOM: MOUSE.MIDDLE, PAN: MOUSE.RIGHT };
this.target0=this.target.clone();
this.position0=this.object.position.clone();
this.zoom0=this.object.zoom;
this.getPolarAngle=function (){
return spherical.phi;
};
this.getAzimuthalAngle=function (){
return spherical.theta;
};
this.saveState=function (){
scope.target0.copy(scope.target);
scope.position0.copy(scope.object.position);
scope.zoom0=scope.object.zoom;
};
this.reset=function (){
scope.target.copy(scope.target0);
scope.object.position.copy(scope.position0);
scope.object.zoom=scope.zoom0;
scope.object.updateProjectionMatrix();
scope.dispatchEvent(changeEvent);
scope.update();
state=STATE.NONE;
};
this.update=function (){
var offset=new Vector3();
var quat=new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0) );
var quatInverse=quat.clone().inverse();
var lastPosition=new Vector3();
var lastQuaternion=new Quaternion();
return function update(){
var position=scope.object.position;
offset.copy(position).sub(scope.target);
offset.applyQuaternion(quat);
spherical.setFromVector3(offset);
if(scope.autoRotate&&state===STATE.NONE){
scope.rotateLeft(getAutoRotationAngle());
}
spherical.theta +=sphericalDelta.theta;
spherical.phi +=sphericalDelta.phi;
spherical.theta=Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta) );
spherical.phi=Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi) );
spherical.makeSafe();
spherical.radius *=scale;
spherical.radius=Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius) );
scope.target.add(panOffset);
offset.setFromSpherical(spherical);
offset.applyQuaternion(quatInverse);
position.copy(scope.target).add(offset);
scope.object.lookAt(scope.target);
if(scope.enableDamping===true){
sphericalDelta.theta *=(1 - scope.dampingFactor);
sphericalDelta.phi *=(1 - scope.dampingFactor);
panOffset.multiplyScalar(1 - scope.dampingFactor);
}else{
sphericalDelta.set(0, 0, 0);
panOffset.set(0, 0, 0);
}
scale=1;
if(zoomChanged ||
lastPosition.distanceToSquared(scope.object.position) > EPS ||
8 *(1 - lastQuaternion.dot(scope.object.quaternion) ) > EPS){
scope.dispatchEvent(changeEvent);
lastPosition.copy(scope.object.position);
lastQuaternion.copy(scope.object.quaternion);
zoomChanged=false;
return true;
}
return false;
};}();
this.dispose=function (){
scope.domElement.removeEventListener('contextmenu', onContextMenu, false);
scope.domElement.removeEventListener('mousedown', onMouseDown, false);
scope.domElement.removeEventListener('wheel', onMouseWheel, false);
scope.domElement.removeEventListener('touchstart', onTouchStart, false);
scope.domElement.removeEventListener('touchend', onTouchEnd, false);
scope.domElement.removeEventListener('touchmove', onTouchMove, false);
document.removeEventListener('mousemove', onMouseMove, false);
document.removeEventListener('mouseup', onMouseUp, false);
window.removeEventListener('keydown', onKeyDown, false);
};
var scope=this;
var changeEvent={ type: 'change' };
var startEvent={ type: 'start' };
var endEvent={ type: 'end' };
var STATE={ NONE: - 1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY_PAN: 4 };
var state=STATE.NONE;
var EPS=0.000001;
var spherical=new Spherical();
var sphericalDelta=new Spherical();
var scale=1;
var panOffset=new Vector3();
var zoomChanged=false;
var rotateStart=new Vector2();
var rotateEnd=new Vector2();
var rotateDelta=new Vector2();
var panStart=new Vector2();
var panEnd=new Vector2();
var panDelta=new Vector2();
var dollyStart=new Vector2();
var dollyEnd=new Vector2();
var dollyDelta=new Vector2();
function getAutoRotationAngle(){
return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;
}
function getZoomScale(){
return Math.pow(0.95, scope.zoomSpeed);
}
scope.rotateLeft=function(angle){
sphericalDelta.theta -=angle;
};
scope.rotateUp=function(angle){
sphericalDelta.phi -=angle;
};
var panLeft=function (){
var v=new Vector3();
return function panLeft(distance, objectMatrix){
v.setFromMatrixColumn(objectMatrix, 0);
v.multiplyScalar(- distance);
panOffset.add(v);
};}();
var panUp=function (){
var v=new Vector3();
return function panUp(distance, objectMatrix){
if(scope.screenSpacePanning===true){
v.setFromMatrixColumn(objectMatrix, 1);
}else{
v.setFromMatrixColumn(objectMatrix, 0);
v.crossVectors(scope.object.up, v);
}
v.multiplyScalar(distance);
panOffset.add(v);
};}();
var pan=function (){
var offset=new Vector3();
return function pan(deltaX, deltaY){
var element=scope.domElement===document ? scope.domElement.body:scope.domElement;
if(scope.object.isPerspectiveCamera){
var position=scope.object.position;
offset.copy(position).sub(scope.target);
var targetDistance=offset.length();
targetDistance *=Math.tan(( scope.object.fov / 2) * Math.PI / 180.0);
panLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);
panUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);
}else if(scope.object.isOrthographicCamera){
panLeft(deltaX *(scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);
panUp(deltaY *(scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);
}else{
console.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.');
scope.enablePan=false;
}};}();
function dollyIn(dollyScale){
if(scope.object.isPerspectiveCamera){
scale /=dollyScale;
}else if(scope.object.isOrthographicCamera){
scope.object.zoom=Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale) );
scope.object.updateProjectionMatrix();
zoomChanged=true;
}else{
console.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');
scope.enableZoom=false;
}}
function dollyOut(dollyScale){
if(scope.object.isPerspectiveCamera){
scale *=dollyScale;
}else if(scope.object.isOrthographicCamera){
scope.object.zoom=Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale) );
scope.object.updateProjectionMatrix();
zoomChanged=true;
}else{
console.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');
scope.enableZoom=false;
}}
function handleMouseDownRotate(event){
rotateStart.set(event.clientX, event.clientY);
}
function handleMouseDownDolly(event){
dollyStart.set(event.clientX, event.clientY);
}
function handleMouseDownPan(event){
panStart.set(event.clientX, event.clientY);
}
function handleMouseMoveRotate(event){
rotateEnd.set(event.clientX, event.clientY);
rotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(scope.rotateSpeed);
var element=scope.domElement===document ? scope.domElement.body:scope.domElement;
scope.rotateLeft(2 * Math.PI * rotateDelta.x / element.clientHeight);
scope.rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight);
rotateStart.copy(rotateEnd);
scope.update();
}
function handleMouseMoveDolly(event){
dollyEnd.set(event.clientX, event.clientY);
dollyDelta.subVectors(dollyEnd, dollyStart);
if(dollyDelta.y > 0){
dollyIn(getZoomScale());
}else if(dollyDelta.y < 0){
dollyOut(getZoomScale());
}
dollyStart.copy(dollyEnd);
scope.update();
}
function handleMouseMovePan(event){
panEnd.set(event.clientX, event.clientY);
panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed);
pan(panDelta.x, panDelta.y);
panStart.copy(panEnd);
scope.update();
}
function handleMouseWheel(event){
if(event.deltaY < 0){
dollyOut(getZoomScale());
}else if(event.deltaY > 0){
dollyIn(getZoomScale());
}
scope.update();
}
function handleKeyDown(event){
switch(event.keyCode){
case scope.keys.UP:
pan(0, scope.keyPanSpeed);
scope.update();
break;
case scope.keys.BOTTOM:
pan(0, - scope.keyPanSpeed);
scope.update();
break;
case scope.keys.LEFT:
pan(scope.keyPanSpeed, 0);
scope.update();
break;
case scope.keys.RIGHT:
pan(- scope.keyPanSpeed, 0);
scope.update();
break;
}}
function handleTouchStartRotate(event){
rotateStart.set(event.touches[ 0 ].pageX, event.touches[ 0 ].pageY);
}
function handleTouchStartDollyPan(event){
if(scope.enableZoom){
var dx=event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
var dy=event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
var distance=Math.sqrt(dx * dx + dy * dy);
dollyStart.set(0, distance);
}
if(scope.enablePan){
var x=0.5 *(event.touches[ 0 ].pageX + event.touches[ 1 ].pageX);
var y=0.5 *(event.touches[ 0 ].pageY + event.touches[ 1 ].pageY);
panStart.set(x, y);
}}
function handleTouchMoveRotate(event){
rotateEnd.set(event.touches[ 0 ].pageX, event.touches[ 0 ].pageY);
rotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(scope.rotateSpeed);
var element=scope.domElement===document ? scope.domElement.body:scope.domElement;
scope.rotateLeft(2 * Math.PI * rotateDelta.x / element.clientHeight);
scope.rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight);
rotateStart.copy(rotateEnd);
scope.update();
}
function handleTouchMoveDollyPan(event){
if(scope.enableZoom){
var dx=event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
var dy=event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
var distance=Math.sqrt(dx * dx + dy * dy);
dollyEnd.set(0, distance);
dollyDelta.set(0, Math.pow(dollyEnd.y / dollyStart.y, scope.zoomSpeed) );
dollyIn(dollyDelta.y);
dollyStart.copy(dollyEnd);
}
if(scope.enablePan){
var x=0.5 *(event.touches[ 0 ].pageX + event.touches[ 1 ].pageX);
var y=0.5 *(event.touches[ 0 ].pageY + event.touches[ 1 ].pageY);
panEnd.set(x, y);
panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed);
pan(panDelta.x, panDelta.y);
panStart.copy(panEnd);
}
scope.update();
}
function onMouseDown(event){
if(scope.enabled===false) return;
event.preventDefault();
switch(event.button){
case scope.mouseButtons.ORBIT:
if(scope.enableRotate===false) return;
handleMouseDownRotate(event);
state=STATE.ROTATE;
break;
case scope.mouseButtons.ZOOM:
if(scope.enableZoom===false) return;
handleMouseDownDolly(event);
state=STATE.DOLLY;
break;
case scope.mouseButtons.PAN:
if(scope.enablePan===false) return;
handleMouseDownPan(event);
state=STATE.PAN;
break;
}
if(state!==STATE.NONE){
document.addEventListener('mousemove', onMouseMove, false);
document.addEventListener('mouseup', onMouseUp, false);
scope.dispatchEvent(startEvent);
}}
function onMouseMove(event){
if(scope.enabled===false) return;
event.preventDefault();
switch(state){
case STATE.ROTATE:
if(scope.enableRotate===false) return;
handleMouseMoveRotate(event);
break;
case STATE.DOLLY:
if(scope.enableZoom===false) return;
handleMouseMoveDolly(event);
break;
case STATE.PAN:
if(scope.enablePan===false) return;
handleMouseMovePan(event);
break;
}}
function onMouseUp(event){
if(scope.enabled===false) return;
document.removeEventListener('mousemove', onMouseMove, false);
document.removeEventListener('mouseup', onMouseUp, false);
scope.dispatchEvent(endEvent);
state=STATE.NONE;
}
function onMouseWheel(event){
if(scope.enabled===false||scope.enableZoom===false||(state!==STATE.NONE&&state!==STATE.ROTATE) ) return;
event.preventDefault();
event.stopPropagation();
scope.dispatchEvent(startEvent);
handleMouseWheel(event);
scope.dispatchEvent(endEvent);
}
function onKeyDown(event){
if(scope.enabled===false||scope.enableKeys===false||scope.enablePan===false) return;
handleKeyDown(event);
}
function onTouchStart(event){
if(scope.enabled===false) return;
event.preventDefault();
switch(event.touches.length){
case 1:
if(scope.enableRotate===false) return;
handleTouchStartRotate(event);
state=STATE.TOUCH_ROTATE;
break;
case 2:
if(scope.enableZoom===false&&scope.enablePan===false) return;
handleTouchStartDollyPan(event);
state=STATE.TOUCH_DOLLY_PAN;
break;
default:
state=STATE.NONE;
}
if(state!==STATE.NONE){
scope.dispatchEvent(startEvent);
}}
function onTouchMove(event){
if(scope.enabled===false) return;
event.preventDefault();
event.stopPropagation();
switch(event.touches.length){
case 1:
if(scope.enableRotate===false) return;
if(state!==STATE.TOUCH_ROTATE) return;
handleTouchMoveRotate(event);
break;
case 2:
if(scope.enableZoom===false&&scope.enablePan===false) return;
if(state!==STATE.TOUCH_DOLLY_PAN) return;
handleTouchMoveDollyPan(event);
break;
default:
state=STATE.NONE;
}}
function onTouchEnd(event){
if(scope.enabled===false) return;
scope.dispatchEvent(endEvent);
state=STATE.NONE;
}
function onContextMenu(event){
if(scope.enabled===false) return;
event.preventDefault();
}
scope.domElement.addEventListener('mousedown', onMouseDown, false);
scope.domElement.addEventListener('wheel', onMouseWheel, false);
scope.domElement.addEventListener('touchstart', onTouchStart, false);
scope.domElement.addEventListener('touchend', onTouchEnd, false);
scope.domElement.addEventListener('touchmove', onTouchMove, false);
window.addEventListener('keydown', onKeyDown, false);
this.update();
};
OrbitControls.prototype=Object.create(EventDispatcher.prototype);
OrbitControls.prototype.constructor=OrbitControls;
Object.defineProperties(OrbitControls.prototype, {
center: {
get: function (){
console.warn('OrbitControls: .center has been renamed to .target');
return this.target;
}},
noZoom: {
get: function (){
console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');
return ! this.enableZoom;
},
set: function(value){
console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');
this.enableZoom = ! value;
}},
noRotate: {
get: function (){
console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');
return ! this.enableRotate;
},
set: function(value){
console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');
this.enableRotate = ! value;
}},
noPan: {
get: function (){
console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');
return ! this.enablePan;
},
set: function(value){
console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');
this.enablePan = ! value;
}},
noKeys: {
get: function (){
console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');
return ! this.enableKeys;
},
set: function(value){
console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');
this.enableKeys = ! value;
}},
staticMoving: {
get: function (){
console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');
return ! this.enableDamping;
},
set: function(value){
console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');
this.enableDamping = ! value;
}},
dynamicDampingFactor: {
get: function (){
console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');
return this.dampingFactor;
},
set: function(value){
console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');
this.dampingFactor=value;
}}
});
var DeviceOrientationControls=function(object){
var scope=this;
this.object=object;
this.object.rotation.reorder('YXZ');
this.enabled=true;
this.deviceOrientation={};
this.screenOrientation=0;
this.alphaOffset=0;
var onDeviceOrientationChangeEvent=function(event){
scope.deviceOrientation=event;
};
var onScreenOrientationChangeEvent=function (){
scope.screenOrientation=window.orientation||0;
};
var setObjectQuaternion=function (){
var zee=new Vector3(0, 0, 1);
var euler=new Euler();
var q0=new Quaternion();
var q1=new Quaternion(- Math.sqrt(0.5), 0, 0, Math.sqrt(0.5) );
return function(quaternion, alpha, beta, gamma, orient){
euler.set(beta, alpha, - gamma, 'YXZ'); // 'ZXY' for the device, but 'YXZ' for us
quaternion.setFromEuler(euler);
quaternion.multiply(q1);
quaternion.multiply(q0.setFromAxisAngle(zee, - orient) );
};}();
this.connect=function (){
onScreenOrientationChangeEvent();
window.addEventListener('orientationchange', onScreenOrientationChangeEvent, false);
window.addEventListener('deviceorientation', onDeviceOrientationChangeEvent, false);
scope.enabled=true;
};
this.disconnect=function (){
window.removeEventListener('orientationchange', onScreenOrientationChangeEvent, false);
window.removeEventListener('deviceorientation', onDeviceOrientationChangeEvent, false);
scope.enabled=false;
};
this.update=function (){
if(scope.enabled===false) return;
var device=scope.deviceOrientation;
if(device){
var alpha=device.alpha ? _Math.degToRad(device.alpha) + scope.alphaOffset:0;
var beta=device.beta ? _Math.degToRad(device.beta):0; // X'
var gamma=device.gamma ? _Math.degToRad(device.gamma):0;
var orient=scope.screenOrientation ? _Math.degToRad(scope.screenOrientation):0;
setObjectQuaternion(scope.object.quaternion, alpha, beta, gamma, orient);
}};
this.dispose=function (){
scope.disconnect();
};
this.connect();
};
function Quat2Angle(x, y, z, w){
var test=x * y + z * w;
if(test > 0.499){
var _yaw=2 * Math.atan2(x, w);
var _pitch=Math.PI / 2;
var _roll=0;
return new Vector3(_pitch, _roll, _yaw);
}
if(test < -0.499){
var _yaw2=-2 * Math.atan2(x, w);
var _pitch2=-Math.PI / 2;
var _roll2=0;
return new Vector3(_pitch2, _roll2, _yaw2);
}
var sqx=x * x;
var sqy=y * y;
var sqz=z * z;
var yaw=Math.atan2(2 * y * w - 2 * x * z, 1 - 2 * sqy - 2 * sqz);
var pitch=Math.asin(2 * test);
var roll=Math.atan2(2 * x * w - 2 * y * z, 1 - 2 * sqx - 2 * sqz);
return new Vector3(pitch, roll, yaw);
}
var OrbitOrientationControls =
function (){
function OrbitOrientationControls(options){
this.object=options.camera;
this.domElement=options.canvas;
this.orbit=new OrbitControls(this.object, this.domElement);
this.speed=0.5;
this.orbit.target.set(0, 0, -1);
this.orbit.enableZoom=false;
this.orbit.enablePan=false;
this.orbit.rotateSpeed=-this.speed;
if(options.orientation){
this.orientation=new DeviceOrientationControls(this.object);
}
if(options.halfView){
this.orbit.minAzimuthAngle=-Math.PI / 4;
this.orbit.maxAzimuthAngle=Math.PI / 4;
}}
var _proto=OrbitOrientationControls.prototype;
_proto.update=function update(){
if(this.orientation){
this.orientation.update();
var quat=this.orientation.object.quaternion;
var currentAngle=Quat2Angle(quat.x, quat.y, quat.z, quat.w);
if(typeof this.lastAngle_==='undefined'){
this.lastAngle_=currentAngle;
}
this.orbit.rotateLeft((this.lastAngle_.z - currentAngle.z) * (1 + this.speed));
this.orbit.rotateUp((this.lastAngle_.y - currentAngle.y) * (1 + this.speed));
this.lastAngle_=currentAngle;
}
this.orbit.update();
};
_proto.dispose=function dispose(){
this.orbit.dispose();
if(this.orientation){
this.orientation.dispose();
}};
return OrbitOrientationControls;
}();
var corsSupport=function (){
var video=document$1.createElement('video');
video.crossOrigin='anonymous';
return video.hasAttribute('crossorigin');
}();
var validProjections=['360', '360_LR', '360_TB', '360_CUBE', 'EAC', 'EAC_LR', 'NONE', 'AUTO', 'Sphere', 'Cube', 'equirectangular', '180', '180_LR', '180_MONO'];
var getInternalProjectionName=function getInternalProjectionName(projection){
if(!projection){
return;
}
projection=projection.toString().trim();
if(/sphere/i.test(projection)){
return '360';
}
if(/cube/i.test(projection)){
return '360_CUBE';
}
if(/equirectangular/i.test(projection)){
return '360';
}
for (var i=0; i < validProjections.length; i++){
if(new RegExp('^' + validProjections[i] + '$', 'i').test(projection)){
return validProjections[i];
}}
};
var CanvasPlayerControls =
function (_videojs$EventTarget){
inheritsLoose(CanvasPlayerControls, _videojs$EventTarget);
function CanvasPlayerControls(player, canvas){
var _this;
_this=_videojs$EventTarget.call(this)||this;
_this.player=player;
_this.canvas=canvas;
_this.onMoveEnd=videojs.bind(assertThisInitialized(_this), _this.onMoveEnd);
_this.onMoveStart=videojs.bind(assertThisInitialized(_this), _this.onMoveStart);
_this.onMove=videojs.bind(assertThisInitialized(_this), _this.onMove);
_this.onControlBarMove=videojs.bind(assertThisInitialized(_this), _this.onControlBarMove);
_this.player.controlBar.on(['mousedown', 'mousemove', 'mouseup', 'touchstart', 'touchmove', 'touchend'], _this.onControlBarMove);
_this.oldReportUserActivity=_this.player.reportUserActivity;
_this.player.reportUserActivity=function (){};
_this.canvas.addEventListener('mousedown', _this.onMoveStart);
_this.canvas.addEventListener('touchstart', _this.onMoveStart);
_this.canvas.addEventListener('mousemove', _this.onMove);
_this.canvas.addEventListener('touchmove', _this.onMove);
_this.canvas.addEventListener('mouseup', _this.onMoveEnd);
_this.canvas.addEventListener('touchend', _this.onMoveEnd);
_this.shouldTogglePlay=false;
return _this;
}
var _proto=CanvasPlayerControls.prototype;
_proto.togglePlay=function togglePlay(){
if(this.player.paused()){
this.player.play();
}else{
this.player.pause();
}};
_proto.onMoveStart=function onMoveStart(e){
if(!this.player.controls()||e.type==='mousedown'&&!videojs.dom.isSingleLeftClick(e)){
this.shouldTogglePlay=false;
return;
}
this.shouldTogglePlay=true;
this.touchMoveCount_=0;
};
_proto.onMoveEnd=function onMoveEnd(e){
if(e.type==='touchend'&&this.touchMoveCount_ < 10){
if(this.player.userActive()===false){
this.player.userActive(true);
return;
}
this.player.userActive(false);
return;
}
if(!this.shouldTogglePlay){
return;
}
if(e.type=='mouseup'){
this.togglePlay();
}};
_proto.onMove=function onMove(e){
this.touchMoveCount_++;
this.shouldTogglePlay=false;
};
_proto.onControlBarMove=function onControlBarMove(e){
this.player.userActive(true);
};
_proto.dispose=function dispose(){
this.canvas.removeEventListener('mousedown', this.onMoveStart);
this.canvas.removeEventListener('touchstart', this.onMoveStart);
this.canvas.removeEventListener('mousemove', this.onMove);
this.canvas.removeEventListener('touchmove', this.onMove);
this.canvas.removeEventListener('mouseup', this.onMoveEnd);
this.canvas.removeEventListener('touchend', this.onMoveEnd);
this.player.controlBar.off(['mousedown', 'mousemove', 'mouseup', 'touchstart', 'touchmove', 'touchend'], this.onControlBarMove);
this.player.reportUserActivity=this.oldReportUserActivity;
};
return CanvasPlayerControls;
}(videojs.EventTarget);
var OmnitoneController =
function (_videojs$EventTarget){
inheritsLoose(OmnitoneController, _videojs$EventTarget);
function OmnitoneController(audioContext, omnitone, video, options){
var _this;
_this=_videojs$EventTarget.call(this)||this;
var settings=videojs.mergeOptions({
channelMap: videojs.browser.IS_SAFARI ? [2, 0, 1, 3]:[0, 1, 2, 3],
ambisonicOrder: 1
}, options);
_this.videoElementSource=audioContext.createMediaElementSource(video);
_this.foaRenderer=omnitone.createFOARenderer(audioContext, settings);
_this.foaRenderer.initialize().then(function (){
if(audioContext.state==='suspended'){
_this.trigger({
type: 'audiocontext-suspended'
});
}
_this.videoElementSource.connect(_this.foaRenderer.input);
_this.foaRenderer.output.connect(audioContext.destination);
_this.initialized=true;
_this.trigger({
type: 'omnitone-ready'
});
}, function (error){
videojs.log.warn("videojs-vr: Omnitone initializes failed with the following error: " + error + ")");
});
return _this;
}
var _proto=OmnitoneController.prototype;
_proto.update=function update(camera){
if(!this.initialized){
return;
}
this.foaRenderer.setRotationMatrixFromCamera(camera.matrix);
}
;
_proto.dispose=function dispose(){
this.initialized=false;
this.foaRenderer.setRenderingMode('bypass');
this.foaRenderer=null;
};
return OmnitoneController;
}(videojs.EventTarget);
var Button=videojs.getComponent('Button');
var CardboardButton =
function (_Button){
inheritsLoose(CardboardButton, _Button);
function CardboardButton(player, options){
var _this;
_this=_Button.call(this, player, options)||this;
_this.handleVrDisplayActivate_=videojs.bind(assertThisInitialized(_this), _this.handleVrDisplayActivate_);
_this.handleVrDisplayDeactivate_=videojs.bind(assertThisInitialized(_this), _this.handleVrDisplayDeactivate_);
_this.handleVrDisplayPresentChange_=videojs.bind(assertThisInitialized(_this), _this.handleVrDisplayPresentChange_);
_this.handleOrientationChange_=videojs.bind(assertThisInitialized(_this), _this.handleOrientationChange_);
window$1.addEventListener('orientationchange', _this.handleOrientationChange_);
window$1.addEventListener('vrdisplayactivate', _this.handleVrDisplayActivate_);
window$1.addEventListener('vrdisplaydeactivate', _this.handleVrDisplayDeactivate_);
window$1.addEventListener('vrdisplaypresentchange', _this.handleVrDisplayPresentChange_);
if(videojs.browser.IS_ANDROID){
_this.on(player, 'fullscreenchange', function (){
if(player.isFullscreen()){
_this.hide();
}else{
_this.show();
}});
}
return _this;
}
var _proto=CardboardButton.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-button-vr " + _Button.prototype.buildCSSClass.call(this);
};
_proto.handleVrDisplayPresentChange_=function handleVrDisplayPresentChange_(){
if(!this.player_.vr().vrDisplay.isPresenting&&this.active_){
this.handleVrDisplayDeactivate_();
}
if(this.player_.vr().vrDisplay.isPresenting&&!this.active_){
this.handleVrDisplayActivate_();
}};
_proto.handleOrientationChange_=function handleOrientationChange_(){
if(this.active_&&videojs.browser.IS_IOS){
this.changeSize_();
}};
_proto.changeSize_=function changeSize_(){
this.player_.width(window$1.innerWidth);
this.player_.height(window$1.innerHeight);
window$1.dispatchEvent(new window$1.Event('resize'));
};
_proto.handleVrDisplayActivate_=function handleVrDisplayActivate_(){
if(videojs.browser.IS_IOS){
this.oldWidth_=this.player_.currentWidth();
this.oldHeight_=this.player_.currentHeight();
this.player_.enterFullWindow();
this.changeSize_();
}
this.active_=true;
};
_proto.handleVrDisplayDeactivate_=function handleVrDisplayDeactivate_(){
if(videojs.browser.IS_IOS){
if(this.oldWidth_){
this.player_.width(this.oldWidth_);
}
if(this.oldHeight_){
this.player_.height(this.oldHeight_);
}
this.player_.exitFullWindow();
}
this.active_=false;
};
_proto.handleClick=function handleClick(event){
if(!this.active_){
if(!this.player_.hasStarted()&&videojs.browser.IS_ANDROID){
this.player_.play();
}
window$1.dispatchEvent(new window$1.Event('vrdisplayactivate'));
}else{
window$1.dispatchEvent(new window$1.Event('vrdisplaydeactivate'));
}};
_proto.dispose=function dispose(){
_Button.prototype.dispose.call(this);
window$1.removeEventListener('vrdisplayactivate', this.handleVrDisplayActivate_);
window$1.removeEventListener('vrdisplaydeactivate', this.handleVrDisplayDeactivate_);
window$1.removeEventListener('vrdisplaypresentchange', this.handleVrDisplayPresentChange_);
};
return CardboardButton;
}(Button);
videojs.registerComponent('CardboardButton', CardboardButton);
var BigPlayButton=videojs.getComponent('BigPlayButton');
var BigVrPlayButton =
function (_BigPlayButton){
inheritsLoose(BigVrPlayButton, _BigPlayButton);
function BigVrPlayButton(){
return _BigPlayButton.apply(this, arguments)||this;
}
var _proto=BigVrPlayButton.prototype;
_proto.buildCSSClass=function buildCSSClass(){
return "vjs-big-vr-play-button " + _BigPlayButton.prototype.buildCSSClass.call(this);
};
return BigVrPlayButton;
}(BigPlayButton);
videojs.registerComponent('BigVrPlayButton', BigVrPlayButton);
var defaults={
debug: false,
omnitone: false,
forceCardboard: false,
omnitoneOptions: {},
projection: 'AUTO',
sphereDetail: 32
};
var errors={
'web-vr-out-of-date': {
headline: '360 is out of date',
type: '360_OUT_OF_DATE',
message: "Your browser supports 360 but not the latest version. See <a href='http://webvr.info'>http://webvr.info</a> for more info."
},
'web-vr-not-supported': {
headline: '360 not supported on this device',
type: '360_NOT_SUPPORTED',
message: "Your browser does not support 360. See <a href='http://webvr.info'>http://webvr.info</a> for assistance."
},
'web-vr-hls-cors-not-supported': {
headline: '360 HLS video not supported on this device',
type: '360_NOT_SUPPORTED',
message: "Your browser/device does not support HLS 360 video. See <a href='http://webvr.info'>http://webvr.info</a> for assistance."
}};
var Plugin=videojs.getPlugin('plugin');
var Component=videojs.getComponent('Component');
var VR =
function (_Plugin){
inheritsLoose(VR, _Plugin);
function VR(player, options){
var _this;
var settings=videojs.mergeOptions(defaults, options);
_this=_Plugin.call(this, player, settings)||this;
_this.options_=settings;
_this.player_=player;
_this.bigPlayButtonIndex_=player.children().indexOf(player.getChild('BigPlayButton'))||0;
_this.videojsErrorsSupport_ = !!videojs.errors;
if(_this.videojsErrorsSupport_){
player.errors({
errors: errors
});
}
if(videojs.browser.IE_VERSION||!corsSupport){
_this.player_.on('loadstart', function (){
_this.triggerError_({
code: 'web-vr-not-supported',
dismiss: false
});
});
return assertThisInitialized(_this);
}
_this.polyfill_=new WebVRPolyfill({
ROTATE_INSTRUCTIONS_DISABLED: true
});
_this.polyfill_=new WebVRPolyfill();
_this.handleVrDisplayActivate_=videojs.bind(assertThisInitialized(_this), _this.handleVrDisplayActivate_);
_this.handleVrDisplayDeactivate_=videojs.bind(assertThisInitialized(_this), _this.handleVrDisplayDeactivate_);
_this.handleResize_=videojs.bind(assertThisInitialized(_this), _this.handleResize_);
_this.animate_=videojs.bind(assertThisInitialized(_this), _this.animate_);
_this.setProjection(_this.options_.projection);
_this.on(player, 'adstart', function (){
return player.setTimeout(function (){
if(!player.ads||!player.ads.videoElementRecycled()){
_this.log('video element not recycled for this ad, no need to reset');
return;
}
_this.log('video element recycled for this ad, reseting');
_this.reset();
_this.one(player, 'playing', _this.init);
});
}, 1);
_this.on(player, 'loadedmetadata', _this.init);
return _this;
}
var _proto=VR.prototype;
_proto.changeProjection_=function changeProjection_(projection){
var _this2=this;
projection=getInternalProjectionName(projection);
if(!projection){
projection='NONE';
}
var position={
x: 0,
y: 0,
z: 0
};
if(this.scene){
this.scene.remove(this.movieScreen);
}
if(projection==='AUTO'){
if(this.player_.mediainfo&&this.player_.mediainfo.projection&&this.player_.mediainfo.projection!=='AUTO'){
var autoProjection=getInternalProjectionName(this.player_.mediainfo.projection);
return this.changeProjection_(autoProjection);
}
return this.changeProjection_('NONE');
}else if(projection==='360'){
this.movieGeometry=new SphereBufferGeometry(256, this.options_.sphereDetail, this.options_.sphereDetail);
this.movieMaterial=new MeshBasicMaterial({
map: this.videoTexture,
overdraw: true,
side: BackSide
});
this.movieScreen=new Mesh(this.movieGeometry, this.movieMaterial);
this.movieScreen.position.set(position.x, position.y, position.z);
this.movieScreen.scale.x=-1;
this.movieScreen.quaternion.setFromAxisAngle({
x: 0,
y: 1,
z: 0
}, -Math.PI / 2);
this.scene.add(this.movieScreen);
}else if(projection==='360_LR'||projection==='360_TB'){
var geometry=new SphereGeometry(256, this.options_.sphereDetail, this.options_.sphereDetail);
var uvs=geometry.faceVertexUvs[0];
for (var i=0; i < uvs.length; i++){
for (var j=0; j < 3; j++){
if(projection==='360_LR'){
uvs[i][j].x *=0.5;
}else{
uvs[i][j].y *=0.5;
uvs[i][j].y +=0.5;
}}
}
this.movieGeometry=new BufferGeometry().fromGeometry(geometry);
this.movieMaterial=new MeshBasicMaterial({
map: this.videoTexture,
overdraw: true,
side: BackSide
});
this.movieScreen=new Mesh(this.movieGeometry, this.movieMaterial);
this.movieScreen.scale.x=-1;
this.movieScreen.quaternion.setFromAxisAngle({
x: 0,
y: 1,
z: 0
}, -Math.PI / 2);
this.movieScreen.layers.set(1);
this.scene.add(this.movieScreen);
geometry=new SphereGeometry(256, this.options_.sphereDetail, this.options_.sphereDetail);
uvs=geometry.faceVertexUvs[0];
for (var _i=0; _i < uvs.length; _i++){
for (var _j=0; _j < 3; _j++){
if(projection==='360_LR'){
uvs[_i][_j].x *=0.5;
uvs[_i][_j].x +=0.5;
}else{
uvs[_i][_j].y *=0.5;
}}
}
this.movieGeometry=new BufferGeometry().fromGeometry(geometry);
this.movieMaterial=new MeshBasicMaterial({
map: this.videoTexture,
overdraw: true,
side: BackSide
});
this.movieScreen=new Mesh(this.movieGeometry, this.movieMaterial);
this.movieScreen.scale.x=-1;
this.movieScreen.quaternion.setFromAxisAngle({
x: 0,
y: 1,
z: 0
}, -Math.PI / 2);
this.movieScreen.layers.set(2);
this.scene.add(this.movieScreen);
}else if(projection==='360_CUBE'){
this.movieGeometry=new BoxGeometry(256, 256, 256);
this.movieMaterial=new MeshBasicMaterial({
map: this.videoTexture,
overdraw: true,
side: BackSide
});
var left=[new Vector2(0, 0.5), new Vector2(0.333, 0.5), new Vector2(0.333, 1), new Vector2(0, 1)];
var right=[new Vector2(0.333, 0.5), new Vector2(0.666, 0.5), new Vector2(0.666, 1), new Vector2(0.333, 1)];
var top=[new Vector2(0.666, 0.5), new Vector2(1, 0.5), new Vector2(1, 1), new Vector2(0.666, 1)];
var bottom=[new Vector2(0, 0), new Vector2(0.333, 0), new Vector2(0.333, 0.5), new Vector2(0, 0.5)];
var front=[new Vector2(0.333, 0), new Vector2(0.666, 0), new Vector2(0.666, 0.5), new Vector2(0.333, 0.5)];
var back=[new Vector2(0.666, 0), new Vector2(1, 0), new Vector2(1, 0.5), new Vector2(0.666, 0.5)];
this.movieGeometry.faceVertexUvs[0]=[];
this.movieGeometry.faceVertexUvs[0][0]=[right[2], right[1], right[3]];
this.movieGeometry.faceVertexUvs[0][1]=[right[1], right[0], right[3]];
this.movieGeometry.faceVertexUvs[0][2]=[left[2], left[1], left[3]];
this.movieGeometry.faceVertexUvs[0][3]=[left[1], left[0], left[3]];
this.movieGeometry.faceVertexUvs[0][4]=[top[2], top[1], top[3]];
this.movieGeometry.faceVertexUvs[0][5]=[top[1], top[0], top[3]];
this.movieGeometry.faceVertexUvs[0][6]=[bottom[2], bottom[1], bottom[3]];
this.movieGeometry.faceVertexUvs[0][7]=[bottom[1], bottom[0], bottom[3]];
this.movieGeometry.faceVertexUvs[0][8]=[front[2], front[1], front[3]];
this.movieGeometry.faceVertexUvs[0][9]=[front[1], front[0], front[3]];
this.movieGeometry.faceVertexUvs[0][10]=[back[2], back[1], back[3]];
this.movieGeometry.faceVertexUvs[0][11]=[back[1], back[0], back[3]];
this.movieScreen=new Mesh(this.movieGeometry, this.movieMaterial);
this.movieScreen.position.set(position.x, position.y, position.z);
this.movieScreen.rotation.y=-Math.PI;
this.scene.add(this.movieScreen);
}else if(projection==='180'||projection==='180_LR'||projection==='180_MONO'){
var _geometry=new SphereGeometry(256, this.options_.sphereDetail, this.options_.sphereDetail, Math.PI, Math.PI);
_geometry.scale(-1, 1, 1);
var _uvs=_geometry.faceVertexUvs[0];
if(projection!=='180_MONO'){
for (var _i2=0; _i2 < _uvs.length; _i2++){
for (var _j2=0; _j2 < 3; _j2++){
_uvs[_i2][_j2].x *=0.5;
}}
}
this.movieGeometry=new BufferGeometry().fromGeometry(_geometry);
this.movieMaterial=new MeshBasicMaterial({
map: this.videoTexture,
overdraw: true
});
this.movieScreen=new Mesh(this.movieGeometry, this.movieMaterial);
this.movieScreen.layers.set(1);
this.scene.add(this.movieScreen);
_geometry=new SphereGeometry(256, this.options_.sphereDetail, this.options_.sphereDetail, Math.PI, Math.PI);
_geometry.scale(-1, 1, 1);
_uvs=_geometry.faceVertexUvs[0];
for (var _i3=0; _i3 < _uvs.length; _i3++){
for (var _j3=0; _j3 < 3; _j3++){
_uvs[_i3][_j3].x *=0.5;
_uvs[_i3][_j3].x +=0.5;
}}
this.movieGeometry=new BufferGeometry().fromGeometry(_geometry);
this.movieMaterial=new MeshBasicMaterial({
map: this.videoTexture,
overdraw: true
});
this.movieScreen=new Mesh(this.movieGeometry, this.movieMaterial);
this.movieScreen.layers.set(2);
this.scene.add(this.movieScreen);
}else if(projection==='EAC'||projection==='EAC_LR'){
var makeScreen=function makeScreen(mapMatrix, scaleMatrix){
var contCorrect=2;
_this2.movieGeometry=new BoxGeometry(256, 256, 256);
_this2.movieMaterial=new ShaderMaterial({
overdraw: true,
side: BackSide,
uniforms: {
mapped: {
value: _this2.videoTexture
},
mapMatrix: {
value: mapMatrix
},
contCorrect: {
value: contCorrect
},
faceWH: {
value: new Vector2(1 / 3, 1 / 2).applyMatrix3(scaleMatrix)
},
vidWH: {
value: new Vector2(_this2.videoTexture.image.videoWidth, _this2.videoTexture.image.videoHeight).applyMatrix3(scaleMatrix)
}},
vertexShader: "\nvarying vec2 vUv;\nuniform mat3 mapMatrix;\n\nvoid main(){\n  vUv=(mapMatrix * vec3(uv, 1.)).xy;\n  gl_Position=projectionMatrix * modelViewMatrix * vec4(position, 1.);\n}",
fragmentShader: "\nvarying vec2 vUv;\nuniform sampler2D mapped;\nuniform vec2 faceWH;\nuniform vec2 vidWH;\nuniform float contCorrect;\n\nconst float PI=3.1415926535897932384626433832795;\n\nvoid main(){\n  vec2 corner=vUv - mod(vUv, faceWH) + vec2(0, contCorrect / vidWH.y);\n\n  vec2 faceWHadj=faceWH - vec2(0, contCorrect * 2. / vidWH.y);\n\n  vec2 p=(vUv - corner) / faceWHadj - .5;\n  vec2 q=2. / PI * atan(2. * p) + .5;\n\n  vec2 eUv=corner + q * faceWHadj;\n\n  gl_FragColor=texture2D(mapped, eUv);\n}"
});
var right=[new Vector2(0, 1 / 2), new Vector2(1 / 3, 1 / 2), new Vector2(1 / 3, 1), new Vector2(0, 1)];
var front=[new Vector2(1 / 3, 1 / 2), new Vector2(2 / 3, 1 / 2), new Vector2(2 / 3, 1), new Vector2(1 / 3, 1)];
var left=[new Vector2(2 / 3, 1 / 2), new Vector2(1, 1 / 2), new Vector2(1, 1), new Vector2(2 / 3, 1)];
var bottom=[new Vector2(1 / 3, 0), new Vector2(1 / 3, 1 / 2), new Vector2(0, 1 / 2), new Vector2(0, 0)];
var back=[new Vector2(1 / 3, 1 / 2), new Vector2(1 / 3, 0), new Vector2(2 / 3, 0), new Vector2(2 / 3, 1 / 2)];
var top=[new Vector2(1, 0), new Vector2(1, 1 / 2), new Vector2(2 / 3, 1 / 2), new Vector2(2 / 3, 0)];
for (var _i4=0, _arr=[right, front, left, bottom, back, top]; _i4 < _arr.length; _i4++){
var face=_arr[_i4];
var height=_this2.videoTexture.image.videoHeight;
var lowY=1;
var highY=0;
for (var _iterator=face, _isArray=Array.isArray(_iterator), _i5=0, _iterator=_isArray ? _iterator:_iterator[Symbol.iterator]();;){
var _ref;
if(_isArray){
if(_i5 >=_iterator.length) break;
_ref=_iterator[_i5++];
}else{
_i5=_iterator.next();
if(_i5.done) break;
_ref=_i5.value;
}
var vector=_ref;
if(vector.y < lowY){
lowY=vector.y;
}
if(vector.y > highY){
highY=vector.y;
}}
for (var _iterator2=face, _isArray2=Array.isArray(_iterator2), _i6=0, _iterator2=_isArray2 ? _iterator2:_iterator2[Symbol.iterator]();;){
var _ref2;
if(_isArray2){
if(_i6 >=_iterator2.length) break;
_ref2=_iterator2[_i6++];
}else{
_i6=_iterator2.next();
if(_i6.done) break;
_ref2=_i6.value;
}
var _vector=_ref2;
if(Math.abs(_vector.y - lowY) < Number.EPSILON){
_vector.y +=contCorrect / height;
}
if(Math.abs(_vector.y - highY) < Number.EPSILON){
_vector.y -=contCorrect / height;
}
_vector.x=_vector.x / height * (height - contCorrect * 2) + contCorrect / height;
}}
_this2.movieGeometry.faceVertexUvs[0]=[];
_this2.movieGeometry.faceVertexUvs[0][0]=[right[2], right[1], right[3]];
_this2.movieGeometry.faceVertexUvs[0][1]=[right[1], right[0], right[3]];
_this2.movieGeometry.faceVertexUvs[0][2]=[left[2], left[1], left[3]];
_this2.movieGeometry.faceVertexUvs[0][3]=[left[1], left[0], left[3]];
_this2.movieGeometry.faceVertexUvs[0][4]=[top[2], top[1], top[3]];
_this2.movieGeometry.faceVertexUvs[0][5]=[top[1], top[0], top[3]];
_this2.movieGeometry.faceVertexUvs[0][6]=[bottom[2], bottom[1], bottom[3]];
_this2.movieGeometry.faceVertexUvs[0][7]=[bottom[1], bottom[0], bottom[3]];
_this2.movieGeometry.faceVertexUvs[0][8]=[front[2], front[1], front[3]];
_this2.movieGeometry.faceVertexUvs[0][9]=[front[1], front[0], front[3]];
_this2.movieGeometry.faceVertexUvs[0][10]=[back[2], back[1], back[3]];
_this2.movieGeometry.faceVertexUvs[0][11]=[back[1], back[0], back[3]];
_this2.movieScreen=new Mesh(_this2.movieGeometry, _this2.movieMaterial);
_this2.movieScreen.position.set(position.x, position.y, position.z);
_this2.movieScreen.rotation.y=-Math.PI;
return _this2.movieScreen;
};
if(projection==='EAC'){
this.scene.add(makeScreen(new Matrix3(), new Matrix3()));
}else{
var scaleMatrix=new Matrix3().set(0, 0.5, 0, 1, 0, 0, 0, 0, 1);
makeScreen(new Matrix3().set(0, -0.5, 0.5, 1, 0, 0, 0, 0, 1), scaleMatrix);
this.movieScreen.layers.set(1);
this.scene.add(this.movieScreen);
makeScreen(new Matrix3().set(0, -0.5, 1, 1, 0, 0, 0, 0, 1), scaleMatrix);
this.movieScreen.layers.set(2);
this.scene.add(this.movieScreen);
}}
this.currentProjection_=projection;
};
_proto.triggerError_=function triggerError_(errorObj){
if(this.videojsErrorsSupport_){
this.player_.error(errorObj);
}else{
var div=document$1.createElement('div');
div.innerHTML=errors[errorObj.code].message;
var message=div.textContent||div.innerText||'';
this.player_.error({
code: errorObj.code,
message: message
});
}};
_proto.log=function log(){
if(!this.options_.debug){
return;
}
for (var _len=arguments.length, msgs=new Array(_len), _key=0; _key < _len; _key++){
msgs[_key]=arguments[_key];
}
msgs.forEach(function (msg){
videojs.log('VR: ', msg);
});
};
_proto.handleVrDisplayActivate_=function handleVrDisplayActivate_(){
var _this3=this;
if(!this.vrDisplay){
return;
}
this.vrDisplay.requestPresent([{
source: this.renderedCanvas
}]).then(function (){
if(!_this3.vrDisplay.cardboardUI_||!videojs.browser.IS_IOS){
return;
}
var touches=[];
var iosCardboardTouchStart_=function iosCardboardTouchStart_(e){
for (var i=0; i < e.touches.length; i++){
touches.push(e.touches[i]);
}};
var iosCardboardTouchEnd_=function iosCardboardTouchEnd_(e){
if(!touches.length){
return;
}
touches.forEach(function (t){
var simulatedClick=new window$1.MouseEvent('click', {
screenX: t.screenX,
screenY: t.screenY,
clientX: t.clientX,
clientY: t.clientY
});
_this3.renderedCanvas.dispatchEvent(simulatedClick);
});
touches=[];
};
_this3.renderedCanvas.addEventListener('touchstart', iosCardboardTouchStart_);
_this3.renderedCanvas.addEventListener('touchend', iosCardboardTouchEnd_);
_this3.iosRevertTouchToClick_=function (){
_this3.renderedCanvas.removeEventListener('touchstart', iosCardboardTouchStart_);
_this3.renderedCanvas.removeEventListener('touchend', iosCardboardTouchEnd_);
_this3.iosRevertTouchToClick_=null;
};});
};
_proto.handleVrDisplayDeactivate_=function handleVrDisplayDeactivate_(){
if(!this.vrDisplay||!this.vrDisplay.isPresenting){
return;
}
if(this.iosRevertTouchToClick_){
this.iosRevertTouchToClick_();
}
this.vrDisplay.exitPresent();
};
_proto.requestAnimationFrame=function requestAnimationFrame(fn){
if(this.vrDisplay){
return this.vrDisplay.requestAnimationFrame(fn);
}
return this.player_.requestAnimationFrame(fn);
};
_proto.cancelAnimationFrame=function cancelAnimationFrame(id){
if(this.vrDisplay){
return this.vrDisplay.cancelAnimationFrame(id);
}
return this.player_.cancelAnimationFrame(id);
};
_proto.togglePlay_=function togglePlay_(){
if(this.player_.paused()){
this.player_.play();
}else{
this.player_.pause();
}};
_proto.animate_=function animate_(){
if(!this.initialized_){
return;
}
if(this.getVideoEl_().readyState===this.getVideoEl_().HAVE_ENOUGH_DATA){
if(this.videoTexture){
this.videoTexture.needsUpdate=true;
}}
this.controls3d.update();
if(this.omniController){
this.omniController.update(this.camera);
}
this.effect.render(this.scene, this.camera);
if(window$1.navigator.getGamepads){
var gamepads=window$1.navigator.getGamepads();
for (var i=0; i < gamepads.length; ++i){
var gamepad=gamepads[i];
if(!gamepad||!gamepad.timestamp||gamepad.timestamp===this.prevTimestamps_[i]){
continue;
}
for (var j=0; j < gamepad.buttons.length; ++j){
if(gamepad.buttons[j].pressed){
this.togglePlay_();
this.prevTimestamps_[i]=gamepad.timestamp;
break;
}}
}}
this.camera.getWorldDirection(this.cameraVector);
this.animationFrameId_=this.requestAnimationFrame(this.animate_);
};
_proto.handleResize_=function handleResize_(){
var width=this.player_.currentWidth();
var height=this.player_.currentHeight();
this.effect.setSize(width, height, false);
this.camera.aspect=width / height;
this.camera.updateProjectionMatrix();
};
_proto.setProjection=function setProjection(projection){
if(!getInternalProjectionName(projection)){
videojs.log.error('videojs-vr: please pass a valid projection ' + validProjections.join(', '));
return;
}
this.currentProjection_=projection;
this.defaultProjection_=projection;
};
_proto.init=function init(){
var _this4=this;
this.reset();
this.camera=new PerspectiveCamera(75, this.player_.currentWidth() / this.player_.currentHeight(), 1, 1000);
this.cameraVector=new Vector3();
if(this.currentProjection_==='360_LR'||this.currentProjection_==='360_TB'||this.currentProjection_==='180'||this.currentProjection_==='180_LR'||this.currentProjection_==='180_MONO'||this.currentProjection_==='EAC_LR'){
this.camera.layers.enable(1);
}
this.scene=new Scene();
this.videoTexture=new VideoTexture(this.getVideoEl_());
this.videoTexture.generateMipmaps=false;
this.videoTexture.minFilter=LinearFilter;
this.videoTexture.magFilter=LinearFilter;
this.videoTexture.format=RGBFormat;
this.changeProjection_(this.currentProjection_);
if(this.currentProjection_==='NONE'){
this.log('Projection is NONE, dont init');
this.reset();
return;
}
this.player_.removeChild('BigPlayButton');
this.player_.addChild('BigVrPlayButton', {}, this.bigPlayButtonIndex_);
this.player_.bigPlayButton=this.player_.getChild('BigVrPlayButton');
if(this.options_.forceCardboard||videojs.browser.IS_ANDROID||videojs.browser.IS_IOS){
this.addCardboardButton_();
}
if(videojs.browser.IS_IOS&&this.player_.controlBar&&this.player_.controlBar.fullscreenToggle){
this.player_.controlBar.fullscreenToggle.hide();
}
this.camera.position.set(0, 0, 0);
this.renderer=new WebGLRenderer({
devicePixelRatio: window$1.devicePixelRatio,
alpha: false,
clearColor: 0xffffff,
antialias: true
});
var webglContext=this.renderer.getContext('webgl');
var oldTexImage2D=webglContext.texImage2D;
webglContext.texImage2D=function (){
try {
for (var _len2=arguments.length, args=new Array(_len2), _key2=0; _key2 < _len2; _key2++){
args[_key2]=arguments[_key2];
}
return oldTexImage2D.apply(webglContext, args);
} catch (e){
_this4.reset();
_this4.player_.pause();
_this4.triggerError_({
code: 'web-vr-hls-cors-not-supported',
dismiss: false
});
throw new Error(e);
}};
this.renderer.setSize(this.player_.currentWidth(), this.player_.currentHeight(), false);
this.effect=new VREffect(this.renderer);
this.effect.setSize(this.player_.currentWidth(), this.player_.currentHeight(), false);
this.vrDisplay=null;
this.prevTimestamps_=[];
this.renderedCanvas=this.renderer.domElement;
this.renderedCanvas.setAttribute('style', 'width: 100%; height: 100%; position: absolute; top:0;');
var videoElStyle=this.getVideoEl_().style;
this.player_.el().insertBefore(this.renderedCanvas, this.player_.el().firstChild);
videoElStyle.zIndex='-1';
videoElStyle.opacity='0';
if(window$1.navigator.getVRDisplays){
this.log('is supported, getting vr displays');
window$1.navigator.getVRDisplays().then(function (displays){
if(displays.length > 0){
_this4.log('Displays found', displays);
_this4.vrDisplay=displays[0];
if(!_this4.vrDisplay.isPolyfilled){
_this4.log('Real HMD found using VRControls', _this4.vrDisplay);
_this4.addCardboardButton_();
_this4.controls3d=new VRControls(_this4.camera);
}}
if(!_this4.controls3d){
_this4.log('no HMD found Using Orbit & Orientation Controls');
var options={
camera: _this4.camera,
canvas: _this4.renderedCanvas,
halfView: _this4.currentProjection_.indexOf('180')===0,
orientation: videojs.browser.IS_IOS||videojs.browser.IS_ANDROID||false
};
if(_this4.options_.motionControls===false){
options.orientation=false;
}
_this4.controls3d=new OrbitOrientationControls(options);
_this4.canvasPlayerControls=new CanvasPlayerControls(_this4.player_, _this4.renderedCanvas);
}
_this4.animationFrameId_=_this4.requestAnimationFrame(_this4.animate_);
});
}else if(window$1.navigator.getVRDevices){
this.triggerError_({
code: 'web-vr-out-of-date',
dismiss: false
});
}else{
this.triggerError_({
code: 'web-vr-not-supported',
dismiss: false
});
}
if(this.options_.omnitone){
var audiocontext=AudioContext.getContext();
this.omniController=new OmnitoneController(audiocontext, this.options_.omnitone, this.getVideoEl_(), this.options_.omnitoneOptions);
this.omniController.one('audiocontext-suspended', function (){
_this4.player.pause();
_this4.player.one('playing', function (){
audiocontext.resume();
});
});
}
this.on(this.player_, 'fullscreenchange', this.handleResize_);
window$1.addEventListener('vrdisplaypresentchange', this.handleResize_, true);
window$1.addEventListener('resize', this.handleResize_, true);
window$1.addEventListener('vrdisplayactivate', this.handleVrDisplayActivate_, true);
window$1.addEventListener('vrdisplaydeactivate', this.handleVrDisplayDeactivate_, true);
this.initialized_=true;
this.trigger('initialized');
};
_proto.addCardboardButton_=function addCardboardButton_(){
if(!this.player_.controlBar.getChild('CardboardButton')){
this.player_.controlBar.addChild('CardboardButton', {});
}};
_proto.getVideoEl_=function getVideoEl_(){
return this.player_.el().getElementsByTagName('video')[0];
};
_proto.reset=function reset(){
if(!this.initialized_){
return;
}
if(this.omniController){
this.omniController.off('audiocontext-suspended');
this.omniController.dispose();
this.omniController=undefined;
}
if(this.controls3d){
this.controls3d.dispose();
this.controls3d=null;
}
if(this.canvasPlayerControls){
this.canvasPlayerControls.dispose();
this.canvasPlayerControls=null;
}
if(this.effect){
this.effect.dispose();
this.effect=null;
}
window$1.removeEventListener('resize', this.handleResize_, true);
window$1.removeEventListener('vrdisplaypresentchange', this.handleResize_, true);
window$1.removeEventListener('vrdisplayactivate', this.handleVrDisplayActivate_, true);
window$1.removeEventListener('vrdisplaydeactivate', this.handleVrDisplayDeactivate_, true);
if(!this.player_.getChild('BigPlayButton')){
this.player_.addChild('BigPlayButton', {}, this.bigPlayButtonIndex_);
}
if(this.player_.getChild('BigVrPlayButton')){
this.player_.removeChild('BigVrPlayButton');
}
if(this.player_.getChild('CardboardButton')){
this.player_.controlBar.removeChild('CardboardButton');
}
if(videojs.browser.IS_IOS&&this.player_.controlBar&&this.player_.controlBar.fullscreenToggle){
this.player_.controlBar.fullscreenToggle.show();
}
var videoElStyle=this.getVideoEl_().style;
videoElStyle.zIndex='';
videoElStyle.opacity='';
this.currentProjection_=this.defaultProjection_;
if(this.iosRevertTouchToClick_){
this.iosRevertTouchToClick_();
}
if(this.renderedCanvas){
this.renderedCanvas.parentNode.removeChild(this.renderedCanvas);
}
if(this.animationFrameId_){
this.cancelAnimationFrame(this.animationFrameId_);
}
this.initialized_=false;
};
_proto.dispose=function dispose(){
_Plugin.prototype.dispose.call(this);
this.reset();
};
_proto.polyfillVersion=function polyfillVersion(){
return WebVRPolyfill.version;
};
return VR;
}(Plugin);
VR.prototype.setTimeout=Component.prototype.setTimeout;
VR.prototype.clearTimeout=Component.prototype.clearTimeout;
VR.VERSION=version;
videojs.registerPlugin('vr', VR);
return VR;
})));
window.pannellum=(function(window, document, undefined){
'use strict';
function Viewer(container, initialConfig){
var _this=this;
var config,
renderer,
preview,
isUserInteracting=false,
latestInteraction=Date.now(),
onPointerDownPointerX=0,
onPointerDownPointerY=0,
onPointerDownPointerDist=-1,
onPointerDownYaw=0,
onPointerDownPitch=0,
keysDown=new Array(10),
fullscreenActive=false,
loaded,
error=false,
isTimedOut=false,
listenersAdded=false,
panoImage,
prevTime,
speed={'yaw': 0, 'pitch': 0, 'hfov': 0},
animating=false,
orientation=false,
orientationYawOffset=0,
autoRotateStart,
autoRotateSpeed=0,
origHfov,
origPitch,
animatedMove={},
externalEventListeners={},
specifiedPhotoSphereExcludes=[],
update=false,
eps=1e-6,
hotspotsCreated=false,
destroyed=false;
var defaultConfig={
hfov: 100,
minHfov: 50,
multiResMinHfov: false,
maxHfov: 120,
pitch: 0,
minPitch: undefined,
maxPitch: undefined,
yaw: 0,
minYaw: -180,
maxYaw: 180,
roll: 0,
haov: 360,
vaov: 180,
vOffset: 0,
autoRotate: false,
autoRotateInactivityDelay: -1,
autoRotateStopDelay: undefined,
type: 'equirectangular',
northOffset: 0,
showFullscreenCtrl: true,
dynamic: false,
dynamicUpdate: false,
doubleClickZoom: true,
keyboardZoom: true,
mouseZoom: true,
showZoomCtrl: true,
autoLoad: false,
showControls: true,
orientationOnByDefault: false,
hotSpotDebug: false,
backgroundColor: [0, 0, 0],
avoidShowingBackground: false,
animationTimingFunction: timingFunction,
draggable: true,
disableKeyboardCtrl: false,
crossOrigin: 'anonymous',
touchPanSpeedCoeffFactor: -1,
capturedKeyNumbers: [16, 17, 27, 37, 38, 39, 40, 61, 65, 68, 83, 87, 107, 109, 173, 187, 189],
friction: 0.15
};
defaultConfig.strings={
loadButtonLabel: 'Click to<br>Load<br>Panorama',
loadingLabel: 'Loading...',
bylineLabel: ' %s',
noPanoramaError: 'No panorama image was specified.',
fileAccessError: 'The file %s could not be accessed.',
malformedURLError: 'There is something wrong with the panorama URL.',
iOS8WebGLError: "Due to iOS 8's broken WebGL implementation, only " +
"progressive encoded JPEGs work for your device (this " +
"panorama uses standard encoding).",
genericWebGLError: 'Your browser does not have the necessary WebGL support to display this panorama.',
textureSizeError: 'This panorama is too big for your device! It\'s ' +
'%spx wide, but your device only supports images up to ' +
'%spx wide. Try another device.' +
' (If you\'re the author, try scaling down the image.)',
unknownError: 'Unknown error. Check developer console.',
};
container=typeof container==='string' ? document.getElementById(container):container;
container.classList.add('pnlm-container');
container.tabIndex=0;
var uiContainer=document.createElement('div');
uiContainer.className='pnlm-ui';
container.appendChild(uiContainer);
var renderContainer=document.createElement('div');
renderContainer.className='pnlm-render-container';
container.appendChild(renderContainer);
var dragFix=document.createElement('div');
dragFix.className='pnlm-dragfix';
uiContainer.appendChild(dragFix);
var aboutMsg=document.createElement('span');
aboutMsg.className='pnlm-about-msg';
var wpvrAboutMsgHtml='';
if(window.wpvr_public&&!window.wpvr_public.is_pro_active){
var wpvrBadgeVariants=[
{label: 'Powered by WPVR', utmContent: 'control'},
{label: 'Create your own virtual tour - Free', utmContent: 'benefit_cta'},
{label: 'Built with WPVR -> Create yours', utmContent: 'action_cta'}
];
var wpvrSelectedVariant=wpvrBadgeVariants[Math.floor(Math.random() * wpvrBadgeVariants.length)];
var wpvrBadgeUrl='https://rextheme.com/go/wpvr/' + wpvrSelectedVariant.utmContent;
wpvrAboutMsgHtml='<a href="' + wpvrBadgeUrl + '" target="_blank" rel="noopener noreferrer">' + wpvrSelectedVariant.label + '</a>';
}
if(wpvrAboutMsgHtml){
aboutMsg.innerHTML=wpvrAboutMsgHtml;
uiContainer.appendChild(aboutMsg);
dragFix.addEventListener('contextmenu', aboutMessage);
}
var infoDisplay={};
var hotSpotDebugIndicator=document.createElement('div');
hotSpotDebugIndicator.className='pnlm-sprite pnlm-hot-spot-debug-indicator';
uiContainer.appendChild(hotSpotDebugIndicator);
infoDisplay.container=document.createElement('div');
infoDisplay.container.className='pnlm-panorama-info';
infoDisplay.title=document.createElement('div');
infoDisplay.title.className='pnlm-title-box';
infoDisplay.container.appendChild(infoDisplay.title);
infoDisplay.author=document.createElement('div');
infoDisplay.author.className='pnlm-author-box';
infoDisplay.container.appendChild(infoDisplay.author);
uiContainer.appendChild(infoDisplay.container);
infoDisplay.load={};
infoDisplay.load.box=document.createElement('div');
infoDisplay.load.box.className='pnlm-load-box';
infoDisplay.load.boxp=document.createElement('p');
infoDisplay.load.box.appendChild(infoDisplay.load.boxp);
infoDisplay.load.lbox=document.createElement('div');
infoDisplay.load.lbox.className='pnlm-lbox';
infoDisplay.load.lbox.innerHTML='<div class="pnlm-loading"></div>';
infoDisplay.load.box.appendChild(infoDisplay.load.lbox);
infoDisplay.load.lbar=document.createElement('div');
infoDisplay.load.lbar.className='pnlm-lbar';
infoDisplay.load.lbarFill=document.createElement('div');
infoDisplay.load.lbarFill.className='pnlm-lbar-fill';
infoDisplay.load.lbar.appendChild(infoDisplay.load.lbarFill);
infoDisplay.load.box.appendChild(infoDisplay.load.lbar);
infoDisplay.load.msg=document.createElement('p');
infoDisplay.load.msg.className='pnlm-lmsg';
infoDisplay.load.box.appendChild(infoDisplay.load.msg);
uiContainer.appendChild(infoDisplay.load.box);
infoDisplay.errorMsg=document.createElement('div');
infoDisplay.errorMsg.className='pnlm-error-msg pnlm-info-box';
uiContainer.appendChild(infoDisplay.errorMsg);
var controls={};
controls.container=document.createElement('div');
controls.container.className='pnlm-controls-container';
uiContainer.appendChild(controls.container);
controls.load=document.createElement('div');
controls.load.className='pnlm-load-button';
controls.load.addEventListener('click', function(){
processOptions();
load();
});
uiContainer.appendChild(controls.load);
controls.zoom=document.createElement('div');
controls.zoom.className='pnlm-zoom-controls pnlm-controls';
controls.zoomIn=document.createElement('div');
controls.zoomIn.className='pnlm-zoom-in pnlm-sprite pnlm-control';
controls.zoomIn.addEventListener('click', zoomIn);
controls.zoom.appendChild(controls.zoomIn);
controls.zoomOut=document.createElement('div');
controls.zoomOut.className='pnlm-zoom-out pnlm-sprite pnlm-control';
controls.zoomOut.addEventListener('click', zoomOut);
controls.zoom.appendChild(controls.zoomOut);
controls.container.appendChild(controls.zoom);
controls.fullscreen=document.createElement('div');
controls.fullscreen.addEventListener('click', toggleFullscreen);
controls.fullscreen.className='pnlm-fullscreen-toggle-button pnlm-sprite pnlm-fullscreen-toggle-button-inactive pnlm-controls pnlm-control';
if(document.fullscreenEnabled||document.mozFullScreenEnabled||document.webkitFullscreenEnabled||document.msFullscreenEnabled)
controls.container.appendChild(controls.fullscreen);
controls.orientation=document.createElement('div');
controls.orientation.addEventListener('click', function(e){
if(orientation)
stopOrientation();
else
startOrientation();
});
controls.orientation.addEventListener('mousedown', function(e){e.stopPropagation();});
controls.orientation.addEventListener('touchstart', function(e){e.stopPropagation();});
controls.orientation.addEventListener('pointerdown', function(e){e.stopPropagation();});
controls.orientation.className='pnlm-orientation-button pnlm-orientation-button-inactive pnlm-sprite pnlm-controls pnlm-control';
var orientationSupport=false;
if(window.DeviceOrientationEvent&&location.protocol=='https:' &&
navigator.userAgent.toLowerCase().indexOf('mobi') >=0){
controls.container.appendChild(controls.orientation);
orientationSupport=true;
}
var compass=document.createElement('div');
compass.className='pnlm-compass pnlm-controls pnlm-control';
uiContainer.appendChild(compass);
if(initialConfig.firstScene){
mergeConfig(initialConfig.firstScene);
}else if(initialConfig.default&&initialConfig.default.firstScene){
mergeConfig(initialConfig.default.firstScene);
}else{
mergeConfig(null);
}
processOptions(true);
function init(){
var div=document.createElement("div");
div.innerHTML="<!--[if lte IE 9]><i></i><![endif]-->";
if(div.getElementsByTagName("i").length==1){
anError();
return;
}
origHfov=config.hfov;
origPitch=config.pitch;
var i, p;
if(config.type=='cubemap'){
panoImage=[];
for (i=0; i < 6; i++){
panoImage.push(new Image());
panoImage[i].crossOrigin=config.crossOrigin;
}
infoDisplay.load.lbox.style.display='block';
infoDisplay.load.lbar.style.display='none';
}else if(config.type=='multires'){
var c=JSON.parse(JSON.stringify(config.multiRes));
if(config.basePath&&config.multiRes.basePath &&
!(/^(?:[a-z]+:)?\/\//i.test(config.multiRes.basePath))){
c.basePath=config.basePath + config.multiRes.basePath;
}else if(config.multiRes.basePath){
c.basePath=config.multiRes.basePath;
}else if(config.basePath){
c.basePath=config.basePath;
}
panoImage=c;
}else{
if(config.dynamic===true){
panoImage=config.panorama;
}else{
if(config.panorama===undefined){
anError(config.strings.noPanoramaError);
return;
}
panoImage=new Image();
}}
if(config.type=='cubemap'){
var itemsToLoad=6;
var onLoad=function(){
itemsToLoad--;
if(itemsToLoad===0){
onImageLoad();
}};
var onError=function(e){
var a=document.createElement('a');
a.href=e.target.src;
a.textContent=a.href;
anError(config.strings.fileAccessError.replace('%s', a.outerHTML));
};
for (i=0; i < panoImage.length; i++){
p=config.cubeMap[i];
if(p=="null"){
console.log('Will use background instead of missing cubemap face ' + i);
onLoad();
}else{
if(config.basePath&&!absoluteURL(p)){
p=config.basePath + p;
}
panoImage[i].onload=onLoad;
panoImage[i].onerror=onError;
panoImage[i].src=sanitizeURL(p);
}}
}else if(config.type=='multires'){
onImageLoad();
}else{
p='';
if(config.basePath){
p=config.basePath;
}
if(config.dynamic!==true){
p=absoluteURL(config.panorama) ? config.panorama:p + config.panorama;
panoImage.onload=function(){
window.URL.revokeObjectURL(this.src);
onImageLoad();
};
var xhr=new XMLHttpRequest();
xhr.onloadend=function(){
if(xhr.status!=200){
var a=document.createElement('a');
a.href=p;
a.textContent=a.href;
anError(config.strings.fileAccessError.replace('%s', a.outerHTML));
}
var img=this.response;
parseGPanoXMP(img, p);
infoDisplay.load.msg.innerHTML='';
};
xhr.onprogress=function(e){
if(e.lengthComputable){
var percent=e.loaded / e.total * 100;
infoDisplay.load.lbarFill.style.width=percent + '%';
var unit, numerator, denominator;
if(e.total > 1e6){
unit='MB';
numerator=(e.loaded / 1e6).toFixed(2);
denominator=(e.total / 1e6).toFixed(2);
}else if(e.total > 1e3){
unit='kB';
numerator=(e.loaded / 1e3).toFixed(1);
denominator=(e.total / 1e3).toFixed(1);
}else{
unit='B';
numerator=e.loaded;
denominator=e.total;
}
infoDisplay.load.msg.innerHTML=numerator + ' / ' + denominator + ' ' + unit;
}else{
infoDisplay.load.lbox.style.display='block';
infoDisplay.load.lbar.style.display='none';
}};
try {
xhr.open('GET', p, true);
} catch (e){
anError(config.strings.malformedURLError);
}
xhr.responseType='blob';
xhr.setRequestHeader('Accept', 'image*;q=0.9');
xhr.withCredentials=config.crossOrigin==='use-credentials';
xhr.send();
}}
if(config.draggable)
uiContainer.classList.add('pnlm-grab');
uiContainer.classList.remove('pnlm-grabbing');
update=config.dynamicUpdate===true;
if(config.dynamic&&update){
panoImage=config.panorama;
onImageLoad();
}}
function absoluteURL(url){
return new RegExp('^(?:[a-z]+:)?//', 'i').test(url)||url[0]=='/'||url.slice(0, 5)=='blob:';
}
function onImageLoad(){
if(!renderer)
renderer=new libpannellum.renderer(renderContainer);
if(!listenersAdded){
listenersAdded=true;
dragFix.addEventListener('mousedown', onDocumentMouseDown, false);
document.addEventListener('mousemove', onDocumentMouseMove, false);
document.addEventListener('mouseup', onDocumentMouseUp, false);
if(config.mouseZoom){
uiContainer.addEventListener('mousewheel', onDocumentMouseWheel, false);
uiContainer.addEventListener('DOMMouseScroll', onDocumentMouseWheel, false);
}
if(config.doubleClickZoom){
dragFix.addEventListener('dblclick', onDocumentDoubleClick, false);
}
container.addEventListener('mozfullscreenchange', onFullScreenChange, false);
container.addEventListener('webkitfullscreenchange', onFullScreenChange, false);
container.addEventListener('msfullscreenchange', onFullScreenChange, false);
container.addEventListener('fullscreenchange', onFullScreenChange, false);
window.addEventListener('resize', onDocumentResize, false);
window.addEventListener('orientationchange', onDocumentResize, false);
if(!config.disableKeyboardCtrl){
container.addEventListener('keydown', onDocumentKeyPress, false);
container.addEventListener('keyup', onDocumentKeyUp, false);
container.addEventListener('blur', clearKeys, false);
}
document.addEventListener('mouseleave', onDocumentMouseUp, false);
if(window.PointerEvent){
dragFix.addEventListener('pointerdown', onDocumentPointerDown, false);
dragFix.addEventListener('pointermove', onDocumentPointerMove, false);
dragFix.addEventListener('pointerup', onDocumentPointerUp, false);
dragFix.addEventListener('pointerleave', onDocumentPointerUp, false);
}else{
dragFix.addEventListener('touchstart', onDocumentTouchStart, { passive: false });
dragFix.addEventListener('touchmove', onDocumentTouchMove, { passive: false });
dragFix.addEventListener('touchend', onDocumentTouchEnd, false);
}
if(window.navigator.pointerEnabled)
container.style.touchAction='none';
}
renderInit();
setHfov(config.hfov);
setTimeout(function(){isTimedOut=true;}, 500);
}
function parseGPanoXMP(image, url){
var reader=new FileReader();
reader.addEventListener('loadend', function(){
var img=reader.result;
if(navigator.userAgent.toLowerCase().match(/(iphone|ipod|ipad).* os 8_/)){
var flagIndex=img.indexOf('\xff\xc2');
if(flagIndex < 0||flagIndex > 65536)
anError(config.strings.iOS8WebGLError);
}
var start=img.indexOf('<x:xmpmeta');
if(start > -1&&config.ignoreGPanoXMP!==true){
var xmpData=img.substring(start, img.indexOf('</x:xmpmeta>') + 12);
var getTag=function(tag){
var result;
if(xmpData.indexOf(tag + '="') >=0){
result=xmpData.substring(xmpData.indexOf(tag + '="') + tag.length + 2);
result=result.substring(0, result.indexOf('"'));
}else if(xmpData.indexOf(tag + '>') >=0){
result=xmpData.substring(xmpData.indexOf(tag + '>') + tag.length + 1);
result=result.substring(0, result.indexOf('<'));
}
if(result!==undefined){
return Number(result);
}
return null;
};
var xmp={
fullWidth: getTag('GPano:FullPanoWidthPixels'),
croppedWidth: getTag('GPano:CroppedAreaImageWidthPixels'),
fullHeight: getTag('GPano:FullPanoHeightPixels'),
croppedHeight: getTag('GPano:CroppedAreaImageHeightPixels'),
topPixels: getTag('GPano:CroppedAreaTopPixels'),
heading: getTag('GPano:PoseHeadingDegrees'),
horizonPitch: getTag('GPano:PosePitchDegrees'),
horizonRoll: getTag('GPano:PoseRollDegrees')
};
if(xmp.fullWidth!==null&&xmp.croppedWidth!==null &&
xmp.fullHeight!==null&&xmp.croppedHeight!==null &&
xmp.topPixels!==null){
if(specifiedPhotoSphereExcludes.indexOf('haov') < 0)
config.haov=xmp.croppedWidth / xmp.fullWidth * 360;
if(specifiedPhotoSphereExcludes.indexOf('vaov') < 0)
config.vaov=xmp.croppedHeight / xmp.fullHeight * 180;
if(specifiedPhotoSphereExcludes.indexOf('vOffset') < 0)
config.vOffset=((xmp.topPixels + xmp.croppedHeight / 2) / xmp.fullHeight - 0.5) * -180;
if(xmp.heading!==null&&specifiedPhotoSphereExcludes.indexOf('northOffset') < 0){
config.northOffset=xmp.heading;
if(config.compass!==false){
config.compass=true;
}}
if(xmp.horizonPitch!==null&&xmp.horizonRoll!==null){
if(specifiedPhotoSphereExcludes.indexOf('horizonPitch') < 0)
config.horizonPitch=xmp.horizonPitch;
if(specifiedPhotoSphereExcludes.indexOf('horizonRoll') < 0)
config.horizonRoll=xmp.horizonRoll;
}}
}
panoImage.src=window.URL.createObjectURL(image);
panoImage.onerror=function(){
function getCspHeaders(){
if(!window.fetch)
return null;
return window.fetch(document.location.href)
.then(function(resp){
return resp.headers.get('Content-Security-Policy');
});
}
getCspHeaders().then(function(cspHeaders){
if(cspHeaders){
var invalidImgSource=cspHeaders.split(";").find(function(p){
var matchstring=p.match(/img-src(.*)/);
if(matchstring){
return !matchstring[1].includes("blob");
}});
if(invalidImgSource){
console.log('CSP blocks blobs; reverting to URL.');
panoImage.crossOrigin=config.crossOrigin;
panoImage.src=url;
}}
});
}});
if(reader.readAsBinaryString!==undefined)
reader.readAsBinaryString(image);
else
reader.readAsText(image);
}
function anError(errorMsg){
if(errorMsg===undefined)
errorMsg=config.strings.genericWebGLError;
infoDisplay.errorMsg.innerHTML='<p>' + errorMsg + '</p>';
controls.load.style.display='none';
infoDisplay.load.box.style.display='none';
infoDisplay.errorMsg.style.display='table';
error=true;
loaded=undefined;
renderContainer.style.display='none';
fireEvent('error', errorMsg);
}
function clearError(){
if(error){
infoDisplay.load.box.style.display='none';
infoDisplay.errorMsg.style.display='none';
error=false;
renderContainer.style.display='block';
fireEvent('errorcleared');
}}
function aboutMessage(event){
var pos=mousePosition(event);
aboutMsg.style.left=pos.x + 'px';
aboutMsg.style.top=pos.y + 'px';
clearTimeout(aboutMessage.t1);
clearTimeout(aboutMessage.t2);
aboutMsg.style.display='block';
aboutMsg.style.opacity=1;
aboutMessage.t1=setTimeout(function(){aboutMsg.style.opacity=0;}, 2000);
aboutMessage.t2=setTimeout(function(){aboutMsg.style.display='none';}, 2500);
event.preventDefault();
}
function mousePosition(event){
var bounds=container.getBoundingClientRect();
var pos={};
pos.x=(event.clientX||event.pageX) - bounds.left;
pos.y=(event.clientY||event.pageY) - bounds.top;
return pos;
}
function onDocumentMouseDown(event){
event.preventDefault();
container.focus();
if(!loaded||!config.draggable){
return;
}
var pos=mousePosition(event);
if(config.hotSpotDebug){
var coords=mouseEventToCoords(event);
console.log('Pitch: ' + coords[0] + ', Yaw: ' + coords[1] + ', Center Pitch: ' +
config.pitch + ', Center Yaw: ' + config.yaw + ', HFOV: ' + config.hfov);
}
stopAnimation();
stopOrientation();
config.roll=0;
speed.hfov=0;
isUserInteracting=true;
latestInteraction=Date.now();
onPointerDownPointerX=pos.x;
onPointerDownPointerY=pos.y;
onPointerDownYaw=config.yaw;
onPointerDownPitch=config.pitch;
uiContainer.classList.add('pnlm-grabbing');
uiContainer.classList.remove('pnlm-grab');
fireEvent('mousedown', event);
animateInit();
}
function onDocumentDoubleClick(event){
if(config.minHfov===config.hfov){
_this.setHfov(origHfov, 1000);
}else{
var coords=mouseEventToCoords(event);
_this.lookAt(coords[0], coords[1], config.minHfov, 1000);
}}
function mouseEventToCoords(event){
var pos=mousePosition(event);
var canvas=renderer.getCanvas();
var canvasWidth=canvas.clientWidth,
canvasHeight=canvas.clientHeight;
var x=pos.x / canvasWidth * 2 - 1;
var y=(1 - pos.y / canvasHeight * 2) * canvasHeight / canvasWidth;
var focal=1 / Math.tan(config.hfov * Math.PI / 360);
var s=Math.sin(config.pitch * Math.PI / 180);
var c=Math.cos(config.pitch * Math.PI / 180);
var a=focal * c - y * s;
var root=Math.sqrt(x*x + a*a);
var pitch=Math.atan((y * c + focal * s) / root) * 180 / Math.PI;
var yaw=Math.atan2(x / root, a / root) * 180 / Math.PI + config.yaw;
if(yaw < -180)
yaw +=360;
if(yaw > 180)
yaw -=360;
return [pitch, yaw];
}
function onDocumentMouseMove(event){
if(isUserInteracting&&loaded){
latestInteraction=Date.now();
var canvas=renderer.getCanvas();
var canvasWidth=canvas.clientWidth,
canvasHeight=canvas.clientHeight;
var pos=mousePosition(event);
var yaw=((Math.atan(onPointerDownPointerX / canvasWidth * 2 - 1) - Math.atan(pos.x / canvasWidth * 2 - 1)) * 180 / Math.PI * config.hfov / 90) + onPointerDownYaw;
speed.yaw=(yaw - config.yaw) % 360 * 0.2;
config.yaw=yaw;
var vfov=2 * Math.atan(Math.tan(config.hfov/360*Math.PI) * canvasHeight / canvasWidth) * 180 / Math.PI;
var pitch=((Math.atan(pos.y / canvasHeight * 2 - 1) - Math.atan(onPointerDownPointerY / canvasHeight * 2 - 1)) * 180 / Math.PI * vfov / 90) + onPointerDownPitch;
speed.pitch=(pitch - config.pitch) * 0.2;
config.pitch=pitch;
var mirrorData={
pitch: pitch,
yaw: yaw
}
fireEvent('mousemove', mirrorData);
}}
function onDocumentMouseUp(event){
if(!isUserInteracting){
return;
}
isUserInteracting=false;
if(Date.now() - latestInteraction > 15){
speed.pitch=speed.yaw=0;
}
uiContainer.classList.add('pnlm-grab');
uiContainer.classList.remove('pnlm-grabbing');
latestInteraction=Date.now();
fireEvent('mouseup', event);
}
function onDocumentTouchStart(event){
if(!loaded||!config.draggable){
return;
}
stopAnimation();
stopOrientation();
config.roll=0;
speed.hfov=0;
var pos0=mousePosition(event.targetTouches[0]);
onPointerDownPointerX=pos0.x;
onPointerDownPointerY=pos0.y;
if(event.targetTouches.length==2){
var pos1=mousePosition(event.targetTouches[1]);
onPointerDownPointerX +=(pos1.x - pos0.x) * 0.5;
onPointerDownPointerY +=(pos1.y - pos0.y) * 0.5;
onPointerDownPointerDist=Math.sqrt((pos0.x - pos1.x) * (pos0.x - pos1.x) +
(pos0.y - pos1.y) * (pos0.y - pos1.y));
}
isUserInteracting=true;
latestInteraction=Date.now();
onPointerDownYaw=config.yaw;
onPointerDownPitch=config.pitch;
fireEvent('touchstart', event);
animateInit();
}
function onDocumentTouchMove(event){
if(!config.draggable){
return;
}
event.preventDefault();
if(loaded){
latestInteraction=Date.now();
}
if(isUserInteracting&&loaded){
var pos0=mousePosition(event.targetTouches[0]);
var clientX=pos0.x;
var clientY=pos0.y;
if(event.targetTouches.length==2&&onPointerDownPointerDist!=-1){
var pos1=mousePosition(event.targetTouches[1]);
clientX +=(pos1.x - pos0.x) * 0.5;
clientY +=(pos1.y - pos0.y) * 0.5;
var clientDist=Math.sqrt((pos0.x - pos1.x) * (pos0.x - pos1.x) +
(pos0.y - pos1.y) * (pos0.y - pos1.y));
setHfov(config.hfov + (onPointerDownPointerDist - clientDist) * 0.1);
onPointerDownPointerDist=clientDist;
}
var touchmovePanSpeedCoeff=(config.hfov / 360) * config.touchPanSpeedCoeffFactor;
var yaw=(clientX - onPointerDownPointerX) * touchmovePanSpeedCoeff + onPointerDownYaw;
speed.yaw=(yaw - config.yaw) % 360 * 0.2;
config.yaw=yaw;
var pitch=(onPointerDownPointerY - clientY) * touchmovePanSpeedCoeff + onPointerDownPitch;
speed.pitch=(pitch - config.pitch) * 0.2;
config.pitch=pitch;
var mirrorData={
pitch: pitch,
yaw: yaw
}
fireEvent('touchmove', mirrorData);
}}
function onDocumentTouchEnd(){
isUserInteracting=false;
if(Date.now() - latestInteraction > 150){
speed.pitch=speed.yaw=0;
}
onPointerDownPointerDist=-1;
latestInteraction=Date.now();
fireEvent('touchend', event);
}
var pointerIDs=[],
pointerCoordinates=[];
function onDocumentPointerDown(event){
if(event.pointerType=='touch'){
if(!loaded||!config.draggable)
return;
pointerIDs.push(event.pointerId);
var pos=mousePosition(event);
pointerCoordinates.push({clientX: pos.x, clientY: pos.y});
event.targetTouches=pointerCoordinates;
onDocumentTouchStart(event);
event.preventDefault();
}}
function onDocumentPointerMove(event){
if(event.pointerType=='touch'){
if(!config.draggable)
return;
for (var i=0; i < pointerIDs.length; i++){
if(event.pointerId==pointerIDs[i]){
var pos=mousePosition(event);
pointerCoordinates[i].clientX=pos.x;
pointerCoordinates[i].clientY=pos.y;
event.targetTouches=pointerCoordinates;
onDocumentTouchMove(event);
event.preventDefault();
return;
}}
}}
function onDocumentPointerUp(event){
if(event.pointerType=='touch'){
var defined=false;
for (var i=0; i < pointerIDs.length; i++){
if(event.pointerId==pointerIDs[i])
pointerIDs[i]=undefined;
if(pointerIDs[i])
defined=true;
}
if(!defined){
pointerIDs=[];
pointerCoordinates=[];
onDocumentTouchEnd();
}
event.preventDefault();
}}
function onDocumentMouseWheel(event){
if(!loaded||(config.mouseZoom=='fullscreenonly'&&!fullscreenActive)){
return;
}
event.preventDefault();
stopAnimation();
latestInteraction=Date.now();
if(event.wheelDeltaY){
setHfov(config.hfov - event.wheelDeltaY * 0.05);
speed.hfov=event.wheelDelta < 0 ? 1:-1;
}else if(event.wheelDelta){
setHfov(config.hfov - event.wheelDelta * 0.05);
speed.hfov=event.wheelDelta < 0 ? 1:-1;
}else if(event.detail){
setHfov(config.hfov + event.detail * 1.5);
speed.hfov=event.detail > 0 ? 1:-1;
}
animateInit();
}
function onDocumentKeyPress(event){
stopAnimation();
latestInteraction=Date.now();
stopOrientation();
config.roll=0;
var keynumber=event.which||event.keycode;
if(config.capturedKeyNumbers.indexOf(keynumber) < 0)
return;
event.preventDefault();
if(keynumber==27){
if(fullscreenActive){
toggleFullscreen();
}}else{
changeKey(keynumber, true);
}}
function clearKeys(){
for (var i=0; i < 10; i++){
keysDown[i]=false;
}}
function onDocumentKeyUp(event){
var keynumber=event.which||event.keycode;
if(config.capturedKeyNumbers.indexOf(keynumber) < 0)
return;
event.preventDefault();
changeKey(keynumber, false);
}
function changeKey(keynumber, value){
var keyChanged=false;
switch(keynumber){
case 109: case 189: case 17: case 173:
if(keysDown[0]!=value){ keyChanged=true; }
keysDown[0]=value; break;
case 107: case 187: case 16: case 61:
if(keysDown[1]!=value){ keyChanged=true; }
keysDown[1]=value; break;
case 38:
if(keysDown[2]!=value){ keyChanged=true; }
keysDown[2]=value; break;
case 87:
if(keysDown[6]!=value){ keyChanged=true; }
keysDown[6]=value; break;
case 40:
if(keysDown[3]!=value){ keyChanged=true; }
keysDown[3]=value; break;
case 83:
if(keysDown[7]!=value){ keyChanged=true; }
keysDown[7]=value; break;
case 37:
if(keysDown[4]!=value){ keyChanged=true; }
keysDown[4]=value; break;
case 65:
if(keysDown[8]!=value){ keyChanged=true; }
keysDown[8]=value; break;
case 39:
if(keysDown[5]!=value){ keyChanged=true; }
keysDown[5]=value; break;
case 68:
if(keysDown[9]!=value){ keyChanged=true; }
keysDown[9]=value;
}
if(keyChanged&&value){
if(typeof performance!=='undefined'&&performance.now()){
prevTime=performance.now();
}else{
prevTime=Date.now();
}
animateInit();
}}
function keyRepeat(){
if(!loaded){
return;
}
var isKeyDown=false;
var prevPitch=config.pitch;
var prevYaw=config.yaw;
var prevZoom=config.hfov;
var newTime;
if(typeof performance!=='undefined'&&performance.now()){
newTime=performance.now();
}else{
newTime=Date.now();
}
if(prevTime===undefined){
prevTime=newTime;
}
var diff=(newTime - prevTime) * config.hfov / 1700;
diff=Math.min(diff, 1.0);
if(keysDown[0]&&config.keyboardZoom===true){
setHfov(config.hfov + (speed.hfov * 0.8 + 0.5) * diff);
isKeyDown=true;
}
if(keysDown[1]&&config.keyboardZoom===true){
setHfov(config.hfov + (speed.hfov * 0.8 - 0.2) * diff);
isKeyDown=true;
}
if(keysDown[2]||keysDown[6]){
config.pitch +=(speed.pitch * 0.8 + 0.2) * diff;
isKeyDown=true;
}
if(keysDown[3]||keysDown[7]){
config.pitch +=(speed.pitch * 0.8 - 0.2) * diff;
isKeyDown=true;
}
if(keysDown[4]||keysDown[8]){
config.yaw +=(speed.yaw * 0.8 - 0.2) * diff;
isKeyDown=true;
}
if(keysDown[5]||keysDown[9]){
config.yaw +=(speed.yaw * 0.8 + 0.2) * diff;
isKeyDown=true;
}
if(isKeyDown)
latestInteraction=Date.now();
if(config.autoRotate){
if(newTime - prevTime > 0.001){
var timeDiff=(newTime - prevTime) / 1000;
var yawDiff=(speed.yaw / timeDiff * diff - config.autoRotate * 0.2) * timeDiff;
yawDiff=(-config.autoRotate > 0 ? 1:-1) * Math.min(Math.abs(config.autoRotate * timeDiff), Math.abs(yawDiff));
config.yaw +=yawDiff;
}
if(config.autoRotateStopDelay){
config.autoRotateStopDelay -=newTime - prevTime;
if(config.autoRotateStopDelay <=0){
config.autoRotateStopDelay=false;
autoRotateSpeed=config.autoRotate;
config.autoRotate=0;
}}
}
if(animatedMove.pitch){
animateMove('pitch');
prevPitch=config.pitch;
}
if(animatedMove.yaw){
animateMove('yaw');
prevYaw=config.yaw;
}
if(animatedMove.hfov){
animateMove('hfov');
prevZoom=config.hfov;
}
if(diff > 0&&!config.autoRotate){
var slowDownFactor=1 - config.friction;
if(!keysDown[4]&&!keysDown[5]&&!keysDown[8]&&!keysDown[9]&&!animatedMove.yaw){
config.yaw +=speed.yaw * diff * slowDownFactor;
}
if(!keysDown[2]&&!keysDown[3]&&!keysDown[6]&&!keysDown[7]&&!animatedMove.pitch){
config.pitch +=speed.pitch * diff * slowDownFactor;
}
if(!keysDown[0]&&!keysDown[1]&&!animatedMove.hfov){
setHfov(config.hfov + speed.hfov * diff * slowDownFactor);
}}
prevTime=newTime;
if(diff > 0){
speed.yaw=speed.yaw * 0.8 + (config.yaw - prevYaw) / diff * 0.2;
speed.pitch=speed.pitch * 0.8 + (config.pitch - prevPitch) / diff * 0.2;
speed.hfov=speed.hfov * 0.8 + (config.hfov - prevZoom) / diff * 0.2;
var maxSpeed=config.autoRotate ? Math.abs(config.autoRotate):5;
speed.yaw=Math.min(maxSpeed, Math.max(speed.yaw, -maxSpeed));
speed.pitch=Math.min(maxSpeed, Math.max(speed.pitch, -maxSpeed));
speed.hfov=Math.min(maxSpeed, Math.max(speed.hfov, -maxSpeed));
}
if(keysDown[0]&&keysDown[1]){
speed.hfov=0;
}
if((keysDown[2]||keysDown[6])&&(keysDown[3]||keysDown[7])){
speed.pitch=0;
}
if((keysDown[4]||keysDown[8])&&(keysDown[5]||keysDown[9])){
speed.yaw=0;
}}
function animateMove(axis){
var t=animatedMove[axis];
var normTime=Math.min(1, Math.max((Date.now() - t.startTime) / 1000 / (t.duration / 1000), 0));
var result=t.startPosition + config.animationTimingFunction(normTime) * (t.endPosition - t.startPosition);
if((t.endPosition > t.startPosition&&result >=t.endPosition) ||
(t.endPosition < t.startPosition&&result <=t.endPosition) ||
t.endPosition===t.startPosition){
result=t.endPosition;
speed[axis]=0;
delete animatedMove[axis];
}
config[axis]=result;
}
function timingFunction(t){
return t < 0.5 ? 2*t*t:-1+(4-2*t)*t;
}
function onDocumentResize(){
onFullScreenChange('resize');
}
function animateInit(){
if(animating){
return;
}
animating=true;
animate();
}
function animate(){
if(destroyed){
return;
}
render();
if(autoRotateStart)
clearTimeout(autoRotateStart);
if(isUserInteracting||orientation===true){
requestAnimationFrame(animate);
}else if(keysDown[0]||keysDown[1]||keysDown[2]||keysDown[3] ||
keysDown[4]||keysDown[5]||keysDown[6]||keysDown[7] ||
keysDown[8]||keysDown[9]||config.autoRotate ||
animatedMove.pitch||animatedMove.yaw||animatedMove.hfov ||
Math.abs(speed.yaw) > 0.01||Math.abs(speed.pitch) > 0.01 ||
Math.abs(speed.hfov) > 0.01){
keyRepeat();
if(config.autoRotateInactivityDelay >=0&&autoRotateSpeed &&
Date.now() - latestInteraction > config.autoRotateInactivityDelay &&
!config.autoRotate){
config.autoRotate=autoRotateSpeed;
_this.lookAt(origPitch, undefined, origHfov, 3000);
}
requestAnimationFrame(animate);
}else if(renderer&&(renderer.isLoading()||(config.dynamic===true&&update))){
requestAnimationFrame(animate);
}else{
fireEvent('animatefinished', {pitch: _this.getPitch(), yaw: _this.getYaw(), hfov: _this.getHfov()});
animating=false;
prevTime=undefined;
var autoRotateStartTime=config.autoRotateInactivityDelay -
(Date.now() - latestInteraction);
if(autoRotateStartTime > 0){
autoRotateStart=setTimeout(function(){
config.autoRotate=autoRotateSpeed;
_this.lookAt(origPitch, undefined, origHfov, 3000);
animateInit();
}, autoRotateStartTime);
}else if(config.autoRotateInactivityDelay >=0&&autoRotateSpeed){
config.autoRotate=autoRotateSpeed;
_this.lookAt(origPitch, undefined, origHfov, 3000);
animateInit();
}}
}
function render(){
var tmpyaw;
if(loaded){
var canvas=renderer.getCanvas();
if(config.autoRotate!==false){
if(config.yaw > 360){
config.yaw -=360;
}else if(config.yaw < -360){
config.yaw +=360;
}}
tmpyaw=config.yaw;
var hoffcut=0,
voffcut=0;
if(config.avoidShowingBackground){
var hfov2=config.hfov / 2,
vfov2=Math.atan2(Math.tan(hfov2 / 180 * Math.PI), (canvas.width / canvas.height)) * 180 / Math.PI,
transposed=config.vaov > config.haov;
if(transposed){
voffcut=vfov2 * (1 - Math.min(Math.cos((config.pitch - hfov2) / 180 * Math.PI),
Math.cos((config.pitch + hfov2) / 180 * Math.PI)));
}else{
hoffcut=hfov2 * (1 - Math.min(Math.cos((config.pitch - vfov2) / 180 * Math.PI),
Math.cos((config.pitch + vfov2) / 180 * Math.PI)));
}}
var yawRange=config.maxYaw - config.minYaw,
minYaw=-180,
maxYaw=180;
if(yawRange < 360){
minYaw=config.minYaw + config.hfov / 2 + hoffcut;
maxYaw=config.maxYaw - config.hfov / 2 - hoffcut;
if(yawRange < config.hfov){
minYaw=maxYaw=(minYaw + maxYaw) / 2;
}
config.yaw=Math.max(minYaw, Math.min(maxYaw, config.yaw));
}
if(!(config.autoRotate!==false)){
if(config.yaw > 360){
config.yaw -=360;
}else if(config.yaw < -360){
config.yaw +=360;
}}
if(config.autoRotate!==false&&tmpyaw!=config.yaw &&
prevTime!==undefined){
config.autoRotate *=-1;
}
var vfov=2 * Math.atan(Math.tan(config.hfov / 180 * Math.PI * 0.5) /
(canvas.width / canvas.height)) / Math.PI * 180;
var minPitch=config.minPitch + vfov / 2,
maxPitch=config.maxPitch - vfov / 2;
var pitchRange=config.maxPitch - config.minPitch;
if(pitchRange < vfov){
minPitch=maxPitch=(minPitch + maxPitch) / 2;
}
if(isNaN(minPitch))
minPitch=-90;
if(isNaN(maxPitch))
maxPitch=90;
config.pitch=Math.max(minPitch, Math.min(maxPitch, config.pitch));
renderer.render(config.pitch * Math.PI / 180, config.yaw * Math.PI / 180, config.hfov * Math.PI / 180, {roll: config.roll * Math.PI / 180});
renderHotSpots();
if(config.compass){
compass.style.transform='rotate(' + (-config.yaw - config.northOffset) + 'deg)';
compass.style.webkitTransform='rotate(' + (-config.yaw - config.northOffset) + 'deg)';
}}
}
function Quaternion(w, x, y, z){
this.w=w;
this.x=x;
this.y=y;
this.z=z;
}
Quaternion.prototype.multiply=function(q){
return new Quaternion(this.w*q.w - this.x*q.x - this.y*q.y - this.z*q.z,
this.x*q.w + this.w*q.x + this.y*q.z - this.z*q.y,
this.y*q.w + this.w*q.y + this.z*q.x - this.x*q.z,
this.z*q.w + this.w*q.z + this.x*q.y - this.y*q.x);
};
Quaternion.prototype.toEulerAngles=function(){
var phi=Math.atan2(2 * (this.w * this.x + this.y * this.z),
1 - 2 * (this.x * this.x + this.y * this.y)),
theta=Math.asin(2 * (this.w * this.y - this.z * this.x)),
psi=Math.atan2(2 * (this.w * this.z + this.x * this.y),
1 - 2 * (this.y * this.y + this.z * this.z));
return [phi, theta, psi];
};
function taitBryanToQuaternion(alpha, beta, gamma){
var r=[beta ? beta * Math.PI / 180 / 2:0,
gamma ? gamma * Math.PI / 180 / 2:0,
alpha ? alpha * Math.PI / 180 / 2:0];
var c=[Math.cos(r[0]), Math.cos(r[1]), Math.cos(r[2])],
s=[Math.sin(r[0]), Math.sin(r[1]), Math.sin(r[2])];
return new Quaternion(c[0]*c[1]*c[2] - s[0]*s[1]*s[2],
s[0]*c[1]*c[2] - c[0]*s[1]*s[2],
c[0]*s[1]*c[2] + s[0]*c[1]*s[2],
c[0]*c[1]*s[2] + s[0]*s[1]*c[2]);
}
function computeQuaternion(alpha, beta, gamma){
var quaternion=taitBryanToQuaternion(alpha, beta, gamma);
quaternion=quaternion.multiply(new Quaternion(Math.sqrt(0.5), -Math.sqrt(0.5), 0, 0));
var angle=window.orientation ? -window.orientation * Math.PI / 180 / 2:0;
return quaternion.multiply(new Quaternion(Math.cos(angle), 0, -Math.sin(angle), 0));
}
function orientationListener(e){
var q=computeQuaternion(e.alpha, e.beta, e.gamma).toEulerAngles();
if(typeof(orientation)=='number'&&orientation < 10){
orientation +=1;
}else if(orientation===10){
orientationYawOffset=q[2] / Math.PI * 180 + config.yaw;
orientation=true;
requestAnimationFrame(animate);
}else{
config.pitch=q[0] / Math.PI * 180;
config.roll=-q[1] / Math.PI * 180;
config.yaw=-q[2] / Math.PI * 180 + orientationYawOffset;
}}
function renderInit(){
try {
var params={};
if(config.horizonPitch!==undefined)
params.horizonPitch=config.horizonPitch * Math.PI / 180;
if(config.horizonRoll!==undefined)
params.horizonRoll=config.horizonRoll * Math.PI / 180;
if(config.backgroundColor!==undefined)
params.backgroundColor=config.backgroundColor;
renderer.init(panoImage, config.type, config.dynamic, config.haov * Math.PI / 180, config.vaov * Math.PI / 180, config.vOffset * Math.PI / 180, renderInitCallback, params);
if(config.dynamic!==true){
panoImage=undefined;
}} catch(event){
if(event.type=='webgl error'||event.type=='no webgl'){
anError();
}else if(event.type=='webgl size error'){
anError(config.strings.textureSizeError.replace('%s', event.width).replace('%s', event.maxWidth));
}else{
anError(config.strings.unknownError);
throw event;
}}
}
function renderInitCallback(){
if(config.sceneFadeDuration&&renderer.fadeImg!==undefined){
renderer.fadeImg.style.opacity=0;
var fadeImg=renderer.fadeImg;
delete renderer.fadeImg;
setTimeout(function(){
renderContainer.removeChild(fadeImg);
fireEvent('scenechangefadedone');
}, config.sceneFadeDuration);
}
if(config.compass){
compass.style.display='inline';
}else{
compass.style.display='none';
}
createHotSpots();
infoDisplay.load.box.style.display='none';
if(preview!==undefined){
renderContainer.removeChild(preview);
preview=undefined;
}
loaded=true;
animateInit();
fireEvent('load');
}
function createHotSpot(hs){
hs.pitch=Number(hs.pitch)||0;
hs.yaw=Number(hs.yaw)||0;
var div=document.createElement('div');
div.className='pnlm-hotspot-base';
if(hs.cssClass)
div.className +=' ' + hs.cssClass;
else
div.className +=' pnlm-hotspot pnlm-sprite pnlm-' + escapeHTML(hs.type);
var span=document.createElement('span');
if(hs.text)
span.innerHTML=escapeHTML(hs.text);
var a;
if(hs.video){
var video=document.createElement('video'),
vidp=hs.video;
if(config.basePath&&!absoluteURL(vidp))
vidp=config.basePath + vidp;
video.src=sanitizeURL(vidp);
video.controls=true;
video.style.width=hs.width + 'px';
renderContainer.appendChild(div);
span.appendChild(video);
}else if(hs.image){
var imgp=hs.image;
if(config.basePath&&!absoluteURL(imgp))
imgp=config.basePath + imgp;
a=document.createElement('a');
a.href=sanitizeURL(hs.URL ? hs.URL:imgp, true);
a.target='_blank';
span.appendChild(a);
var image=document.createElement('img');
image.src=sanitizeURL(imgp);
image.style.width=hs.width + 'px';
image.style.paddingTop='5px';
renderContainer.appendChild(div);
a.appendChild(image);
span.style.maxWidth='initial';
}else if(hs.URL){
a=document.createElement('a');
a.href=sanitizeURL(hs.URL, true);
if(hs.attributes){
for (var key in hs.attributes){
a.setAttribute(key, hs.attributes[key]);
}}else{
if(hs.wpvr_url_open=='on'){
a.target='_self';
}else{
a.target='_blank';
}}
renderContainer.appendChild(a);
div.className +=' pnlm-pointer';
span.className +=' pnlm-pointer';
a.appendChild(div);
}else{
if(hs.sceneId){
div.onclick=div.ontouchend=function(){
if(!div.clicked){
div.clicked=true;
loadScene(hs.sceneId, hs.targetPitch, hs.targetYaw, hs.targetHfov);
}
return false;
};
div.className +=' pnlm-pointer';
span.className +=' pnlm-pointer';
}
renderContainer.appendChild(div);
}
if(hs.createTooltipFunc){
hs.createTooltipFunc(div, hs.createTooltipArgs);
}else if(hs.text||hs.video||hs.image){
div.classList.add('pnlm-tooltip');
div.appendChild(span);
span.style.width=span.scrollWidth - 20 + 'px';
span.style.marginLeft=-(span.scrollWidth - div.offsetWidth) / 2 + 'px';
span.style.marginTop=-span.scrollHeight - 12 + 'px';
}
if(hs.clickHandlerFunc){
div.addEventListener('click', function(e){
hs.clickHandlerFunc(e, hs.clickHandlerArgs);
}, 'false');
div.className +=' pnlm-pointer';
span.className +=' pnlm-pointer';
}
hs.div=div;
}
function createHotSpots(){
if(hotspotsCreated) return;
if(!config.hotSpots){
config.hotSpots=[];
}else{
config.hotSpots=config.hotSpots.sort(function(a, b){
return a.pitch < b.pitch;
});
config.hotSpots.forEach(createHotSpot);
}
hotspotsCreated=true;
renderHotSpots();
}
function destroyHotSpots(){
var hs=config.hotSpots;
hotspotsCreated=false;
delete config.hotSpots;
if(hs){
for (var i=0; i < hs.length; i++){
var current=hs[i].div;
if(current){
while (current.parentNode&&current.parentNode!=renderContainer){
current=current.parentNode;
}
renderContainer.removeChild(current);
}
delete hs[i].div;
}}
}
function renderHotSpot(hs){
var hsPitchSin=Math.sin(hs.pitch * Math.PI / 180),
hsPitchCos=Math.cos(hs.pitch * Math.PI / 180),
configPitchSin=Math.sin(config.pitch * Math.PI / 180),
configPitchCos=Math.cos(config.pitch * Math.PI / 180),
yawCos=Math.cos((-hs.yaw + config.yaw) * Math.PI / 180);
var z=hsPitchSin * configPitchSin + hsPitchCos * yawCos * configPitchCos;
if((hs.yaw <=90&&hs.yaw > -90&&z <=0) ||
((hs.yaw > 90||hs.yaw <=-90)&&z <=0)){
hs.div.style.visibility='hidden';
}else{
var yawSin=Math.sin((-hs.yaw + config.yaw) * Math.PI / 180),
hfovTan=Math.tan(config.hfov * Math.PI / 360);
hs.div.style.visibility='visible';
var canvas=renderer.getCanvas(),
canvasWidth=canvas.clientWidth,
canvasHeight=canvas.clientHeight;
var coord=[-canvasWidth / hfovTan * yawSin * hsPitchCos / z / 2,
-canvasWidth / hfovTan * (hsPitchSin * configPitchCos -
hsPitchCos * yawCos * configPitchSin) / z / 2];
var rollSin=Math.sin(config.roll * Math.PI / 180),
rollCos=Math.cos(config.roll * Math.PI / 180);
coord=[coord[0] * rollCos - coord[1] * rollSin,
coord[0] * rollSin + coord[1] * rollCos];
coord[0] +=(canvasWidth - hs.div.offsetWidth) / 2;
coord[1] +=(canvasHeight - hs.div.offsetHeight) / 2;
var transform='translate(' + coord[0] + 'px, ' + coord[1] +
'px) translateZ(9999px) rotate(' + config.roll + 'deg)';
if(hs.scale){
transform +=' scale(' + (origHfov/config.hfov) / z + ')';
}
hs.div.style.webkitTransform=transform;
hs.div.style.MozTransform=transform;
hs.div.style.transform=transform;
}}
function renderHotSpots(){
config.hotSpots.forEach(renderHotSpot);
}
function mergeConfig(sceneId){
config={};
var k, s;
var photoSphereExcludes=['haov', 'vaov', 'vOffset', 'northOffset', 'horizonPitch', 'horizonRoll'];
specifiedPhotoSphereExcludes=[];
for (k in defaultConfig){
if(defaultConfig.hasOwnProperty(k)){
config[k]=defaultConfig[k];
}}
for (k in initialConfig.default){
if(initialConfig.default.hasOwnProperty(k)){
if(k=='strings'){
for (s in initialConfig.default.strings){
if(initialConfig.default.strings.hasOwnProperty(s)){
config.strings[s]=escapeHTML(initialConfig.default.strings[s]);
}}
}else{
config[k]=initialConfig.default[k];
if(photoSphereExcludes.indexOf(k) >=0){
specifiedPhotoSphereExcludes.push(k);
}}
}}
if((sceneId!==null)&&(sceneId!=='')&&(initialConfig.scenes)&&(initialConfig.scenes[sceneId])){
var scene=initialConfig.scenes[sceneId];
for (k in scene){
if(scene.hasOwnProperty(k)){
if(k=='strings'){
for (s in scene.strings){
if(scene.strings.hasOwnProperty(s)){
config.strings[s]=escapeHTML(scene.strings[s]);
}}
}else{
config[k]=scene[k];
if(photoSphereExcludes.indexOf(k) >=0){
specifiedPhotoSphereExcludes.push(k);
}}
}}
config.scene=sceneId;
}
for (k in initialConfig){
if(initialConfig.hasOwnProperty(k)){
if(k=='strings'){
for (s in initialConfig.strings){
if(initialConfig.strings.hasOwnProperty(s)){
config.strings[s]=escapeHTML(initialConfig.strings[s]);
}}
}else{
config[k]=initialConfig[k];
if(photoSphereExcludes.indexOf(k) >=0){
specifiedPhotoSphereExcludes.push(k);
}}
}}
}
function processOptions(isPreview){
isPreview=isPreview ? isPreview:false;
if(isPreview&&'preview' in config){
var p=config.preview;
if(config.basePath&&!absoluteURL(p))
p=config.basePath + p;
preview=document.createElement('div');
preview.className='pnlm-preview-img';
preview.style.backgroundImage="url('" + sanitizeURLForCss(p) + "')";
renderContainer.appendChild(preview);
}
var title=config.title,
author=config.author;
if(isPreview){
if('previewTitle' in config)
config.title=config.previewTitle;
if('previewAuthor' in config)
config.author=config.previewAuthor;
}
if(!config.hasOwnProperty('title'))
infoDisplay.title.innerHTML='';
if(!config.hasOwnProperty('author'))
infoDisplay.author.innerHTML='';
if(!config.hasOwnProperty('title')&&!config.hasOwnProperty('author'))
infoDisplay.container.style.display='none';
controls.load.innerHTML='<p>' + config.strings.loadButtonLabel + '</p>';
infoDisplay.load.boxp.innerHTML=config.strings.loadingLabel;
for (var key in config){
if(config.hasOwnProperty(key)){
switch(key){
case 'title':
infoDisplay.title.innerHTML=escapeHTML(config[key]);
infoDisplay.container.style.display='inline';
break;
case 'author':
var authorText=escapeHTML(config[key]);
if(config.authorURL){
var authorLink=document.createElement('a');
authorLink.href=sanitizeURL(config['authorURL'], true);
authorLink.target='_blank';
authorLink.innerHTML=escapeHTML(config[key]);
authorText=authorLink.outerHTML;
}
infoDisplay.author.innerHTML=config.strings.bylineLabel.replace('%s', authorText);
infoDisplay.container.style.display='inline';
break;
case 'fallback':
var link=document.createElement('a');
link.href=sanitizeURL(config[key], true);
link.target='_blank';
link.textContent='Click here to view this panorama in an alternative viewer.';
var message=document.createElement('p');
message.textContent='Your browser does not support WebGL.';
message.appendChild(document.createElement('br'));
message.appendChild(link);
infoDisplay.errorMsg.innerHTML='';
infoDisplay.errorMsg.appendChild(message);
break;
case 'hfov':
setHfov(Number(config[key]));
break;
case 'autoLoad':
if(config[key]===true&&renderer===undefined){
infoDisplay.load.box.style.display='inline';
controls.load.style.display='none';
init();
}
break;
case 'showZoomCtrl':
if(config[key]&&config.showControls!=false){
controls.zoom.style.display='block';
}else{
controls.zoom.style.display='none';
}
break;
case 'showFullscreenCtrl':
if(config[key]&&config.showControls!=false&&('fullscreen' in document||'mozFullScreen' in document ||
'webkitIsFullScreen' in document||'msFullscreenElement' in document)){
controls.fullscreen.style.display='block';
}else{
controls.fullscreen.style.display='none';
}
break;
case 'hotSpotDebug':
if(config[key])
hotSpotDebugIndicator.style.display='block';
else
hotSpotDebugIndicator.style.display='none';
break;
case 'showControls':
if(!config[key]){
controls.orientation.style.display='none';
controls.zoom.style.display='none';
controls.fullscreen.style.display='none';
}
break;
case 'orientationOnByDefault':
if(config[key])
startOrientation();
break;
}}
}
if(isPreview){
if(title)
config.title=title;
else
delete config.title;
if(author)
config.author=author;
else
delete config.author;
}}
function toggleFullscreen(){
if(loaded&&!error){
if(!fullscreenActive){
try {
if(container.requestFullscreen){
container.requestFullscreen();
}else if(container.mozRequestFullScreen){
container.mozRequestFullScreen();
}else if(container.msRequestFullscreen){
container.msRequestFullscreen();
}else{
container.webkitRequestFullScreen();
}} catch(event){
}}else{
if(document.exitFullscreen){
document.exitFullscreen();
}else if(document.mozCancelFullScreen){
document.mozCancelFullScreen();
}else if(document.webkitCancelFullScreen){
document.webkitCancelFullScreen();
}else if(document.msExitFullscreen){
document.msExitFullscreen();
}}
}}
function onFullScreenChange(resize){
if(document.fullscreenElement||document.fullscreen||document.mozFullScreen||document.webkitIsFullScreen||document.msFullscreenElement){
controls.fullscreen.classList.add('pnlm-fullscreen-toggle-button-active');
fullscreenActive=true;
}else{
controls.fullscreen.classList.remove('pnlm-fullscreen-toggle-button-active');
fullscreenActive=false;
}
if(resize!=='resize')
fireEvent('fullscreenchange', fullscreenActive);
renderer.resize();
setHfov(config.hfov);
animateInit();
}
function zoomIn(){
if(loaded){
setHfov(config.hfov - 5);
animateInit();
}}
function zoomOut(){
if(loaded){
setHfov(config.hfov + 5);
animateInit();
}}
function constrainHfov(hfov){
var minHfov=config.minHfov;
if(config.type=='multires'&&renderer&&!config.multiResMinHfov){
minHfov=Math.min(minHfov, renderer.getCanvas().width / (config.multiRes.cubeResolution / 90 * 0.9));
}
if(minHfov > config.maxHfov){
console.log('HFOV bounds do not make sense (minHfov > maxHfov).');
return config.hfov;
}
var newHfov=config.hfov;
if(hfov < minHfov){
newHfov=minHfov;
}else if(hfov > config.maxHfov){
newHfov=config.maxHfov;
}else{
newHfov=hfov;
}
if(config.avoidShowingBackground&&renderer){
var canvas=renderer.getCanvas();
newHfov=Math.min(newHfov,
Math.atan(Math.tan((config.maxPitch - config.minPitch) / 360 * Math.PI) /
canvas.height * canvas.width) * 360 / Math.PI);
}
return newHfov;
}
function setHfov(hfov){
config.hfov=constrainHfov(hfov);
fireEvent('zoomchange', config.hfov);
}
function stopAnimation(){
animatedMove={};
autoRotateSpeed=config.autoRotate ? config.autoRotate:autoRotateSpeed;
config.autoRotate=false;
}
function load(){
clearError();
loaded=false;
controls.load.style.display='none';
infoDisplay.load.box.style.display='inline';
init();
}
function loadScene(sceneId, targetPitch, targetYaw, targetHfov, fadeDone){
if(!loaded)
fadeDone=true;
loaded=false;
animatedMove={};
var fadeImg, workingPitch, workingYaw, workingHfov;
if(config.sceneFadeDuration&&!fadeDone){
var data=renderer.render(config.pitch * Math.PI / 180, config.yaw * Math.PI / 180, config.hfov * Math.PI / 180, {returnImage: true});
if(data!==undefined){
fadeImg=new Image();
fadeImg.className='pnlm-fade-img';
fadeImg.style.transition='opacity ' + (config.sceneFadeDuration / 1000) + 's';
fadeImg.style.width='100%';
fadeImg.style.height='100%';
fadeImg.onload=function(){
loadScene(sceneId, targetPitch, targetYaw, targetHfov, true);
};
fadeImg.src=data;
renderContainer.appendChild(fadeImg);
renderer.fadeImg=fadeImg;
return;
}}
if(targetPitch==='same'){
workingPitch=config.pitch;
}else{
workingPitch=targetPitch;
}
if(targetYaw==='same'){
workingYaw=config.yaw;
}else if(targetYaw==='sameAzimuth'){
workingYaw=config.yaw + (config.northOffset||0) - (initialConfig.scenes[sceneId].northOffset||0);
}else{
workingYaw=targetYaw;
}
if(targetHfov==='same'){
workingHfov=config.hfov;
}else{
workingHfov=targetHfov;
}
destroyHotSpots();
mergeConfig(sceneId);
speed.yaw=speed.pitch=speed.hfov=0;
processOptions();
if(workingPitch!==undefined){
config.pitch=workingPitch;
}
if(workingYaw!==undefined){
config.yaw=workingYaw;
}
if(workingHfov!==undefined){
config.hfov=workingHfov;
}
fireEvent('scenechange', sceneId);
load();
}
function stopOrientation(){
window.removeEventListener('deviceorientation', orientationListener);
controls.orientation.classList.remove('pnlm-orientation-button-active');
orientation=false;
}
function startOrientation(){
if(!orientationSupport)
return;
if(typeof DeviceMotionEvent!=='undefined' &&
typeof DeviceMotionEvent.requestPermission==='function'){
DeviceOrientationEvent.requestPermission().then(function(response){
if(response=='granted'){
orientation=1;
window.addEventListener('deviceorientation', orientationListener);
controls.orientation.classList.add('pnlm-orientation-button-active');
}});
}else{
orientation=1;
window.addEventListener('deviceorientation', orientationListener);
controls.orientation.classList.add('pnlm-orientation-button-active');
}}
function escapeHTML(s){
if(!initialConfig.escapeHTML)
return String(s).split('\n').join('<br>');
return String(s).split(/&/g).join('&amp;')
.split('"').join('&quot;')
.split("'").join('&#39;')
.split('<').join('&lt;')
.split('>').join('&gt;')
.split('/').join('&#x2f;')
.split('\n').join('<br>');
}
function sanitizeURL(url, href){
try {
var decoded_url=decodeURIComponent(unescape(url)).replace(/[^\w:]/g, '').toLowerCase();
} catch (e){
return 'about:blank';
}
if(decoded_url.indexOf('javascript:')===0 ||
decoded_url.indexOf('vbscript:')===0){
console.log('Script URL removed.');
return 'about:blank';
}
if(href&&decoded_url.indexOf('data:')===0){
console.log('Data URI removed from link.');
return 'about:blank';
}
return url;
}
function unescape(html){
return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n){
n=n.toLowerCase();
if(n==='colon') return ':';
if(n.charAt(0)==='#'){
return n.charAt(1)==='x'
? String.fromCharCode(parseInt(n.substring(2), 16))
: String.fromCharCode(+n.substring(1));
}
return '';
});
}
function sanitizeURLForCss(url){
return sanitizeURL(url)
.replace(/"/g, '%22')
.replace(/'/g, '%27');
}
this.isLoaded=function(){
return Boolean(loaded);
};
this.getPitch=function(){
return config.pitch;
};
this.setPitch=function(pitch, animated, callback, callbackArgs){
latestInteraction=Date.now();
if(Math.abs(pitch - config.pitch) <=eps){
if(typeof callback=='function')
callback(callbackArgs);
return this;
}
animated=animated==undefined ? 1000: Number(animated);
if(animated){
animatedMove.pitch={
'startTime': Date.now(),
'startPosition': config.pitch,
'endPosition': pitch,
'duration': animated
};
if(typeof callback=='function')
setTimeout(function(){callback(callbackArgs);}, animated);
}else{
config.pitch=pitch;
}
animateInit();
return this;
};
this.getPitchBounds=function(){
return [config.minPitch, config.maxPitch];
};
this.setPitchBounds=function(bounds){
config.minPitch=Math.max(-90, Math.min(bounds[0], 90));
config.maxPitch=Math.max(-90, Math.min(bounds[1], 90));
return this;
};
this.getYaw=function(){
return (config.yaw + 540) % 360 - 180;
};
this.setYaw=function(yaw, animated, callback, callbackArgs){
latestInteraction=Date.now();
if(Math.abs(yaw - config.yaw) <=eps){
if(typeof callback=='function')
callback(callbackArgs);
return this;
}
animated=animated==undefined ? 1000: Number(animated);
yaw=((yaw + 180) % 360) - 180;
if(animated){
if(config.yaw - yaw > 180)
yaw +=360;
else if(yaw - config.yaw > 180)
yaw -=360;
animatedMove.yaw={
'startTime': Date.now(),
'startPosition': config.yaw,
'endPosition': yaw,
'duration': animated
};
if(typeof callback=='function')
setTimeout(function(){callback(callbackArgs);}, animated);
}else{
config.yaw=yaw;
}
animateInit();
return this;
};
this.getYawBounds=function(){
return [config.minYaw, config.maxYaw];
};
this.setYawBounds=function(bounds){
config.minYaw=Math.max(-360, Math.min(bounds[0], 360));
config.maxYaw=Math.max(-360, Math.min(bounds[1], 360));
return this;
};
this.getHfov=function(){
return config.hfov;
};
this.setHfov=function(hfov, animated, callback, callbackArgs){
latestInteraction=Date.now();
if(Math.abs(hfov - config.hfov) <=eps){
if(typeof callback=='function')
callback(callbackArgs);
return this;
}
animated=animated==undefined ? 1000: Number(animated);
if(animated){
animatedMove.hfov={
'startTime': Date.now(),
'startPosition': config.hfov,
'endPosition': constrainHfov(hfov),
'duration': animated
};
if(typeof callback=='function')
setTimeout(function(){callback(callbackArgs);}, animated);
}else{
setHfov(hfov);
}
animateInit();
return this;
};
this.getHfovBounds=function(){
return [config.minHfov, config.maxHfov];
};
this.setHfovBounds=function(bounds){
config.minHfov=Math.max(0, bounds[0]);
config.maxHfov=Math.max(0, bounds[1]);
return this;
};
this.lookAt=function(pitch, yaw, hfov, animated, callback, callbackArgs){
animated=animated==undefined ? 1000: Number(animated);
if(pitch!==undefined&&Math.abs(pitch - config.pitch) > eps){
this.setPitch(pitch, animated, callback, callbackArgs);
callback=undefined;
}
if(yaw!==undefined&&Math.abs(yaw - config.yaw) > eps){
this.setYaw(yaw, animated, callback, callbackArgs);
callback=undefined;
}
if(hfov!==undefined&&Math.abs(hfov - config.hfov) > eps){
this.setHfov(hfov, animated, callback, callbackArgs);
callback=undefined;
}
if(typeof callback=='function')
callback(callbackArgs);
return this;
};
this.getNorthOffset=function(){
return config.northOffset;
};
this.setNorthOffset=function(heading){
config.northOffset=Math.min(360, Math.max(0, heading));
animateInit();
return this;
};
this.getHorizonRoll=function(){
return config.horizonRoll;
};
this.setHorizonRoll=function(roll){
config.horizonRoll=Math.min(90, Math.max(-90, roll));
renderer.setPose(config.horizonPitch * Math.PI / 180, config.horizonRoll * Math.PI / 180);
animateInit();
return this;
};
this.getHorizonPitch=function(){
return config.horizonPitch;
};
this.setHorizonPitch=function(pitch){
config.horizonPitch=Math.min(90, Math.max(-90, pitch));
renderer.setPose(config.horizonPitch * Math.PI / 180, config.horizonRoll * Math.PI / 180);
animateInit();
return this;
};
this.startAutoRotate=function(speed, pitch){
speed=speed||autoRotateSpeed||1;
pitch=pitch===undefined ? origPitch:pitch;
config.autoRotate=speed;
_this.lookAt(pitch, undefined, origHfov, 3000);
animating=false;
animateInit();
return this;
};
this.stopAutoRotate=function(){
autoRotateSpeed=config.autoRotate ? config.autoRotate:autoRotateSpeed;
config.autoRotate=false;
config.autoRotateInactivityDelay=-1;
return this;
};
this.stopMovement=function(){
stopAnimation();
speed={'yaw': 0, 'pitch': 0, 'hfov': 0};};
this.getRenderer=function(){
return renderer;
};
this.setUpdate=function(bool){
update=bool===true;
if(renderer===undefined)
onImageLoad();
else
animateInit();
return this;
};
this.mouseEventToCoords=function(event){
return mouseEventToCoords(event);
};
this.loadScene=function(sceneId, pitch, yaw, hfov){
if(loaded!==false)
loadScene(sceneId, pitch, yaw, hfov);
return this;
};
this.getScene=function(){
return config.scene;
};
this.addScene=function(sceneId, config){
initialConfig.scenes[sceneId]=config;
return this;
};
this.removeScene=function(sceneId){
if(config.scene===sceneId||!initialConfig.scenes.hasOwnProperty(sceneId))
return false;
delete initialConfig.scenes[sceneId];
return true;
};
this.toggleFullscreen=function(){
toggleFullscreen();
return this;
};
this.getConfig=function(){
return config;
};
this.getContainer=function(){
return container;
};
this.addHotSpot=function(hs, sceneId){
if(sceneId===undefined&&config.scene===undefined){
config.hotSpots.push(hs);
}else{
var id=sceneId!==undefined ? sceneId:config.scene;
if(initialConfig.scenes.hasOwnProperty(id)){
if(!initialConfig.scenes[id].hasOwnProperty('hotSpots')){
initialConfig.scenes[id].hotSpots=[];
if(id==config.scene)
config.hotSpots=initialConfig.scenes[id].hotSpots;
}
initialConfig.scenes[id].hotSpots.push(hs);
}else{
throw 'Invalid scene ID!';
}}
if(sceneId===undefined||config.scene==sceneId){
createHotSpot(hs);
if(loaded)
renderHotSpot(hs);
}
return this;
};
this.removeHotSpot=function(hotSpotId, sceneId){
if(sceneId===undefined||config.scene==sceneId){
if(!config.hotSpots)
return false;
for (var i=0; i < config.hotSpots.length; i++){
if(config.hotSpots[i].hasOwnProperty('id') &&
config.hotSpots[i].id===hotSpotId){
var current=config.hotSpots[i].div;
while (current.parentNode!=renderContainer)
current=current.parentNode;
renderContainer.removeChild(current);
delete config.hotSpots[i].div;
config.hotSpots.splice(i, 1);
return true;
}}
}else{
if(initialConfig.scenes.hasOwnProperty(sceneId)){
if(!initialConfig.scenes[sceneId].hasOwnProperty('hotSpots'))
return false;
for (var j=0; j < initialConfig.scenes[sceneId].hotSpots.length; j++){
if(initialConfig.scenes[sceneId].hotSpots[j].hasOwnProperty('id') &&
initialConfig.scenes[sceneId].hotSpots[j].id===hotSpotId){
initialConfig.scenes[sceneId].hotSpots.splice(j, 1);
return true;
}}
}else{
return false;
}}
};
this.resize=function(){
if(renderer)
onDocumentResize();
};
this.isLoaded=function(){
return loaded;
};
this.isOrientationSupported=function(){
return orientationSupport||false;
};
this.stopOrientation=function(){
stopOrientation();
};
this.startOrientation=function(){
if(orientationSupport)
startOrientation();
};
this.isOrientationActive=function(){
return Boolean(orientation);
};
this.on=function(type, listener){
externalEventListeners[type]=externalEventListeners[type]||[];
externalEventListeners[type].push(listener);
return this;
};
this.off=function(type, listener){
if(!type){
externalEventListeners={};
return this;
}
if(listener){
var i=externalEventListeners[type].indexOf(listener);
if(i >=0){
externalEventListeners[type].splice(i, 1);
}
if(externalEventListeners[type].length==0){
delete externalEventListeners[type];
}}else{
delete externalEventListeners[type];
}
return this;
};
function fireEvent(type){
if(type in externalEventListeners){
for (var i=externalEventListeners[type].length; i > 0; i--){
externalEventListeners[type][externalEventListeners[type].length - i].apply(null, [].slice.call(arguments, 1));
}}
}
this.destroy=function(){
destroyed=true;
clearTimeout(autoRotateStart);
if(renderer)
renderer.destroy();
if(listenersAdded){
document.removeEventListener('mousemove', onDocumentMouseMove, false);
document.removeEventListener('mouseup', onDocumentMouseUp, false);
container.removeEventListener('mozfullscreenchange', onFullScreenChange, false);
container.removeEventListener('webkitfullscreenchange', onFullScreenChange, false);
container.removeEventListener('msfullscreenchange', onFullScreenChange, false);
container.removeEventListener('fullscreenchange', onFullScreenChange, false);
window.removeEventListener('resize', onDocumentResize, false);
window.removeEventListener('orientationchange', onDocumentResize, false);
container.removeEventListener('keydown', onDocumentKeyPress, false);
container.removeEventListener('keyup', onDocumentKeyUp, false);
container.removeEventListener('blur', clearKeys, false);
document.removeEventListener('mouseleave', onDocumentMouseUp, false);
}
container.innerHTML='';
container.classList.remove('pnlm-container');
};}
return {
viewer: function(container, config){
return new Viewer(container, config);
}};})(window, document);
window.libpannellum=(function(window, document, undefined){
'use strict';
function Renderer(container){
var canvas=document.createElement('canvas');
canvas.style.width=canvas.style.height='100%';
container.appendChild(canvas);
var program, gl, vs, fs;
var fallbackImgSize;
var world;
var vtmps;
var pose;
var image, imageType, dynamic;
var texCoordBuffer, cubeVertBuf, cubeVertTexCoordBuf, cubeVertIndBuf;
var globalParams;
this.init=function(_image, _imageType, _dynamic, haov, vaov, voffset, callback, params){
if(_imageType===undefined)
_imageType='equirectangular';
if(_imageType!='equirectangular'&&_imageType!='cubemap' &&
_imageType!='multires'){
console.log('Error: invalid image type specified!');
throw {type: 'config error'};}
imageType=_imageType;
image=_image;
dynamic=_dynamic;
globalParams=params||{};
if(program){
if(vs){
gl.detachShader(program, vs);
gl.deleteShader(vs);
}
if(fs){
gl.detachShader(program, fs);
gl.deleteShader(fs);
}
gl.bindBuffer(gl.ARRAY_BUFFER, null);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
if(program.texture)
gl.deleteTexture(program.texture);
if(program.nodeCache)
for (var i=0; i < program.nodeCache.length; i++)
gl.deleteTexture(program.nodeCache[i].texture);
gl.deleteProgram(program);
program=undefined;
}
pose=undefined;
var s;
var faceMissing=false;
var cubeImgWidth;
if(imageType=='cubemap'){
for (s=0; s < 6; s++){
if(image[s].width > 0){
if(cubeImgWidth===undefined)
cubeImgWidth=image[s].width;
if(cubeImgWidth!=image[s].width)
console.log('Cube faces have inconsistent widths: ' + cubeImgWidth + ' vs. ' + image[s].width);
} else
faceMissing=true;
}}
function fillMissingFaces(imgSize){
if(faceMissing){
var nbytes=imgSize * imgSize * 4;
var imageArray=new Uint8ClampedArray(nbytes);
var rgb=params.backgroundColor ? params.backgroundColor:[0, 0, 0];
rgb[0] *=255;
rgb[1] *=255;
rgb[2] *=255;
for (var i=0; i < nbytes; i++){
imageArray[i++]=rgb[0];
imageArray[i++]=rgb[1];
imageArray[i++]=rgb[2];
}
var backgroundSquare=new ImageData(imageArray, imgSize, imgSize);
for (s=0; s < 6; s++){
if(image[s].width==0)
image[s]=backgroundSquare;
}}
}
if(!(imageType=='cubemap' &&
(cubeImgWidth & (cubeImgWidth - 1))!==0 &&
(navigator.userAgent.toLowerCase().match(/(iphone|ipod|ipad).* os 8_/) ||
navigator.userAgent.toLowerCase().match(/(iphone|ipod|ipad).* os 9_/) ||
navigator.userAgent.toLowerCase().match(/(iphone|ipod|ipad).* os 10_/) ||
navigator.userAgent.match(/Trident.*rv[ :]*11\./)))){
if(!gl)
gl=canvas.getContext('experimental-webgl', {alpha: false, depth: false});
if(gl&&gl.getError()==1286)
handleWebGLError1286();
}
if(!gl&&((imageType=='multires'&&image.hasOwnProperty('fallbackPath')) ||
imageType=='cubemap') &&
('WebkitAppearance' in document.documentElement.style ||
navigator.userAgent.match(/Trident.*rv[ :]*11\./) ||
navigator.appVersion.indexOf('MSIE 10')!==-1)){
if(world){
container.removeChild(world);
}
world=document.createElement('div');
world.className='pnlm-world';
var path;
if(image.basePath){
path=image.basePath + image.fallbackPath;
}else{
path=image.fallbackPath;
}
var sides=['f', 'r', 'b', 'l', 'u', 'd'];
var loaded=0;
var onLoad=function(){
var faceCanvas=document.createElement('canvas');
faceCanvas.className='pnlm-face pnlm-' + sides[this.side] + 'face';
world.appendChild(faceCanvas);
var faceContext=faceCanvas.getContext('2d');
faceCanvas.style.width=this.width + 4 + 'px';
faceCanvas.style.height=this.height + 4 + 'px';
faceCanvas.width=this.width + 4;
faceCanvas.height=this.height + 4;
faceContext.drawImage(this, 2, 2);
var imgData=faceContext.getImageData(0, 0, faceCanvas.width, faceCanvas.height);
var data=imgData.data;
var i;
var j;
for (i=2; i < faceCanvas.width - 2; i++){
for (j=0; j < 4; j++){
data[(i + faceCanvas.width) * 4 + j]=data[(i + faceCanvas.width * 2) * 4 + j];
data[(i + faceCanvas.width * (faceCanvas.height - 2)) * 4 + j]=data[(i + faceCanvas.width * (faceCanvas.height - 3)) * 4 + j];
}}
for (i=2; i < faceCanvas.height - 2; i++){
for (j=0; j < 4; j++){
data[(i * faceCanvas.width + 1) * 4 + j]=data[(i * faceCanvas.width + 2) * 4 + j];
data[((i + 1) * faceCanvas.width - 2) * 4 + j]=data[((i + 1) * faceCanvas.width - 3) * 4 + j];
}}
for (j=0; j < 4; j++){
data[(faceCanvas.width + 1) * 4 + j]=data[(faceCanvas.width * 2 + 2) * 4 + j];
data[(faceCanvas.width * 2 - 2) * 4 + j]=data[(faceCanvas.width * 3 - 3) * 4 + j];
data[(faceCanvas.width * (faceCanvas.height - 2) + 1) * 4 + j]=data[(faceCanvas.width * (faceCanvas.height - 3) + 2) * 4 + j];
data[(faceCanvas.width * (faceCanvas.height - 1) - 2) * 4 + j]=data[(faceCanvas.width * (faceCanvas.height - 2) - 3) * 4 + j];
}
for (i=1; i < faceCanvas.width - 1; i++){
for (j=0; j < 4; j++){
data[i * 4 + j]=data[(i + faceCanvas.width) * 4 + j];
data[(i + faceCanvas.width * (faceCanvas.height - 1)) * 4 + j]=data[(i + faceCanvas.width * (faceCanvas.height - 2)) * 4 + j];
}}
for (i=1; i < faceCanvas.height - 1; i++){
for (j=0; j < 4; j++){
data[(i * faceCanvas.width) * 4 + j]=data[(i * faceCanvas.width + 1) * 4 + j];
data[((i + 1) * faceCanvas.width - 1) * 4 + j]=data[((i + 1) * faceCanvas.width - 2) * 4 + j];
}}
for (j=0; j < 4; j++){
data[j]=data[(faceCanvas.width + 1) * 4 + j];
data[(faceCanvas.width - 1) * 4 + j]=data[(faceCanvas.width * 2 - 2) * 4 + j];
data[(faceCanvas.width * (faceCanvas.height - 1)) * 4 + j]=data[(faceCanvas.width * (faceCanvas.height - 2) + 1) * 4 + j];
data[(faceCanvas.width * faceCanvas.height - 1) * 4 + j]=data[(faceCanvas.width * (faceCanvas.height - 1) - 2) * 4 + j];
}
faceContext.putImageData(imgData, 0, 0);
incLoaded.call(this);
};
var incLoaded=function(){
if(this.width > 0){
if(fallbackImgSize===undefined)
fallbackImgSize=this.width;
if(fallbackImgSize!=this.width)
console.log('Fallback faces have inconsistent widths: ' + fallbackImgSize + ' vs. ' + this.width);
} else
faceMissing=true;
loaded++;
if(loaded==6){
fallbackImgSize=this.width;
container.appendChild(world);
callback();
}};
faceMissing=false;
for (s=0; s < 6; s++){
var faceImg=new Image();
faceImg.crossOrigin=globalParams.crossOrigin ? globalParams.crossOrigin:'anonymous';
faceImg.side=s;
faceImg.onload=onLoad;
faceImg.onerror=incLoaded;
if(imageType=='multires'){
faceImg.src=path.replace('%s', sides[s]) + '.' + image.extension;
}else{
faceImg.src=image[s].src;
}}
fillMissingFaces(fallbackImgSize);
return;
}else if(!gl){
console.log('Error: no WebGL support detected!');
throw {type: 'no webgl'};}
if(imageType=='cubemap')
fillMissingFaces(cubeImgWidth);
if(image.basePath){
image.fullpath=image.basePath + image.path;
}else{
image.fullpath=image.path;
}
image.invTileResolution=1 / image.tileResolution;
var vertices=createCube();
vtmps=[];
for (s=0; s < 6; s++){
vtmps[s]=vertices.slice(s * 12, s * 12 + 12);
vertices=createCube();
}
var maxWidth=0;
if(imageType=='equirectangular'){
maxWidth=gl.getParameter(gl.MAX_TEXTURE_SIZE);
if(Math.max(image.width / 2, image.height) > maxWidth){
console.log('Error: The image is too big; it\'s ' + image.width + 'px wide, '+
'but this device\'s maximum supported size is ' + (maxWidth * 2) + 'px.');
throw {type: 'webgl size error', width: image.width, maxWidth: maxWidth * 2};}}else if(imageType=='cubemap'){
if(cubeImgWidth > gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE)){
console.log('Error: The image is too big; it\'s ' + cubeImgWidth + 'px wide, ' +
'but this device\'s maximum supported size is ' + maxWidth + 'px.');
throw {type: 'webgl size error', width: cubeImgWidth, maxWidth: maxWidth};}}
if(params!==undefined&&(params.horizonPitch!==undefined||params.horizonRoll!==undefined))
pose=[params.horizonPitch==undefined ? 0:params.horizonPitch,
params.horizonRoll==undefined ? 0:params.horizonRoll];
var glBindType=gl.TEXTURE_2D;
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
if(gl.getShaderPrecisionFormat){
var precision=gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT);
if(precision&&precision.precision < 1){
fragEquiCubeBase=fragEquiCubeBase.replace('highp', 'mediump');
}}
vs=gl.createShader(gl.VERTEX_SHADER);
var vertexSrc=v;
if(imageType=='multires'){
vertexSrc=vMulti;
}
gl.shaderSource(vs, vertexSrc);
gl.compileShader(vs);
fs=gl.createShader(gl.FRAGMENT_SHADER);
var fragmentSrc=fragEquirectangular;
if(imageType=='cubemap'){
glBindType=gl.TEXTURE_CUBE_MAP;
fragmentSrc=fragCube;
}else if(imageType=='multires'){
fragmentSrc=fragMulti;
}
gl.shaderSource(fs, fragmentSrc);
gl.compileShader(fs);
program=gl.createProgram();
gl.attachShader(program, vs);
gl.attachShader(program, fs);
gl.linkProgram(program);
if(!gl.getShaderParameter(vs, gl.COMPILE_STATUS))
console.log(gl.getShaderInfoLog(vs));
if(!gl.getShaderParameter(fs, gl.COMPILE_STATUS))
console.log(gl.getShaderInfoLog(fs));
if(!gl.getProgramParameter(program, gl.LINK_STATUS))
console.log(gl.getProgramInfoLog(program));
gl.useProgram(program);
program.drawInProgress=false;
var color=params.backgroundColor ? params.backgroundColor:[0, 0, 0];
gl.clearColor(color[0], color[1], color[2], 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
program.texCoordLocation=gl.getAttribLocation(program, 'a_texCoord');
gl.enableVertexAttribArray(program.texCoordLocation);
if(imageType!='multires'){
if(!texCoordBuffer)
texCoordBuffer=gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1,1,1,1,1,-1,-1,1,1,-1,-1,-1]), gl.STATIC_DRAW);
gl.vertexAttribPointer(program.texCoordLocation, 2, gl.FLOAT, false, 0, 0);
program.aspectRatio=gl.getUniformLocation(program, 'u_aspectRatio');
gl.uniform1f(program.aspectRatio, gl.drawingBufferWidth / gl.drawingBufferHeight);
program.psi=gl.getUniformLocation(program, 'u_psi');
program.theta=gl.getUniformLocation(program, 'u_theta');
program.f=gl.getUniformLocation(program, 'u_f');
program.h=gl.getUniformLocation(program, 'u_h');
program.v=gl.getUniformLocation(program, 'u_v');
program.vo=gl.getUniformLocation(program, 'u_vo');
program.rot=gl.getUniformLocation(program, 'u_rot');
gl.uniform1f(program.h, haov / (Math.PI * 2.0));
gl.uniform1f(program.v, vaov / Math.PI);
gl.uniform1f(program.vo, voffset / Math.PI * 2);
if(imageType=='equirectangular'){
program.backgroundColor=gl.getUniformLocation(program, 'u_backgroundColor');
gl.uniform4fv(program.backgroundColor, color.concat([1]));
}
program.texture=gl.createTexture();
gl.bindTexture(glBindType, program.texture);
if(imageType=='cubemap'){
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image[1]);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image[3]);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_Y, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image[4]);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image[5]);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_Z, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image[0]);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image[2]);
}else{
if(image.width <=maxWidth){
gl.uniform1i(gl.getUniformLocation(program, 'u_splitImage'), 0);
gl.texImage2D(glBindType, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image);
}else{
gl.uniform1i(gl.getUniformLocation(program, 'u_splitImage'), 1);
var cropCanvas=document.createElement('canvas');
cropCanvas.width=image.width / 2;
cropCanvas.height=image.height;
var cropContext=cropCanvas.getContext('2d');
cropContext.drawImage(image, 0, 0);
var cropImage=cropContext.getImageData(0, 0, image.width / 2, image.height);
gl.texImage2D(glBindType, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, cropImage);
program.texture2=gl.createTexture();
gl.activeTexture(gl.TEXTURE1);
gl.bindTexture(glBindType, program.texture2);
gl.uniform1i(gl.getUniformLocation(program, 'u_image1'), 1);
cropContext.drawImage(image, -image.width / 2, 0);
cropImage=cropContext.getImageData(0, 0, image.width / 2, image.height);
gl.texImage2D(glBindType, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, cropImage);
gl.texParameteri(glBindType, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(glBindType, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(glBindType, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(glBindType, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.activeTexture(gl.TEXTURE0);
}}
gl.texParameteri(glBindType, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(glBindType, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(glBindType, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(glBindType, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
}else{
program.vertPosLocation=gl.getAttribLocation(program, 'a_vertCoord');
gl.enableVertexAttribArray(program.vertPosLocation);
if(!cubeVertBuf)
cubeVertBuf=gl.createBuffer();
if(!cubeVertTexCoordBuf)
cubeVertTexCoordBuf=gl.createBuffer();
if(!cubeVertIndBuf)
cubeVertIndBuf=gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertTexCoordBuf);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0,0,1,0,1,1,0,1]), gl.STATIC_DRAW);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVertIndBuf);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0,1,2,0,2,3]), gl.STATIC_DRAW);
program.perspUniform=gl.getUniformLocation(program, 'u_perspMatrix');
program.cubeUniform=gl.getUniformLocation(program, 'u_cubeMatrix');
program.level=-1;
program.currentNodes=[];
program.nodeCache=[];
program.nodeCacheTimestamp=0;
}
var err=gl.getError();
if(err!==0){
console.log('Error: Something went wrong with WebGL!', err);
throw {type: 'webgl error'};}
callback();
};
this.destroy=function(){
if(container!==undefined){
if(canvas!==undefined&&container.contains(canvas)){
container.removeChild(canvas);
}
if(world!==undefined&&container.contains(world)){
container.removeChild(world);
}}
if(gl){
var extension=gl.getExtension('WEBGL_lose_context');
if(extension)
extension.loseContext();
}};
this.resize=function(){
var pixelRatio=window.devicePixelRatio||1;
canvas.width=canvas.clientWidth * pixelRatio;
canvas.height=canvas.clientHeight * pixelRatio;
if(gl){
if(gl.getError()==1286)
handleWebGLError1286();
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
if(imageType!='multires'){
gl.uniform1f(program.aspectRatio, canvas.clientWidth / canvas.clientHeight);
}}
};
this.resize();
this.setPose=function(horizonPitch, horizonRoll){
pose=[horizonPitch, horizonRoll];
};
this.render=function(pitch, yaw, hfov, params){
var focal, i, s, roll=0;
if(params===undefined)
params={};
if(params.roll)
roll=params.roll;
if(pose!==undefined){
var horizonPitch=pose[0],
horizonRoll=pose[1];
var orig_pitch=pitch,
orig_yaw=yaw,
x=Math.cos(horizonRoll) * Math.sin(pitch) * Math.sin(horizonPitch) +
Math.cos(pitch) * (Math.cos(horizonPitch) * Math.cos(yaw) +
Math.sin(horizonRoll) * Math.sin(horizonPitch) * Math.sin(yaw)),
y=-Math.sin(pitch) * Math.sin(horizonRoll) +
Math.cos(pitch) * Math.cos(horizonRoll) * Math.sin(yaw),
z=Math.cos(horizonRoll) * Math.cos(horizonPitch) * Math.sin(pitch) +
Math.cos(pitch) * (-Math.cos(yaw) * Math.sin(horizonPitch) +
Math.cos(horizonPitch) * Math.sin(horizonRoll) * Math.sin(yaw));
pitch=Math.asin(Math.max(Math.min(z, 1), -1));
yaw=Math.atan2(y, x);
var v=[Math.cos(orig_pitch) * (Math.sin(horizonRoll) * Math.sin(horizonPitch) * Math.cos(orig_yaw) -
Math.cos(horizonPitch) * Math.sin(orig_yaw)),
Math.cos(orig_pitch) * Math.cos(horizonRoll) * Math.cos(orig_yaw),
Math.cos(orig_pitch) * (Math.cos(horizonPitch) * Math.sin(horizonRoll) * Math.cos(orig_yaw) +
Math.sin(orig_yaw) * Math.sin(horizonPitch))],
w=[-Math.cos(pitch) * Math.sin(yaw), Math.cos(pitch) * Math.cos(yaw)];
var roll_adj=Math.acos(Math.max(Math.min((v[0]*w[0] + v[1]*w[1]) /
(Math.sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]) *
Math.sqrt(w[0]*w[0]+w[1]*w[1])), 1), -1));
if(v[2] < 0)
roll_adj=2 * Math.PI - roll_adj;
roll +=roll_adj;
}
if(!gl&&(imageType=='multires'||imageType=='cubemap')){
s=fallbackImgSize / 2;
var transforms={
f: 'translate3d(-' + (s + 2) + 'px, -' + (s + 2) + 'px, -' + s + 'px)',
b: 'translate3d(' + (s + 2) + 'px, -' + (s + 2) + 'px, ' + s + 'px) rotateX(180deg) rotateZ(180deg)',
u: 'translate3d(-' + (s + 2) + 'px, -' + s + 'px, ' + (s + 2) + 'px) rotateX(270deg)',
d: 'translate3d(-' + (s + 2) + 'px, ' + s + 'px, -' + (s + 2) + 'px) rotateX(90deg)',
l: 'translate3d(-' + s + 'px, -' + (s + 2) + 'px, ' + (s + 2) + 'px) rotateX(180deg) rotateY(90deg) rotateZ(180deg)',
r: 'translate3d(' + s + 'px, -' + (s + 2) + 'px, -' + (s + 2) + 'px) rotateY(270deg)'
};
focal=1 / Math.tan(hfov / 2);
var zoom=focal * canvas.clientWidth / 2 + 'px';
var transform='perspective(' + zoom + ') translateZ(' + zoom + ') rotateX(' + pitch + 'rad) rotateY(' + yaw + 'rad) ';
var faces=Object.keys(transforms);
for (i=0; i < 6; i++){
var face=world.querySelector('.pnlm-' + faces[i] + 'face');
if(!face)
continue;
face.style.webkitTransform=transform + transforms[faces[i]];
face.style.transform=transform + transforms[faces[i]];
}
return;
}
if(imageType!='multires'){
var vfov=2 * Math.atan(Math.tan(hfov * 0.5) / (gl.drawingBufferWidth / gl.drawingBufferHeight));
focal=1 / Math.tan(vfov * 0.5);
gl.uniform1f(program.psi, yaw);
gl.uniform1f(program.theta, pitch);
gl.uniform1f(program.rot, roll);
gl.uniform1f(program.f, focal);
if(dynamic===true){
if(imageType=='equirectangular'){
gl.bindTexture(gl.TEXTURE_2D, program.texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image);
}}
gl.drawArrays(gl.TRIANGLES, 0, 6);
}else{
var perspMatrix=makePersp(hfov, gl.drawingBufferWidth / gl.drawingBufferHeight, 0.1, 100.0);
checkZoom(hfov);
var matrix=identityMatrix3();
matrix=rotateMatrix(matrix, -roll, 'z');
matrix=rotateMatrix(matrix, -pitch, 'x');
matrix=rotateMatrix(matrix, yaw, 'y');
matrix=makeMatrix4(matrix);
gl.uniformMatrix4fv(program.perspUniform, false, new Float32Array(transposeMatrix4(perspMatrix)));
gl.uniformMatrix4fv(program.cubeUniform, false, new Float32Array(transposeMatrix4(matrix)));
var rotPersp=rotatePersp(perspMatrix, matrix);
program.nodeCache.sort(multiresNodeSort);
if(program.nodeCache.length > 200 &&
program.nodeCache.length > program.currentNodes.length + 50){
var removed=program.nodeCache.splice(200, program.nodeCache.length - 200);
for (var j=0; j < removed.length; j++){
gl.deleteTexture(removed[j].texture);
}}
program.currentNodes=[];
var sides=['f', 'b', 'u', 'd', 'l', 'r'];
for (s=0; s < 6; s++){
var ntmp=new MultiresNode(vtmps[s], sides[s], 1, 0, 0, image.fullpath);
testMultiresNode(rotPersp, ntmp, pitch, yaw, hfov);
}
program.currentNodes.sort(multiresNodeRenderSort);
for (i=pendingTextureRequests.length - 1; i >=0; i--){
if(program.currentNodes.indexOf(pendingTextureRequests[i].node)===-1){
pendingTextureRequests[i].node.textureLoad=false;
pendingTextureRequests.splice(i, 1);
}}
if(pendingTextureRequests.length===0){
for (i=0; i < program.currentNodes.length; i++){
var node=program.currentNodes[i];
if(!node.texture&&!node.textureLoad){
node.textureLoad=true;
setTimeout(processNextTile, 0, node);
break;
}}
}
multiresDraw();
}
if(params.returnImage!==undefined){
return canvas.toDataURL('image/png');
}};
this.isLoading=function(){
if(gl&&imageType=='multires'){
for(var i=0; i < program.currentNodes.length; i++){
if(!program.currentNodes[i].textureLoaded){
return true;
}}
}
return false;
};
this.getCanvas=function(){
return canvas;
};
function multiresNodeSort(a, b){
if(a.level==1&&b.level!=1){
return -1;
}
if(b. level==1&&a.level!=1){
return 1;
}
return b.timestamp - a.timestamp;
}
function multiresNodeRenderSort(a, b){
if(a.level!=b.level){
return a.level - b.level;
}
return a.diff - b.diff;
}
function multiresDraw(){
if(!program.drawInProgress){
program.drawInProgress=true;
gl.clear(gl.COLOR_BUFFER_BIT);
for(var i=0; i < program.currentNodes.length; i++){
if(program.currentNodes[i].textureLoaded > 1){
gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertBuf);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(program.currentNodes[i].vertices), gl.STATIC_DRAW);
gl.vertexAttribPointer(program.vertPosLocation, 3, gl.FLOAT, false, 0, 0);
gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertTexCoordBuf);
gl.vertexAttribPointer(program.texCoordLocation, 2, gl.FLOAT, false, 0, 0);
gl.bindTexture(gl.TEXTURE_2D, program.currentNodes[i].texture);
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
}}
program.drawInProgress=false;
}}
function MultiresNode(vertices, side, level, x, y, path){
this.vertices=vertices;
this.side=side;
this.level=level;
this.x=x;
this.y=y;
this.path=path.replace('%s',side).replace('%l',level).replace('%x',x).replace('%y',y);
}
function testMultiresNode(rotPersp, node, pitch, yaw, hfov){
if(checkSquareInView(rotPersp, node.vertices)){
var v=node.vertices;
var x=v[0] + v[3] + v[6] + v[ 9];
var y=v[1] + v[4] + v[7] + v[10];
var z=v[2] + v[5] + v[8] + v[11];
var r=Math.sqrt(x*x + y*y + z*z);
var theta=Math.asin(z / r);
var phi=Math.atan2(y, x);
var ydiff=phi - yaw;
ydiff +=(ydiff > Math.PI) ? -2 * Math.PI:(ydiff < -Math.PI) ? 2 * Math.PI:0;
ydiff=Math.abs(ydiff);
node.diff=Math.acos(Math.sin(pitch) * Math.sin(theta) + Math.cos(pitch) * Math.cos(theta) * Math.cos(ydiff));
var inCurrent=false;
for (var k=0; k < program.nodeCache.length; k++){
if(program.nodeCache[k].path==node.path){
inCurrent=true;
program.nodeCache[k].timestamp=program.nodeCacheTimestamp++;
program.nodeCache[k].diff=node.diff;
program.currentNodes.push(program.nodeCache[k]);
break;
}}
if(!inCurrent){
node.timestamp=program.nodeCacheTimestamp++;
program.currentNodes.push(node);
program.nodeCache.push(node);
}
if(node.level < program.level){
var cubeSize=image.cubeResolution * Math.pow(2, node.level - image.maxLevel);
var numTiles=Math.ceil(cubeSize * image.invTileResolution) - 1;
var doubleTileSize=cubeSize % image.tileResolution * 2;
var lastTileSize=(cubeSize * 2) % image.tileResolution;
if(lastTileSize===0){
lastTileSize=image.tileResolution;
}
if(doubleTileSize===0){
doubleTileSize=image.tileResolution * 2;
}
var f=0.5;
if(node.x==numTiles||node.y==numTiles){
f=1.0 - image.tileResolution / (image.tileResolution + lastTileSize);
}
var i=1.0 - f;
var children=[];
var vtmp, ntmp;
var f1=f, f2=f, f3=f, i1=i, i2=i, i3=i;
if(lastTileSize < image.tileResolution){
if(node.x==numTiles&&node.y!=numTiles){
f2=0.5;
i2=0.5;
if(node.side=='d'||node.side=='u'){
f3=0.5;
i3=0.5;
}}else if(node.x!=numTiles&&node.y==numTiles){
f1=0.5;
i1=0.5;
if(node.side=='l'||node.side=='r'){
f3=0.5;
i3=0.5;
}}
}
if(doubleTileSize <=image.tileResolution){
if(node.x==numTiles){
f1=0;
i1=1;
if(node.side=='l'||node.side=='r'){
f3=0;
i3=1;
}}
if(node.y==numTiles){
f2=0;
i2=1;
if(node.side=='d'||node.side=='u'){
f3=0;
i3=1;
}}
}
vtmp=[           v[0],             v[1],             v[2],
v[0]*f1+v[3]*i1,    v[1]*f+v[4]*i,  v[2]*f3+v[5]*i3,
v[0]*f1+v[6]*i1,  v[1]*f2+v[7]*i2,  v[2]*f3+v[8]*i3,
v[0]*f+v[9]*i, v[1]*f2+v[10]*i2, v[2]*f3+v[11]*i3
];
ntmp=new MultiresNode(vtmp, node.side, node.level + 1, node.x*2, node.y*2, image.fullpath);
children.push(ntmp);
if(!(node.x==numTiles&&doubleTileSize <=image.tileResolution)){
vtmp=[v[0]*f1+v[3]*i1,    v[1]*f+v[4]*i,  v[2]*f3+v[5]*i3,
v[3],             v[4],             v[5],
v[3]*f+v[6]*i,  v[4]*f2+v[7]*i2,  v[5]*f3+v[8]*i3,
v[0]*f1+v[6]*i1,  v[1]*f2+v[7]*i2,  v[2]*f3+v[8]*i3
];
ntmp=new MultiresNode(vtmp, node.side, node.level + 1, node.x*2+1, node.y*2, image.fullpath);
children.push(ntmp);
}
if(!(node.x==numTiles&&doubleTileSize <=image.tileResolution) &&
!(node.y==numTiles&&doubleTileSize <=image.tileResolution)){
vtmp=[v[0]*f1+v[6]*i1,  v[1]*f2+v[7]*i2,  v[2]*f3+v[8]*i3,
v[3]*f+v[6]*i,  v[4]*f2+v[7]*i2,  v[5]*f3+v[8]*i3,
v[6],             v[7],             v[8],
v[9]*f1+v[6]*i1,   v[10]*f+v[7]*i, v[11]*f3+v[8]*i3
];
ntmp=new MultiresNode(vtmp, node.side, node.level + 1, node.x*2+1, node.y*2+1, image.fullpath);
children.push(ntmp);
}
if(!(node.y==numTiles&&doubleTileSize <=image.tileResolution)){
vtmp=[  v[0]*f+v[9]*i, v[1]*f2+v[10]*i2, v[2]*f3+v[11]*i3,
v[0]*f1+v[6]*i1,  v[1]*f2+v[7]*i2,  v[2]*f3+v[8]*i3,
v[9]*f1+v[6]*i1,   v[10]*f+v[7]*i, v[11]*f3+v[8]*i3,
v[9],            v[10],            v[11]
];
ntmp=new MultiresNode(vtmp, node.side, node.level + 1, node.x*2, node.y*2+1, image.fullpath);
children.push(ntmp);
}
for (var j=0; j < children.length; j++){
testMultiresNode(rotPersp, children[j], pitch, yaw, hfov);
}}
}}
function createCube(){
return [-1,  1, -1,  1,  1, -1,  1, -1, -1, -1, -1, -1,
1,  1,  1, -1,  1,  1, -1, -1,  1,  1, -1,  1,
-1,  1,  1,  1,  1,  1,  1,  1, -1, -1,  1, -1,
-1, -1, -1,  1, -1, -1,  1, -1,  1, -1, -1,  1,
-1,  1,  1, -1,  1, -1, -1, -1, -1, -1, -1,  1,
1,  1, -1,  1,  1,  1,  1, -1,  1,  1, -1, -1 
];
}
function identityMatrix3(){
return [
1, 0, 0,
0, 1, 0,
0, 0, 1
];
}
function rotateMatrix(m, angle, axis){
var s=Math.sin(angle);
var c=Math.cos(angle);
if(axis=='x'){
return [
m[0], c*m[1] + s*m[2], c*m[2] - s*m[1],
m[3], c*m[4] + s*m[5], c*m[5] - s*m[4],
m[6], c*m[7] + s*m[8], c*m[8] - s*m[7]
];
}
if(axis=='y'){
return [
c*m[0] - s*m[2], m[1], c*m[2] + s*m[0],
c*m[3] - s*m[5], m[4], c*m[5] + s*m[3],
c*m[6] - s*m[8], m[7], c*m[8] + s*m[6]
];
}
if(axis=='z'){
return [
c*m[0] + s*m[1], c*m[1] - s*m[0], m[2],
c*m[3] + s*m[4], c*m[4] - s*m[3], m[5],
c*m[6] + s*m[7], c*m[7] - s*m[6], m[8]
];
}}
function makeMatrix4(m){
return [
m[0], m[1], m[2],    0,
m[3], m[4], m[5],    0,
m[6], m[7], m[8],    0,
0,    0,    0,    1
];
}
function transposeMatrix4(m){
return [
m[ 0], m[ 4], m[ 8], m[12],
m[ 1], m[ 5], m[ 9], m[13],
m[ 2], m[ 6], m[10], m[14],
m[ 3], m[ 7], m[11], m[15]
];
}
function makePersp(hfov, aspect, znear, zfar){
var fovy=2 * Math.atan(Math.tan(hfov/2) * gl.drawingBufferHeight / gl.drawingBufferWidth);
var f=1 / Math.tan(fovy/2);
return [
f/aspect,   0,  0,  0,
0,   f,  0,  0,
0,   0,  (zfar+znear)/(znear-zfar), (2*zfar*znear)/(znear-zfar),
0,   0, -1,  0
];
}
function processLoadedTexture(img, tex){
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, img);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.bindTexture(gl.TEXTURE_2D, null);
}
var pendingTextureRequests=[];
var loadTexture=(function(){
var cacheTop=4;
var textureImageCache={};
var crossOrigin;
function TextureImageLoader(){
var self=this;
this.texture=this.callback=null;
this.image=new Image();
this.image.crossOrigin=crossOrigin ? crossOrigin:'anonymous';
var loadFn=(function(){
if(self.image.width > 0&&self.image.height > 0){
processLoadedTexture(self.image, self.texture);
self.callback(self.texture, true);
}else{
self.callback(self.texture, false);
}
releaseTextureImageLoader(self);
});
this.image.addEventListener('load', loadFn);
this.image.addEventListener('error', loadFn);
}
TextureImageLoader.prototype.loadTexture=function(src, texture, callback){
this.texture=texture;
this.callback=callback;
this.image.src=src;
};
function PendingTextureRequest(node, src, texture, callback){
this.node=node;
this.src=src;
this.texture=texture;
this.callback=callback;
}
function releaseTextureImageLoader(til){
if(pendingTextureRequests.length){
var req=pendingTextureRequests.shift();
til.loadTexture(req.src, req.texture, req.callback);
} else
textureImageCache[cacheTop++]=til;
}
for (var i=0; i < cacheTop; i++)
textureImageCache[i]=new TextureImageLoader();
return function(node, src, callback, _crossOrigin){
crossOrigin=_crossOrigin;
var texture=gl.createTexture();
if(cacheTop)
textureImageCache[--cacheTop].loadTexture(src, texture, callback);
else
pendingTextureRequests.push(new PendingTextureRequest(node, src, texture, callback));
return texture;
};})();
function processNextTile(node){
loadTexture(node, node.path + '.' + image.extension, function(texture, loaded){
node.texture=texture;
node.textureLoaded=loaded ? 2:1;
}, globalParams.crossOrigin);
}
function checkZoom(hfov){
var newLevel=1;
while(newLevel < image.maxLevel &&
gl.drawingBufferWidth > image.tileResolution *
Math.pow(2, newLevel - 1) * Math.tan(hfov / 2) * 0.707){
newLevel++;
}
program.level=newLevel;
}
function rotatePersp(p, r){
return [
p[ 0]*r[0], p[ 0]*r[1], p[ 0]*r[ 2],     0,
p[ 5]*r[4], p[ 5]*r[5], p[ 5]*r[ 6],     0,
p[10]*r[8], p[10]*r[9], p[10]*r[10], p[11],
-r[8],      -r[9],      -r[10],     0
];
}
function applyRotPerspToVec(m, v){
return [
m[ 0]*v[0] + m[ 1]*v[1] + m[ 2]*v[2],
m[ 4]*v[0] + m[ 5]*v[1] + m[ 6]*v[2],
m[11] + m[ 8]*v[0] + m[ 9]*v[1] + m[10]*v[2],
1/(m[12]*v[0] + m[13]*v[1] + m[14]*v[2])
];
}
function checkInView(m, v){
var vpp=applyRotPerspToVec(m, v);
var winX=vpp[0]*vpp[3];
var winY=vpp[1]*vpp[3];
var winZ=vpp[2]*vpp[3];
var ret=[0, 0, 0];
if(winX < -1)
ret[0]=-1;
if(winX > 1)
ret[0]=1;
if(winY < -1)
ret[1]=-1;
if(winY > 1)
ret[1]=1;
if(winZ < -1||winZ > 1)
ret[2]=1;
return ret;
}
function checkSquareInView(m, v){
var check1=checkInView(m, v.slice(0, 3));
var check2=checkInView(m, v.slice(3, 6));
var check3=checkInView(m, v.slice(6, 9));
var check4=checkInView(m, v.slice(9, 12));
var testX=check1[0] + check2[0] + check3[0] + check4[0];
if(testX==-4||testX==4)
return false;
var testY=check1[1] + check2[1] + check3[1] + check4[1];
if(testY==-4||testY==4)
return false;
var testZ=check1[2] + check2[2] + check3[2] + check4[2];
return testZ!=4;
}
function handleWebGLError1286(){
console.log('Reducing canvas size due to error 1286!');
canvas.width=Math.round(canvas.width / 2);
canvas.height=Math.round(canvas.height / 2);
}}
var v=[
'attribute vec2 a_texCoord;',
'varying vec2 v_texCoord;',
'void main(){',
'gl_Position=vec4(a_texCoord, 0.0, 1.0);',
'v_texCoord=a_texCoord;',
'}'
].join('');
var vMulti=[
'attribute vec3 a_vertCoord;',
'attribute vec2 a_texCoord;',
'uniform mat4 u_cubeMatrix;',
'uniform mat4 u_perspMatrix;',
'varying mediump vec2 v_texCoord;',
'void main(void){',
'gl_Position=u_perspMatrix * u_cubeMatrix * vec4(a_vertCoord, 1.0);',
'v_texCoord=a_texCoord;',
'}'
].join('');
var fragEquiCubeBase=[
'precision highp float;',
'uniform float u_aspectRatio;',
'uniform float u_psi;',
'uniform float u_theta;',
'uniform float u_f;',
'uniform float u_h;',
'uniform float u_v;',
'uniform float u_vo;',
'uniform float u_rot;',
'const float PI=3.14159265358979323846264;',
'uniform sampler2D u_image0;',
'uniform sampler2D u_image1;',
'uniform bool u_splitImage;',
'uniform samplerCube u_imageCube;',
'varying vec2 v_texCoord;',
'uniform vec4 u_backgroundColor;',
'void main(){',
'float x=v_texCoord.x * u_aspectRatio;',
'float y=v_texCoord.y;',
'float sinrot=sin(u_rot);',
'float cosrot=cos(u_rot);',
'float rot_x=x * cosrot - y * sinrot;',
'float rot_y=x * sinrot + y * cosrot;',
'float sintheta=sin(u_theta);',
'float costheta=cos(u_theta);',
'float a=u_f * costheta - rot_y * sintheta;',
'float root=sqrt(rot_x * rot_x + a * a);',
'float lambda=atan(rot_x / root, a / root) + u_psi;',
'float phi=atan((rot_y * costheta + u_f * sintheta) / root);',
].join('\n');
var fragCube=fragEquiCubeBase + [
'float cosphi=cos(phi);',
'gl_FragColor=textureCube(u_imageCube, vec3(cosphi*sin(lambda), sin(phi), cosphi*cos(lambda)));',
'}'
].join('\n');
var fragEquirectangular=fragEquiCubeBase + [
'lambda=mod(lambda + PI, PI * 2.0) - PI;',
'vec2 coord=vec2(lambda / PI, phi / (PI / 2.0));',
'if(coord.x < -u_h||coord.x > u_h||coord.y < -u_v + u_vo||coord.y > u_v + u_vo)',
'gl_FragColor=u_backgroundColor;',
'else {',
'if(u_splitImage){',
'if(coord.x < 0.0)',
'gl_FragColor=texture2D(u_image0, vec2((coord.x + u_h) / u_h, (-coord.y + u_v + u_vo) / (u_v * 2.0)));',
'else',
'gl_FragColor=texture2D(u_image1, vec2((coord.x + u_h) / u_h - 1.0, (-coord.y + u_v + u_vo) / (u_v * 2.0)));',
'}else{',
'gl_FragColor=texture2D(u_image0, vec2((coord.x + u_h) / (u_h * 2.0), (-coord.y + u_v + u_vo) / (u_v * 2.0)));',
'}',
'}',
'}'
].join('\n');
var fragMulti=[
'varying mediump vec2 v_texCoord;',
'uniform sampler2D u_sampler;',
'void main(void){',
'gl_FragColor=texture2D(u_sampler, v_texCoord);',
'}'
].join('');
return {
renderer: function(container, image, imagetype, dynamic){
return new Renderer(container, image, imagetype, dynamic);
}};})(window, document);
(function(document, videojs, pannellum){
'use strict';
var registerPlugin=videojs.registerPlugin||videojs.plugin;
registerPlugin('pannellum', function(config){
var player=this;
var container=player.el();
var vid=container.getElementsByTagName('video')[0],
pnlmContainer=document.createElement('div');
pnlmContainer.style.zIndex='0';
config=config||{};
config.type='equirectangular';
config.dynamic=true;
config.showZoomCtrl=false;
config.showFullscreenCtrl=false;
config.autoLoad=true;
config.panorama=vid;
pnlmContainer.style.visibility='hidden';
player.pnlmViewer=pannellum.viewer(pnlmContainer, config);
container.insertBefore(pnlmContainer, container.firstChild);
vid.style.display='none';
player.on('play', function(){
if(vid.readyState > 1)
player.pnlmViewer.setUpdate(true);
});
player.on('canplay', function(){
pnlmContainer.style.visibility='visible';
if(!player.paused())
player.pnlmViewer.setUpdate(true);
});
player.on('pause', function(){
player.pnlmViewer.setUpdate(false);
});
player.on('loadeddata', function(){
pnlmContainer.style.visibility='visible';
});
player.on('seeking', function(){
if(player.paused())
player.pnlmViewer.setUpdate(true);
});
player.on('seeked', function(){
if(player.paused())
player.pnlmViewer.setUpdate(false);
});
if(vid.readyState >=2){
pnlmContainer.style.visibility='visible';
}});
})(document, videojs, pannellum);
;(function($, window, document, undefined){
function Owl(element, options){
this.settings=null;
this.options=$.extend({}, Owl.Defaults, options);
this.$element=$(element);
this._handlers={};
this._plugins={};
this._supress={};
this._current=null;
this._speed=null;
this._coordinates=[];
this._breakpoint=null;
this._width=null;
this._items=[];
this._clones=[];
this._mergers=[];
this._widths=[];
this._invalidated={};
this._pipe=[];
this._drag={
time: null,
target: null,
pointer: null,
stage: {
start: null,
current: null
},
direction: null
};
this._states={
current: {},
tags: {
'initializing': [ 'busy' ],
'animating': [ 'busy' ],
'dragging': [ 'interacting' ]
}};
$.each([ 'onResize', 'onThrottledResize' ], $.proxy(function(i, handler){
this._handlers[handler]=$.proxy(this[handler], this);
}, this));
$.each(Owl.Plugins, $.proxy(function(key, plugin){
this._plugins[key.charAt(0).toLowerCase() + key.slice(1)]
= new plugin(this);
}, this));
$.each(Owl.Workers, $.proxy(function(priority, worker){
this._pipe.push({
'filter': worker.filter,
'run': $.proxy(worker.run, this)
});
}, this));
this.setup();
this.initialize();
}
Owl.Defaults={
items: 3,
loop: false,
center: false,
rewind: false,
checkVisibility: true,
mouseDrag: true,
touchDrag: true,
pullDrag: true,
freeDrag: false,
margin: 0,
stagePadding: 0,
merge: false,
mergeFit: true,
autoWidth: false,
startPosition: 0,
rtl: false,
smartSpeed: 250,
fluidSpeed: false,
dragEndSpeed: false,
responsive: {},
responsiveRefreshRate: 200,
responsiveBaseElement: window,
fallbackEasing: 'swing',
slideTransition: '',
info: false,
nestedItemSelector: false,
itemElement: 'div',
stageElement: 'div',
refreshClass: 'owl-refresh',
loadedClass: 'owl-loaded',
loadingClass: 'owl-loading',
rtlClass: 'owl-rtl',
responsiveClass: 'owl-responsive',
dragClass: 'owl-drag',
itemClass: 'owl-item',
stageClass: 'owl-stage',
stageOuterClass: 'owl-stage-outer',
grabClass: 'owl-grab'
};
Owl.Width={
Default: 'default',
Inner: 'inner',
Outer: 'outer'
};
Owl.Type={
Event: 'event',
State: 'state'
};
Owl.Plugins={};
Owl.Workers=[ {
filter: [ 'width', 'settings' ],
run: function(){
this._width=this.$element.width();
}}, {
filter: [ 'width', 'items', 'settings' ],
run: function(cache){
cache.current=this._items&&this._items[this.relative(this._current)];
}}, {
filter: [ 'items', 'settings' ],
run: function(){
this.$stage.children('.cloned').remove();
}}, {
filter: [ 'width', 'items', 'settings' ],
run: function(cache){
var margin=this.settings.margin||'',
grid = !this.settings.autoWidth,
rtl=this.settings.rtl,
css={
'width': 'auto',
'margin-left': rtl ? margin:'',
'margin-right': rtl ? '':margin
};
!grid&&this.$stage.children().css(css);
cache.css=css;
}}, {
filter: [ 'width', 'items', 'settings' ],
run: function(cache){
var width=(this.width() / this.settings.items).toFixed(3) - this.settings.margin,
merge=null,
iterator=this._items.length,
grid = !this.settings.autoWidth,
widths=[];
cache.items={
merge: false,
width: width
};
while (iterator--){
merge=this._mergers[iterator];
merge=this.settings.mergeFit&&Math.min(merge, this.settings.items)||merge;
cache.items.merge=merge > 1||cache.items.merge;
widths[iterator] = !grid ? this._items[iterator].width():width * merge;
}
this._widths=widths;
}}, {
filter: [ 'items', 'settings' ],
run: function(){
var clones=[],
items=this._items,
settings=this.settings,
view=Math.max(settings.items * 2, 4),
size=Math.ceil(items.length / 2) * 2,
repeat=settings.loop&&items.length ? settings.rewind ? view:Math.max(view, size):0,
append='',
prepend='';
repeat /=2;
while (repeat > 0){
clones.push(this.normalize(clones.length / 2, true));
$(items[clones[clones.length - 1]][0]).clone(true).addClass('cloned').appendTo(this.$stage);
clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));
$(items[clones[clones.length - 1]][0]).clone(true).addClass('cloned').prependTo(this.$stage);
repeat -=1;
}
this._clones=clones;
}}, {
filter: [ 'width', 'items', 'settings' ],
run: function(){
var rtl=this.settings.rtl ? 1:-1,
size=this._clones.length + this._items.length,
iterator=-1,
previous=0,
current=0,
coordinates=[];
while (++iterator < size){
previous=coordinates[iterator - 1]||0;
current=this._widths[this.relative(iterator)] + this.settings.margin;
coordinates.push(previous + current * rtl);
}
this._coordinates=coordinates;
}}, {
filter: [ 'width', 'items', 'settings' ],
run: function(){
var padding=this.settings.stagePadding,
coordinates=this._coordinates,
css={
'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,
'padding-left': padding||'',
'padding-right': padding||''
};
this.$stage.css(css);
}}, {
filter: [ 'width', 'items', 'settings' ],
run: function(cache){
var iterator=this._coordinates.length,
grid = !this.settings.autoWidth,
items=this.$stage.children();
if(grid&&cache.items.merge){
while (iterator--){
cache.css.width=this._widths[this.relative(iterator)];
items.eq(iterator).css(cache.css);
}}else if(grid){
cache.css.width=cache.items.width;
items.css(cache.css);
}}
}, {
filter: [ 'items' ],
run: function(){
this._coordinates.length < 1&&this.$stage.removeAttr('style');
}}, {
filter: [ 'width', 'items', 'settings' ],
run: function(cache){
cache.current=cache.current ? this.$stage.children().index(cache.current):0;
cache.current=Math.max(this.minimum(), Math.min(this.maximum(), cache.current));
this.reset(cache.current);
}}, {
filter: [ 'position' ],
run: function(){
this.animate(this.coordinates(this._current));
}}, {
filter: [ 'width', 'position', 'items', 'settings' ],
run: function(){
var rtl=this.settings.rtl ? 1:-1,
padding=this.settings.stagePadding * 2,
begin=this.coordinates(this.current()) + padding,
end=begin + this.width() * rtl,
inner, outer, matches=[], i, n;
for (i=0, n=this._coordinates.length; i < n; i++){
inner=this._coordinates[i - 1]||0;
outer=Math.abs(this._coordinates[i]) + padding * rtl;
if((this.op(inner, '<=', begin)&&(this.op(inner, '>', end)))
|| (this.op(outer, '<', begin)&&this.op(outer, '>', end))){
matches.push(i);
}}
this.$stage.children('.active').removeClass('active');
this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active');
this.$stage.children('.center').removeClass('center');
if(this.settings.center){
this.$stage.children().eq(this.current()).addClass('center');
}}
} ];
Owl.prototype.initializeStage=function(){
this.$stage=this.$element.find('.' + this.settings.stageClass);
if(this.$stage.length){
return;
}
this.$element.addClass(this.options.loadingClass);
this.$stage=$('<' + this.settings.stageElement + '>', {
"class": this.settings.stageClass
}).wrap($('<div/>', {
"class": this.settings.stageOuterClass
}));
this.$element.append(this.$stage.parent());
};
Owl.prototype.initializeItems=function(){
var $items=this.$element.find('.owl-item');
if($items.length){
this._items=$items.get().map(function(item){
return $(item);
});
this._mergers=this._items.map(function(){
return 1;
});
this.refresh();
return;
}
this.replace(this.$element.children().not(this.$stage.parent()));
if(this.isVisible()){
this.refresh();
}else{
this.invalidate('width');
}
this.$element
.removeClass(this.options.loadingClass)
.addClass(this.options.loadedClass);
};
Owl.prototype.initialize=function(){
this.enter('initializing');
this.trigger('initialize');
this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl);
if(this.settings.autoWidth&&!this.is('pre-loading')){
var imgs, nestedSelector, width;
imgs=this.$element.find('img');
nestedSelector=this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector:undefined;
width=this.$element.children(nestedSelector).width();
if(imgs.length&&width <=0){
this.preloadAutoWidthImages(imgs);
}}
this.initializeStage();
this.initializeItems();
this.registerEventHandlers();
this.leave('initializing');
this.trigger('initialized');
};
Owl.prototype.isVisible=function(){
return this.settings.checkVisibility
? this.$element.is(':visible')
: true;
};
Owl.prototype.setup=function(){
var viewport=this.viewport(),
overwrites=this.options.responsive,
match=-1,
settings=null;
if(!overwrites){
settings=$.extend({}, this.options);
}else{
$.each(overwrites, function(breakpoint){
if(breakpoint <=viewport&&breakpoint > match){
match=Number(breakpoint);
}});
settings=$.extend({}, this.options, overwrites[match]);
if(typeof settings.stagePadding==='function'){
settings.stagePadding=settings.stagePadding();
}
delete settings.responsive;
if(settings.responsiveClass){
this.$element.attr('class',
this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match)
);
}}
this.trigger('change', { property: { name: 'settings', value: settings }});
this._breakpoint=match;
this.settings=settings;
this.invalidate('settings');
this.trigger('changed', { property: { name: 'settings', value: this.settings }});
};
Owl.prototype.optionsLogic=function(){
if(this.settings.autoWidth){
this.settings.stagePadding=false;
this.settings.merge=false;
}};
Owl.prototype.prepare=function(item){
var event=this.trigger('prepare', { content: item });
if(!event.data){
event.data=$('<' + this.settings.itemElement + '/>')
.addClass(this.options.itemClass).append(item)
}
this.trigger('prepared', { content: event.data });
return event.data;
};
Owl.prototype.update=function(){
var i=0,
n=this._pipe.length,
filter=$.proxy(function(p){ return this[p] }, this._invalidated),
cache={};
while (i < n){
if(this._invalidated.all||$.grep(this._pipe[i].filter, filter).length > 0){
this._pipe[i].run(cache);
}
i++;
}
this._invalidated={};
!this.is('valid')&&this.enter('valid');
};
Owl.prototype.width=function(dimension){
dimension=dimension||Owl.Width.Default;
switch (dimension){
case Owl.Width.Inner:
case Owl.Width.Outer:
return this._width;
default:
return this._width - this.settings.stagePadding * 2 + this.settings.margin;
}};
Owl.prototype.refresh=function(resizing){
resizing=resizing||false;
this.enter('refreshing');
this.trigger('refresh');
this.setup();
this.optionsLogic();
this.$element.addClass(this.options.refreshClass);
this.update();
if(!resizing){
this.onResize();
}
this.$element.removeClass(this.options.refreshClass);
this.leave('refreshing');
this.trigger('refreshed');
};
Owl.prototype.onThrottledResize=function(){
window.clearTimeout(this.resizeTimer);
this.resizeTimer=window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate);
};
Owl.prototype.onResize=function(){
var resizing=true;
if(!this._items.length){
return false;
}
if(this._width===this.$element.width()){
return false;
}
if(!this.isVisible()){
return false;
}
this.enter('resizing');
if(this.trigger('resize').isDefaultPrevented()){
this.leave('resizing');
return false;
}
this.invalidate('width');
this.refresh(resizing);
this.leave('resizing');
this.trigger('resized');
};
Owl.prototype.registerEventHandlers=function(){
if($.support.transition){
this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this));
}
if(this.settings.responsive!==false){
this.on(window, 'resize', this._handlers.onThrottledResize);
}
if(this.settings.mouseDrag){
this.$element.addClass(this.options.dragClass);
this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this));
this.$stage.on('dragstart.owl.core selectstart.owl.core', function(){ return false });
}
if(this.settings.touchDrag){
this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this));
this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this));
}};
Owl.prototype.onDragStart=function(event){
var stage=null;
if(event.which===3){
return;
}
if($.support.transform){
stage=this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(',');
stage={
x: stage[stage.length===16 ? 12:4],
y: stage[stage.length===16 ? 13:5]
};}else{
stage=this.$stage.position();
stage={
x: this.settings.rtl ?
stage.left + this.$stage.width() - this.width() + this.settings.margin :
stage.left,
y: stage.top
};}
if(this.is('animating')){
$.support.transform ? this.animate(stage.x):this.$stage.stop()
this.invalidate('position');
}
this.$element.toggleClass(this.options.grabClass, event.type==='mousedown');
this.speed(0);
this._drag.time=new Date().getTime();
this._drag.target=$(event.target);
this._drag.stage.start=stage;
this._drag.stage.current=stage;
this._drag.pointer=this.pointer(event);
$(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this));
$(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function(event){
var delta=this.difference(this._drag.pointer, this.pointer(event));
$(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this));
if(Math.abs(delta.x) < Math.abs(delta.y)&&this.is('valid')){
return;
}
event.preventDefault();
this.enter('dragging');
this.trigger('drag');
}, this));
};
Owl.prototype.onDragMove=function(event){
var minimum=null,
maximum=null,
pull=null,
delta=this.difference(this._drag.pointer, this.pointer(event)),
stage=this.difference(this._drag.stage.start, delta);
if(!this.is('dragging')){
return;
}
event.preventDefault();
if(this.settings.loop){
minimum=this.coordinates(this.minimum());
maximum=this.coordinates(this.maximum() + 1) - minimum;
stage.x=(((stage.x - minimum) % maximum + maximum) % maximum) + minimum;
}else{
minimum=this.settings.rtl ? this.coordinates(this.maximum()):this.coordinates(this.minimum());
maximum=this.settings.rtl ? this.coordinates(this.minimum()):this.coordinates(this.maximum());
pull=this.settings.pullDrag ? -1 * delta.x / 5:0;
stage.x=Math.max(Math.min(stage.x, minimum + pull), maximum + pull);
}
this._drag.stage.current=stage;
this.animate(stage.x);
};
Owl.prototype.onDragEnd=function(event){
var delta=this.difference(this._drag.pointer, this.pointer(event)),
stage=this._drag.stage.current,
direction=delta.x > 0 ^ this.settings.rtl ? 'left':'right';
$(document).off('.owl.core');
this.$element.removeClass(this.options.grabClass);
if(delta.x!==0&&this.is('dragging')||!this.is('valid')){
this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed);
this.current(this.closest(stage.x, delta.x!==0 ? direction:this._drag.direction));
this.invalidate('position');
this.update();
this._drag.direction=direction;
if(Math.abs(delta.x) > 3||new Date().getTime() - this._drag.time > 300){
this._drag.target.one('click.owl.core', function(){ return false; });
}}
if(!this.is('dragging')){
return;
}
this.leave('dragging');
this.trigger('dragged');
};
Owl.prototype.closest=function(coordinate, direction){
var position=-1,
pull=30,
width=this.width(),
count=this.settings.items,
itemWidth=Math.round(width / count),
coordinates=this.coordinates();
if(!this.settings.freeDrag){
$.each(coordinates, $.proxy(function(index, value){
if(direction==='left'&&coordinate > value - pull&&coordinate < value + pull){
position=index;
}else if(direction==='right'&&coordinate > value - itemWidth - pull&&coordinate < value - itemWidth + pull){
position=index + 1;
}else if(this.op(coordinate, '<', value)
&& this.op(coordinate, '>', coordinates[index + 1]!==undefined ? coordinates[index + 1]:value - width)){
position=direction==='left' ? index + 1:index;
}
return position===-1;
}, this));
}
if(!this.settings.loop){
if(this.op(coordinate, '>', coordinates[this.minimum()])){
position=coordinate=this.minimum();
}else if(this.op(coordinate, '<', coordinates[this.maximum()])){
position=coordinate=this.maximum();
}}
return position;
};
Owl.prototype.animate=function(coordinate){
var animate=this.speed() > 0;
this.is('animating')&&this.onTransitionEnd();
if(animate){
this.enter('animating');
this.trigger('translate');
}
if($.support.transform3d&&$.support.transition){
this.$stage.css({
transform: 'translate3d(' + coordinate + 'px,0px,0px)',
transition: (this.speed() / 1000) + 's' + (
this.settings.slideTransition ? ' ' + this.settings.slideTransition:''
)
});
}else if(animate){
this.$stage.animate({
left: coordinate + 'px'
}, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this));
}else{
this.$stage.css({
left: coordinate + 'px'
});
}};
Owl.prototype.is=function(state){
return this._states.current[state]&&this._states.current[state] > 0;
};
Owl.prototype.current=function(position){
if(position===undefined){
return this._current;
}
if(this._items.length===0){
return undefined;
}
position=this.normalize(position);
if(this._current!==position){
var event=this.trigger('change', { property: { name: 'position', value: position }});
if(event.data!==undefined){
position=this.normalize(event.data);
}
this._current=position;
this.invalidate('position');
this.trigger('changed', { property: { name: 'position', value: this._current }});
}
return this._current;
};
Owl.prototype.invalidate=function(part){
if($.type(part)==='string'){
this._invalidated[part]=true;
this.is('valid')&&this.leave('valid');
}
return $.map(this._invalidated, function(v, i){ return i });
};
Owl.prototype.reset=function(position){
position=this.normalize(position);
if(position===undefined){
return;
}
this._speed=0;
this._current=position;
this.suppress([ 'translate', 'translated' ]);
this.animate(this.coordinates(position));
this.release([ 'translate', 'translated' ]);
};
Owl.prototype.normalize=function(position, relative){
var n=this._items.length,
m=relative ? 0:this._clones.length;
if(!this.isNumeric(position)||n < 1){
position=undefined;
}else if(position < 0||position >=n + m){
position=((position - m / 2) % n + n) % n + m / 2;
}
return position;
};
Owl.prototype.relative=function(position){
position -=this._clones.length / 2;
return this.normalize(position, true);
};
Owl.prototype.maximum=function(relative){
var settings=this.settings,
maximum=this._coordinates.length,
iterator,
reciprocalItemsWidth,
elementWidth;
if(settings.loop){
maximum=this._clones.length / 2 + this._items.length - 1;
}else if(settings.autoWidth||settings.merge){
iterator=this._items.length;
if(iterator){
reciprocalItemsWidth=this._items[--iterator].width();
elementWidth=this.$element.width();
while (iterator--){
reciprocalItemsWidth +=this._items[iterator].width() + this.settings.margin;
if(reciprocalItemsWidth > elementWidth){
break;
}}
}
maximum=iterator + 1;
}else if(settings.center){
maximum=this._items.length - 1;
}else{
maximum=this._items.length - settings.items;
}
if(relative){
maximum -=this._clones.length / 2;
}
return Math.max(maximum, 0);
};
Owl.prototype.minimum=function(relative){
return relative ? 0:this._clones.length / 2;
};
Owl.prototype.items=function(position){
if(position===undefined){
return this._items.slice();
}
position=this.normalize(position, true);
return this._items[position];
};
Owl.prototype.mergers=function(position){
if(position===undefined){
return this._mergers.slice();
}
position=this.normalize(position, true);
return this._mergers[position];
};
Owl.prototype.clones=function(position){
var odd=this._clones.length / 2,
even=odd + this._items.length,
map=function(index){ return index % 2===0 ? even + index / 2:odd - (index + 1) / 2 };
if(position===undefined){
return $.map(this._clones, function(v, i){ return map(i) });
}
return $.map(this._clones, function(v, i){ return v===position ? map(i):null });
};
Owl.prototype.speed=function(speed){
if(speed!==undefined){
this._speed=speed;
}
return this._speed;
};
Owl.prototype.coordinates=function(position){
var multiplier=1,
newPosition=position - 1,
coordinate;
if(position===undefined){
return $.map(this._coordinates, $.proxy(function(coordinate, index){
return this.coordinates(index);
}, this));
}
if(this.settings.center){
if(this.settings.rtl){
multiplier=-1;
newPosition=position + 1;
}
coordinate=this._coordinates[position];
coordinate +=(this.width() - coordinate + (this._coordinates[newPosition]||0)) / 2 * multiplier;
}else{
coordinate=this._coordinates[newPosition]||0;
}
coordinate=Math.ceil(coordinate);
return coordinate;
};
Owl.prototype.duration=function(from, to, factor){
if(factor===0){
return 0;
}
return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((factor||this.settings.smartSpeed));
};
Owl.prototype.to=function(position, speed){
var current=this.current(),
revert=null,
distance=position - this.relative(current),
direction=(distance > 0) - (distance < 0),
items=this._items.length,
minimum=this.minimum(),
maximum=this.maximum();
if(this.settings.loop){
if(!this.settings.rewind&&Math.abs(distance) > items / 2){
distance +=direction * -1 * items;
}
position=current + distance;
revert=((position - minimum) % items + items) % items + minimum;
if(revert!==position&&revert - distance <=maximum&&revert - distance > 0){
current=revert - distance;
position=revert;
this.reset(current);
}}else if(this.settings.rewind){
maximum +=1;
position=(position % maximum + maximum) % maximum;
}else{
position=Math.max(minimum, Math.min(maximum, position));
}
this.speed(this.duration(current, position, speed));
this.current(position);
if(this.isVisible()){
this.update();
}};
Owl.prototype.next=function(speed){
speed=speed||false;
this.to(this.relative(this.current()) + 1, speed);
};
Owl.prototype.prev=function(speed){
speed=speed||false;
this.to(this.relative(this.current()) - 1, speed);
};
Owl.prototype.onTransitionEnd=function(event){
if(event!==undefined){
event.stopPropagation();
if((event.target||event.srcElement||event.originalTarget)!==this.$stage.get(0)){
return false;
}}
this.leave('animating');
this.trigger('translated');
};
Owl.prototype.viewport=function(){
var width;
if(this.options.responsiveBaseElement!==window){
width=$(this.options.responsiveBaseElement).width();
}else if(window.innerWidth){
width=window.innerWidth;
}else if(document.documentElement&&document.documentElement.clientWidth){
width=document.documentElement.clientWidth;
}else{
console.warn('Can not detect viewport width.');
}
return width;
};
Owl.prototype.replace=function(content){
this.$stage.empty();
this._items=[];
if(content){
content=(content instanceof jQuery) ? content:$(content);
}
if(this.settings.nestedItemSelector){
content=content.find('.' + this.settings.nestedItemSelector);
}
content.filter(function(){
return this.nodeType===1;
}).each($.proxy(function(index, item){
item=this.prepare(item);
this.$stage.append(item);
this._items.push(item);
this._mergers.push(item.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1||1);
}, this));
this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition:0);
this.invalidate('items');
};
Owl.prototype.add=function(content, position){
var current=this.relative(this._current);
position=position===undefined ? this._items.length:this.normalize(position, true);
content=content instanceof jQuery ? content:$(content);
this.trigger('add', { content: content, position: position });
content=this.prepare(content);
if(this._items.length===0||position===this._items.length){
this._items.length===0&&this.$stage.append(content);
this._items.length!==0&&this._items[position - 1].after(content);
this._items.push(content);
this._mergers.push(content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1||1);
}else{
this._items[position].before(content);
this._items.splice(position, 0, content);
this._mergers.splice(position, 0, content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1||1);
}
this._items[current]&&this.reset(this._items[current].index());
this.invalidate('items');
this.trigger('added', { content: content, position: position });
};
Owl.prototype.remove=function(position){
position=this.normalize(position, true);
if(position===undefined){
return;
}
this.trigger('remove', { content: this._items[position], position: position });
this._items[position].remove();
this._items.splice(position, 1);
this._mergers.splice(position, 1);
this.invalidate('items');
this.trigger('removed', { content: null, position: position });
};
Owl.prototype.preloadAutoWidthImages=function(images){
images.each($.proxy(function(i, element){
this.enter('pre-loading');
element=$(element);
$(new Image()).one('load', $.proxy(function(e){
element.attr('src', e.target.src);
element.css('opacity', 1);
this.leave('pre-loading');
!this.is('pre-loading')&&!this.is('initializing')&&this.refresh();
}, this)).attr('src', (window.devicePixelRatio > 1) ? element.attr('data-src-retina'):element.attr('data-src')||element.attr('src'));
}, this));
};
Owl.prototype.destroy=function(){
this.$element.off('.owl.core');
this.$stage.off('.owl.core');
$(document).off('.owl.core');
if(this.settings.responsive!==false){
window.clearTimeout(this.resizeTimer);
this.off(window, 'resize', this._handlers.onThrottledResize);
}
for (var i in this._plugins){
this._plugins[i].destroy();
}
this.$stage.children('.cloned').remove();
this.$stage.unwrap();
this.$stage.children().contents().unwrap();
this.$stage.children().unwrap();
this.$stage.remove();
this.$element
.removeClass(this.options.refreshClass)
.removeClass(this.options.loadingClass)
.removeClass(this.options.loadedClass)
.removeClass(this.options.rtlClass)
.removeClass(this.options.dragClass)
.removeClass(this.options.grabClass)
.attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), ''))
.removeData('owl.carousel');
};
Owl.prototype.op=function(a, o, b){
var rtl=this.settings.rtl;
switch (o){
case '<':
return rtl ? a > b:a < b;
case '>':
return rtl ? a < b:a > b;
case '>=':
return rtl ? a <=b:a >=b;
case '<=':
return rtl ? a >=b:a <=b;
default:
break;
}};
Owl.prototype.on=function(element, event, listener, capture){
if(element.addEventListener){
element.addEventListener(event, listener, capture);
}else if(element.attachEvent){
element.attachEvent('on' + event, listener);
}};
Owl.prototype.off=function(element, event, listener, capture){
if(element.removeEventListener){
element.removeEventListener(event, listener, capture);
}else if(element.detachEvent){
element.detachEvent('on' + event, listener);
}};
Owl.prototype.trigger=function(name, data, namespace, state, enter){
var status={
item: { count: this._items.length, index: this.current() }}, handler=$.camelCase($.grep([ 'on', name, namespace ], function(v){ return v })
.join('-').toLowerCase()
), event=$.Event([ name, 'owl', namespace||'carousel' ].join('.').toLowerCase(),
$.extend({ relatedTarget: this }, status, data)
);
if(!this._supress[name]){
$.each(this._plugins, function(name, plugin){
if(plugin.onTrigger){
plugin.onTrigger(event);
}});
this.register({ type: Owl.Type.Event, name: name });
this.$element.trigger(event);
if(this.settings&&typeof this.settings[handler]==='function'){
this.settings[handler].call(this, event);
}}
return event;
};
Owl.prototype.enter=function(name){
$.each([ name ].concat(this._states.tags[name]||[]), $.proxy(function(i, name){
if(this._states.current[name]===undefined){
this._states.current[name]=0;
}
this._states.current[name]++;
}, this));
};
Owl.prototype.leave=function(name){
$.each([ name ].concat(this._states.tags[name]||[]), $.proxy(function(i, name){
this._states.current[name]--;
}, this));
};
Owl.prototype.register=function(object){
if(object.type===Owl.Type.Event){
if(!$.event.special[object.name]){
$.event.special[object.name]={};}
if(!$.event.special[object.name].owl){
var _default=$.event.special[object.name]._default;
$.event.special[object.name]._default=function(e){
if(_default&&_default.apply&&(!e.namespace||e.namespace.indexOf('owl')===-1)){
return _default.apply(this, arguments);
}
return e.namespace&&e.namespace.indexOf('owl') > -1;
};
$.event.special[object.name].owl=true;
}}else if(object.type===Owl.Type.State){
if(!this._states.tags[object.name]){
this._states.tags[object.name]=object.tags;
}else{
this._states.tags[object.name]=this._states.tags[object.name].concat(object.tags);
}
this._states.tags[object.name]=$.grep(this._states.tags[object.name], $.proxy(function(tag, i){
return $.inArray(tag, this._states.tags[object.name])===i;
}, this));
}};
Owl.prototype.suppress=function(events){
$.each(events, $.proxy(function(index, event){
this._supress[event]=true;
}, this));
};
Owl.prototype.release=function(events){
$.each(events, $.proxy(function(index, event){
delete this._supress[event];
}, this));
};
Owl.prototype.pointer=function(event){
var result={ x: null, y: null };
event=event.originalEvent||event||window.event;
event=event.touches&&event.touches.length ?
event.touches[0]:event.changedTouches&&event.changedTouches.length ?
event.changedTouches[0]:event;
if(event.pageX){
result.x=event.pageX;
result.y=event.pageY;
}else{
result.x=event.clientX;
result.y=event.clientY;
}
return result;
};
Owl.prototype.isNumeric=function(number){
return !isNaN(parseFloat(number));
};
Owl.prototype.difference=function(first, second){
return {
x: first.x - second.x,
y: first.y - second.y
};};
$.fn.owlCarousel=function(option){
var args=Array.prototype.slice.call(arguments, 1);
return this.each(function(){
var $this=$(this),
data=$this.data('owl.carousel');
if(!data){
data=new Owl(this, typeof option=='object'&&option);
$this.data('owl.carousel', data);
$.each([
'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove'
], function(i, event){
data.register({ type: Owl.Type.Event, name: event });
data.$element.on(event + '.owl.carousel.core', $.proxy(function(e){
if(e.namespace&&e.relatedTarget!==this){
this.suppress([ event ]);
data[event].apply(this, [].slice.call(arguments, 1));
this.release([ event ]);
}}, data));
});
}
if(typeof option=='string'&&option.charAt(0)!=='_'){
data[option].apply(data, args);
}});
};
$.fn.owlCarousel.Constructor=Owl;
})(window.Zepto||window.jQuery, window, document);
(function (factory){
if(typeof define==='function'&&define.amd){
define(['jquery'], factory);
}else if(typeof exports==='object'){
factory(require('jquery'));
}else{
factory(jQuery);
}}(function ($){
var pluses=/\+/g;
function encode(s){
return config.raw ? s:encodeURIComponent(s);
}
function decode(s){
return config.raw ? s:decodeURIComponent(s);
}
function stringifyCookieValue(value){
return encode(config.json ? JSON.stringify(value):String(value));
}
function parseCookieValue(s){
if(s.indexOf('"')===0){
s=s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
}
try {
s=decodeURIComponent(s.replace(pluses, ' '));
return config.json ? JSON.parse(s):s;
} catch(e){}}
function read(s, converter){
var value=config.raw ? s:parseCookieValue(s);
return $.isFunction(converter) ? converter(value):value;
}
var config=$.cookie=function (key, value, options){
if(value!==undefined&&!$.isFunction(value)){
options=$.extend({}, config.defaults, options);
if(typeof options.expires==='number'){
var days=options.expires, t=options.expires=new Date();
t.setTime(+t + days * 864e+5);
}
return (document.cookie=[
encode(key), '=', stringifyCookieValue(value),
options.expires ? '; expires=' + options.expires.toUTCString():'',
options.path    ? '; path=' + options.path:'',
options.domain  ? '; domain=' + options.domain:'',
options.secure  ? '; secure':''
].join(''));
}
var result=key ? undefined:{};
var cookies=document.cookie ? document.cookie.split('; '):[];
for (var i=0, l=cookies.length; i < l; i++){
var parts=cookies[i].split('=');
var name=decode(parts.shift());
var cookie=parts.join('=');
if(key&&key===name){
result=read(cookie, value);
break;
}
if(!key&&(cookie=read(cookie))!==undefined){
result[name]=cookie;
}}
return result;
};
config.defaults={};
$.removeCookie=function (key, options){
if($.cookie(key)===undefined){
return false;
}
$.cookie(key, '', $.extend({}, options, { expires: -1 }));
return !$.cookie(key);
};}));
(function($){
'use strict';
/**
* All of the code for your public-facing JavaScript source
* should reside in this file.
*
* Note: It has been assumed you will write jQuery code here, so the
* $ function reference has been prepared for usage within the scope
* of this function.
*
* This enables you to define handlers, for when the DOM is ready:
*
* $(function(){
*
* });
*
* When the window is loaded:
*
* $(window).load(function(){
*
* });
*
* ...and/or other possibilities.
*
* Ideally, it is not considered best practise to attach more than a
* single DOM-ready or window-load handler for a particular page.
* Although scripts in the WordPress core, Plugins and Themes may be
* practising this, we should strive to set a better example in our own work.
*/
})(jQuery);
function wpvrhotspot(hotSpotDiv, hotspotData){
const args=hotspotData.on_click_content;
if(args){
const hasTextContent=args.replace(/<[^>]*>/g, '').trim()!=='';
const hasMediaContent=/<(img|video|audio|iframe|embed|object)\b[^>]*>/i.test(args);
const hasOtherContent=args.replace(/<(p|br|div|span)\b[^>]*\/?>/gi, '').trim()!=='';
if(hasTextContent||hasMediaContent||hasOtherContent){
const cleanArgs=args.replace(/\\/g, '');
const $wrapper=jQuery(hotSpotDiv.target).parent().siblings(".custom-ifram-wrapper");
$wrapper.find('.custom-ifram').html(cleanArgs);
$wrapper.fadeIn();
jQuery(hotSpotDiv.target).closest(".pano-wrap").addClass("show-modal");
}}
}
function wpvrtooltip(hotSpotDiv, args){
if(args){
const hasTextContent=args.replace(/<[^>]*>/g, '').trim()!=='';
const hasMediaContent=/<(img|video|audio|iframe|embed|object)\b[^>]*>/i.test(args);
const hasOtherContent=args.replace(/<(p|br|div|span)\b[^>]*\/?>/gi, '').trim()!=='';
if(hasTextContent||hasMediaContent||hasOtherContent){
const cleanArgs=args.replace(/\\/g, '');
hotSpotDiv.classList.add('custom-tooltip');
const p=document.createElement('p');
p.innerHTML=cleanArgs;
hotSpotDiv.appendChild(p);
p.style.marginLeft=-(p.scrollWidth - hotSpotDiv.offsetWidth) / 2 + 'px';
p.style.marginTop=-p.scrollHeight - 12 + 'px';
if(!document.getElementById('wpvr-tooltip-style')){
const style=document.createElement('style');
style.id='wpvr-tooltip-style';
style.textContent=`
.table, .table td, .table th {
border: 1px solid #dee2e6;
border-collapse: collapse;
padding: 8px;
}
`;
document.head.appendChild(style);
}}
}}
jQuery(document).ready(function($){
$(".cross").on("click", function(e){
e.preventDefault();
$(this).parent(".custom-ifram-wrapper").fadeOut();
$(this).parents(".pano-wrap").removeClass("show-modal");
$('.vr-iframe').attr('src', '');
if($('#wpvr-video').length!=0){
$('#wpvr-video').get(0).pause();
}
$(this).parent(".custom-ifram-wrapper").find('.custom-ifram').empty();
});
});
jQuery(document).ready(function($){
var notice_active=wpvr_public.notice_active;
var notice=wpvr_public.notice;
if(notice_active=="true"){
if(!$.cookie("wpvr_mobile_notice")){
if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)){
if($(".pano-wrap")[0]){
$('body').append("<div class='wpvr-mobile-notice'><p>" + notice + "</p> <span class='notice-close'><i class='fa fa-times'></i></span></div>");
}}
}}
$('.wpvr-mobile-notice .notice-close').on('click', function(){
$('.wpvr-mobile-notice').fadeOut();
$.cookie('wpvr_mobile_notice', 'true');
});
});
jQuery(document).ready(function($){
var isTouchDevice=("ontouchstart" in window)||(navigator.maxTouchPoints > 0);
var disOnHover=(typeof wpvr_public!=='undefined') ? wpvr_public.dis_on_hover:undefined;
var tipEnabled=(typeof wpvr_public!=='undefined') ? wpvr_public.mobile_hotspot_tip:undefined;
var shouldShowAlert=isTouchDevice&&(disOnHover!=="1");
if(shouldShowAlert){
setTimeout(function(){
if(!$('.pnlm-container').length){
return;
}
$('.pnlm-hotspot-base, .pnlm-hotspot').each(function(){
$(this).off('mouseenter mouseover mouseleave');
$(this).find('p').hide();
var longPressTimer;
var isLongPress=false;
$(this).off('click._wpvrHotspotFix').on('click._wpvrHotspotFix', function(e){
if($(this).data('wpvr-longpress')){
e.preventDefault();
e.stopImmediatePropagation();
$(this).data('wpvr-longpress', false);
return false;
}});
$(this).on('touchstart', function(e){
isLongPress=false;
var $hotspot=$(this);
$hotspot.find('p').hide();
longPressTimer=setTimeout(function(){
isLongPress=true;
$hotspot.data('wpvr-longpress', true);
$('.pnlm-hotspot-base p, .pnlm-hotspot p').hide();
$hotspot.find('p').show();
}, 600);
});
$(this).on('touchend', function(e){
clearTimeout(longPressTimer);
if(isLongPress){
e.preventDefault();
e.stopPropagation();
}else{
$(this).find('p').hide();
}});
$(this).on('touchmove', function(){
clearTimeout(longPressTimer);
isLongPress=false;
$(this).find('p').hide();
});
});
$(document).on('touchstart.wpvrHotspotOutside', function(e){
if(!$(e.target).closest('.pnlm-hotspot-base, .pnlm-hotspot').length){
$('.pnlm-hotspot-base p, .pnlm-hotspot p').hide();
}});
$('.pnlm-hotspot-base, .pnlm-hotspot').on('touchstart', function(e){
var $current=$(this);
$('.pnlm-hotspot-base, .pnlm-hotspot').not($current).find('p').hide();
});
if(tipEnabled=='1'){
function showHotspotTip(){
if(window.sessionStorage&&sessionStorage.getItem('wpvrHotspotTipShown')) return;
if(window.sessionStorage){
sessionStorage.setItem('wpvrHotspotTipShown', '1');
}
alert('Tip: On mobile devices, long-press a hotspot to show its hover content.');
}
$('.pnlm-container').on('touchstart.wpvrTip touchmove.wpvrTip', showHotspotTip);
$('.pnlm-hotspot-base, .pnlm-hotspot').on('touchstart.wpvrTip', showHotspotTip);
}}, 800);
}});