{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./player/playback/config/status-codes.js","webpack:///./player/config/production.js","webpack:///./player/config/translations.js","webpack:///./player/config.js","webpack:///./player/config/jw-keys.js","webpack:///./icons/close.svg","webpack:///./icons/play.svg","webpack:///./icons/pause.svg","webpack:///./icons/audio.svg","webpack:///./icons/audio-muted.svg","webpack:///./icons/chevron-right.svg","webpack:///./icons/captions.svg","webpack:///./player/playback/ads/homad-lib.js","webpack:///./icons/audio-half.svg","webpack:///./icons/fullscreen-off.svg","webpack:///./icons/fullscreen-on.svg","webpack:///./icons/settings.svg","webpack:///./icons/share.svg","webpack:///./player/plugins/pause.html","webpack:///./player/plugins/countdown.html","webpack:///./player/plugins/recommended/recommended.html","webpack:///./player/plugins/recommended/next-asset.html","webpack:///./player/plugins/recommended/grid.html","webpack:///./icons/error.svg","webpack:///./icons/backward-sec.svg","webpack:///./icons/embed.svg","webpack:///./icons/forward-sec.svg","webpack:///./icons/gallery.svg","webpack:///./icons/info.svg","webpack:///./icons/link.svg","webpack:///./icons/play-backward.svg","webpack:///./icons/play-forward.svg","webpack:///./icons/play-next.svg","webpack:///./icons/playlist.svg","webpack:///./icons/quality.svg","webpack:///./icons/replay.svg","webpack:///./utils/underscore.js","webpack:///./utils/backbone.events.js","webpack:///./utils/device.js","webpack:///./utils/merge.js","webpack:///./utils/utils.js","webpack:///./utils/logger.js","webpack:///./utils/server-time.js","webpack:///./utils/model.js","webpack:///./player/model/category.js","webpack:///./player/model/asset.js","webpack:///./utils/image.js","webpack:///./player/model/stream.js","webpack:///./player/model/excluded-assets.js","webpack:///./player/model/next-asset.js","webpack:///./player/model/locale.js","webpack:///./player/model/domain.js","webpack:///./player/model/token.js","webpack:///./player/playback/ads/appnexus-tag-builder.js","webpack:///./player/playback/ads/appnexus-jw-config.js","webpack:///./player/playback/ads/appnexus.js","webpack:///./player/playback/config/playlist.js","webpack:///./player/playback/config/playback.js","webpack:///./player/playback/config/jw-youbora.js","webpack:///./player/playback/config.js","webpack:///./player/playback/config/sharing.js","webpack:///./player/playback/config/keys.js","webpack:///./player/playback/viewport.js","webpack:///./player/playback/ads/homad.js","webpack:///./player/playback/ads/homad-jw.js","webpack:///./player/playback/config/autoplay.js","webpack:///./player/playback/skin.js","webpack:///./player/playback/provider.js","webpack:///./player/playback/ads/appnexus-ad-asset.js","webpack:///./player/plugins/model.js","webpack:///./player/plugins.js","webpack:///./player/playback/ads/appnexus-ast.js","webpack:///./player/plugins/pause.js","webpack:///./player/plugins/age-limit.js","webpack:///./player/plugins/countdown.js","webpack:///./player/model/recommended.js","webpack:///./player/plugins/recommended.js","webpack:///./player/plugins/svp-stats/tracker.js","webpack:///./player/plugins/svp-stats.js","webpack:///./player/player.js","webpack:///./index.js","webpack:///./utils/script-loader.js","webpack:///./svp-player.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","ACTIVE","ACTIVE_PREVIEW","NOT_ACTIVE","NOT_ACTIVE_GEOBLOCKED","NOT_FOUND","NOT_ACTIVE_PAST","GENERAL_ERROR","NETWORK_ERROR","TOKEN_FETCH_ERROR","statusMessages","[object Object]","__webpack_exports__","errorCode","_config__WEBPACK_IMPORTED_MODULE_0__","env","translations","en","Video will start at","Video will start in","ageLimit-0","months","status_codes","Sharing","Live button","Error code","en_GB","es_ES","nb_NO","ads","admessage","cuetext","skipmessage","skiptext","podmessage","adblock","player","no","This video cannot be played because of a technical error.","Sorry, the video player failed to load.","This video file cannot be played.","The live stream is either down or has ended.","There was a problem providing access to protected content.","This video cannot be played because of a problem with your internet connection.","play","playback","pause","volume","prev","next","cast","airplay","fullscreen","playlist","hd","cc","audioTracks","playbackRates","replay","buffer","more","liveBroadcast","loadingAd","rewind","nextUp","nextUpClose","related","close","settings","unmute","copied","se","config","version","keys","default","100sport","ab","adressa","altaposten","ap","bt","brandstudio","folkebladet","fvn","harstad","itromso","podcast","rbnett","riks","ridenews","sa","schibsted","smp","svd","tronderavisa","vgtv","vgtvs","api","url","tokenUrl","thumbnailsUrl","vendor","identifier","getUrl","endpoint","joiner","indexOf","this","cb","Math","random","homad","global","client","appnexus","vmap","ast","debug","cdn","svp","pollyfils","time","images","servers","sizes","poster","autoHeight","autoWidth","skins","about","link","text","sharing","sites","code","domains","blacklist","whitelist","preview","locale","isLoaded","exportz","conf","k","b","u","g","a","round","e","String","fromCharCode","floor","A","toString","h","f","Array","q","length","charCodeAt","push","toLowerCase","j","isNaN","charAt","fireEvent","document","createEvent","state","initCustomEvent","dispatchEvent","window","track","M","isEnabled","T","encodeURIComponent","data","homad_url_prefix_alias","homad_track_key","homad_track_value","P","setTimeout","v","w","S","type","message","V","C","O","F","J","G","I","K","H","B","U","R","D","L","N","X","W","z","abs","Date","now","navigator","appCodeName","appName","appVersion","userAgent","platform","language","parseInt","reverse","match","y","startPlayer","eval","fp_error","hd_ready","createElement","src","onerror","head","firstChild","insertBefore","appendChild","setInterval","addEventListener","clearTimeout","getElementsByTagName","parentNode","removeChild","getElementsByClassName","self","top","hasChildNodes","lastChild","homad_url_suffix_base64","homad_url_suffix","homad_hash_guessed","x","enabled","server","replace","getTime","XMLHttpRequest","onreadystatechange","readyState","status","JSON","parse","responseText","open","substr","setRequestHeader","send","location","hostname","onFailure","globalConfig","clientConfig","clearInterval","idCounter","_","jwplayer","MAX_ARRAY_INDEX","pow","getLength","obj","isEmpty","collection","isArrayLike","isArray","isString","isArguments","uniqueId","prefix","id","underscore","Events","eventSplitter","eventsApi","iteratee","events","callback","opts","names","context","test","split","on","internalOn","listening","_events","onApi","ctx","_listeners","listenTo","_listenId","listeningTo","_listeningTo","thisId","objId","count","options","handlers","off","offApi","listeners","stopListening","ids","remaining","handler","_callback","size","once","onceMap","listenToOnce","map","offer","apply","arguments","trigger","max","args","triggerApi","objEvents","allEvents","all","slice","triggerEvents","concat","ev","a1","a2","a3","unbind","backbone_events","userAgentMatch","regex","lazyUserAgentMatch","isFF","isIETrident","isIPad","isEdge","isAndroid","device","isIOS","isAppleIOS","result","exec","isIPhone","isSafari","isAndroidNative","isChrome","isFirefox","isIE","isDesktop","isMobile","isTablet","isSamsungInternet","isWindowsPhone","getChromeVersion","raw","getPixelRatio","devicePixelRatio","getFlashVersion","flash","plugins","description","parseFloat","ActiveXObject","GetVariable","getDeviceType","canAutoplay","isMergeableObject","val","cloneIfNecessary","optionsArgument","clone","deepmerge","emptyTarget","defaultArrayMerge","target","source","destination","forEach","array","arrayMerge","mergeObject","Error","reduce","merge","jwUtils","utils","jwUnderscore","extend","ajax","each","isUndefined","isNumber","omit","memoize","createNode","addStyleSheet","addClass","removeClass","throttle","template","cache","tmpl","str","fn","Function","join","getElementById","innerHTML","shareTimeToSeconds","hours","minutes","seconds","compact","hasFlash","number","zeroPad","escape","escapeMap","&","<",">","\"","'","`","tag","string","getTimeFormatted","timestamp","inherit","model","protoProps","staticProps","parent","child","Surrogate","constructor","__super__","scriptLoader","scriptloader","getScrollSnapPrefix","scrollSnapSupport","documentElement","style","loadScript","path","Promise","resolve","reject","script","done","async","onload","body","jsonToUrl","startsWith","searchString","position","log","logger_isEnabled","utils_utils","console","block","localStorage","getItem","error","logger","unshift","server_time","_time","_responseTime","fetch","resolveRequest","attr","attributes","set","oldVal","Category","initialize","additional","background","main","image","logo","playerLogo","playerLogoImage","hasEmbedPlayNext","isSeries","getLastAsset","category","handleErrors","response","ok","Asset","production","getVendor","unifyTimestamp","startIndexPoint","ageLimit","sourceFiles","series","season","seasonNumber","episode","episodeNumber","flightTimes","start","end","created","published","updated","chapters","chapter","index","timeline","nextAsset","then","json","assign","catch","statusText","destroy","getAgeLimit","getChapter","chapterIndex","getChapters","getThumbnail","getTitle","getCategory","requestNumber","currentServerId","image_config","getServer","getImageTransform","serversAmount","model_asset","imageId","width","height","pixelRatio","min","cacheKey","transform","maxDimension","idLen","transformType","transformSizes","dimensions","getImageQuality","normalizeTransformSize","curr","getClosestSize","utils_image","getImageSrc","extension","Stream","title","streams","hls","streamUrls","hds","mp4","streamType","streamConfiguration","snapshots","captions","begin","externalId","duration","metadata","is360","pseudostreaming","showAds","cuePoints","getId","hasProperty","properties","getDuration","getCuePoints","isSecure","isGeoblocked","isLive","wasLive","isActive","isPast","isFuture","hasHds","hasPlayableSource","getTimeToStart","isOnHttp","protocol","streamUrl","getPoster","getPosterSrc","containerWidth","getSnapshots","hasSnapshots","getCaptions","hasMp4Streams","getMp4Streams","stream","streamData","pop","bitrate","getPlaybackTime","hasCreatives","getExternalId","getDisplayType","hasAdsDisabled","model_stream","getKey","excluded_assets","add","assets","getAll","splice","getStorage","setItem","stringify","getCategorySettings","asset","order","categoryId","currentOrder","NextAsset","hasPlayNext","includeCategory","hasNextInCategory","fetchNextFromSeries","itemOffset","item","fetchNextFromCategory","_embedded","fetchNextAssetById","assetId","fetchNextFromMlEngine","excludedAssets","fetchSimple","fetchFromMlEngine","request","threshold","mlThreshold","nextAssetId","useMlEngine","next_asset","Locale","translate","substitute","getMonthName","date","getMonth","model_locale","isDomainInArray","origin","domain","pos","domainBeginning","len","undefined","model_domain","na","vendors","getPermissions","isBlacklisted","fetchToken","params","isFetching","expire","token_Token","maxBitrate","configuration","isValid","query","expiry","token","getVmapTag","queryObject","getAstConfig","tagOptions","globalOptions","getDefaultParams","countryCode","getCountryCode","supplyType","publisherName","slotIds","preroll","midroll","postroll","JwAdsConfig","setParams","adSlotConfig","offset","adLabel","appnexus_tag_builder","getConfig","appnexus_jw_config","getParams","memberId","member","getJwAdSchedule","adSlots","adConfig","adsConfig","hasNext","cuePoint","getAdsConfig","schedule","getAdPlacements","adPlacements","globalParams","placements","values","placementId","parseAdPlacements","getClientConfig","adn","adSchedule","adOptions","getLiveMidrollTag","maxDuration","vmaxduration","hlsUrl","addPlaylistMetadata","playlistItem","mediaId","mediaid","addProgressiveMediaSources","mp4Stream","sources","label","file","addSnapshots","tracks","kind","addCaptions","caption","add3dSupport","stereomode","advertising","autoplayMuted","autoplayadsmuted","vpaidcontrols","adschedule","addAppnexusAds","canAutostart","autoplay","withCredentials","preload","autostart","mute","skin","slot","hasPreroll","jw_youbora","youboraAccount","https://smartplugin.youbora.com/v5/javascript/jwplayer/5.4.1/sp.min.js","accountCode","enableAnalytics","getYouboraConfig","youbora","media","resource","content_id","content_metadata","owner","Config","node","jwDefaults","primary","hlshtml","flashplayer","wmode","hasYoubora","setLocale","setStream","getMaxBitrate","container","clientWidth","clientHeight","getToken","hasValidToken","getStreamUrl","getSettings","getJwConfig","abouttext","aboutlink","localization","getPlaylistSettings","heading","sharingDefaults","config_sharing","jwConfig","config_keys","jw","hasRecommended","getRecommended","rawOptions","permissions","freeze","writable","playback_config","Viewport","current","labels","update","newIndex","arr","compare","comp","binarySearch","newBreakpoint","getViewportByIndex","currentBreakpoint","viewport","getTagUrl","potOffset","getPlaylist","getAdPotTag","__svp__locale","skipable","skipAdOnContextChange","runInsideContainer","adjustAdVolumeToContentPlayer","postrollUseCompleteEvent","onReady","muteButton","audio_default","unmuteButton","audio_muted_default","playButton","play_default","pauseButton","pause_default","skipableButton","skipButton","innerWarpper.style","prerollAdTag","midrollAdTag","postrollAdTag","SvpPlayer","SVP","Player","isHomadLoaded","defaults","aabConfig","homad_lib","event","details","detail","containerId","getEvents","playerId","removeEvents","getAdBlock","aab","getContainer","classList","remove","adPosition","adPlaying","currentTime","adId","impression","impressionURL","eventName","adPlayerLoading","pauseReason","getCurrentTime","adposition","MutationObserver","mutations","mutation","nodes","addedNodes","video","querySelector","observe","childList","characterData","getAdPlayer","adPlayer","adPlayerContainer","initializeAdPlayer","canDeviceAutoplay","autoplay_hasPreroll","iconsMap",".jw-svg-icon-play",".jw-svg-icon-pause",".jw-skip-icon .jw-svg-icon-next","chevron_right_default",".jw-svg-icon-settings","settings_default",".jw-svg-icon-sharing","share_default",".jw-svg-icon-cc-on","captions_default",".jw-svg-icon-cc-off",".jw-svg-icon-volume-0",".jw-svg-icon-volume-50","audio_half_default",".jw-svg-icon-volume-100",".jw-svg-icon-fullscreen-on","fullscreen_on_default",".jw-svg-icon-fullscreen-off","fullscreen_off_default","playback_skin","customIcon","selector","icons","querySelectorAll","icon","svpIcon","setAttribute","getAttribute","replaceChild","PlayerModel","isInitalized","onViewportChange","provider_forwardEvent","getAdPosition","slotId","pre","mid","post","setup","onError","onPlaylistItemLoad","onPlay","onPause","onComplete","eventData","contains","submenu","right","offsetWidth","offsetLeft","onTime","onPlayerResize","onMeta","getPlugin","ignoringAdHandler","ignoredAdHandler","getCaptionsList","sequence","xml","adSelector","adData","URL","podcount","parseAdData","playNext","complete","load","stop","getVolume","setVolume","seek","getState","getStream","reason","isAdPlaying","loadStream","force","getPosition","getProvider","provider","playerCaptions","setCurrentCaptions","captionsIndex","playbackEndTime","onFirstFrameLoad","display","levels","playbackEnd","startTime","currentViewport","previousViewport","TXXX","slotDuration","adTag","playAd","skipAd","playReason","methods","forwardedMethods","method","warn","proxyMethod","sourceMethod","VIDEO","Blob","Uint8Array","PluginModel","el","getName","setPlayer","plugins_model","player_plugins","pluginsRepo","PluginsLoader","scripts","queueLen","onResponse","plugin","pluginSrc","getPluginSrc","register","appnexus_ast","apntag","defineTag","tagId","tagConfig","targetId","loadTags","onEvent","showTag","refreshTag","refresh","resizeTag","dimmensions","resizeAd","offEvent","PausePlugin","maxDisplays","displayCounter","withAdTag","adPlacement","withCounter","counter","getBoundingClientRect","appnexusAdId","isAdTagLoaded","show","hide","timerId","onSeek","onResumeClick","render","adTagOptions","appnexusAdContainerId","plugins_pause_default","closeIcon","close_default","closeButton","stopPropagation","player_plugins_pause","AgeLimitPlugin","age_limit","CountdownPlugin","liveDOM","countdownDOM","timer","countdown_default","intervalId","getDateData","repaint","liveDate","isCountdownActive","leadingZeros","sec","currentState","getDate","getHours","getMinutes","numValue","numLen","num","endDate","diff","dateData","years","days","plugins_countdown","onResponseError","recommended_fetch","Recommended","ml","relatedEndpoint","getNextAsset","getItems","items","assetsIds","fetchItemsByIds","fetchRecommendedItems","model_recommended","RecommendedPlugin","countdownTime","countdown","grid","gridItemsReady","clear","getThumbnailUrl","onInitialize","fetchDuration","recommended","getAsset","onPlaybackComplete","scrollSnapPrefix","gridItem","getByClass","onTimeNextVisible","onPlayNextVisible","timeout","transitionDuration","onNextAssetReady","Image","next_asset_default","nextIcon","onGridItemsReady","grid_default","dataset","onGridVisible","onAssetReplay","className","previousEl","recommended_default","plugins_recommended","tracker","trackMediaEvent","sendRequest","trackStreamEvent","queryString","apiUrl","getApiUrl","hypen","SvpStatsPlugin","trackingInterval","getTrackingInterval","initialStartTime","playerTime","adSlot","svp_stats","player_Player","createObjectURL","onceConfigReady","isCompleted","isPlayNextAvailable","serverTime","destroyPlugin","clearError","previousErrorNode","onPlayerEvent","Plugin","addPlugin","setAsset","onAssetReady","isStreamPlayable","onAssetError","onPlaylistItem","translatedMessage","errorDetails","error_default","posterSrc","errorNode","callFunction","getCurrentQuartile","ceil","getCurrentCaptions","setCaptionsStyles","styles","Plugins","player_player","index_SVP","player_config","__defaults","configurable","script_loader","onSuccess","loadSvpLibrary","root","onSvpPlayerReady","PLAYER_LIB","define","amd","require","loadJwPlayer","library"],"mappings":"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","file":"player.next.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"//cdn.svp.schibsted.io/player/3.0.1/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 35);\n","export const ACTIVE = 12000;\nexport const ACTIVE_PREVIEW = 12001;\n\nexport const NOT_ACTIVE = 14001;\nexport const NOT_ACTIVE_GEOBLOCKED = 14002;\nexport const NOT_FOUND = 14003;\nexport const NOT_ACTIVE_PAST = 14004;\n\nexport const GENERAL_ERROR = 15000;\nexport const NETWORK_ERROR = 15101;\nexport const TOKEN_FETCH_ERROR = 15102;\n\nconst statusMessages = {\n [ACTIVE]: 'Stream active',\n [ACTIVE_PREVIEW]: 'Preview mode',\n [NOT_ACTIVE]: 'Stream is not active',\n [NOT_ACTIVE_GEOBLOCKED]: 'Stream failed to play due to geoblock restrictions',\n [NOT_FOUND]: 'Stream not found',\n [NOT_ACTIVE_PAST]: 'Stream has been unpublished',\n [GENERAL_ERROR]: 'General error',\n [NETWORK_ERROR]: 'Network error',\n [TOKEN_FETCH_ERROR]: 'Token fetch error'\n};\n\n/**\n * Get localized messages\n */\nexport default (errorCode) => statusMessages[errorCode] || statusMessages[GENERAL_ERROR];","import config from '../config';\n\nconfig.env = 'production';\nexport default config;\n","/* eslint-disable max-len */\nimport codeToString, * as STATUS_CODES from '../playback/config/status-codes';\n\n// translation configuration for different locales\nconst translations = {\n en: {\n // Countdown plugin\n 'Video will start at': 'Video will start at',\n 'Video will start in': 'Video will start in',\n\n 'ageLimit-0': 'A',\n\n // months is special case for translating month to human readable form\n months: [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]: 'Sorry. An error occured. Try again later.',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]: 'The video failed to play due to geoblock restrictions.',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]: 'Sorry. This video is unavailable.',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Sorry. This video is not active.',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]: 'Sorry. This video is unavailable.',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]: 'Network issues. Please check your internet connection',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]: 'Sorry. An error occured. Try again later.',\n\n // sharing box heading\n Sharing: 'Share this video',\n 'Live button': 'Live',\n\n // error message\n 'Error code': 'Error code',\n\n // closed captions\n en_GB: 'English',\n es_ES: 'Español',\n nb_NO: 'Bokmål',\n\n ads: {\n // jw ad messages\n admessage: 'The ad will end in xx seconds',\n cuetext: 'Advertisement',\n skipmessage: 'Skip ad in xx',\n skiptext: 'Skip',\n podmessage: 'Ad __AD_POD_CURRENT__ of __AD_POD_LENGTH__'\n },\n\n adblock: {\n admessage: 'The ad will end in [time]s'\n },\n player: {}\n },\n no: {\n // Countdown plugin\n 'Video will start at': 'Videoen starter',\n 'Video will start in': 'Videoen starter om',\n\n 'ageLimit-0': 'A',\n\n // months is special case for translating month to human readable form\n months: [\n 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]: 'Beklager, en feil oppstod. Prøv å spill av videoen senere',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]: 'Denne videoen er kun tilgjengelig i Norge',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]: 'Beklager, videoen er ikke tilgjengelig',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Beklager, videoen er ikke tilgjengelig',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]: 'Beklager, vi har ikke rettigheter til å vise videoen lenger',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]: 'Kunne ikke spille av video, venligst sjekk internettforbindelsen din',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]: 'Beklager, en feil oppstod. Prøv å spill av videoen senere',\n\n // jw player error messages\n 'This video cannot be played because of a technical error.': 'Kunne ikke spille av video på grunn av en teknisk feil',\n 'Sorry, the video player failed to load.': 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n 'This video file cannot be played.': 'Kunne ikke spille av video',\n 'The live stream is either down or has ended.': 'Livesendingen er nede eller er avsluttet',\n 'There was a problem providing access to protected content.': 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n 'This video cannot be played because of a problem with your internet connection.': 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n\n // sharing box heading\n Sharing: 'Del denne videoen',\n 'Live button': 'Direkte',\n\n // error message\n 'Error code': 'Feilkode',\n\n // closed captions\n en_GB: 'English',\n es_ES: 'Español',\n nb_NO: 'Bokmål',\n\n ads: {\n admessage: 'Annonsen slutter om xx',\n cuetext: 'Annonse',\n skipmessage: 'Hopp over om xx',\n skiptext: 'Hopp over',\n podmessage: 'Annonse __AD_POD_CURRENT__ av __AD_POD_LENGTH__'\n },\n\n adblock: {\n admessage: 'Annonsen slutter om [time]'\n },\n player: {\n player: 'Videospiller',\n play: 'Spill',\n playback: 'Start avspilling',\n pause: 'Pause',\n volume: 'Volum',\n prev: 'Forrige',\n next: 'Neste',\n cast: 'Chromecast',\n airplay: 'AirPlay',\n fullscreen: 'Fullskjerm',\n playlist: 'Spilleliste',\n hd: 'Kvalitet',\n cc: 'Undertekster',\n audioTracks: 'Lydspor',\n playbackRates: 'Avspillingshastighet',\n replay: 'Spill igjen',\n buffer: 'Laster inn',\n more: 'Mer',\n liveBroadcast: 'Liveopptak',\n loadingAd: 'Laster annonse',\n rewind: 'Spol tilbake 10 sekunder',\n nextUp: \"Neste' video\",\n nextUpClose: 'Lukk neste',\n related: 'Relaterte videoer',\n close: 'Lukk',\n settings: ' Innstillinger',\n unmute: 'Slå på lyd',\n copied: 'Kopiert'\n }\n },\n\n se: {\n // Countdown plugin\n 'Video will start at': 'Videon är tillgänglig',\n 'Video will start in': 'Videon är tillgänglig om',\n\n 'ageLimit-0': 'A',\n\n // months is special case for translating month to human readable form\n months: [\n 'Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]: 'Något gick fel. Försök igen senare.',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]: 'Vi har tyvärr endast rättigheter att spela detta innehåll i Sverige',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]: 'Videon är inte tillgänglig',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Videon är inte tillgänglig',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]: 'Videon är inte tillgänglig',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]: 'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]: 'Token kunde inte hämtas',\n\n // jw player error messages\n 'This video cannot be played because of a technical error.': 'Den här videon kan inte spelas på grund av ett tekniskt fel',\n 'Sorry, the video player failed to load.': 'Något gick fel. Försök igen senare',\n 'This video file cannot be played.': 'Det gick inte att spela videon',\n 'The live stream is either down or has ended.': 'Live överföring är antingen nere eller har slutat',\n 'There was a problem providing access to protected content.': 'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n 'This video cannot be played because of a problem with your internet connection.': 'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n\n // sharing box heading\n Sharing: 'Dela',\n 'Live button': 'Live',\n\n // error message\n 'Error code': 'Felkod',\n\n // closed captions\n en_GB: 'English',\n es_ES: 'Español',\n nb_NO: 'Bokmål',\n\n ads: {\n admessage: 'Annonsen tar slut om xx sekunder',\n cuetext: 'Annons',\n skipmessage: 'Skippa annons om xx',\n skiptext: 'Skippa',\n podmessage: 'Annons __AD_POD_CURRENT__ av __AD_POD_LENGTH__'\n },\n\n adblock: {\n admessage: 'Annonsen tar slut om [time] sekunder'\n },\n\n player: {\n player: 'Videospelare',\n play: 'Spela',\n playback: 'Spela video',\n pause: 'Pausa',\n volume: 'Volym',\n prev: 'Förra',\n next: 'Nästa',\n cast: 'Chromecast',\n airplay: 'AirPlay',\n fullscreen: 'Fullskärm',\n playlist: 'Spellista',\n hd: 'Kvalitet',\n cc: 'Undertexter',\n audioTracks: 'Ljudspår',\n playbackRates: 'Uppspelningshastighet',\n replay: 'Spela igen',\n buffer: 'Laddar',\n more: 'Mer',\n liveBroadcast: 'Live',\n loadingAd: 'Laddar annons',\n rewind: 'Spola tillbaka 10 sekunder',\n nextUp: 'Nästa',\n nextUpClose: 'Stäng',\n related: 'Fler videos',\n close: 'Stäng',\n settings: 'Inställningar',\n unmute: 'Slå på ljud',\n copied: 'Kopierad'\n }\n }\n};\n\n/**\n * Get single locale translations hash map\n */\nexport default function (locale) {\n return translations[locale];\n}\n","/* global __BUILD_VERSION__ */\nimport translations from './config/translations';\nimport jwKeys from './config/jw-keys';\n\nconst VERSION = __BUILD_VERSION__;\n\nconst config = {\n version: VERSION,\n player: {\n keys: jwKeys\n },\n /**\n * SVP API configuration\n */\n api: {\n url: '//svp.vg.no/svp/api/v1/',\n tokenUrl: '//svp.vg.no/svp/token/v1/',\n thumbnailsUrl: '//svp.vg.no/svp/thumbnails/v1/',\n\n vendor: null,\n /**\n * API identifier\n */\n identifier: 'svp-player',\n\n /**\n * Get full endpoint url to requested resource\n *\n * @param vendor\n * @param endpoint\n * @returns {string}\n */\n getUrl: function (vendor, endpoint) {\n const joiner = (endpoint.indexOf('?') > -1) ? '&' : '?';\n let url = `${this.url + vendor + endpoint + joiner}appName=${this.identifier}`;\n\n // enable cachebreaking in preview mode\n if (this.cb === true) {\n url += `&cb=${Math.random() * 10000}`;\n }\n\n return url;\n }\n },\n\n ads: {\n homad: {\n global: 'https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json',\n client: '/homad-config.json'\n },\n\n appnexus: {\n vmap: 'https://ib.adnxs.com/vmap',\n ast: 'https://cdn.svp.schibsted.io/ast/ast-custom.min.js',\n debug: false\n }\n },\n\n cdn: {\n svp: `//cdn.svp.schibsted.io/player/${VERSION}`,\n player: '//cdn.svp.schibsted.io/jw/jwplayer-8.4.6',\n pollyfils: '//svp.vgc.no/pollyfils/es6-promise.min.js'\n },\n\n time: '//svp.vg.no/svp/api/v1/time',\n\n /**\n * Imbo images server\n */\n images: {\n servers: ['imbo', 'imbo01', 'imbo02', 'imbo03'],\n\n sizes: {\n poster: {\n autoHeight: [\n 380, 480, 580, 680, 780, 800, 980, 1080, 1440, 2048\n ],\n autoWidth: [\n 452, 613, 740, 900, 1080, 1440\n ]\n }\n\n }\n },\n\n /**\n * Default skins for providers\n */\n skins: {\n default: {\n url: `//cdn.svp.schibsted.io/player/${VERSION}/css/player.css`,\n name: 'svp-default jw-skin-seven'\n }\n },\n\n about: {\n vgtv: {\n link: 'http://www.vgtv.no/',\n text: 'VGTV'\n }\n },\n\n sharing: {\n global: {\n sites: ['facebook', 'twitter']\n },\n\n vgtv: {\n link: 'http://www.vgtv.no/#!/MEDIAID',\n // eslint-disable-next-line max-len\n code: ``\n }\n },\n\n domains: {\n blacklist: {\n global: [],\n ab: ['*avpixlat.info', '*exponerat.net']\n },\n\n whitelist: {\n global: [\n '*localhost', '*schibsted.io', '*schibsted.media', '*schibsted.ws', '*schibsted.se', '*smp.no',\n '*plan3dev.se', '*plan3.se',\n '*vg.no', '*vgtv.no', '*vgnett.no',\n '*aftonbladet.se',\n '*aftenposten.no', '*ap.no',\n '*sa.no', '*aftenbladet.no',\n\n '*adresseavisen.no',\n '*polarismedia.no',\n '*adressa.no',\n '*bt.no',\n '*fvn.no',\n\n '*htmlinstant.com',\n '*ht.no',\n '*rbnett.no',\n '*itromso.no',\n '*folkebladet.no',\n '*framtidinord.no',\n '*osloby.no',\n '*av-avis.no',\n '*medianorge.no',\n '*herokuapp.com',\n '*bergenstidende.no',\n '*bonansa.no',\n '*sysla.no',\n '*bygdanytt.no',\n '*vestnytt.no',\n '*strilen.no',\n '*snd.no', '*fedrelandsvennen.no', '*lister24.no', '*l-a.no', '*lindesnesfyr.no',\n\n // Polaris related newspapers\n // addressa.no\n '*adressa.no', '*avisa-st.no', '*banett.no', '*fosna-folket.no', '*hitra-froya.no', '*innherred.no',\n '*mb.no', '*bladet.no', '*opdalingen.no', '*tronderbladet.no',\n // rbnett\n '*rbnett.no', '*andalsnes-avis.no', '*driva.no',\n // smp newspaper\n '*smp.no', '*dolen.no', '*fjordabladet.no', '*fjt.no', '*fjordingen.no', '*fjuken.no', '*heroynytt.no',\n '*morenytt.no', '*sunnmoringen.no', '*vigga.no', '*vikebladet.no',\n // itromso.no\n '*itromso.no', '*framtidinord.no',\n // ht.no\n '*ht.no', '*vol.no',\n // t-a.no\n '*t-a.no', '*namdalsavisa.no',\n // other polaris newspapers\n '*altaposten.no', '*folkebladet.no',\n '*svd.se',\n\n // testing env\n '*mylocal.com'\n ]\n },\n\n preview: {\n global: [\n '*vgnett.no', '*svp.schibsted.io', '*cms.schibsted.media', '*localhost'\n ]\n }\n },\n\n translations: translations\n};\n\nexport default config;\n","\nexport default {\n default: 'OjqkBWp9VpYP8utpWdzBZ+eZIJhcfOW5U9g4/w==',\n //\n '100sport': 'Uq5GO7mRz+oxp7pVh3bZEvDEBzEYRTG4h3sr1Q==',\n ab: 'qK+optxkJTV2KblAIiLdoWze6AAGxX5Qxeb57A==',\n adressa: 'BQs7m1EiK0wlK8xAZQgJwU1a4OskbKgoYRSEfA==',\n altaposten: 'Y0grkUQ6BaCat409fP7mPqr1SbDS+LntWrQIpg==',\n ap: 'ElscszbjUK+A0En7My3UPpJ/4MlOUOn+fiU2/w==',\n bt: 'wgmdmAfgbneZjUBt8ZxqiKTxVCpriTwcC06hzQ==',\n brandstudio: 'uXOJWRxZaxOSRhIisAGWsEbzn3PIhbTlCn99IQ==',\n folkebladet: 'kGoJc75y4Uq1r2kw2n883oYzGk+SrEJ2GEDQUQ==',\n fvn: '88vcnFV8g4crXq1P8jrGz8D7XqMwawGvwFmhJg==',\n harstad: 'C8hK/HIbIL3k9h4dN4xY3lHAPdjLyx7B4WGM/w==',\n itromso: 'QAPvDWM3mHi3lYOZCLqOwHZMstixgFefhc/d1Q==',\n podcast: 'X2K7i+dwWXsIR0BKyX+3C+8s4y9VOWcYgtjeJA==',\n rbnett: 'y7Z4M5Ah6dOyDH7/ZrCQjHZPb3E3xnctwkixbw==',\n riks: 'a5kTQmkeGHV+P2wOaTQvAuXEdivj2lbXoAxTbw==',\n ridenews: '6s5IkHj1LiODLxDOaYr1ze6F7F1Cun92UFuOpA==',\n sa: 'dWpue+L8nJKbDFqh9Ps3o2mxqr92MY2G9tQohg==',\n schibsted: 'Cn+pnRPeR7dlwUgy+QwoSwyu0NXoGUtxD/LVqA==',\n smp: 'eZ34FUhLc6cW3MypHSgtbYwRgbDxKLV/iaABmQ==',\n svd: 'Olwljnb5W0VdUf38yWyv3kjowR9JamQYw4RndA==',\n tronderavisa: '7azVhGsMlCm9EuRPr4EJ8RY6cyVbmAgeS1MkKw==',\n vgtv: 'edF0bFyKcM68omCq24JsMWw/CO/f6cAgS91oiQ==',\n vgtvs: 'D/kRElM9UDSgZxbEqPBESxIKamNBql5PeIabpg=='\n};\n","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","/* jshint ignore:start */\n/* eslint-disable */\n\nvar isLoaded = false;\nvar exportz = {};\n\nexport default function (conf) {\n if (!isLoaded) {\n isLoaded = true;\n\n (function(k) {\n k = k || {}; (function(l) {\n function b() { this.u = 'setup'; }l.g = b; b.prototype = {\n c: function(a) { a = a && typeof a === 'number' && a > 0 ? Math.round(a) : 10; for (var g = '', e = 0; e < a; e++)g += String.fromCharCode((Math.random() < 0.5 ? 65 : 97) + Math.floor(26 * Math.random())); return g; },\n A: function(a) {\n function g(d) {\n var a = '';\n var c;\n var g;\n for (c = 7; c >= 0; c--)g = d >>> 4 * c & 15, a += g.toString(16);return a;\n }function e(d, a) { return d << a | d >>> 32 - a; }\n var c;\n var h;\n var b = Array(80);\n var l = 1732584193;\n var q = 4023233417;\n var p = 2562383102;\n var k = 271733878;\n var t = 3285377520;\n var f;\n var m;\n var n;\n var r;\n var d;\n a = a && typeof a === 'string'\n ? a : '';f = a.length;var u = [];for (c = 0; c < f - 3; c += 4)h = a.charCodeAt(c) << 24 | a.charCodeAt(c + 1) << 16 | a.charCodeAt(c + 2) << 8 | a.charCodeAt(c + 3), u.push(h);switch (f % 4) { case 0: c = 2147483648; break; case 1: c = a.charCodeAt(f - 1) << 24 | 8388608; break; case 2: c = a.charCodeAt(f - 2) << 24 | a.charCodeAt(f - 1) << 16 | 32768; break; case 3: c = a.charCodeAt(f - 3) << 24 | a.charCodeAt(f - 2) << 16 | a.charCodeAt(f - 1) << 8 | 128; }for (u.push(c); u.length % 16 != 14;)u.push(0);u.push(f >>> 29);u.push(f << 3 & 4294967295);for (a = 0; a < u.length; a += 16) {\n for (c = 0; c < 16; c++)b[c] = u[a + c]; for (c = 16; c <= 79; c++)b[c] = e(b[c - 3] ^ b[c - 8] ^ b[c - 14] ^ b[c - 16], 1); h = l; f = q; m = p; n = k; r = t; for (c = 0; c <= 19; c++)d = e(h, 5) + (f & m | ~f & n) + r + b[c] + 1518500249 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 20; c <= 39; c++)d = e(h, 5) + (f ^ m ^ n) + r + b[c] + 1859775393 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 40; c <= 59; c++)d = e(h, 5) + (f & m | f & n | m & n) + r + b[c] + 2400959708 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 60; c <= 79; c++)d = e(h, 5) + (f ^ m ^ n) + r + b[c] + 3395469782 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; l = l + h & 4294967295; q = q + f & 4294967295; p = p + m & 4294967295; k = k + n\n & 4294967295; t = t + r & 4294967295;\n }return (g(l) + g(q) + g(p) + g(k) + g(t)).toLowerCase();\n },\n j: function(a) {\n for (var g = '', e, c, b, l, k, q, p = 0; p < a.length;) {\n e = a.charCodeAt(p++), c = a.charCodeAt(p++), b = a.charCodeAt(p++), l = e >> 2, e = (e & 3) << 4 | c >> 4, k = (c & 15) << 2 | b >> 6, q = b & 63, isNaN(c) ? k = q = 64 : isNaN(b) && (q = 64), g = g + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(l) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(e) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(k)\n + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(q);\n } return g;\n },\n fireEvent: function(a, g, b) {\n var c = this.u;\n var h = document.createEvent('CustomEvent');\n b.state = c;h.initCustomEvent(g, !1, !1, b);a.dispatchEvent(h);\n },\n l: function(a, g, b) { g || (g = 'hdEvent'); b || (b = window); this.fireEvent(b, g, a); },\n track: function(a, b, e) {\n if (e) {\n if (!homad || !homad.M)window.setTimeout(function() { this.track(a, b, e); }.bind(this), 500); else if (homad.isEnabled) {\n var c = `${homad.T()}?homad_track_key=${encodeURIComponent(a)}&homad_track_value=${\n encodeURIComponent(b)}`; homad.o(c, !0); c = homad.o(c, !0); c.data.homad_url_prefix_alias = ''; c.data.homad_track_key = encodeURIComponent(a); c.data.homad_track_value = encodeURIComponent(b); homad.P(c, function() {});\n }\n }\n }\n };\n }(k)); var v = k.g || v; new v(); var w = new v(); (function(l) {\n function b(a) { this.data = a || {}; }l.f = b; b.S = function(a, b) {\n var e = {};\n var c;\n for (c in b)e[c] = b[c];for (c in a)e[c] = a[c];return e;\n }; b.w = { code: '1000', type: 'penalty', message: '' }; b.V = { code: '1001', type: 'mediaerror', message: '' }; b.C = { code: '1002', type: 'vpaid', message: '' };\n b.O = { code: '1003', type: 'emptyVast', message: '' }; b.F = { code: '1004', type: 'malformattedXML' }; b.J = { code: '1005', type: 'adStart' }; b.G = { code: '1006', type: 'adFirstQuartile' }; b.I = { code: '1007', type: 'adMidPoint' }; b.K = { code: '1008', type: 'adThirdQuartile' }; b.i = { code: '1009', type: 'adComplete' }; b.H = { code: '1010', type: 'adImpressionsCalled' }; b.B = { code: '1011', type: 'vastLoadingFailed' }; b.U = { code: '1012', type: 'noCreative' }; b.R = { code: '1013', type: 'emptyVastFromHomadServerEvent', message: '' }; b.D = {\n code: '1014',\n type: 'wrapperLimitReached',\n message: ''\n }; b.L = { code: '1015', type: 'clickthrough', message: '' }; b.N = { code: '1016', type: 'continueContent', message: '' }; b.X = { code: '1017', type: 'variableDeletedEvent', message: '' }; b.W = { code: '1018', type: 'noVariableSettingEvent', message: '' }; b.prototype = {};\n }(k)); var z = k.f || z; (function(l) {\n function b() {}l.h = b; b.prototype = {\n s: function(a) {\n var b = 0;\n var e;\n var c;\n var h;\n if (a.length == 0) return b;e = 0;for (h = a.length; e < h; e++)c = a.charCodeAt(e), b = (b << 5) - b + c, b |= 0;return Math.abs(b);\n },\n m: function() {\n return Math.round(Date.now() / 1E3 / 3600 / 24) + navigator.appCodeName\n + navigator.appName + navigator.appVersion + navigator.userAgent + navigator.platform + (navigator.language || navigator.i || 'x');\n },\n a: function(a) { a = parseInt(a); if (a >= 65 && a <= 90 || a >= 97 && a <= 122) return String.fromCharCode(a); if (a <= 0) return ''; if (a < 65) return this.a(a + 65); if (a > 90) return this.a(Math.round(a / 2)); },\n reverse: function(a) { for (var b = '', e = a.length - 1, b = ''; e >= 0; b += a[e--]);return b; },\n b: function() {\n for (var a = this.s(`${this.m()}`), a = (`${a}${this.reverse(`${a}`)}`).match(/.{1,2}/g), b = '', e = 0; e < a.length; e++)b += this.a(a[e]); b.length == 0\n && (b = 'zork'); return b;\n },\n v: function() { return `${this.b()}2`; }\n };\n }(k)); var y = k.h || y; (function() {\n function l() {\n if (p)conf.startPlayer && eval(conf.startPlayer), document.fp_error = !0, document.hd_ready = !0; else {\n var d = document.createElement('script');d.type = 'text/javascript';d.src = `https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=${w.c(10)}`;d.onerror = e;document.head.firstChild ? document.head.insertBefore(d, document.head.firstChild) : document.head.appendChild(d);\n var d = new y();\n var a = document.createEvent('CustomEvent');\n conf.version = '20170704_0930_802';a.initCustomEvent(d.b(), !1, !1, conf);window.setInterval(function() { window.dispatchEvent(a); }, 500);b();\n }\n }function b() { var d = new y(); r = window.setTimeout(function() { a(); }, 15E3); window.addEventListener(d.v(), function() { window.clearTimeout(r); }); }function a() {\n for (var d = document.getElementsByTagName('video'), a = 0; a < d.length; a++) { try { d[a] && d[a].pause && typeof d[a].pause === 'function' && d[a].pause(); } catch (b) {}d[a].parentNode.removeChild(d[a]); }d = document.getElementsByTagName('object'); for (a = 0; a < d.length; a++)d[a].parentNode.removeChild(d[a]);\n d = document.getElementsByClassName('video-wrapper'); for (a = 0; a < d.length; a++)d[a] && d[a].parentNode && d[a].parentNode.removeChild(d[a]); d = document.getElementsByClassName('videoplayer'); for (a = 0; a < d.length; a++)d[a] && d[a].parentNode && d[a].parentNode.removeChild(d[a]); if (window.self != window.top) for (d = window.document; d.hasChildNodes();)d.removeChild(d.lastChild);\n }function g() {\n if (t) {\n var d = `fail-init-100.gif${v()}`; k(t, function() {}, function() {}, {\n homad_url_prefix_alias: f,\n homad_url_suffix_base64: w.j(d),\n homad_url_suffix: d,\n homad_hash_guessed: 'true'\n });\n }w.l(z.w); x && typeof x === 'function' ? x() : (a(), window.setInterval(a, 500), window.setTimeout(a, 1500));\n }function e() { var a = document.createElement('script'); a.type = 'text/javascript'; a.src = `https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/hd-main.js?cache=${w.c(10)}`; a.onerror = g; document.head.firstChild ? document.head.insertBefore(a, document.head.firstChild) : document.head.appendChild(a); }function c(a) { p || (p = !q(a.enabled)); l(); }function h(a) {\n a && a.server && a.server[0]\n && (t = (`${a.server[1]}`).replace('[hash]', w.A(`${(new Date()).getTime()}`)), f = 'homadvastimpressions'); p ? l() : (p = !q(a.enabled)) ? l() : k(a.config, c, l);\n }function k(a, b, c, e) {\n var f = new XMLHttpRequest(); f.onreadystatechange = function() { if (b && f.readyState == 4 && f.status == 200) { var a = {}; try { a = JSON.parse(f.responseText); } catch (d) { a.enabled = 'false'; }b(a); }c && f.readyState == 4 && f.status != 200 && c(f); }; try {\n if (e) {\n f.open('POST', a, !0); a = e; e = ''; for (var g in a)e += `&${g}=${encodeURIComponent(a[g])}`; e = e.substr(1); f.setRequestHeader('Content-type',\n 'application/x-www-form-urlencoded'); f.send(e);\n } else f.open('GET', a, !0), f.send();\n } catch (h) { c && c(f); }\n }function v() { var a = '?c=unknown'; window && window.location && window.location.hostname && (a = `?c=${window.location.hostname}`); return a; }function q(a) { return a == 'True' || a == 'true' || a == 1 || a == '1' || a == 1; }\n var p = !1;\n var x = conf.onFailure;\n var t = '';\n var f = '';\n var m = !1;\n var n = 0;\n var r = !1;\n k(conf.globalConfig, function(a) { p ? l() : p = !q(a.enabled); });typeof conf.clientConfig === 'string' ? k(conf.clientConfig, h, function() {\n window.setTimeout(function() {\n k(conf.clientConfig,\n h, function() { window.setTimeout(g, 1500); });\n }, 500);\n }) : m = window.setInterval(function() { var a = ''; try { a = conf.clientConfig(), n++, a ? (h(a), window.clearInterval(m)) : n >= 50 && (window.clearInterval(m), g()); } catch (b) {} }, 100);\n }());\n }).call(exportz, exportz);\n }\n}\n","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"
\\n
\\\">
\\n\\n
\\n \\n \\n \\n
\\n\\n \\n
\"","module.exports = \"
\\n
\\n
\\n \\n \\n
\\n
\\n \\n
\\n
\\n
\\n\"","module.exports = \"\\n\"","module.exports = \"\\n <%= closeIcon %>\\n\\n\\n <%= next.getTitle() %>\\n ');\\\">\\n s\\\">\\n Next <%= nextIcon %>\\n );\\\">\\n \\n\\n\"","module.exports = \"\\n\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","/* jshint ignore:start */\n\n var idCounter = 0;\n\n // we do not include underscore as it is our hard dependency\n var _ = jwplayer._,\n property = function (key) {\n return function (obj) {\n return obj == null ? void 0 : obj[key];\n };\n },\n MAX_ARRAY_INDEX = Math.pow(2, 53) - 1,\n getLength = property('length'),\n isArrayLike = function (collection) {\n var length = getLength(collection);\n return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n };\n\n _.isEmpty = function (obj) {\n if (obj == null) return true;\n if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;\n return _.keys(obj).length === 0;\n };\n\n _.uniqueId = function(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n };\n\n export default _;\n\n/* jshint ignore:end */\n","/* jshint ignore:start */\nimport _ from './underscore';\n\n // Backbone.Events\n // ---------------\n\n // A module that can be mixed in to *any object* in order to provide it with\n // a custom event channel. You may bind a callback to an event with `on` or\n // remove with `off`; `trigger`-ing an event fires all callbacks in\n // succession.\n //\n // var object = {};\n // _.extend(object, Backbone.Events);\n // object.on('expand', function(){ alert('expanded'); });\n // object.trigger('expand');\n //\n var Events = {};\n\n // Regular expression used to split event strings.\n var eventSplitter = /\\s+/;\n\n // Iterates over the standard `event, callback` (as well as the fancy multiple\n // space-separated events `\"change blur\", callback` and jQuery-style event\n // maps `{event: callback}`).\n var eventsApi = function(iteratee, events, name, callback, opts) {\n var i = 0, names;\n if (name && typeof name === 'object') {\n // Handle event maps.\n if (callback !== void 0 && 'context' in opts && opts.context === void 0) opts.context = callback;\n for (names = _.keys(name); i < names.length ; i++) {\n events = eventsApi(iteratee, events, names[i], name[names[i]], opts);\n }\n } else if (name && eventSplitter.test(name)) {\n // Handle space separated event names by delegating them individually.\n for (names = name.split(eventSplitter); i < names.length; i++) {\n events = iteratee(events, names[i], callback, opts);\n }\n } else {\n // Finally, standard events.\n events = iteratee(events, name, callback, opts);\n }\n return events;\n };\n\n // Bind an event to a `callback` function. Passing `\"all\"` will bind\n // the callback to all events fired.\n Events.on = function(name, callback, context) {\n return internalOn(this, name, callback, context);\n };\n\n // Guard the `listening` argument from the public API.\n var internalOn = function(obj, name, callback, context, listening) {\n obj._events = eventsApi(onApi, obj._events || {}, name, callback, {\n context: context,\n ctx: obj,\n listening: listening\n });\n\n if (listening) {\n var listeners = obj._listeners || (obj._listeners = {});\n listeners[listening.id] = listening;\n }\n\n return obj;\n };\n\n // Inversion-of-control versions of `on`. Tell *this* object to listen to\n // an event in another object... keeping track of what it's listening to\n // for easier unbinding later.\n Events.listenTo = function(obj, name, callback) {\n if (!obj) return this;\n var id = obj._listenId || (obj._listenId = _.uniqueId('l'));\n var listeningTo = this._listeningTo || (this._listeningTo = {});\n var listening = listeningTo[id];\n\n // This object is not listening to any other events on `obj` yet.\n // Setup the necessary references to track the listening callbacks.\n if (!listening) {\n var thisId = this._listenId || (this._listenId = _.uniqueId('l'));\n listening = listeningTo[id] = {obj: obj, objId: id, id: thisId, listeningTo: listeningTo, count: 0};\n }\n\n // Bind callbacks on obj, and keep track of them on listening.\n internalOn(obj, name, callback, this, listening);\n return this;\n };\n\n // The reducing API that adds a callback to the `events` object.\n var onApi = function(events, name, callback, options) {\n if (callback) {\n var handlers = events[name] || (events[name] = []);\n var context = options.context, ctx = options.ctx, listening = options.listening;\n if (listening) listening.count++;\n\n handlers.push({ callback: callback, context: context, ctx: context || ctx, listening: listening });\n }\n return events;\n };\n\n // Remove one or many callbacks. If `context` is null, removes all\n // callbacks with that function. If `callback` is null, removes all\n // callbacks for the event. If `name` is null, removes all bound\n // callbacks for all events.\n Events.off = function(name, callback, context) {\n if (!this._events) return this;\n this._events = eventsApi(offApi, this._events, name, callback, {\n context: context,\n listeners: this._listeners\n });\n return this;\n };\n\n // Tell this object to stop listening to either specific events ... or\n // to every object it's currently listening to.\n Events.stopListening = function(obj, name, callback) {\n var listeningTo = this._listeningTo;\n if (!listeningTo) return this;\n\n var ids = obj ? [obj._listenId] : _.keys(listeningTo);\n\n for (var i = 0; i < ids.length; i++) {\n var listening = listeningTo[ids[i]];\n\n // If listening doesn't exist, this object is not currently\n // listening to obj. Break out early.\n if (!listening) break;\n\n listening.obj.off(name, callback, this);\n }\n if (_.isEmpty(listeningTo)) this._listeningTo = void 0;\n\n return this;\n };\n\n // The reducing API that removes a callback from the `events` object.\n var offApi = function(events, name, callback, options) {\n if (!events) return;\n\n var i = 0, listening;\n var context = options.context, listeners = options.listeners;\n\n // Delete all events listeners and \"drop\" events.\n if (!name && !callback && !context) {\n var ids = _.keys(listeners);\n for (; i < ids.length; i++) {\n listening = listeners[ids[i]];\n delete listeners[listening.id];\n delete listening.listeningTo[listening.objId];\n }\n return;\n }\n\n var names = name ? [name] : _.keys(events);\n for (; i < names.length; i++) {\n name = names[i];\n var handlers = events[name];\n\n // Bail out if there are no events stored.\n if (!handlers) break;\n\n // Replace events if there are any remaining. Otherwise, clean up.\n var remaining = [];\n for (var j = 0; j < handlers.length; j++) {\n var handler = handlers[j];\n if (\n callback && callback !== handler.callback &&\n callback !== handler.callback._callback ||\n context && context !== handler.context\n ) {\n remaining.push(handler);\n } else {\n listening = handler.listening;\n if (listening && --listening.count === 0) {\n delete listeners[listening.id];\n delete listening.listeningTo[listening.objId];\n }\n }\n }\n\n // Update tail event if the list has any events. Otherwise, clean up.\n if (remaining.length) {\n events[name] = remaining;\n } else {\n delete events[name];\n }\n }\n if (_.size(events)) return events;\n };\n\n // Bind an event to only be triggered a single time. After the first time\n // the callback is invoked, its listener will be removed. If multiple events\n // are passed in using the space-separated syntax, the handler will fire\n // once for each event, not once for a combination of all events.\n Events.once = function(name, callback, context) {\n // Map the event into a `{event: once}` object.\n var events = eventsApi(onceMap, {}, name, callback, _.bind(this.off, this));\n return this.on(events, void 0, context);\n };\n\n // Inversion-of-control versions of `once`.\n Events.listenToOnce = function(obj, name, callback) {\n // Map the event into a `{event: once}` object.\n var events = eventsApi(onceMap, {}, name, callback, _.bind(this.stopListening, this, obj));\n return this.listenTo(obj, events);\n };\n\n // Reduces the event callbacks into a map of `{event: onceWrapper}`.\n // `offer` unbinds the `onceWrapper` after it has been called.\n var onceMap = function(map, name, callback, offer) {\n if (callback) {\n var once = map[name] = _.once(function() {\n offer(name, once);\n callback.apply(this, arguments);\n });\n once._callback = callback;\n }\n return map;\n };\n\n // Trigger one or many events, firing all bound callbacks. Callbacks are\n // passed the same arguments as `trigger` is, apart from the event name\n // (unless you're listening on `\"all\"`, which will cause your callback to\n // receive the true name of the event as the first argument).\n Events.trigger = function(name) {\n if (!this._events) return this;\n\n var length = Math.max(0, arguments.length - 1);\n var args = Array(length);\n for (var i = 0; i < length; i++) args[i] = arguments[i + 1];\n\n eventsApi(triggerApi, this._events, name, void 0, args);\n return this;\n };\n\n // Handles triggering the appropriate event callbacks.\n var triggerApi = function(objEvents, name, cb, args) {\n if (objEvents) {\n var events = objEvents[name];\n var allEvents = objEvents.all;\n if (events && allEvents) allEvents = allEvents.slice();\n if (events) triggerEvents(events, args);\n if (allEvents) triggerEvents(allEvents, [name].concat(args));\n }\n return objEvents;\n };\n\n // A difficult-to-believe, but optimized internal dispatch function for\n // triggering events. Tries to keep the usual cases speedy (most internal\n // Backbone events have 3 arguments).\n var triggerEvents = function(events, args) {\n var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];\n switch (args.length) {\n case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;\n case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;\n case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;\n case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;\n default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;\n }\n };\n\n // Aliases for backwards compatibility.\n Events.bind = Events.on;\n Events.unbind = Events.off;\n\n export default Events;\n\n","\n \n var userAgent = navigator.userAgent;\n\n function userAgentMatch(regex) {\n return userAgent.match(regex) !== null;\n }\n\n function lazyUserAgentMatch(regex) {\n return function () {\n return userAgentMatch(regex);\n };\n }\n\n var isFF = lazyUserAgentMatch(/gecko\\//i);\n var isIETrident = lazyUserAgentMatch(/trident\\/.+rv:\\s*11/i);\n var isIPad = lazyUserAgentMatch(/iPad/i);\n var isIPhone = lazyUserAgentMatch(/iPhone/i);\n// Check for Facebook App Version to see if it's Facebook\n\n function isEdge() {\n return userAgentMatch(/\\sEdge\\/\\d+/i);\n }\n\n function isMSIE() {\n return userAgentMatch(/msie/i);\n }\n\n function isChrome() {\n return userAgentMatch(/\\s(?:Chrome|CriOS)\\//i) && !isEdge();\n }\n\n function isIE() {\n return isEdge() || isIETrident() || isMSIE();\n }\n\n function isSafari() {\n return userAgentMatch(/safari/i) && !userAgentMatch(/(?:Chrome|CriOS|chromium|android)/i);\n }\n\n /** Matches iOS devices **/\n function isIOS(version) {\n var isAppleIOS = userAgentMatch(/iP(hone|ad|od)/i),\n result = null;\n\n // check if version matches\n if(isAppleIOS && version) {\n result = /OS ([._\\d]+)/.exec(userAgent);\n\n // get version and parse it\n if(result && parseInt(result[1], 10) === version) {\n return true;\n } else {\n // didn't match version\n return false;\n }\n }\n\n return isAppleIOS;\n }\n\n function isAndroid() {\n return userAgentMatch(/Android/i);\n }\n\n /** Matches Android devices **/\n function isAndroidNative() {\n // Android Browser appears to include a user-agent string for Chrome/18\n if (userAgentMatch(/chrome\\/[123456789]/i) && !userAgentMatch(/chrome\\/18/i) && !isFF()) {\n return false;\n }\n return isAndroid();\n }\n\n /**\n * If the browser has flash capabilities, return the flash version\n */\n function flashVersion() {\n if (isAndroid()) {\n return 0;\n }\n\n var plugins = navigator.plugins;\n var flash;\n\n if (plugins) {\n flash = plugins['Shockwave Flash'];\n if (flash && flash.description) {\n return parseFloat(flash.description.replace(/\\D+(\\d+\\.?\\d*).*/, '$1'));\n }\n }\n\n if (typeof window.ActiveXObject !== 'undefined') {\n try {\n flash = new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash');\n if (flash) {\n return parseFloat(flash.GetVariable('$version').split(' ')[1].replace(/\\s*,\\s*/, '.'));\n }\n } catch (e) {\n return 0;\n }\n\n return flash;\n }\n return 0;\n }\n\n export default {\n isIOS: isIOS,\n isIPhone: isIPhone,\n isIPad: isIPad,\n isSafari: isSafari,\n\n isAndroid: isAndroid,\n isAndroidNative: isAndroidNative,\n isChrome: isChrome,\n\n isFirefox: isFF,\n\n isEdge: isEdge,\n isIE: isIE,\n\n isDesktop: function () {\n return !this.isMobile() && !this.isTablet();\n },\n\n isSamsungInternet: function () {\n return userAgent.indexOf('SamsungBrowser') !== -1;\n },\n\n isTablet: function () {\n var isTablet = isIPad() || false;\n\n // android tables are when\n if (this.isAndroid() && (userAgent.indexOf('Mobile') === -1)) {\n isTablet = true;\n }\n\n return isTablet;\n },\n\n isMobile: function () {\n return userAgent.match(/(iPhone|iPod|Android(?=.*Mobile).*|HTC|Fennec|IEMobile|BlackBerry|SymbianOS(?=.*AppleWebKit).*|Opera Mobi|Symbian|SonyEricsson|Nokia|SAMSUNG|LG)/i) === null ? false : true;\n },\n\n isWindowsPhone: function () {\n return userAgent.match(/Windows Phone/i) !== null;\n },\n\n getChromeVersion: function () {\n var raw = userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n\n return raw ? parseInt(raw[2], 10) : false;\n },\n\n getPixelRatio: function () {\n var devicePixelRatio = window.devicePixelRatio || 1;\n\n if (devicePixelRatio > 1) {\n devicePixelRatio = 2;\n }\n\n return devicePixelRatio;\n },\n\n getFlashVersion: flashVersion,\n\n\n /**\n * Tracking is divided by device type\n *\n * @returns {*}\n */\n getDeviceType: function () {\n if (this.isTablet()) {\n return 'tablet';\n }\n\n if (this.isMobile()) {\n return 'phone';\n }\n\n return 'desktop';\n },\n\n canAutoplay: function () {\n var canAutoplay = 'always';\n\n // default is muted for never ios systems\n if (this.isIOS()) {\n canAutoplay = 'muted';\n }\n\n // iOS 8 and 9 can not autoplay any kind of stream\n // also Android Devices are lacking this\n if (this.isIOS(9) || this.isIOS(8) || (this.isAndroid())) {\n canAutoplay = 'never';\n }\n\n // chrome android can autoplay muted\n if (this.isAndroid() && !this.isSamsungInternet() && this.getChromeVersion() >= 53) {\n canAutoplay = 'muted';\n }\n\n return canAutoplay;\n }\n };\n\n","/* jshint ignore:start */\n\n function isMergeableObject(val) {\n var nonNullObject = val && typeof val === 'object'\n\n return nonNullObject\n && Object.prototype.toString.call(val) !== '[object RegExp]'\n && Object.prototype.toString.call(val) !== '[object Date]'\n }\n\n function emptyTarget(val) {\n return Array.isArray(val) ? [] : {}\n }\n\n function cloneIfNecessary(value, optionsArgument) {\n var clone = optionsArgument && optionsArgument.clone === true\n return (clone && isMergeableObject(value)) ? deepmerge(emptyTarget(value), value, optionsArgument) : value\n }\n\n function defaultArrayMerge(target, source, optionsArgument) {\n var destination = target.slice()\n source.forEach(function(e, i) {\n if (typeof destination[i] === 'undefined') {\n destination[i] = cloneIfNecessary(e, optionsArgument)\n } else if (isMergeableObject(e)) {\n destination[i] = deepmerge(target[i], e, optionsArgument)\n } else if (target.indexOf(e) === -1) {\n destination.push(cloneIfNecessary(e, optionsArgument))\n }\n })\n return destination\n }\n\n function mergeObject(target, source, optionsArgument) {\n var destination = {}\n if (isMergeableObject(target)) {\n Object.keys(target).forEach(function (key) {\n destination[key] = cloneIfNecessary(target[key], optionsArgument)\n })\n }\n Object.keys(source).forEach(function (key) {\n if (!isMergeableObject(source[key]) || !target[key]) {\n destination[key] = cloneIfNecessary(source[key], optionsArgument)\n } else {\n destination[key] = deepmerge(target[key], source[key], optionsArgument)\n }\n })\n return destination\n }\n\n function deepmerge(target, source, optionsArgument) {\n var array = Array.isArray(source);\n var options = optionsArgument || { arrayMerge: defaultArrayMerge }\n var arrayMerge = options.arrayMerge || defaultArrayMerge\n\n if (array) {\n return Array.isArray(target) ? arrayMerge(target, source, optionsArgument) : cloneIfNecessary(source, optionsArgument)\n } else {\n return mergeObject(target, source, optionsArgument)\n }\n }\n\n deepmerge.all = function deepmergeAll(array, optionsArgument) {\n if (!Array.isArray(array) || array.length < 2) {\n throw new Error('first argument should be an array with at least two elements')\n }\n\n // we are sure there are at least 2 values, so it is safe to have no initial value\n return array.reduce(function(prev, next) {\n return deepmerge(prev, next, optionsArgument)\n })\n }\n\n window.deepmerge = deepmerge;\n\n export default deepmerge;\n\n","/* global jwplayer */\nimport Events from './backbone.events';\nimport device from './device';\nimport merge from './merge';\n var jwUtils = jwplayer.utils,\n jwUnderscore = jwplayer._,\n // jwplayer is hard dependecy here\n utils = {\n Events: Events,\n\n // methods reused from jwplayer core\n extend: jwUtils.extend,\n // merge with deep copy, similar to jQuery extend\n merge: merge,\n\n ajax: jwUtils.ajax,\n\n each: jwUnderscore.each,\n isUndefined: jwUnderscore.isUndefined,\n isNumber: jwUnderscore.isNumber,\n isString: jwUnderscore.isString,\n isArray: jwUnderscore.isArray,\n omit: jwUnderscore.omit,\n memoize: jwUnderscore.memoize,\n\n createNode: jwUtils.createElement,\n addStyleSheet: jwUtils.addStyleSheet,\n addClass: jwUtils.addClass,\n removeClass: jwUtils.removeClass,\n throttle: jwUnderscore.throttle,\n\n /* jshint ignore:start */\n /**\n * Template system borrowed from http://ejohn.org/blog/javascript-micro-templating/\n */\n template: (function () {\n var cache = {};\n\n return function tmpl(str, data) {\n // Figure out if we're getting a template, or if we need to\n // load the template - and be sure to cache the result.\n var fn = !/\\W/.test(str) ?\n cache[str] = cache[str] ||\n tmpl(document.getElementById(str).innerHTML) :\n\n // Generate a reusable function that will serve as a template\n // generator (and which will be cached).\n new Function(\"obj\",\n \"var p=[],print=function(){p.push.apply(p,arguments);};\" +\n\n // Introduce the data as local variables using with(){}\n \"with(obj){p.push('\" +\n\n // Convert the template into pure JavaScript\n str\n .replace(/[\\r\\t\\n]/g, \" \")\n .split(\"<%\").join(\"\\t\")\n .replace(/((^|%>)[^\\t]*)'/g, \"$1\\r\")\n .replace(/\\t=(.*?)%>/g, \"',$1,'\")\n .split(\"\\t\").join(\"');\")\n .split(\"%>\").join(\"p.push('\")\n .split(\"\\r\").join(\"\\\\'\")\n + \"');}return p.join('');\");\n\n // Provide some basic currying to the user\n return data ? fn(data) : fn({});\n };\n })(),\n /* jshint ignore:end */\n\n device: device,\n\n time: {\n shareTimeToSeconds: function (time) {\n var hours, minutes, seconds, length;\n\n time = jwUnderscore.compact(time.split(/[msh]/));\n length = time.length; // last is empty\n\n seconds = parseInt(time[length - 1], 10);\n minutes = time[length - 2];\n hours = time[length - 3];\n\n return seconds + (minutes ? parseInt(minutes, 10) * 60 : 0) + (hours ? parseInt(hours, 10) * 3600 : 0);\n }\n },\n\n\n hasFlash: function () {\n return device.getFlashVersion() > 0;\n },\n\n number: {\n zeroPad: function (number) {\n number = parseInt(number, 10);\n return number < 10 ? '0' + number : number.toString();\n }\n },\n\n escape: function (str) {\n var escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n };\n\n return str.replace(/[&<>\"'`]/g, function replaceTag(tag) {\n return escapeMap[tag] || tag;\n });\n },\n\n string: {\n // timestamp [s]\n getTimeFormatted: function (timestamp) {\n var hours = Math.floor(timestamp / 3600),\n minutes = Math.floor((timestamp % 3600) / 60),\n seconds = timestamp % 60;\n\n return (hours > 0 ? hours + ':' : '') + utils.number.zeroPad(minutes) + ':' + utils.number.zeroPad(seconds);\n }\n },\n\n inherit: function (o) {\n function F() {\n } // Dummy constructor\n\n F.prototype = o;\n return new F();\n },\n\n model: {\n // Helper function to correctly set up the prototype chain, for subclasses.\n // Similar to `goog.inherits`, but uses a hash of prototype properties and\n // class properties to be extended.\n extend: function (protoProps, staticProps) {\n var parent = this;\n var child = function () {\n return parent.apply(this, arguments);\n };\n\n // Add static properties to the constructor function, if supplied.\n utils.extend(child, parent, staticProps);\n\n // Set the prototype chain to inherit from `parent`, without calling\n // `parent`'s constructor function.\n var Surrogate = function () {\n this.constructor = child;\n };\n Surrogate.prototype = parent.prototype;\n child.prototype = new Surrogate();\n\n // Add prototype properties (instance properties) to the subclass,\n // if supplied.\n if (protoProps) {\n utils.extend(child.prototype, protoProps);\n }\n\n // Set a convenience property in case the parent's prototype is needed\n // later.\n child.__super__ = parent.prototype;\n\n return child;\n }\n },\n\n scriptLoader: jwUtils.scriptloader,\n\n /**\n * Check snap points support\n * @returns {boolean}\n */\n getScrollSnapPrefix: function () {\n var scrollSnapSupport = false;\n\n if('webkitScrollSnapType' in document.documentElement.style) {\n scrollSnapSupport = '-webkit-';\n } else if('msScrollSnapType' in document.documentElement.style) {\n scrollSnapSupport = '-ms-';\n } else if('scrollSnapType' in document.documentElement.style) {\n scrollSnapSupport = '';\n }\n\n return scrollSnapSupport;\n },\n\n loadScript: function (path) {\n return new Promise(function (resolve, reject) {\n var script = document.createElement(\"script\"),\n done = false;\n\n script.type = \"text/javascript\";\n script.src = path;\n script.async = true;\n script.onreadystatechange = script.onload = function() {\n if ( !done && (!this.readyState ||\n this.readyState === \"loaded\" || this.readyState === \"complete\") ) {\n done = true;\n resolve();\n\n // Handle memory leak in IE\n script.onload = script.onreadystatechange = null;\n }\n };\n script.onerror = reject;\n\n document.body.appendChild(script);\n });\n },\n\n jsonToUrl: function (obj) {\n return Object.keys(obj).map(function(key) {\n return encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]);\n }).join('&');\n\n }\n };\n\n /**\n * Polyfill for String.startsWith\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\n */\n (function() {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(searchString, position) {\n position = position || 0;\n return this.indexOf(searchString, position) === position;\n };\n }\n })();\n\n export default utils;\n\n","/* globals console */\n\n var log, isEnabled;\n\n log = function() {\n var args = Array.prototype.slice.call(arguments);\n\n args[0] = args[0] + ': %c\"' + args[1] + '\"';\n args[1] = 'color: #ca2117;';\n\n console.log.apply(console, args);\n };\n\n isEnabled = function(block) {\n // check global first\n if(window['logSvpPlayer' + block] === true) {\n return true;\n }\n\n // fix Safari errors when cookies are disabled\n try {\n if(!window.localStorage) {\n return false;\n }\n\n return window.localStorage.getItem('logSvpPlayer' + block);\n } catch (error) {\n return false;\n }\n };\n\n export default function(block) {\n if(isEnabled(block)) {\n return {\n log: function() {\n var args = Array.prototype.slice.call(arguments);\n\n if(typeof args[0] === 'function') {\n args[0](log.bind(this, block));\n } else {\n args.unshift(block);\n log.apply(this, args);\n }\n }\n };\n }\n\n return {\n log: function() {}\n };\n };\n\n","import utils from './utils';\n /**\n * Server time helper required for syncing browser time with stream vendors servers (SMP Stream)\n * @type {{_time: null, _responseTime: null, fetch: Function, getTime: Function}}\n */\n var ServerTime = {\n _time: null,\n _responseTime: null,\n\n fetch: function(url) {\n var resolveRequest = function (time) {\n this._time = time;\n this._responseTime = new Date().getTime();\n }.bind(this);\n\n // TODO server url?\n utils.ajax(url, function(result) {\n // set current microtime if server will return value different than int\n if(isNaN(parseInt(result, 10))) {\n result = (new Date().getTime());\n } else {\n // adjust to miliseconds\n result = result * 1000;\n }\n resolveRequest(result);\n }.bind(this), function() {\n resolveRequest(new Date().getTime());\n }.bind(this), true);\n },\n\n getTime: function() {\n return this._time + (new Date().getTime() - this._responseTime);\n }\n };\n\n export default ServerTime;\n\n","import _ from './underscore';\nimport Events from './backbone.events';\n var SimpleModel = _.extend({\n 'get': function (attr) {\n this.attributes = this.attributes || {};\n return this.attributes[attr];\n },\n 'set': function (attr, val) {\n this.attributes = this.attributes || {};\n\n if (this.attributes[attr] === val) {\n return;\n }\n var oldVal = this.attributes[attr];\n this.attributes[attr] = val;\n this.trigger('change:' + attr, this, val, oldVal);\n },\n 'clone': function () {\n return _.clone(this.attributes);\n }\n }, Events);\n\n export default SimpleModel;\n\n","/* eslint-disable no-param-reassign */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\n\nconst Category = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nCategory.prototype = {\n initialize: function (data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n parse: function(data) {\n if (data.additional) {\n utils.each(data.additional, (value, key) => {\n if (typeof data[key] === 'undefined') {\n data[key] = value;\n }\n });\n\n data.images = utils.extend({}, data.images || {}, {\n background: data.background,\n main: data.image,\n logo: data.logo,\n playerLogo: data.playerLogoImage\n });\n\n data = utils.omit(data, ['additional', 'background', 'image', 'logo', 'playerLogoImage']);\n }\n\n return data;\n },\n\n hasEmbedPlayNext: function() {\n return this.get('autoPlayNextEmbed');\n },\n\n isSeries: function() {\n return this.get('isSeries') === true;\n },\n\n getLastAsset: function() {\n return this.get('lastAsset') || {}; // cant be object because of circular dependency\n }\n};\n\nutils.extend(Category.prototype, Model);\n\nexport default Category;\n","/* eslint-disable no-param-reassign */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\nimport config from 'player/config';\nimport Category from './category';\n\nfunction handleErrors(response) {\n if (!response.ok) {\n return Promise.reject(response);\n }\n return response;\n}\n\nconst Asset = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nAsset.prototype = {\n initialize: function (data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n url: function() {\n // eslint-disable-next-line max-len\n return config.api.getUrl(this.getVendor(), `/assets/${this.get('id')}?additional=settings|chapters|cuePoints|externalId|barrels|externalCategoryId|nextAsset|sourceFiles|subtitles|metadata|access|tags`);\n },\n\n parse: function(data) {\n data = data || {};\n\n function unifyTimestamp(time) {\n if (!time) {\n return null;\n }\n\n if (time.toString().length === 10) {\n return time * 1000;\n }\n\n return time;\n }\n\n // rewrite additional fields\n if (data.additional) {\n utils.each(data.additional, (value, key) => {\n // featured chapters are fetched on the lists\n // merge them\n if (key === 'featuredChapters') {\n key = 'chapters';\n }\n\n if (key === 'subtitles') {\n key = 'captions';\n }\n\n if (typeof data[key] === 'undefined') {\n data[key] = value;\n }\n });\n\n if (data.additional.settings) {\n if (data.additional.settings.startIndexPoint) {\n data.startIndexPoint = data.additional.settings.startIndexPoint;\n }\n\n if (!utils.isUndefined(data.additional.settings.ageLimit)) {\n data.ageLimit = data.additional.settings.ageLimit;\n }\n }\n\n if (data.additional.sourceFiles) {\n data.sourceFiles = data.additional.sourceFiles;\n }\n }\n\n if (data.series) {\n data.season = parseInt(data.series.seasonNumber, 10);\n data.episode = parseInt(data.series.episodeNumber, 10);\n\n data = utils.omit(data, 'series');\n }\n\n // multiply timestamps by 1000 to use ms instead of s\n if (data.flightTimes) {\n data.flightTimes = {\n start: (data.flightTimes.start ? unifyTimestamp(data.flightTimes.start) : null),\n end: (data.flightTimes.end ? unifyTimestamp(data.flightTimes.end) : null)\n };\n }\n\n data.created = (data.created ? unifyTimestamp(data.created) : null);\n data.published = (data.published ? unifyTimestamp(data.published) : null);\n data.updated = (data.updated ? unifyTimestamp(data.updated) : null);\n\n if (data.category) {\n data.category = new Category(data.category);\n }\n\n if (data.chapters) {\n utils.each(data.chapters, (chapter, index) => {\n chapter.time = utils.string.getTimeFormatted(chapter.timeline);\n chapter.index = (index + 1);\n });\n }\n\n // next asset is optional, fill with basic object to avoid undefined errors\n if (!data.nextAsset) {\n data.nextAsset = {};\n }\n\n return data;\n },\n\n fetch() {\n return fetch(this.url())\n .then(handleErrors)\n .then(response => response.json())\n .then(json => {\n Object.assign(this.attributes, this.parse(json));\n this.trigger('fetchSuccess');\n\n return this;\n })\n .catch((response) => {\n this.trigger('fetchError', response.statusText);\n });\n },\n\n getVendor: function() {\n return this.get('vendor');\n },\n\n destroy: function() {\n // in case of any cleanup\n },\n\n getAgeLimit: function() {\n return utils.isNumber(this.get('ageLimit')) ? this.get('ageLimit') : -1;\n },\n\n /**\n * Get chapter by its index (numbered from 1)\n *\n * @param chapterIndex\n * @returns {*} or undefined if not found\n */\n getChapter: function(chapterIndex) {\n return this.getChapters()[chapterIndex - 1];\n },\n\n /**\n * Get chapters for single stream\n *\n * @returns {*|Array}\n */\n getChapters: function () {\n return this.get('chapters') || [];\n },\n\n getThumbnail: function() {\n return this.get('images').main;\n },\n\n getTitle: function() {\n return this.get('title');\n },\n\n getCategory: function() {\n return this.get('category');\n }\n};\n\nutils.extend(Asset.prototype, Model);\n\nexport default Asset;\n","\n var requestNumber, currentServerId, image, config, getServer, getImageTransform, serversAmount;\n\n getServer = (function() {\n var MAX_REQUEST_PER_SERVER = 6;\n\n return function(imageId) {\n if(!imageId) {\n return '';\n }\n\n if(requestNumber === MAX_REQUEST_PER_SERVER) {\n if(currentServerId === serversAmount) {\n currentServerId = -1;\n }\n\n requestNumber = 0;\n currentServerId++;\n }\n\n requestNumber++;\n\n return imageId.replace(\"imbo\", config.servers[currentServerId]);\n };\n }());\n\n function getImageQuality(pixelRatio) {\n return (pixelRatio >= 2) ? 50 : 80;\n }\n\n function normalizeTransformSize(size, pixelRatio) {\n // return default value\n return [\n size,\n getImageQuality(pixelRatio)\n ];\n }\n\n function getClosestSize(transformSizes, maxDimension) {\n return transformSizes.reduce(function (prev, curr) {\n return (Math.abs(curr - maxDimension) < Math.abs(prev - maxDimension) ? curr : prev);\n });\n }\n\n function getPixelRatio() {\n // we do not support px lower than 1 and bigger than 2\n return Math.max(1, Math.min(2, config.getPixelRatio()));\n }\n\n /**\n * Returns transformation for given image key and width\n * Adjusts the best\n */\n getImageTransform = (function() {\n var cache = {};\n\n return function(key, width, height) {\n var pixelRatio = getPixelRatio(),\n cacheKey = key + width + height + pixelRatio;\n\n // first check if there is cached object\n if(cache[cacheKey]) {\n return cache[cacheKey];\n }\n\n var id = key.split('.'),\n i = 0,\n idLen = id.length,\n transformType = (height > width) ? 'autoWidth' : 'autoHeight',\n transformSizes = config.sizes, transform, maxDimension;\n\n while(i < idLen) {\n transformSizes = transformSizes[id[i]];\n\n if(!transformSizes) {\n throw new Error('Image transformation missing for key ' + key);\n }\n\n i++;\n }\n\n transformSizes = transformSizes[transformType];\n\n // transformation is adjusted to not 'auto' side\n maxDimension = (transformType === 'autoHeight') ? width : height;\n maxDimension = maxDimension * pixelRatio;\n\n var dimensions = normalizeTransformSize(getClosestSize(transformSizes, maxDimension), pixelRatio);\n\n // auto width transform starts with 'x'\n // http://svp.vg.no/svp/api/v1/docs/\n transform = (transformType === 'autoWidth') ? 'x' : '';\n transform = transform + dimensions[0] + 'q' + dimensions[1];\n\n cache[cacheKey] = transform;\n\n return transform;\n };\n }());\n\n image = {\n initialize: function(options) {\n config = options;\n serversAmount = options.servers.length - 1;\n requestNumber = 0;\n currentServerId = 0;\n },\n getImageSrc: function(imageId, key, width, height) {\n if(imageId) {\n var extension = (imageId.indexOf('.jpg') === -1 && imageId.indexOf('.png') === -1 ? '.jpg' : '');\n return getServer(imageId) + extension + '?t[]=' + getImageTransform(key, width, height);\n }\n return null;\n }\n };\n\n export default image;\n\n","import utils from 'utils/utils';\nimport image from 'utils/image';\nimport Model from 'utils/model';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\n\nconst Stream = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nStream.prototype = {\n initialize: function (data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n /**\n * Parse data from asset\n * Be aware, data went through Asset.parse method\n *\n * @param data\n */\n parse: function(data) {\n const result = {\n id: data.id,\n vendor: data.vendor,\n title: data.title,\n\n streams: {\n hls: data.streamUrls.hls,\n hds: data.streamUrls.hds,\n mp4: data.streamUrls.mp4 ? [data.streamUrls.mp4] : []\n },\n status: data.status,\n type: data.streamType,\n streamConfiguration: data.streamConfiguration,\n\n images: {\n main: data.images.main,\n snapshots: data.images.snapshots || null\n },\n\n captions: data.captions || [],\n\n flightTimes: {\n start: null,\n end: null\n },\n\n playback: {\n begin: null,\n end: null\n },\n\n sourceFiles: data.sourceFiles || [],\n externalId: data.externalId || null,\n category: data.category\n };\n\n if (data.duration) {\n result.duration = data.duration / 1000;\n }\n\n if (data.metadata) {\n result.is360 = data.metadata.is360 === 'true';\n }\n\n // this array contains other mp4 streams but without main mp4\n if (data.streamUrls.pseudostreaming) {\n result.streams.mp4 = result.streams.mp4.concat(data.streamUrls.pseudostreaming);\n }\n\n // override start and end if set in api\n if (data.flightTimes) {\n result.flightTimes = {\n start: (data.flightTimes.start ? data.flightTimes.start : null),\n end: (data.flightTimes.end ? data.flightTimes.end : null)\n };\n }\n\n if (data.playback) {\n result.playback = {\n begin: data.playback.begin,\n end: data.playback.end\n };\n }\n\n // additional stream settings\n if (data.settings) {\n result.showAds = data.settings.showAds;\n }\n\n // cue points, empty array if nothing set\n result.cuePoints = data.cuePoints;\n\n // add midroll in 10s TODO remove after tests\n // result.cuePoints = [31];\n return result;\n },\n\n getId: function() {\n return this.get('id');\n },\n\n getVendor: function() {\n return this.get('vendor');\n },\n\n getCategory: function () {\n return this.get('category');\n },\n\n hasProperty: function(property) {\n return this.get('streamConfiguration').properties.indexOf(property) > -1;\n },\n\n /**\n * Get duration stored in API\n *\n * @returns {*}\n */\n getDuration: function () {\n return this.get('duration');\n },\n\n getCuePoints: function () {\n return this.get('cuePoints');\n },\n\n /**\n * Check if stream has Akamai Secure Token\n * @returns {*}\n */\n isSecure: function() {\n return this.hasProperty('tokenSecured');\n },\n\n /**\n * Check if stream is available only in certain areas\n * @returns {*}\n */\n isGeoblocked: function() {\n return this.hasProperty('geoblocked');\n },\n\n isLive: function() {\n return this.get('type') === 'live';\n },\n\n wasLive: function() {\n return this.get('type') === 'wasLive';\n },\n\n isActive: function () {\n return this.get('status') === 'active' && !this.isPast();\n },\n\n isFuture: function () {\n return (this.get('flightTimes') && this.get('flightTimes').start\n ? this.get('flightTimes').start > new Date().getTime() : false);\n },\n\n isPast: function () {\n return (this.get('flightTimes') && this.get('flightTimes').end\n ? (this.get('flightTimes').end < new Date().getTime()) : false);\n },\n\n hasHds: function() {\n return this.getUrl('HDS').indexOf('f4m') > -1;\n },\n\n /**\n * Streams might not be available while asset is created\n *\n * @returns {boolean}\n */\n hasPlayableSource: function () {\n if (this.getTimeToStart() > 0 || !this.isActive()) {\n return false;\n }\n\n return true;\n },\n\n getUrl: function(streamType) {\n const isOnHttp = window.location.protocol.toLowerCase().startsWith('http:');\n const type = streamType.toLowerCase();\n\n let streamUrl = this.get('streams')[type];\n\n if (utils.device.isIE() && isOnHttp) {\n streamUrl = streamUrl.replace('https', 'http');\n }\n\n return streamUrl;\n },\n\n getPoster: function() {\n return this.get('images').main;\n },\n\n /**\n * Get poster src adjusted to given width\n *\n * @param containerWidth\n * @returns {*}\n */\n getPosterSrc: function(containerWidth) {\n return image.getImageSrc(this.getPoster(), 'poster', containerWidth);\n },\n\n /**\n * Get snapshots url\n * @returns {*} - url string or null if snapshots not found\n */\n getSnapshots: function() {\n return `${config.api.thumbnailsUrl + this.getVendor()}/assets/${this.getId()}`;\n },\n\n /**\n * Not every asset has snapshot (lives, wasLives)\n */\n hasSnapshots: function() {\n return this.get('images').snapshots !== null;\n },\n\n /**\n * Get captions associated with stream\n *\n * @returns {boolean}\n */\n getCaptions: function() {\n return this.get('captions') || [];\n },\n\n /**\n * Check if mp4 streams are available\n *\n * @returns {boolean}\n */\n hasMp4Streams: function() {\n return this.get('streams').mp4.length > 0;\n },\n\n getMp4Streams: function() {\n const streams = [];\n\n // mp4 streams are not available on live and secure hd\n if (this.hasMp4Streams()) {\n utils.each(this.get('streams').mp4, stream => {\n const streamData = stream.split('/').pop().replace('.mp4', '').split('_');\n\n streams.push({\n source: stream,\n width: streamData[0],\n height: streamData[1],\n bitrate: streamData[2]\n });\n });\n }\n\n return streams;\n },\n\n /**\n * Check if asset is published\n * Method relay on server time to avoid timezone differences\n *\n * @returns {number} seconds to live\n */\n getTimeToStart: function () {\n return (this.get('flightTimes').start - ServerTime.getTime()) / 1000;\n },\n\n\n /**\n * Asset can be virually sliced into small chunks\n * These are only indicators and do not slice stream\n *\n * @param position\n * @returns {*}\n */\n getPlaybackTime: function(position) {\n const playback = this.get('playback');\n\n if (position === 'begin') {\n if (this.get('playAhead') > 0) {\n return this.get('playAhead');\n }\n\n return (playback.begin > 0) ? playback.begin : null;\n }\n\n if (position === 'end' && playback.end > 0) {\n return playback.end;\n }\n\n return null;\n },\n\n /**\n * Check if ads are turned on\n *\n * @returns {boolean}\n */\n hasCreatives: function() {\n return this.get('na') !== true;\n },\n\n /**\n * External id\n * Used for JW Player statistics\n */\n getExternalId: function() {\n return this.get('externalId');\n },\n\n /**\n * Stream display mode\n *\n * @returns {*}\n */\n getDisplayType: function () {\n if (this.is360()) {\n return '360';\n }\n\n return '2d';\n },\n\n /**\n * Check if stream is 360 video\n */\n is360: function () {\n return this.get('is360') === true;\n },\n\n /**\n * Check wethever stream has ads disabled\n */\n hasAdsDisabled: function () {\n return this.get('showAds') === false;\n }\n};\n\nutils.extend(Stream.prototype, Model);\n\nexport default Stream;\n","const EXCLUDED_ASSETS_KEY = 'svp-excludedAssets';\n\n/**\n * Each vendor has own storage for excluded keys\n *\n * @param vendor\n * @returns {string}\n */\nconst getKey = function(vendor) {\n return `${EXCLUDED_ASSETS_KEY}-${vendor}`;\n};\n\nconst ExcludedAssets = {\n add: function(vendor, id) {\n let assets = this.getAll(vendor);\n\n if (id) {\n if (assets.indexOf(id) === -1) {\n // put at top as the older stream will be removed first\n assets.unshift(id);\n // limit only to 10 restricted streams\n assets = assets.splice(0, 10);\n }\n\n this.getStorage().setItem(getKey(vendor), JSON.stringify(assets));\n }\n },\n\n getAll: function(vendor) {\n return JSON.parse(this.getStorage().getItem(getKey(vendor))) || [];\n },\n\n getStorage: function() {\n return window.localStorage;\n }\n};\n\nexport default ExcludedAssets;\n","/* eslint-disable no-underscore-dangle */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\nimport config from 'player/config';\nimport Asset from './asset';\nimport Stream from './stream';\nimport ExcludedAssets from './excluded-assets';\n\nfunction getCategorySettings(asset) {\n const category = asset.getCategory();\n\n const settings = {\n order: null,\n categoryId: null\n };\n\n const currentOrder = (category.getLastAsset().id === asset.get('id') ? 'before' : 'after');\n\n if (settings.order) {\n if (settings.categoryId !== category.get('id')) {\n settings.order = currentOrder;\n settings.categoryId = category.get('id');\n }\n } else {\n settings.order = currentOrder;\n settings.categoryId = category.get('id');\n }\n\n return settings;\n}\n\nconst NextAsset = function () {};\n\nNextAsset.prototype = {\n /**\n * Check if given asset has next stream\n *\n * @param asset\n * @returns {boolean}\n */\n hasPlayNext: function (asset, includeCategory) {\n if (asset.get('streamType') === 'live') {\n return false;\n }\n\n if (asset.get('nextAsset').id) {\n return true;\n }\n\n if (includeCategory === true) {\n return this.hasNextInCategory(asset);\n }\n\n return false;\n },\n\n /**\n * Check if given asset has next stream\n *\n * @param asset\n * @returns {boolean}\n */\n hasNextInCategory: function (asset) {\n const category = asset.getCategory();\n\n if (category) {\n if (category.isSeries()) {\n return true;\n }\n\n if (category.get('autoPlayNextAsset')) {\n return true;\n }\n\n if (category.hasEmbedPlayNext()) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Fetch next asset from asset series\n * Rejected when next asset is not found\n *\n * @param asset\n * @param settings\n * @returns {Promise.}\n */\n fetchNextFromSeries: function(asset, settings) {\n const itemOffset = (settings && settings.order === 'before') ? 1 : -1;\n\n return new Promise((resolve, reject) => {\n let url;\n\n if (asset.get('season')) {\n url = `/categories/${asset.getCategory().get('id')}/seasons/${asset.get('season')}/assets`;\n utils.ajax(config.api.getUrl(asset.getVendor(), url), resolve, reject);\n } else {\n reject('seasonNotAvailable');\n }\n }).then(response => JSON.parse(response.responseText)).then(data => {\n let nextAsset = null;\n\n if (data && data.assets) {\n utils.each(data.assets, (item, index) => {\n if (!nextAsset) {\n if (item.id === asset.get('id')) {\n nextAsset = data.assets[index + itemOffset]; // pick next asset (reverse)\n }\n }\n });\n }\n\n return nextAsset;\n }).then(nextAsset => {\n // resolve next asset only if available\n if (nextAsset) {\n return Promise.resolve({\n asset: new Asset(nextAsset),\n source: 'series'\n });\n }\n\n return Promise.reject('nextAssetNotFound');\n });\n },\n\n /**\n * Fetch next asset from parent category\n * Rejected when next asset is not found\n *\n * @param asset object\n * @param settings\n * @returns {Promise.}\n */\n fetchNextFromCategory: function(asset, settings) {\n const order = (settings && settings.order) || 'after';\n let url = `/assets?limit=1&filter=categoryId::${asset.getCategory().get('id')}`;\n\n if (order === 'before') {\n url += `&before=${asset.get('published') / 1000 - 1}`; // time is in ms\n } else {\n url += `&sort=-published&after=${asset.get('published') / 1000 + 1}`; // time is in ms\n }\n\n return new Promise((resolve, reject) => {\n utils.ajax(config.api.getUrl(asset.getVendor(), url), resolve, reject);\n }).then(response => JSON.parse(response.responseText)).then(data => {\n // parse response\n if (data && data._embedded && data._embedded.assets) {\n const [nextAsset] = data._embedded.assets;\n\n if (nextAsset && nextAsset.id !== asset.get('id')) {\n return nextAsset;\n }\n }\n\n return null;\n }).then(nextAsset => {\n // resolve next asset only if available\n if (nextAsset) {\n return Promise.resolve({\n asset: new Asset(nextAsset),\n source: `category-${order}`\n });\n }\n\n return Promise.reject('nextAssetNotFound');\n });\n },\n\n /**\n * Fetch next asset by providing it's id\n *\n * @param assetId\n * @returns {*}\n */\n fetchNextAssetById: function(vendor, assetId) {\n return new Asset({\n id: assetId,\n vendor: vendor\n }).fetch().then(asset => ({\n asset: asset,\n source: 'byId'\n }));\n },\n\n fetchNextFromMlEngine: function(asset) {\n const url = `/assets/${asset.get('id')}/related-ml?limit=20`;\n const vendor = asset.getVendor();\n\n return new Promise((resolve, reject) => {\n utils.ajax(config.api.getUrl(vendor, url), resolve, reject);\n }).then(response => JSON.parse(response.responseText)).then(data => {\n const assets = data && data._embedded && data._embedded.assets;\n const excludedAssets = ExcludedAssets.getAll(vendor);\n let nextAsset = null;\n\n // parse response\n if (assets) {\n for (let i = 0; i < assets.length; i += 1) {\n nextAsset = assets[i] || {};\n\n if (nextAsset.id !== asset.get('id') && excludedAssets.indexOf(nextAsset.id) === -1) {\n // exclude asset from recommended list\n ExcludedAssets.add(asset.getVendor(), nextAsset.id);\n return nextAsset;\n }\n }\n }\n\n return null;\n }).then(nextAsset => {\n // resolve next asset only if available\n if (nextAsset) {\n return Promise.resolve({\n asset: new Asset(nextAsset),\n source: 'ml-engine'\n });\n }\n // fallback for fetching from \"old api\"\n return this.fetchSimple(asset);\n });\n },\n\n /**\n * Fetch next for given asset\n * Cascade lookup from direct linkage (nextAsset.id) to retriving from category\n * Rejected when nextAsset is not found\n *\n * @param asset\n * @returns {Promise}\n */\n fetchFromMlEngine: function(asset, options) {\n let request = null;\n const threshold = (options && options.mlThreshold) || 0.5;\n\n // check if next asset is set in api\n const nextAssetId = (asset.get('nextAsset') && asset.get('nextAsset').id) || false;\n\n const category = asset.getCategory();\n const settings = getCategorySettings(asset);\n\n if (nextAssetId) {\n // here we compare results from hand set next\n if (Math.random() > threshold) {\n request = this.fetchNextAssetById(asset.getVendor(), nextAssetId);\n } else {\n request = this.fetchNextFromMlEngine(asset);\n }\n } else if (category.isSeries()) {\n if (settings.order === 'before') {\n request = this.fetchNextFromSeries(asset, settings);\n } else {\n request = this.fetchNextFromCategory(asset, settings);\n }\n } else if (asset.get('streamType') !== 'live') {\n request = this.fetchNextFromMlEngine(asset);\n }\n\n return request;\n },\n /**\n * Fetch next for given asset\n * Cascade lookup from direct linkage (nextAsset.id) to retriving from category\n * Rejected when nextAsset is not found\n *\n * @param asset\n * @returns {Promise}\n */\n fetchSimple: function(asset) {\n const category = asset.getCategory();\n const settings = getCategorySettings(asset);\n let request = null;\n\n if (this.hasPlayNext(asset, true)) {\n if (asset.get('nextAsset').id) {\n request = this.fetchNextAssetById(asset.getVendor(), asset.get('nextAsset').id);\n } else if (category.isSeries()) {\n if (settings.order === 'before') {\n request = this.fetchNextFromSeries(asset, settings);\n } else {\n request = this.fetchNextFromCategory(asset, settings);\n }\n } else if (category && (category.get('autoPlayNextAsset'))) {\n request = this.fetchNextFromCategory(asset, settings);\n }\n }\n\n return request;\n },\n\n /**\n * Fetch next for given asset\n * Cascade lookup from direct linkage (nextAsset.id) to retriving from category\n * Rejected when nextAsset is not found\n *\n * @param asset\n * @returns {Promise}\n */\n fetch: function (asset, options) {\n let request = null;\n\n if (options.useMlEngine === true) {\n request = this.fetchFromMlEngine(asset, options);\n } else {\n request = this.fetchSimple(asset);\n }\n\n return new Promise((resolve, reject) => {\n if (request) {\n request.then(data => {\n if (data && data.asset) {\n const stream = new Stream(data.asset.attributes);\n\n if (stream.isActive()) {\n resolve(data);\n } else {\n reject('nextAssetNotActive');\n }\n } else {\n reject('nextAssetNotActive');\n }\n }, reject);\n } else {\n reject('nextAssetNotFound');\n }\n });\n }\n};\n\nutils.extend(NextAsset.prototype, Model);\n\nexport default NextAsset;\n","\nconst Locale = function(translations) {\n this.translations = translations;\n};\n\nLocale.prototype = {\n /**\n * Translate string by key from translation dictionary\n * Return translated key or substitute (if provided) or key itself\n * @param key\n * @returns {*}\n */\n translate: function(key, substitute) {\n // typeof to check keys like \"0\"\n return this.translations[key] || (typeof substitute === 'undefined' ? key : substitute);\n },\n\n /**\n * Get localized month name\n * Returns month number if translation is not found\n *\n * @param date\n * @returns {*|number}\n */\n getMonthName: function(date) {\n const months = this.translations.months || [];\n\n return months[date.getMonth()] || date.getMonth();\n }\n};\n\nexport default Locale;\n","import config from 'player/config';\nimport utils from 'utils/utils';\n\nfunction isDomainInArray(origin, domains) {\n let domain;\n let pos;\n let domainBeginning;\n\n // check if domain has access for given provider\n // otherwise deny it\n // allow all dev builds set settings\n if (config.version === 'dev') {\n return true;\n }\n\n // list is not provided\n if (!utils.isArray(domains)) {\n return false;\n }\n\n const len = domains.length;\n\n for (let i = 0; i < len; i += 1) {\n domain = domains[i];\n\n // subdomain parsing, subdomain has to end with domain\n if (domain[0] === '*') {\n // remove asterisk\n domain = domain.slice(1);\n pos = origin.indexOf(domain);\n\n domainBeginning = origin[origin.length - domain.length - 1];\n\n // check if origin has exactly the same ending of domain\n if (pos > -1 && origin.length - pos === domain.length\n && (domainBeginning === undefined || domainBeginning === '.')) {\n return true;\n }\n\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (domain.indexOf(origin) > -1) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Inherit data from parent array to child\n * Prevents undefined to persist if one of given array is empty\n *\n * @param parent\n * @param child\n * @returns {Array.}\n */\nfunction inherit(parent, child) {\n return (parent || []).concat(child || []);\n}\n\nconst Domain = {\n domain: null,\n\n // default settings configuration\n settings: {\n // boolean Preview of not published videos\n preview: false,\n // completely turn off all ads\n na: false\n },\n\n vendors: {},\n\n initialize: function (domain) {\n this.domain = domain;\n },\n\n /**\n * Fetch permissions for extended settings\n *\n * @param vendor\n * @returns {*}\n */\n fetch: function (vendor) {\n if (!this.vendors[vendor]) {\n this.vendors[vendor] = Promise.resolve(config.domains);\n }\n\n return this.vendors[vendor];\n },\n\n /**\n * Check whatever custom settings may be used on current domain or not\n *\n * @param vendor - api key vendor\n * @returns {Promise}\n */\n getPermissions: function (vendor) {\n return this.fetch(vendor).then(data => {\n const result = {};\n\n utils.each(data, (item, key) => {\n result[key] = isDomainInArray(\n this.domain,\n inherit(item.global, item[vendor])\n );\n });\n\n return result;\n });\n },\n\n /**\n * Check if current domain is blacklisted\n *\n * @param vendor - api vendor key\n * @returns {*}\n */\n isBlacklisted: function (vendor) {\n const { blacklist } = config.domains;\n\n // check if domain has access for given provider\n // otherwise deny it\n // allow all dev builds set settings\n if (config.version === 'dev') {\n return false;\n }\n\n return isDomainInArray(this.domain, inherit(blacklist.global, blacklist[vendor]));\n }\n};\n\nexport default Domain;\n","import utils from 'utils/utils';\nimport config from 'player/config';\n\nimport { TOKEN_FETCH_ERROR } from '../playback/config/status-codes';\n\nconst fetchToken = function(params) {\n this.isFetching = true;\n\n return new Promise((resolve, reject) => {\n // fetch new token\n utils.ajax(this.url(params), response => {\n this.expire = +new Date() + 1000;\n this.value = response.responseText;\n this.isFetching = false;\n resolve(this.value);\n }, () => {\n this.isFetching = false;\n reject(TOKEN_FETCH_ERROR);\n }, true);\n });\n}\n\nclass Token {\n constructor(assetId, maxBitrate) {\n /**\n * Id of SVP related asset\n */\n this.assetId = assetId;\n\n /**\n * Akamai token value retrieved from SVP api\n * @type {null}\n */\n this.value = null;\n /**\n * Expiration time, timestamp\n * @type {null}\n */\n this.expire = null;\n\n /**\n * Maximum allowed bitrate for stream\n * @type {null}\n */\n this.maxBitrate = maxBitrate || null;\n\n this.request = null;\n this.isFetching = false;\n }\n\n fetch(configuration) {\n if (!this.isValid()) {\n if (this.request && this.isFetching) {\n return this.request;\n }\n\n if (typeof configuration === 'function') {\n this.request = configuration(this.assetId).then(fetchToken.bind(this));\n } else {\n this.request = fetchToken.call(this);\n }\n }\n\n return this.request;\n }\n\n url(params) {\n const query = [\n `vendor=${config.api.vendor}`\n ];\n\n if (params && params.expiry && params.value) {\n query.push(`assetId=${this.assetId}`);\n query.push(`expires=${params.expiry}`);\n query.push(`hmac=${params.value}`);\n } else {\n query.push('acl=/*');\n }\n\n if (this.maxBitrate) {\n query.push(`maxBitrate=${this.maxBitrate}`);\n }\n\n return `${config.api.tokenUrl}?${query.join('&')}`;\n }\n\n getValue() {\n return this.value;\n }\n\n isValid() {\n // on load expire is null therefore it will always return false\n return (+new Date() < this.expire);\n }\n}\n\n\nutils.extend(Token.prototype, utils.Events);\n\nexport default Token;\n","import config from 'player/config';\nimport utils from 'utils/utils';\n\nfunction getDeviceType() {\n return utils.device.getDeviceType();\n}\n\nfunction getCountryCode(vendor) {\n return (vendor === 'ab' || vendor === 'svd') ? 'se' : 'no';\n}\n\nexport default {\n getVmapTag: function(params) {\n const queryObject = utils.extend({\n cb: (Math.round(Math.random() * 100000000000))\n }, params);\n\n return `${config.ads.appnexus.vmap}?${utils.jsonToUrl(queryObject)}`;\n },\n\n getAstConfig: function (tagOptions, globalOptions) {\n return utils.extend({}, utils.merge(globalOptions, tagOptions));\n },\n\n getDefaultParams: function(stream) {\n const vendor = stream.getVendor();\n\n return {\n countryCode: getCountryCode(vendor),\n supplyType: `web_${getDeviceType()}`,\n publisherName: vendor,\n slotIds: {\n preroll: 1,\n midroll: 2,\n postroll: 3\n }\n };\n }\n};\n","import utils from 'utils/utils';\nimport appnexusTag from './appnexus-tag-builder';\n\nconst JwAdsConfig = function (stream) {\n this.stream = stream;\n this.config = {};\n this.params = [];\n};\n\nJwAdsConfig.prototype = {\n setParams: function (params) {\n this.params = params;\n },\n\n add: function (adSlotConfig, offset, adLabel) {\n // do not add tag when id is empty\n if (adSlotConfig) {\n this.config[adLabel + Math.floor(Math.random() * 100) + 1] = {\n offset: offset,\n tag: appnexusTag.getVmapTag(utils.merge(this.params, adSlotConfig))\n };\n }\n },\n\n getConfig: function () {\n return this.config;\n }\n};\n\nexport default JwAdsConfig;\n","import utils from 'utils/utils';\nimport appnexusTagBuilder from './appnexus-tag-builder';\nimport JwAdsConfig from './appnexus-jw-config';\n\n// move to appnexus jw\nfunction getAdsConfig(adConfig, stream, settings) {\n const adSlots = adConfig.adSlots || {};\n const params = adConfig.params || [];\n const adsConfig = new JwAdsConfig(stream);\n const { hasNext } = (settings || {});\n\n adsConfig.setParams(params);\n adsConfig.add(adSlots.preroll, 'pre', 'preroll');\n\n utils.each(stream.getCuePoints(), function (cuePoint) {\n if (cuePoint && cuePoint.timeline) {\n adsConfig.add(adSlots.midroll, cuePoint.timeline, 'midroll');\n }\n });\n\n // postroll is disabled when playnext is available\n if (hasNext === false || (hasNext !== true && stream.get('hasNext') === false)) {\n adsConfig.add(adSlots.postroll, 'post', 'postroll');\n }\n\n return adsConfig.getConfig();\n}\n\nfunction getParams(params, memberId) {\n if (memberId) {\n return utils.extend({}, {\n member: memberId\n }, params);\n }\n\n return params;\n}\n\nfunction parseAdPlacements(adPlacements, globalParams) {\n const placements = {};\n\n utils.each(adPlacements, function (values, placementId) {\n placements[placementId] = appnexusTagBuilder.getAstConfig(values, globalParams);\n });\n\n return placements;\n}\n\nfunction getJwAdSchedule(clientConfig, stream, settings) {\n const { adSlots } = clientConfig;\n\n if (adSlots) {\n return getAdsConfig({\n adSlots: adSlots.schedule,\n params: getParams(adSlots.params, clientConfig.member)\n }, stream, settings);\n }\n\n return {};\n}\n\nfunction getAdPlacements(clientConfig) {\n const { adPlacements } = clientConfig;\n\n if (clientConfig.member && adPlacements) {\n return parseAdPlacements(\n adPlacements.schedule,\n getParams(adPlacements.params, clientConfig.member)\n );\n }\n\n return {};\n}\n\nfunction getClientConfig(stream, settings) {\n // ads are disabled\n // check stream config also\n if (settings.na === true || !settings.adn || stream.hasAdsDisabled()) {\n return Promise.resolve(null);\n }\n\n return settings.adn(stream, appnexusTagBuilder.getDefaultParams(stream));\n}\n\nexport default {\n getConfig: function (stream, settings) {\n return getClientConfig(stream, settings).then(function (clientConfig) {\n // null equals to empty ads\n if (clientConfig === null) {\n return {};\n }\n\n return {\n adSchedule: getJwAdSchedule(clientConfig, stream, settings),\n adPlacements: getAdPlacements(clientConfig, stream, settings),\n adOptions: clientConfig.options || {}\n };\n });\n },\n\n getLiveMidrollTag: function (maxDuration, stream, settings) {\n // eslint-disable-next-line consistent-return\n return getClientConfig(stream, settings).then(function (clientConfig) {\n const adSlots = clientConfig && clientConfig.adSlots;\n const midroll = adSlots && adSlots.schedule && adSlots.schedule.midroll;\n const params = utils.extend({}, (adSlots || {}).params);\n\n params.vmaxduration = maxDuration;\n\n if (midroll) {\n return appnexusTagBuilder.getVmapTag(utils.merge(params, midroll));\n }\n });\n }\n};\n","import utils from 'utils/utils';\nimport appnexus from 'player/playback/ads/appnexus';\n\nfunction getPlaylist(hlsUrl, stream, options, settings) {\n const { locale, poster, title } = options;\n\n function addPlaylistMetadata(playlistItem) {\n const mediaId = stream.getExternalId();\n\n // set media id only if it exists\n if (mediaId) {\n playlistItem.mediaid = mediaId;\n }\n\n // add title\n if (title) {\n playlistItem.title = title;\n }\n\n return playlistItem;\n }\n\n function addProgressiveMediaSources(playlistItem) {\n utils.each(stream.getMp4Streams(), function (mp4Stream) {\n playlistItem.sources.push({\n label: `${mp4Stream.height}p`,\n file: mp4Stream.source\n });\n });\n\n return playlistItem;\n }\n\n function addSnapshots(playlistItem) {\n if (stream.hasSnapshots()) {\n // add snapshots for each stream\n playlistItem.tracks.push({\n file: stream.getSnapshots(),\n kind: 'thumbnails'\n });\n }\n\n return playlistItem;\n }\n\n function addCaptions(playlistItem) {\n if (stream.getCaptions().length > 0) {\n utils.each(stream.getCaptions(), function(caption) {\n playlistItem.tracks.push({\n file: caption.url,\n label: locale.translate(caption.language),\n kind: 'captions',\n default: caption.default === true\n });\n });\n }\n\n return playlistItem;\n }\n\n function addAppnexusAds(adConfig, playlistItem) {\n const { adSchedule, adPlacements } = (adConfig || {});\n\n // check if there are ads\n if (adSchedule && Object.keys(adSchedule).length > 0) {\n utils.extend(playlistItem, {\n adschedule: adSchedule\n });\n }\n\n // check if there are ads\n if (adPlacements) {\n playlistItem.adPlacements = adPlacements;\n }\n\n return playlistItem;\n }\n\n function add3dSupport(playlistItem) {\n if (stream.getDisplayType() === '360') {\n playlistItem.stereomode = 'monoscopic';\n }\n\n return playlistItem;\n }\n\n return function (config) {\n return Promise.resolve({\n id: stream.getId(),\n image: poster,\n sources: [{\n file: hlsUrl,\n // force mp4 stream type for ads\n type: stream.getVendor() === 'appnexus' ? 'video/mp4' : 'hls',\n default: true\n }],\n tracks: []\n })\n .then(addPlaylistMetadata)\n .then(addProgressiveMediaSources)\n .then(addCaptions)\n .then(addSnapshots)\n .then(add3dSupport)\n .then(function (playlistItem) {\n return appnexus.getConfig(stream, settings).then(function (adConfig) {\n const adOptions = adConfig.adOptions || {};\n\n config.advertising = utils.extend({\n client: 'vast'\n }, locale.translate('ads', true));\n\n if (typeof adOptions.autoplayMuted !== 'undefined') {\n config.advertising.autoplayadsmuted = adOptions.autoplayMuted;\n }\n\n if (adOptions.vpaidcontrols === true) {\n config.advertising.vpaidcontrols = true;\n }\n\n return addAppnexusAds(adConfig, playlistItem);\n });\n })\n .then(function (playlistItem) {\n config.playlist = [playlistItem];\n\n playlistItem.svp = {\n stream: stream,\n settings: settings\n };\n\n return config;\n });\n };\n}\n\nexport default getPlaylist;\n","import utils from 'utils/utils';\n/**\n * Check if preroll is scheduled in configuration\n *\n * @param config\n * @returns {boolean}\n */\nfunction hasPreroll(config) {\n var playlistItem = config && config.playlist[0];\n var result = false;\n\n if (playlistItem.adschedule) {\n utils.each(playlistItem.adschedule, function (slot) {\n if (slot && slot.offset === 'pre') {\n result = true;\n }\n });\n }\n\n return result;\n}\n\nexport default function (stream, options) {\n // additional config options required for playback\n return function (config) {\n let canAutostart = options.autoplay;\n\n // firefox requires this flag to be set when playing SecureHD stream\n if (stream && stream.isSecure()) {\n config.withCredentials = true;\n }\n\n // stream is not available yet, display countdown\n if (!stream.hasPlayableSource()) {\n // disable autoplay if stream is not available\n config.preload = 'none';\n config.autostart = false;\n }\n\n // force sound mute when configuration is set\n if (options.mute === true) {\n config.mute = true;\n }\n\n // load skin if available\n if (options.skin) {\n config.skin = options.skin;\n }\n\n // fix jw bug\n // by default you can't play muted ads\n if (hasPreroll(config) && config.advertising.autoplayadsmuted !== true) {\n try {\n if (config.mute === true || localStorage.getItem('jwplayer.mute') === 'true') {\n canAutostart = false;\n }\n } catch (error) {\n // for private browsing\n }\n }\n\n // disable autostart for future streams\n if (stream.isFuture()) {\n canAutostart = false;\n }\n\n if (typeof canAutostart !== 'undefined') {\n config.autostart = canAutostart;\n }\n\n\n return config;\n };\n}\n","import utils from 'utils/utils';\n\nexport default function (stream, isEnabled, youboraAccount) {\n function getYouboraConfig(config) {\n config = (typeof config === 'object') ? config : {};\n\n return {\n 'https://smartplugin.youbora.com/v5/javascript/jwplayer/5.4.1/sp.min.js': utils.extend({\n // Account code and enable YOUBORA Analytics\n accountCode: 'schibsted',\n enableAnalytics: true\n }, config)\n };\n }\n\n // additional config options required for playback\n return function (config) {\n // allow only when account config is available\n if (isEnabled && youboraAccount) {\n utils.extend(\n config.plugins,\n getYouboraConfig(youboraAccount)\n );\n\n /* jshint ignore:start */\n if (config.playlist && config.playlist[0]) {\n config.playlist[0].youbora = {\n media: {\n title: stream.get('title'),\n duration: stream.getDuration(),\n isLive: stream.isLive(),\n cdn: 'AKAMAI',\n resource: stream.getUrl('hls')\n },\n\n properties: {\n content_id: stream.getId(),\n content_metadata: {\n owner: stream.getVendor()\n }\n }\n };\n }\n /* jshint ignore:end */\n }\n\n return config;\n };\n}\n","/* global console */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\nimport image from 'utils/image';\n\nimport config from 'player/config';\nimport Domain from 'player/model/domain';\nimport Token from 'player/model/token';\n\nimport appnexus from './ads/appnexus';\nimport addPlaylist from './config/playlist';\nimport addSharing from './config/sharing';\nimport setPlaybackOptions from './config/playback';\nimport addYoubora from './config/jw-youbora';\nimport setKey from './config/keys';\n\nimport * as STATUS_CODES from './config/status-codes';\n\n/**\n * Config instance for player\n * Contains SVP Player options\n * Parses config\n *\n * @param options\n * @constructor\n */\nconst Config = function () {\n this.attributes = {\n // DOM node\n node: null,\n // API vendor\n vendor: null,\n // player environment\n env: 'production',\n // stream object (extracted from asset)\n stream: null,\n // if not provided width will be read from node element\n width: '100%',\n // if not provided height will be read from node element\n height: '100%',\n // start playing from chapter time\n chapter: null,\n // start stream automatically on capable devices (does not work on iPhone and iPad, Android)\n autoplay: false,\n // player poster (image), mixed string (http src)|true|false\n poster: true,\n // display title on poster or change to provided string (default false)\n title: null,\n // play ahead time, format XXhYYmZZs, for example: 02h09m10s\n time: null,\n // url to css file with skin\n skin: config.skins.default,\n // right click defualt text and link\n about: {\n text: 'SMP Stream',\n link: ''\n },\n // token function for secured streams\n token: null\n };\n\n /**\n * JW Player Config\n */\n this.jwDefaults = {\n primary: null,\n hlshtml: true,\n flashplayer: `${config.cdn.player}/jwplayer.flash.swf`,\n wmode: 'transparent',\n key: config.player.keys.default\n };\n\n this.token = null;\n\n /**\n * Determine if user is in 5% range of available traffic\n * We set half of 5% because autoplay gives around 2x traffic\n * @type {boolean}\n */\n this.hasYoubora = (Math.random() < 0.025);\n};\n\nConfig.prototype = {\n /**\n * Locales is required for translations in config\n *\n * @param locale\n */\n setLocale: function(locale) {\n this.locale = locale;\n },\n\n /**\n * Calculates bitrate value based on given limit\n *\n * maxBitrate is increased by 15% due to VBR encoding\n * @returns {number}\n */\n getMaxBitrate() {\n return this.get('maxBitrate') * 1.15;\n },\n\n setStream: function (stream) {\n this.stream = stream;\n this.token = new Token(stream.get('id'), this.getMaxBitrate());\n },\n\n /**\n * TODO add tests\n *\n * @param stream\n * @param container\n * @returns {*}\n */\n getPoster: function (stream, container) {\n const width = this.get('width');\n const height = this.get('height');\n\n container = container || document.getElementById(this.get('node'));\n\n if (utils.isString(this.get('poster'))) {\n return this.get('poster');\n }\n\n if (container && stream) {\n return image.getImageSrc(\n stream.getPoster(),\n 'poster',\n // use width and height if it's set as a number\n utils.isNumber(width) ? width : container.clientWidth,\n utils.isNumber(height) ? height : container.clientHeight\n );\n }\n\n return null;\n },\n\n /**\n * Retrieve token required for secure streams\n * Token expiry has to match API\n */\n getToken: function() {\n if (this.stream.isSecure()) {\n return this.token.fetch(this.get('token'));\n }\n\n return Promise.resolve(null);\n },\n\n /**\n * Token is required only for secure streams so for all other types it's valid\n *\n * @returns {boolean}\n */\n hasValidToken: function () {\n return !this.stream.isSecure() || this.token.isValid();\n },\n\n getStreamUrl: function (type) {\n // stream not set yet\n if (!this.stream) {\n // eslint-disable-next-line no-console\n console.error('SVP SDK: getStreamUrl() called before stream set');\n return null;\n }\n\n return this.getToken().then(token => {\n const streamUrl = this.stream.getUrl(type);\n const maxBitrate = this.getMaxBitrate();\n const params = [];\n\n if (type === 'hls' && token) {\n params.push(`hdnea=${encodeURIComponent(token)}`);\n }\n\n if (maxBitrate) {\n params.push(`b=0-${maxBitrate}`);\n }\n\n // only live streams require custom metadata\n // it's used to trigger ads\n if (this.stream.isLive()) {\n params.push(`custom-mdt=on`);\n }\n\n return streamUrl + ((params.length > 0) ? `?${params.join('&')}` : '');\n });\n },\n\n /**\n * Check if user is eligible to play stream in his geolocation\n *\n * @param stream\n * @returns {Promise}\n */\n isStreamPlayable() {\n const { stream } = this;\n const settings = this.getSettings();\n\n return new Promise((resolve, reject) => {\n if (settings.preview === true) {\n resolve(STATUS_CODES.ACTIVE_PREVIEW);\n } else if (stream.isActive()) {\n if (stream.isGeoblocked() && !stream.isFuture()) {\n this.getStreamUrl('hls').then(streamUrl => {\n // fetch manifest to check user access\n utils.ajax(streamUrl, resolve, function (...args) {\n const response = args[2] || {};\n\n if(response.status === 403) {\n return reject(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED);\n }\n\n return reject(STATUS_CODES.NETWORK_ERROR);\n }, true);\n }).catch(reject);\n } else {\n resolve(STATUS_CODES.ACTIVE);\n }\n } else if (stream.isPast()) {\n reject(STATUS_CODES.NOT_ACTIVE_PAST);\n } else {\n reject(STATUS_CODES.NOT_ACTIVE);\n }\n });\n },\n\n getJwConfig: function (stream) {\n const settings = this.getSettings();\n\n return Promise.resolve({\n width: this.get('width'),\n height: this.get('height'),\n abouttext: this.get('about').text,\n aboutlink: this.get('about').link,\n sharing: utils.extend({}, config.sharing.global),\n primary: this.get('primary') || 'html5',\n localization: this.locale.translate('player', true),\n plugins: {},\n cast: {}\n }).then(config => this.getStreamUrl('hls').then(hlsUrl => addPlaylist(\n hlsUrl,\n stream,\n {\n poster: this.getPoster(stream),\n title: this.get('title'),\n locale: this.locale\n },\n this.getPlaylistSettings()\n )(config)))\n .then(addSharing(\n this.get('sharing'),\n this.get('vendor'),\n this.locale.translate('Sharing'),\n config.sharing\n ))\n .then(setPlaybackOptions(stream, {\n mute: this.get('mute'),\n skin: this.get('skin'),\n autoplay: this.get('autoplay')\n }))\n .then(addYoubora(\n stream,\n // enable only five percent of traffic for youbora\n this.hasYoubora,\n settings.youbora\n ))\n .then(setKey(this.get('vendor')))\n .then(config => utils.merge(utils.extend({}, this.jwDefaults, config), settings.jw || {}));\n },\n\n /**\n * Check if recommended is available\n */\n hasRecommended: function() {\n // recommended is turned off\n return this.get('recommended') !== false;\n },\n\n getRecommended: function() {\n return this.get('recommended');\n },\n\n hasNext: function() {\n if (!this.hasRecommended()) {\n return false;\n }\n\n if (this.getRecommended() && (this.getRecommended().next === false\n || typeof this.getRecommended().next === 'undefined')) {\n return false;\n }\n\n return true;\n },\n\n getPlaylistSettings: function () {\n return utils.extend({\n adn: this.get('adn'),\n hasNext: this.hasNext()\n }, this.getSettings());\n },\n\n getLiveMidrollTag: function(time) {\n return appnexus.getLiveMidrollTag(\n time,\n this.stream,\n this.getPlaylistSettings()\n );\n },\n\n parse: function(options) {\n const asset = (options.asset || options.id);\n const about = config.about[options.vendor];\n const skin = utils.extend({}, (config.skins[options.vendor] || config.skins.default));\n\n // set default skin for player if nothing is provided\n if (typeof options.skin === 'object') {\n if (options.skin.name) {\n skin.name += ` ${options.skin.name}`;\n }\n\n if (options.skin.url) {\n skin.url = options.skin.url;\n }\n } else {\n // remove if not valid\n delete options.skin;\n }\n\n\n options.skin = skin;\n\n // override about link/text\n if (!options.about && about) {\n options.about = about;\n }\n\n // delete asset\n if (asset) {\n delete options.asset;\n }\n\n // check if user passed chapter or time\n if (utils.isString(options.chapter) && options.chapter.match(/^\\d+$/)) {\n options.chapter = parseInt(options.chapter, 10);\n }\n\n // legacy support\n if (options.time) {\n options.time = utils.time.shareTimeToSeconds(options.time);\n }\n\n if (options.settings) {\n delete options.settings;\n }\n\n if (options.locale) {\n delete options.locale;\n }\n\n return options;\n }\n};\n\n// Immutable method for restricted settings like preview or na\nObject.defineProperty(Config.prototype, 'initialize', {\n value: function(options) {\n const { vendor } = options;\n const rawOptions = utils.extend({}, options);\n\n Domain.getPermissions(vendor).then(permissions => {\n const settings = {};\n\n if (permissions.whitelist === true && options.settings) {\n utils.extend(settings, options.settings);\n }\n\n if (permissions.preview === false) {\n delete settings.preview;\n }\n\n // turn off ads for certain provider\n if (config.ads[vendor] === false) {\n settings.na = true;\n }\n\n Object.defineProperty(this, 'settings', {\n value: Object.freeze(settings),\n writable: false\n });\n\n utils.extend(this.attributes, this.parse(options));\n this.trigger('ready', rawOptions, settings);\n });\n },\n writable: false\n});\n\n// Immutable method for restricted settings like preview or na\nObject.defineProperty(Config.prototype, 'getSettings', {\n value: function() {\n return this.settings;\n },\n writable: false\n});\n\nutils.extend(Config.prototype, Model);\n\nexport default Config;\n","import utils from 'utils/utils';\n\nexport default function (options, vendor, heading, sharingDefaults) {\n return function (config) {\n const sharing = {};\n\n if (options === false) {\n delete config.sharing;\n } else {\n utils.extend(sharing, sharingDefaults.global);\n\n // use provider specific sharing info\n if (sharingDefaults[vendor]) {\n utils.extend(sharing, sharingDefaults[vendor]);\n }\n\n // extend sharing options when object is provided as param for it\n if (typeof options === 'object') {\n utils.extend(sharing, options);\n }\n\n // add uri encoding to prevent sharing problems\n if (sharing.code) {\n sharing.code = encodeURIComponent(sharing.code);\n }\n\n if (!sharing.heading) {\n sharing.heading = heading;\n }\n\n config.sharing = sharing;\n }\n\n return config;\n };\n}\n","import config from 'player/config';\n\nexport default function (vendor) {\n // additional config options required for playback\n return function (jwConfig) {\n const { keys } = config.player;\n\n jwConfig.key = keys[vendor] || keys.default;\n\n return jwConfig;\n };\n}\n","/* jshint bitwise: false */\nimport utils from 'utils/utils';\nimport Events from 'utils/backbone.events';\n\nfunction binarySearch(arr, compare) {\n // binary search, with custom compare function\n let l = 0;\n\n let r = arr.length - 1;\n let m;\n let comp;\n\n while (l <= r) {\n // eslint-disable-next-line no-bitwise\n m = l + ((r - l) >> 1);\n comp = compare(arr[m]);\n\n if (comp < 0) {\n // arr[m] comes before the element\n l = m + 1;\n } else if (comp > 0) {\n // arr[m] comes after the element\n r = m - 1;\n } else {\n return m;\n }\n }\n\n return l - 1; // return the index of the next left item\n // usually you would just return -1 in case nothing is found\n}\n\nconst Viewport = function() {\n this.current = null;\n};\n\nViewport.prototype = {\n labels: [\n 'tiny', 'tiny-small', 'tiny-small-medium',\n 'tiny-small-medium-big', 'tiny-small-medium-big-web', 'tiny-small-medium-big-web-wide'\n ],\n sizes: [0, 480, 640, 768, 1024, 1200],\n\n /**\n * Update player viewport which is not equal to browser wiewport\n *\n * @param width\n */\n update: function(width) {\n const newIndex = binarySearch(this.sizes, x => x - width);\n\n if (this.current !== newIndex) {\n const newBreakpoint = this.getViewportByIndex(newIndex);\n const currentBreakpoint = this.getViewportByIndex(this.current);\n\n this.trigger('change', newBreakpoint, currentBreakpoint);\n\n this.current = newIndex;\n }\n },\n\n getViewportByIndex: function(index) {\n return {\n width: this.sizes[index],\n label: this.labels[index]\n };\n }\n};\n\nutils.extend(Viewport.prototype, Events);\n\nexport default Viewport;\n","/* eslint-disable max-len */\n\nimport utils from 'utils/utils';\nimport playIcon from 'icons/play.svg';\nimport pauseIcon from 'icons/pause.svg';\nimport audioIcon from 'icons/audio.svg';\nimport audioMuted from 'icons/audio-muted.svg';\nimport homad from './homad-lib';\n\nfunction getAdPotTag(offset, adschedule) {\n const keys = Object.keys(adschedule);\n let tag = null;\n\n utils.each(keys, function (key) {\n if (key.indexOf(offset) > -1) {\n // eslint-disable-next-line prefer-destructuring\n tag = adschedule[key].tag;\n }\n });\n\n return tag;\n}\n\nfunction getTagUrl(potOffset) {\n return function (player) {\n const playlistItem = player.getPlaylist()[0];\n let tag = false;\n\n if (playlistItem.adschedule) {\n tag = getAdPotTag(potOffset, playlistItem.adschedule);\n }\n\n if (tag) {\n tag = tag.replace('vmap', 'ssvmap');\n } else {\n tag = false;\n }\n\n return tag;\n };\n}\n\n\nconst conf = {\n globalConfig: 'https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json',\n clientConfig: '/homad-config.json',\n admessage: function (data) {\n const player = data && data.player;\n let message = 'The ad will end in [time] seconds';\n\n // eslint-disable-next-line no-underscore-dangle\n if (player.__svp__locale) {\n // eslint-disable-next-line no-underscore-dangle\n message = player.__svp__locale.translate('adblock').admessage;\n }\n\n return message;\n },\n skipable: true,\n skipAdOnContextChange: true,\n runInsideContainer: true,\n adjustAdVolumeToContentPlayer: true,\n postrollUseCompleteEvent: true,\n onReady: function () {\n },\n muteButton: (function () {\n return `
${audioIcon}
`;\n }()),\n unmuteButton: (function () {\n return `
${audioMuted}
`;\n }()),\n playButton: (function () {\n return `
${playIcon}
`;\n }()),\n pauseButton: (function () {\n return `
${pauseIcon}
`;\n }()),\n skipableButton: (function () {\n return `
\n Skip ad in [time]\n \n \n \n
`;\n }()),\n skipButton: (function () {\n return `
\n Skip\n \n
`;\n }()),\n 'innerWarpper.style': '',\n prerollAdTag: getTagUrl('pre'),\n midrollAdTag: getTagUrl('mid'),\n postrollAdTag: getTagUrl('post')\n};\n\n /**\n * Homad AAB ads have single event bus for all players\n *\n * @param event\n */\nfunction parseHomadEvent(event) {\n // homad event details are under detils property\n const details = event && event.detail;\n\n // skip parsing when there is missing data or player is not registered\n if (!details || !this.events[details.containerId]) {\n return;\n }\n\n this.events[details.containerId].trigger(details.name, details);\n}\n\nexport default utils.extend({\n // events hashmap playerId -> eventBus\n // each player has its own events bus\n events: {},\n initialize: function () {\n const SvpPlayer = window.SVP.Player;\n\n if (!SvpPlayer.isHomadLoaded) {\n SvpPlayer.isHomadLoaded = true;\n\n // override aab config url\n if (SvpPlayer.defaults.aabConfig) {\n conf.clientConfig = SvpPlayer.defaults.aabConfig;\n }\n\n homad(conf);\n\n window.addEventListener('hdEvent', parseHomadEvent.bind(this));\n }\n },\n\n /**\n * Get events for specific player\n * Events are matched by player id\n *\n * @param playerId\n * @returns {*}\n */\n getEvents: function (playerId) {\n // create event bus for specific player if this doesn't exist\n if (!this.events[playerId]) {\n this.events[playerId] = utils.extend({}, utils.Events);\n }\n\n return this.events[playerId];\n },\n\n /**\n * Remove player events from messaging bus\n * Prevents memory leaks\n *\n * @param playerId\n */\n removeEvents: function (playerId) {\n if (this.events[playerId]) {\n this.events[playerId].off();\n this.events[playerId].stopListening();\n\n this.events[playerId] = null;\n delete this.events[playerId];\n }\n }\n}, utils.Events);\n","/* global SVP */\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport HomadAds from './homad';\n/**\n * Get Ad Player from player container\n *\n * @param parent\n * @param cb\n */\nfunction getAdPlayer(parent, cb) {\n const observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(mutation) {\n if (mutation.type === 'childList') {\n const nodes = mutation.addedNodes;\n\n if (nodes && nodes[0]) {\n const video = nodes[0].querySelector('video');\n\n if (video) {\n cb(video, nodes[0]);\n }\n }\n }\n });\n });\n\n // pass in the target node, as well as the observer options\n observer.observe(parent, {\n attributes: false,\n childList: true,\n characterData: false\n });\n}\n\n/**\n * Initialize ad player\n *\n * @param player\n * @returns {Function}\n */\nfunction initializeAdPlayer(player) {\n /**\n * Called every time ad video player is shown\n */\n return function (adPlayer, adPlayerContainer) {\n adPlayerContainer.classList.add('svp-homad-player');\n player.getContainer().classList.remove('jw-state-buffering');\n };\n}\n\nfunction onAdError() {\n const jw = this.player;\n const container = this.getContainer();\n\n // just to be sure\n this.once('adStarted', function () {\n this.adPlayerLoading = false;\n }, this);\n\n this.once('adSlotComplete', function () {\n container.classList.remove('svp-homad-loading');\n }, this);\n\n this.listenToOnce(jw, 'play', function () {\n this.adPlayerLoading = true;\n }, this);\n\n this.listenToOnce(jw, 'pause', function (options) {\n // first external pause is triggered by homad\n // this equals to ad tag loaded and parsed\n if (options && options.pauseReason === 'external') {\n this.adPlayerLoading = false;\n }\n }, this);\n}\n\nfunction onAdBreakStart(data) {\n const duration = this.getDuration();\n const currentTime = this.getCurrentTime();\n const container = this.getContainer();\n\n // homad has strange constraints for midroll\n if ((data && data.adposition !== 'mid') || (currentTime > 30 && duration - currentTime > 30)) {\n container.classList.add('svp-homad-loading');\n\n // clean loading in case of any error\n setTimeout(function () {\n container.classList.remove('svp-homad-loading');\n }, 5000);\n }\n}\n\n/**\n * Forward events which are the same\n * @param eventName\n */\nfunction forwardEvent(eventName) {\n this.listenTo(this.events, eventName, function () {\n // trigger ad events only while ads are playing\n if (this.adPlaying === true) {\n // clear event data\n this.trigger(eventName);\n }\n }, this);\n}\n\nfunction onReady() {\n if (!this.getAdBlock() || SVP.Player.defaults.aab !== true) {\n return;\n }\n\n // events are matched by player id\n const playerId = this.config.get('node');\n\n this.events = HomadAds.getEvents(playerId);\n\n this.listenTo(this.events, 'contentPlayerPlay', function () {\n this.getContainer().classList.remove('svp-homad-loading');\n }, this);\n\n this.listenTo(this.events, 'all', function (event, data) {\n logger('AAB').log(event, data);\n }, this);\n\n this.listenTo(this.events, 'adStart', function (data) {\n this.adPosition = data.state;\n\n if (this.adPlaying === false) {\n // just to make sure that preloading state has ended\n this.getContainer().classList.remove('svp-homad-loading');\n\n this.trigger('adSlotStart', {\n position: this.adPosition\n });\n\n this.adPlaying = true;\n\n this.trigger('adStarted');\n }\n }, this);\n\n this.listenTo(this.events, 'continueContent', function () {\n if (this.adPlaying === true) {\n this.trigger('adSlotComplete', {\n position: this.adPosition\n });\n\n this.adPlaying = false;\n }\n });\n\n this.listenTo(this.events, 'adTime', function (data) {\n if (data.currentTime && this.adPlaying) {\n this.trigger('adProgress', data.currentTime, data.duration);\n }\n }, this);\n\n this.listenTo(this.events, 'adMeta', function (data) {\n if (data) {\n this.trigger('adData', {\n adId: data.adId || null,\n impression: data.impressionURL || null\n });\n }\n }, this);\n\n utils.each(['adComplete', 'adSkipped', 'adPause', 'adPlay'], forwardEvent.bind(this));\n\n // cleanup events\n this.once('remove', HomadAds.removeEvents.bind(HomadAds, playerId));\n\n this.listenTo(this.player, 'adError', onAdError.bind(this));\n this.listenTo(this.player, 'adBreakStart', onAdBreakStart.bind(this));\n\n getAdPlayer(this.getContainer(), initializeAdPlayer(this));\n}\n\nexport default function (Player) {\n const { setup } = Player.prototype;\n\n // anti adblock works only for desktops\n if (!utils.device.isDesktop()) {\n return Player;\n }\n\n /**\n * Proxy player method\n * Call source when adblock is not present\n *\n * @param name\n * @param cb\n */\n function proxyMethod(name, cb) {\n const sourceMethod = Player.prototype[name];\n\n Player.prototype[name] = function () {\n const args = Array.prototype.slice.call(arguments);\n\n if (this.getAdBlock() === false || SVP.Player.defaults.aab !== true) {\n return sourceMethod.apply(this, args);\n }\n\n return cb.call(this, sourceMethod, args);\n };\n }\n\n Player.prototype.setup = function () {\n this.once('ready', onReady);\n return setup.call(this);\n };\n\n\n proxyMethod('onFirstFrameLoad', function (onFirstFrameLoad) {\n this.player.once('play', function () {\n this.player.once('providerFirstFrame', onFirstFrameLoad, this);\n }, this);\n });\n\n proxyMethod('onTime', function (onTime, args) {\n if (!this.adPlaying && this.adPlayerLoading === false) {\n onTime.apply(this, args);\n }\n });\n\n // eslint-disable-next-line consistent-return\n proxyMethod('onPlay', function (onPlay, args) {\n if (this.adPlayerLoading === false) {\n return onPlay.apply(this, args);\n }\n });\n\n //\n proxyMethod('onPause', function (onPause, args) {\n if (this.adPlaying === false && this.adPlayerLoading === false) {\n onPause.apply(this, args);\n }\n });\n\n proxyMethod('onComplete', function (onComplete, args) {\n if (this.adPlaying === false && this.adPlayerLoading === false) {\n onComplete.apply(this, args);\n } else {\n this.listenToOnce(this.events, 'continueContent', function () {\n onComplete.apply(this, args);\n }, this);\n }\n });\n\n return Player;\n}\n","import utils from 'utils/utils';\n/**\n * Check if preroll is scheduled in configuration\n *\n * @param config\n * @returns {boolean}\n */\nfunction hasPreroll(config) {\n const playlistItem = config && config.playlist[0];\n let result = false;\n\n if (playlistItem.adschedule) {\n utils.each(playlistItem.adschedule, function (slot) {\n if (slot && slot.offset === 'pre') {\n result = true;\n }\n });\n }\n\n return result;\n}\n\n/**\n * Check if given stream can be autoplayed\n * Rules for autoplay depends on device but also on flags given to playback\n *\n * @deprecated new autoplay policies require starting of video to detect if autoplay will work\n * @param config - JW Configuration\n * @returns {boolean}\n */\nfunction canAutoplay(config) {\n var canDeviceAutoplay = utils.device.canAutoplay();\n\n // enable autoplay for devices with disabled ads and at least muted autoplay ability ios10\n var result = (canDeviceAutoplay === 'always');\n\n if (canDeviceAutoplay === 'muted' && !hasPreroll(config)) {\n result = true;\n }\n\n return result;\n}\n\nexport default {\n canAutoplay: canAutoplay\n};\n","/* eslint-disable */\n\nimport utils from 'utils/utils';\nimport audio from 'icons/audio.svg';\nimport audioMuted from 'icons/audio-muted.svg';\nimport audioHalf from 'icons/audio-half.svg';\nimport backwardSec from 'icons/backward-sec.svg';\nimport captions from 'icons/captions.svg';\nimport chevronRight from 'icons/chevron-right.svg';\nimport close from 'icons/close.svg';\nimport embed from 'icons/embed.svg';\nimport forwardSec from 'icons/forward-sec.svg';\nimport fullscreenOff from 'icons/fullscreen-off.svg';\nimport fullscreenOn from 'icons/fullscreen-on.svg';\nimport gallery from 'icons/gallery.svg';\nimport info from 'icons/info.svg';\nimport link from 'icons/link.svg';\nimport pause from 'icons/pause.svg';\nimport play from 'icons/play.svg';\nimport playBackward from 'icons/play-backward.svg';\nimport playForward from 'icons/play-forward.svg';\nimport playNext from 'icons/play-next.svg';\nimport playlist from 'icons/playlist.svg';\nimport quality from 'icons/quality.svg';\nimport replay from 'icons/replay.svg';\nimport settings from 'icons/settings.svg';\nimport share from 'icons/share.svg';\n\nconst iconsMap = {\n '.jw-svg-icon-play': play,\n '.jw-svg-icon-pause': pause,\n '.jw-skip-icon .jw-svg-icon-next': chevronRight,\n '.jw-svg-icon-settings': settings,\n '.jw-svg-icon-sharing': share,\n\n '.jw-svg-icon-cc-on': captions,\n '.jw-svg-icon-cc-off': captions,\n\n '.jw-svg-icon-volume-0': audioMuted,\n '.jw-svg-icon-volume-50': audioHalf,\n '.jw-svg-icon-volume-100': audio,\n\n '.jw-svg-icon-fullscreen-on': fullscreenOn,\n '.jw-svg-icon-fullscreen-off': fullscreenOff\n};\n\nexport default function () {\n const container = this.getContainer();\n\n utils.each(iconsMap, (customIcon, selector) => {\n const icons = Array.prototype.slice.call(container.querySelectorAll(selector));\n\n if (icons.length > 0) {\n utils.each(icons, icon => {\n if (icon) {\n const svpIcon = utils.createNode(customIcon);\n svpIcon.setAttribute('class', icon.getAttribute('class'));\n icon.parentNode.replaceChild(svpIcon, icon);\n }\n });\n }\n });\n}\n","/* globals jwplayer,console */\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport Viewport from './viewport';\nimport HomadAdsJw from './ads/homad-jw';\nimport autoplay from './config/autoplay';\nimport svpSkin from './skin';\n\nconst PlayerModel = function (config) {\n /**\n * JW Player instance\n * @type {null}\n */\n this.player = null;\n this.stream = null;\n this.locale = null;\n\n this.config = config;\n\n this.isInitalized = false;\n\n /**\n * Current playlist item\n *\n * @type {null}\n */\n this.playlistItem = null;\n\n /**\n * Current time holder for seek and seeked events\n * Fix for JW getPosition bug\n * @type {null}\n */\n this.currentTime = null;\n\n /**\n * Breakpoints for visuals\n * @type {{xsmall: number, small: number, medium: number, big: number, web: number, webWide: number}}\n */\n this.viewport = new Viewport();\n this.listenTo(this.viewport, 'change', this.onViewportChange, this);\n\n\n /**\n * Indicates if ads are currently playing\n * @type {boolean}\n */\n this.adPlaying = false;\n\n /**\n * Adposition\n *\n * @type {null} preroll|midroll|postroll\n */\n this.adPosition = null;\n};\n\n /**\n * Forward JW Events without any change of them as they fits our needs\n *\n * List of proxied events\n * 'play', 'pause'\n *\n * @param event\n */\nfunction forwardEvent(event) {\n this.listenTo(this.player, event, this.trigger.bind(this, event));\n}\n\n/**\n * Simple proxy for JW Methods\n *\n * @param method\n * @returns {Function}\n */\nfunction bindJwMethod(method) {\n return function () {\n const args = Array.prototype.slice.call(arguments);\n\n if (!this.player) {\n // eslint-disable-next-line no-console\n console.warn(`Method ${method} called before player has been initialised`);\n return null;\n }\n\n return this.player[method].apply(this, args);\n };\n}\n\n/**\n * Proxy methods from JW\n */\nfunction forwardMethods(methods) {\n const forwardedMethods = {};\n\n utils.each(methods, function (method) {\n forwardedMethods[method] = bindJwMethod.call(this, method);\n }, this);\n\n return forwardedMethods;\n}\n\nfunction getAdPosition(slotId) {\n const slotKeys = { pre: 'preroll', mid: 'midroll', post: 'postroll' };\n\n return slotKeys[slotId];\n}\n\n/**\n * Parse adresponse for each adslot\n *\n * @param xml\n */\nfunction parseAdData(data) {\n const { sequence } = data;\n const xml = data && data.response;\n\n let source = 'WRAPPER';\n let adSelector = 'Ad';\n let adData = null;\n\n if (xml) {\n // only when additional data is given we set source to appnexus\n if (xml.URL === data.tag) {\n source = 'INLINE';\n adSelector = `Ad[sequence=\"${sequence}\"]`;\n }\n\n adData = Array.prototype.slice.call(xml.querySelectorAll(adSelector));\n // get first element if available\n adData = adData && adData[0] ? adData[0] : null;\n }\n\n return {\n sequence: sequence,\n count: data.podcount,\n raw: adData,\n source: source\n };\n}\n\n/**\n * Initialize playback end method\n * Clear after each completion of stream or playbackEnd reached\n *\n * @param playbackEnd\n */\nfunction onPlaybackEndAvailable(playbackEnd) {\n const onTime = position => {\n if (position > playbackEnd) { //\n this.trigger('playbackEnd', Math.round(position));\n }\n };\n\n this.on('time', onTime);\n\n this.once('playbackEnd complete', function() {\n this.off('time', onTime);\n });\n}\n\n/**\n * Extended ready event with info about device autoplay ability\n * @param data\n */\nfunction onReady(options, eventData) {\n const container = this.getContainer();\n\n container.querySelector('.jw-controlbar .jw-button-container').addEventListener('click', event => {\n const { target } = event;\n\n // eslint-disable-next-line no-console\n if (target.classList.contains('jw-settings-submenu-button') || target.classList.contains('jw-settings-sharing')) {\n const submenu = container.querySelector('.jw-settings-menu');\n\n // eslint-disable-next-line max-len\n const right = Math.round((container.offsetWidth - (target.offsetLeft + target.offsetWidth / 2)) - submenu.offsetWidth / 2);\n\n submenu.style.right = `${right}px`;\n }\n });\n\n this.trigger('ready', utils.extend(options, eventData));\n}\n\nPlayerModel.prototype = {\n initialize: function () {\n this.player = jwplayer(this.config.get('node'));\n\n // eslint-disable-next-line no-underscore-dangle\n this.player.__svp__locale = this.locale;\n\n this.trigger('initialize');\n },\n\n setup: function() {\n this.initialize();\n\n // player could not be setup\n if (!this.player.setup) {\n // eslint-disable-next-line no-console\n console.error(`SVP Player initialization error. DOM ${this.config.get('node')} not found`);\n return;\n }\n\n this.getConfig().then(config => {\n // speedup lookup\n const { player } = this;\n\n player.setup(config);\n\n logger('JW').log('config', config);\n\n this.listenToOnce(player, 'playlist', svpSkin);\n\n // forward native JW events without changing their behaviour\n utils.each(['seek', 'displayClick', 'captionsChanged', 'adPause',\n 'adPlay', 'autostartNotAllowed'], forwardEvent, this);\n\n this.listenTo(player, 'error setupError', this.onError, this);\n this.listenTo(player, 'playlistItem', this.onPlaylistItemLoad, this);\n\n this.listenTo(player, 'play', this.onPlay, this);\n this.listenTo(player, 'pause', this.onPause, this);\n this.listenTo(player, 'complete', this.onComplete, this);\n this.listenTo(player, 'ready', onReady.bind(this, {\n canAutoplay: autoplay.canAutoplay(config)\n }));\n\n this.listenTo(player, 'time', this.onTime, this);\n this.listenTo(player, 'resize', this.onPlayerResize, this);\n\n this.listenTo(player, 'meta', this.onMeta, this);\n\n this.listenTo(player, 'seek', function(data) {\n this.currentTime = data.offset;\n }, this);\n this.listenTo(player, 'seeked', function() {\n this.trigger('seeked', this.currentTime);\n // clearing has to occur after seekend event as getCurrentTime needs it\n this.currentTime = null;\n }, this);\n\n this.listenTo(player, 'ready', function () {\n const youbora = player.getPlugin('sp.min');\n\n if (youbora) {\n this.listenTo(player, 'adSlotStart', () => {\n youbora.ignoringAdHandler();\n }, this);\n\n this.listenTo(player, 'adSlotComplete', () => {\n youbora.ignoredAdHandler();\n }, this);\n }\n }, this);\n\n // 'restart' stream only when flash has been blocked\n this.once('flashBlocked', function() {\n this.listenTo(player, 'providerChanged', this.play, this);\n }, this);\n\n this.once('initialPlay', function () {\n this.listenToOnce(player, 'captionsList', function () {\n this.trigger('captionsList', this.getCaptionsList());\n }, this);\n }, this);\n\n\n this.listenTo(player, 'adImpression', function (data) {\n if (data && data.adposition) {\n this.adPosition = getAdPosition(data.adposition);\n }\n\n if (this.adPlaying === false) {\n this.trigger('adSlotStart', {\n position: this.adPosition,\n response: data && data.response\n });\n\n this.adPlaying = true;\n }\n\n this.trigger('adStarted');\n\n if (data && data.response) {\n this.trigger('adData', parseAdData(data));\n }\n }, this);\n\n this.listenTo(player, 'adError', function (data) {\n if (data && data.adposition) {\n this.adPosition = getAdPosition(data.adposition);\n }\n }, this);\n\n this.listenTo(player, 'adTime', function (data) {\n if (data.position && data.duration) {\n this.trigger('adProgress', data.position, data.duration);\n }\n }, this);\n\n this.on('adSlotStart', function () {\n this.listenToOnce(player, 'adBreakEnd', function () {\n if (this.adPlaying === true) {\n this.trigger('adSlotComplete', {\n position: this.adPosition\n });\n\n this.adPlaying = false;\n }\n }, this);\n }, this);\n\n this.listenTo(player, 'adSkipped', function () {\n this.trigger('adSkipped');\n }, this);\n\n this.listenTo(player, 'adComplete', function () {\n this.trigger('adFinished');\n }, this);\n\n this.isInitalized = true;\n\n logger('JW').log(log => {\n this.listenTo(player, 'all', function (event) {\n if (['bufferChange'].indexOf(event) < 0) {\n log(event, Array.prototype.slice.call(arguments, 1));\n }\n });\n });\n\n this.trigger('setup');\n });\n },\n\n playNext: function(stream) {\n // clear time\n this.stream = stream;\n\n this.complete('playNext');\n\n if (!this.isInitalized) {\n this.setup();\n } else {\n this.getConfig(stream).then(config => {\n this.player.load(config.playlist);\n\n // stream is not available yet, display countdown\n if (stream.getTimeToStart() < 0) {\n // enable autoplay if stream is not available\n this.player.play(true);\n } else {\n this.player.stop();\n }\n });\n }\n },\n\n /**\n * Immediately completes currently playing stream\n */\n complete: function() {\n this.adPlaying = false;\n\n // trigger complete event only when stream is not finished to prevent double 'complete' event triggering\n if (this.getCurrentTime() > 0 && this.getCurrentTime() !== this.getDuration()) {\n this.trigger('complete');\n }\n },\n\n /**\n * Get DOM Node where player is inserted\n * @returns {*}\n */\n getContainer: function() {\n return this.player.getContainer();\n },\n\n /**\n * Get playback volume\n * @returns {*}\n */\n getVolume: function() {\n return this.player.getVolume();\n },\n\n /**\n * Set playback volume\n * @param volume\n */\n setVolume: function(volume) {\n this.player.setVolume(volume);\n },\n\n /**\n * Seek\n * TODO ADD tests\n */\n seek: function(time) {\n // flash bug - player is not seeking when stream hasn't started playing\n if (this.getCurrentTime() === 0) {\n // start stream only it's not playing\n // move this to play method?\n if (this.player.getState() !== 'playing') {\n this.play();\n }\n\n this.once('assetPlay', this.player.seek.bind(this.player, time));\n } else {\n this.player.seek(time);\n }\n },\n\n /**\n * Get player config. Method is asynchronous due to loading info from api\n *\n * @param stream\n */\n getConfig: function(stream) {\n stream = stream || this.getStream();\n\n return this.config\n .getJwConfig(stream)\n .catch(reason => {\n this.trigger('error', reason);\n });\n },\n\n /**\n * Set stream data\n *\n * @param stream\n */\n setStream: function(stream) {\n this.stream = stream;\n },\n\n /**\n * Get current stream loaded with player\n *\n * @returns {null|Stream|*}\n */\n getStream: function() {\n return this.stream;\n },\n\n setLocale: function (locale) {\n this.locale = locale;\n },\n\n /**\n * Check is ad is playing or not\n */\n isAdPlaying: function () {\n return this.adPlaying;\n },\n\n /**\n * Load given stream\n * Perform all required checks before stream playback\n *\n * @returns {Promise}\n */\n loadStream: function () {\n return new Promise(resolve => {\n // for lazy loaded player\n if (!this.isInitalized) {\n this.setup();\n this.player.on('ready', resolve);\n } else {\n resolve();\n }\n });\n },\n\n /**\n * Play stream\n */\n play: function() {\n // ensure stream is loaded properly\n this.loadStream()\n .then(this.player.play.bind(this.player));\n },\n\n /**\n * Pause stream\n * @param force state\n */\n pause: function(force) {\n this.player.pause(force);\n },\n\n /**\n * Destroy the player instance, reset DOM, clean up listeners\n */\n remove: function() {\n if (this.player) {\n this.pause(true);\n\n // TODO remove antiadblock on remove?\n this.player.remove();\n\n this.trigger('remove');\n }\n },\n\n /**\n * Get stream duration\n *\n * @returns {*}\n */\n getDuration: function() {\n const duration = this.player.getDuration();\n\n if (duration < 0) {\n return -duration;\n }\n\n return duration;\n },\n\n /**\n * Get current playback time\n *\n * @returns {*}\n */\n getCurrentTime: function() {\n let { currentTime } = this;\n\n if (currentTime) {\n return currentTime;\n }\n\n currentTime = this.player.getPosition();\n\n if (currentTime < 0) {\n return (this.getDuration() + currentTime);\n }\n\n return this.player.getPosition();\n },\n\n getState: function() {\n if (this.isAdPlaying()) {\n return 'adPlaying';\n }\n\n return this.player.getState();\n },\n\n // eslint-disable-next-line consistent-return\n getAdBlock: function () {\n if (this.player) {\n return this.player.getAdBlock();\n }\n },\n\n /**\n * Get poster for current stream\n * Poster may be changed in config\n *\n * @returns {*}\n */\n getPoster: function(stream, container) {\n return this.config.getPoster(stream, container);\n },\n\n /**\n *\n * Get playback mode\n *\n * @returns {*}\n */\n getProvider: function() {\n const provider = this.player.getProvider();\n\n if (provider && provider.name === 'flash') {\n return 'flash';\n }\n\n return 'html5';\n },\n\n /**\n * Get list of captions extended by data from api\n *\n * @returns {*}\n */\n getCaptionsList: function () {\n const playerCaptions = this.player.getCaptionsList();\n const captions = this.getStream().getCaptions();\n\n // merge player captions data with result from api\n utils.each(playerCaptions, caption => {\n utils.each(captions, item => {\n if (caption.id === item.url) {\n caption.language = item.language;\n caption.default = item.default;\n }\n });\n });\n\n return playerCaptions;\n },\n\n /**\n * Set current captions\n * @param index (number|string) - string is language key, number is index in array\n */\n setCurrentCaptions: function (index) {\n if (!utils.isNumber(index)) {\n utils.each(this.getCaptionsList(), (caption, captionsIndex) => {\n if (caption && caption.language === index) {\n index = captionsIndex;\n }\n });\n\n // fallback to off in case index is not found in captions array\n if (!utils.isNumber(index)) {\n index = 0;\n }\n }\n\n // set captions in player\n this.player.setCurrentCaptions(index);\n },\n\n /**\n * Handle all errors from player\n */\n onError: function (data) {\n const code = data.code;\n const message = data.message ? data.message.toString() : '';\n\n if (message === 'Casting failed to load') {\n // omit JW error when chrome casting is disabled\n return;\n }\n\n if (code === 210002) {\n // Flash plugin failed to load\n // click to play\n this.pause();\n this.trigger('flashBlocked');\n return;\n }\n\n this.trigger('error', {\n message,\n code\n });\n },\n\n /**\n * Event triggered before first stream play\n * Useful for statistics\n */\n onPlaylistItemLoad: function (playlistItem) {\n const container = this.getContainer();\n let playbackEndTime = null;\n\n if (!this.playlistItem || this.playlistItem.file !== playlistItem.item.file) {\n playbackEndTime = this.stream.getPlaybackTime('end');\n\n // cleanup any previous beforePlay event (playnext after countdown or error)\n this.stopListening(this.player, 'beforePlay');\n\n if (!this.playlistItem || this.playlistItem.id !== playlistItem.item.id) {\n // trigger this event every time new playlist item is loaded\n this.listenToOnce(this.player, 'beforePlay', function() {\n if (this.stream.getTimeToStart() < 0) {\n this.trigger('initialPlay');\n }\n }, this);\n\n // ads should not if stream has future start time\n // attach event only for secure streams\n if (this.stream.isSecure()) {\n // reload playlist only if token expired\n // play method do this out of the box\n this.listenToOnce(this.player, 'displayClick', function() {\n if (!this.config.hasValidToken() && this.player.getState() !== 'playing') {\n this.play();\n }\n }, this);\n }\n\n this.trigger('playlistItem', playlistItem.item);\n\n // handle ads only playback\n // class name is scrambled to avoid adblockers\n if (this.stream.getVendor() === 'appnexus') {\n utils.addClass(container, 'svp-appnxs');\n } else {\n utils.removeClass(container, 'svp-appnxs');\n }\n\n // clear ad playing flag for current content\n // important when changing stream while adslot is playing\n this.adPlaying = false;\n\n this.listenToOnce(this.player, 'firstFrame', this.onFirstFrameLoad, this);\n\n this.listenToOnce(this.player, 'levels', data => {\n const icon = container.querySelector('.jw-icon-settings');\n\n if (icon) {\n icon.style.display = '';\n\n // hide settings icon when there is only one level available\n // usually this is a case for iOS or when hls has limited bitrate\n if (data && data.levels && data.levels.length === 1) {\n icon.style.display = 'none';\n }\n }\n }, this);\n }\n\n this.playlistItem = playlistItem.item;\n\n // attach playback listener\n if (playbackEndTime > 0) {\n onPlaybackEndAvailable.call(this, playbackEndTime);\n }\n }\n },\n\n /**\n * Time\n *\n * @param data.position - current playback time\n * @param data.duration - current stream duration\n */\n onTime: function(data) {\n if (data.position < 0) {\n this.trigger('time', -(data.duration - data.position), -(data.duration));\n } else {\n this.trigger('time', data.position, data.duration);\n }\n },\n\n /**\n * Triggered after preroll ad slot and with\n */\n onFirstFrameLoad: function() {\n // first play of stream\n const startTime = this.stream.getPlaybackTime('begin') || 0;\n\n // seek stream if play ahead time is set\n if (startTime) {\n this.seek(startTime);\n }\n\n this.once('time', this.trigger.bind(this, 'assetPlay', startTime));\n },\n\n /**\n * Handler for checking player size\n */\n onPlayerResize: function(data) {\n this.viewport.update(data.width);\n },\n\n onViewportChange: function(currentViewport, previousViewport) {\n // remove current class from container if it exist\n if (previousViewport.label) {\n utils.removeClass(this.getContainer(), `svp-viewport-${previousViewport.label}`);\n }\n\n utils.addClass(this.getContainer(), `svp-viewport-${currentViewport.label}`);\n\n this.trigger('viewport', currentViewport, previousViewport);\n },\n\n onMeta: function (data) {\n const params = data.metadata && data.metadata.TXXX && data.metadata.TXXX.name;\n\n if (params) {\n // place_categoryId_slotDuration_slotFetchTime\n if (params.indexOf('fetch') > -1) {\n const slotDuration = parseInt(params.split('_')[2], 10);\n\n if (slotDuration) {\n this.config.getLiveMidrollTag(slotDuration).then(adTag => {\n // adjust position on lives to be always negative\n const position = -(Math.abs(this.player.getPosition()));\n\n if (adTag) {\n this.once('adSlotComplete', function () {\n this.listenToOnce(this.player, 'providerFirstFrame', function () {\n this.player.seek(position);\n }, this);\n }, this);\n\n this.player.playAd(adTag);\n }\n });\n }\n } else if (params.indexOf('cancel') > -1) {\n this.player.skipAd();\n }\n }\n },\n\n onPlay: function(data) {\n this.trigger('play', {\n playReason: data.playReason\n });\n },\n onPause: function(data) {\n utils.removeClass(this.getContainer(), 'jw-state-buffering');\n\n this.trigger('pause', data);\n },\n\n /**\n * Correct event flow for end of streaming\n */\n onComplete: function() {\n // wait until postroll will finish\n this.trigger('complete');\n }\n};\n\n/**\n * Extend player with events\n * Add methods from JW which are used without any rewriting\n */\nutils.extend(PlayerModel.prototype, utils.Events, forwardMethods.call(PlayerModel.prototype, [\n 'getCurrentCaptions', 'setCaptionsStyles'\n]));\n\n/* jshint newcap: false */\nexport default HomadAdsJw(PlayerModel);\n","/**\n * @type {Blob}\n */\n// eslint-disable-next-line max-len\nvar VIDEO = new Blob([new Uint8Array([0, 0, 0, 28, 102, 116, 121, 112, 105, 115, 111, 109, 0, 0, 2, 0, 105, 115, 111, 109, 105, 115, 111, 50, 109, 112, 52, 49, 0, 0, 0, 8, 102, 114, 101, 101, 0, 0, 2, 239, 109, 100, 97, 116, 33, 16, 5, 32, 164, 27, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 33, 16, 5, 32, 164, 27, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 167, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 2, 194, 109, 111, 111, 118, 0, 0, 0, 108, 109, 118, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 232, 0, 0, 0, 47, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 236, 116, 114, 97, 107, 0, 0, 0, 92, 116, 107, 104, 100, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 101, 100, 116, 115, 0, 0, 0, 28, 101, 108, 115, 116, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 47, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 100, 109, 100, 105, 97, 0, 0, 0, 32, 109, 100, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 68, 0, 0, 8, 0, 85, 196, 0, 0, 0, 0, 0, 45, 104, 100, 108, 114, 0, 0, 0, 0, 0, 0, 0, 0, 115, 111, 117, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 111, 117, 110, 100, 72, 97, 110, 100, 108, 101, 114, 0, 0, 0, 1, 15, 109, 105, 110, 102, 0, 0, 0, 16, 115, 109, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 100, 105, 110, 102, 0, 0, 0, 28, 100, 114, 101, 102, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 117, 114, 108, 32, 0, 0, 0, 1, 0, 0, 0, 211, 115, 116, 98, 108, 0, 0, 0, 103, 115, 116, 115, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 87, 109, 112, 52, 97, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 16, 0, 0, 0, 0, 172, 68, 0, 0, 0, 0, 0, 51, 101, 115, 100, 115, 0, 0, 0, 0, 3, 128, 128, 128, 34, 0, 2, 0, 4, 128, 128, 128, 20, 64, 21, 0, 0, 0, 0, 1, 244, 0, 0, 1, 243, 249, 5, 128, 128, 128, 2, 18, 16, 6, 128, 128, 128, 1, 2, 0, 0, 0, 24, 115, 116, 116, 115, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, 28, 115, 116, 115, 99, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 28, 115, 116, 115, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 115, 0, 0, 1, 116, 0, 0, 0, 20, 115, 116, 99, 111, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 44, 0, 0, 0, 98, 117, 100, 116, 97, 0, 0, 0, 90, 109, 101, 116, 97, 0, 0, 0, 0, 0, 0, 0, 33, 104, 100, 108, 114, 0, 0, 0, 0, 0, 0, 0, 0, 109, 100, 105, 114, 97, 112, 112, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 105, 108, 115, 116, 0, 0, 0, 37, 169, 116, 111, 111, 0, 0, 0, 29, 100, 97, 116, 97, 0, 0, 0, 1, 0, 0, 0, 0, 76, 97, 118, 102, 53, 54, 46, 52, 48, 46, 49, 48, 49])], { type: 'video/mp4' });\n\nexport default function () {\n return {\n id: 1,\n status: 'active',\n streamUrls: {\n hls: URL.createObjectURL(VIDEO)\n },\n\n images: {\n main: null\n },\n\n streamConfiguration: {\n properties: []\n }\n };\n}\n","import utils from 'utils/utils';\n\nconst PluginModel = function() {\n this.player = null;\n this.el = null;\n};\n\nPluginModel.prototype = {\n getName: function() {\n throw new Error('getName() method has to be implemented');\n },\n\n setup: function() {},\n destroy: function() {},\n\n setPlayer: function(player) {\n this.player = player;\n this.setup(player);\n }\n};\n\nPluginModel.extend = utils.model.extend;\n\nutils.extend(PluginModel.prototype, utils.Events);\n\nexport default PluginModel;\n","/* global console */\nimport utils from 'utils/utils';\nimport PluginModel from 'player/plugins/model';\n\nconst Plugins = (function() {\n const plugins = {};\n const pluginsRepo = 'http://localhost:3000/plugins/';\n\n const PluginsLoader = function(options) {\n // no plugins provided, complete immediately\n if (!options) {\n // timeout for proper event listener fire\n setTimeout(this.trigger.bind(this, 'complete'), 300);\n return;\n }\n const scripts = Object.keys(options);\n let queueLen = scripts.length;\n\n function onResponse(plugin, status) {\n queueLen -= 1;\n\n if (status === 'error') {\n // eslint-disable-next-line no-console\n console.error(`An error occur while loading ${plugin}`);\n }\n // plugins are loaded when all requests from batch have been finished\n if (queueLen === 0) {\n this.trigger('complete');\n }\n }\n\n function getPluginSrc(plugin) {\n if (plugin.indexOf('http') > -1) {\n return plugin;\n }\n\n return pluginsRepo + plugin;\n }\n\n utils.each(scripts, function(plugin) {\n const pluginSrc = getPluginSrc(plugin);\n\n // eslint-disable-next-line new-cap\n const request = new utils.scriptLoader(pluginSrc);\n\n request.on('complete', onResponse.bind(this, plugin));\n request.on('error', onResponse.bind(this, pluginSrc, 'error'));\n\n request.load();\n }.bind(this));\n };\n\n utils.extend(PluginsLoader.prototype, utils.Events);\n\n return utils.extend({\n register: function(plugin) {\n const name = plugin.getName();\n\n // register the same plugin only once\n if (!plugins[name]) {\n plugins[name] = PluginModel.extend(plugin);\n }\n },\n\n load: function(options) {\n return new Promise(function(resolve) {\n const loader = new PluginsLoader(options);\n loader.on('complete', resolve);\n });\n },\n\n get: function(name) {\n return plugins[name];\n }\n }, utils.Events);\n}());\n\nexport default Plugins;\n","/* global apntag */\nimport config from 'player/config';\nimport utils from 'utils/utils';\n\nexport default utils.extend({\n load: function () {\n // load this only once\n if (!window.apntag) {\n return utils.loadScript(config.ads.appnexus.ast);\n }\n\n return Promise.resolve();\n },\n\n defineTag: function (tagId, tagOptions) {\n return this.load().then(function () {\n const tagConfig = utils.merge({\n targetId: tagId\n }, tagOptions);\n\n\n apntag.debug = config.ads.appnexus.debug;\n // apntag tag overriden by reference\n apntag.defineTag(utils.extend({}, tagConfig));\n\n apntag.loadTags(tagId);\n apntag.onEvent('adLoaded', tagId, this.trigger.bind(this, 'adLoaded', tagId));\n }.bind(this));\n },\n\n showTag: function (tagId) {\n apntag.showTag(tagId);\n },\n\n refreshTag: function (tagId) {\n apntag.refresh([tagId]);\n },\n\n resizeTag: function (tagId, dimmensions) {\n const size = [\n parseInt(dimmensions[0], 10),\n parseInt(dimmensions[1], 10)\n ];\n\n if (window.apntag) {\n apntag.resizeAd(tagId, size);\n }\n },\n\n off: function (targetId) {\n apntag.offEvent('adLoaded', targetId);\n }\n}, utils.Events);\n","import utils from 'utils/utils';\nimport closeIcon from 'icons/close.svg';\nimport appnexus from 'player/playback/ads/appnexus-ast';\nimport pauseTemplate from './pause.html';\nimport PluginModel from './model';\n\nconst PausePlugin = function (options) {\n PluginModel.call(this, options);\n this.maxDisplays = -1;\n this.displayCounter = 0;\n};\n\nPausePlugin.prototype = utils.inherit(PluginModel.prototype); // Here's where the inheritance occurs\nPausePlugin.prototype.constructor = PausePlugin;\n\n/**\n * Check if ad is loaded\n *\n * @param sourceMethod\n * @returns {Function}\n */\nfunction withAdTag(sourceMethod) {\n // eslint-disable-next-line consistent-return\n return function () {\n if (this.adPlacement) {\n return sourceMethod.apply(this, Array.prototype.slice.call(arguments));\n }\n };\n}\n\nfunction withCounter(sourceMethod) {\n // eslint-disable-next-line consistent-return\n return function () {\n if (this.maxDisplays === -1 || this.displayCounter < this.maxDisplays) {\n return sourceMethod.apply(this, Array.prototype.slice.call(arguments));\n }\n };\n}\n\nutils.extend(PausePlugin.prototype, {\n counter: 0,\n getName: function () {\n return 'PausePlugin';\n },\n\n resizeAd: withAdTag(function (width, height) {\n let size = (width && height) ? [width, height] : null;\n\n if (!size) {\n size = this.player.getContainer().getBoundingClientRect();\n size = [size.width, size.height];\n }\n\n appnexus.resizeTag(this.containerId, size);\n }),\n\n load: withAdTag(function (appnexusAdId) {\n this.listenTo(appnexus, 'adLoaded', function (adId) {\n // different adId\n if (appnexusAdId !== adId) {\n return;\n }\n\n this.resizeAd();\n utils.addClass(this.el, 'svp-pause-view--visible');\n\n this.isAdTagLoaded = true;\n }, this);\n\n appnexus.defineTag(\n appnexusAdId,\n this.adPlacement\n ).then(() => {\n appnexus.showTag(appnexusAdId);\n });\n }),\n\n show: withCounter(withAdTag(function (data) {\n const pauseReason = data && data.pauseReason;\n\n // undefined is returned on ie11 win7\n // settingsInteraction is triggered on mobile phones while using quality or share button\n if (pauseReason !== undefined && pauseReason !== 'external' && pauseReason !== 'settingsInteraction') {\n this.displayCounter += 1;\n\n if (this.isAdTagLoaded === true) {\n appnexus.refreshTag(this.containerId);\n } else {\n this.load(this.containerId);\n }\n }\n })),\n\n hide: withAdTag(function () {\n utils.removeClass(this.el, 'svp-pause-view--visible');\n }),\n\n /**\n * Fixing pause event triggered while interacting with scrub bar\n * @param data\n */\n onPause: withCounter(function (data) {\n let timerId = null;\n\n function onSeek() {\n if (timerId) {\n clearTimeout(timerId);\n timerId = null;\n }\n }\n\n timerId = setTimeout(() => {\n // cleanup seek listener when seek wasn't performed\n // eg regular pause button click\n this.stopListening(this.player.model, 'seek', onSeek);\n // display pause ad\n this.show(data);\n }, 50);\n\n // prevent to display pause ad when user seeked stream\n this.listenToOnce(this.player.model, 'seek', onSeek);\n }),\n\n onResumeClick: function() {\n this.player.play();\n utils.removeClass(this.el, 'svp-pause-view--visible');\n },\n\n setup: function () {\n PausePlugin.prototype.counter += 1;\n this.containerId = `svpPauseContainer${PausePlugin.prototype.counter}`;\n\n this.listenTo(this.player.model, 'playlistItem', function (item) {\n const { adPlacements } = item;\n\n if (adPlacements && adPlacements.pause) {\n // eslint-disable-next-line max-len\n this.maxDisplays = (typeof adPlacements.pause.maxDisplays === 'undefined') ? -1 : parseInt(adPlacements.pause.maxDisplays, 10);\n\n this.displayCounter = 0;\n this.render(adPlacements.pause);\n }\n }, this);\n\n this.listenTo(this.player.model, 'pause', this.onPause, this);\n this.listenTo(this.player, 'play', this.hide, this);\n },\n\n render: function (adTagOptions) {\n const appnexusAdContainerId = this.containerId;\n\n this.adPlacement = adTagOptions;\n this.el = utils.createNode(utils.template(pauseTemplate, {\n appnexusAdContainerId: appnexusAdContainerId,\n closeIcon: closeIcon\n }));\n\n const playButton = this.el.querySelector('.jw-icon-playback');\n const closeButton = this.el.querySelector('.svp-pause-close');\n\n if (playButton) {\n playButton.addEventListener('click', this.onResumeClick.bind(this), true);\n }\n\n if (closeButton) {\n closeButton.addEventListener('click', event => {\n event.stopPropagation();\n this.hide();\n }, true);\n }\n this.player.getContainer().appendChild(this.el);\n\n this.listenTo(this.player.model.player, 'resize', function (width, height) {\n if (this.player.getState() === 'paused') {\n this.resizeAd(width, height);\n }\n }, this);\n\n this.trigger('render');\n },\n\n destroy: function () {\n appnexus.off(this.containerId);\n\n this.stopListening(this.player);\n this.stopListening(this.player.model);\n this.stopListening(appnexus);\n\n this.adPlacement = null;\n this.isAdTagLoaded = false;\n\n if (this.el) {\n this.player.getContainer().removeChild(this.el);\n this.el = null;\n }\n }\n\n});\n\nexport default PausePlugin;\n","import utils from 'utils/utils';\nimport PluginModel from './model';\n/**\n * Displays Age Limit labels in player\n *\n * @param options\n * @constructor\n */\nconst AgeLimitPlugin = function (options) {\n PluginModel.call(this, options);\n\n this.ageLimit = options.ageLimit;\n};\n\nAgeLimitPlugin.prototype = utils.inherit(PluginModel.prototype); // Here's where the inheritance occurs\nAgeLimitPlugin.prototype.constructor = AgeLimitPlugin;\n\nutils.extend(AgeLimitPlugin.prototype, {\n getName: function() {\n return 'AgeLimitPlugin';\n },\n\n setup: function() {\n this.listenToOnce(this.player, 'assetPlay', this.render, this);\n\n this.once('render', this.show, this);\n },\n\n render: function() {\n // return number when there is no translation available\n const ageLimit = this.player.locale.translate(`ageLimit-${this.ageLimit}`, this.ageLimit);\n\n this.el = utils.createNode(`
${ageLimit}
`);\n this.player.getContainer().appendChild(this.el);\n\n this.trigger('render');\n },\n\n destroy: function() {\n this.stopListening(this.player);\n\n if (this.el) {\n this.player.getContainer().removeChild(this.el);\n this.el = null;\n }\n },\n\n\n show: function () {\n if (this.ageLimit !== null) {\n utils.addClass(this.player.getContainer(), 'svp-display-age-limit');\n\n // hide label after 3 seconds\n this.listenToOnce(this.player, 'time', setTimeout.bind(null, this.hide.bind(this), 3000));\n }\n },\n\n hide: function () {\n utils.removeClass(this.player.getContainer(), 'svp-display-age-limit');\n }\n});\n\nexport default AgeLimitPlugin;\n","import utils from 'utils/utils';\nimport countdownTemplate from './countdown.html';\nimport PluginModel from './model';\n/**\n * Renders countdown clock for streams which are not published yet\n *\n * @param options\n * @constructor\n */\nconst CountdownPlugin = function (options) {\n PluginModel.call(this, options);\n\n /**\n * Start date for stream (flightTime.start)\n * Javascript Date object\n */\n this.start = options.start;\n\n this.liveDOM = null;\n this.countdownDOM = null;\n};\n\nCountdownPlugin.prototype = utils.inherit(PluginModel.prototype); // Here's where the inheritance occurs\nCountdownPlugin.prototype.constructor = CountdownPlugin;\n\nutils.extend(CountdownPlugin.prototype, {\n labels: {\n date: 'Video will start at',\n timer: 'Video will start in'\n },\n\n getName: function() {\n return 'countdown';\n },\n\n setup: function() {\n this.listenTo(this.player, 'playlistItem', this.render, this);\n },\n\n /**\n * Cleanup old node\n */\n destroy: function() {\n this.stopListening(this.player);\n\n if (this.el) {\n this.player.getContainer().removeChild(this.el);\n this.el = null;\n }\n },\n\n render: function() {\n try {\n this.player.getContainer();\n } catch (error) {\n return;\n }\n\n this.el = utils.createNode(utils.template(countdownTemplate));\n this.player.getContainer().appendChild(this.el);\n\n utils.addClass(this.player.getContainer(), 'svp-countdown-loaded');\n\n // cached live label dom element\n // eslint-disable-next-line prefer-destructuring\n this.liveDOM = this.el.getElementsByClassName('svp-live-label')[0];\n // eslint-disable-next-line prefer-destructuring\n this.countdownDOM = this.el.getElementsByClassName('svp-countdown-live-timer')[0];\n\n // countdown is ready\n this.trigger('ready');\n // start event runs on first change of countdown\n this.once('change', this.trigger.bind(this, 'start'));\n\n // interval has to be initialized on\n this.intervalId = setInterval(this.refresh.bind(this), 1000);\n this.refresh();\n },\n\n refresh: function() {\n const start = this.getDateData(this.start);\n\n // trigger only if date has changed\n if (this.repaint(start)) {\n this.trigger('change', start);\n }\n },\n\n repaint: function(date) {\n const string = [];\n const liveDate = this.start;\n\n if (this.isCountdownActive()) {\n string.push(`${this.leadingZeros(date.min)}:`);\n string.push(`${this.leadingZeros(date.sec)}s`);\n\n if (this.currentState !== 'timer') {\n this.currentState = 'timer';\n this.liveDOM.innerHTML = this.player.locale.translate(this.labels[this.currentState]);\n\n utils.addClass(this.player.getContainer(), 'svp-countdown-active');\n }\n } else if (this.currentState !== 'date') {\n this.currentState = 'date';\n\n string.push(`${liveDate.getDate()} ${this.getMonthName(liveDate)} `);\n string.push(`${this.leadingZeros(liveDate.getHours())}:`);\n string.push((this.leadingZeros(liveDate.getMinutes())));\n\n this.liveDOM.innerHTML = this.player.locale.translate(this.labels[this.currentState]);\n }\n\n if (string.length > 0) {\n this.countdownDOM.innerHTML = (string.join(''));\n return true;\n }\n\n return false;\n },\n\n /**\n * End of countdown\n */\n stop: function() {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n\n this.intervalId = null;\n this.el.parentNode.removeChild(this.el);\n this.el = null;\n\n utils.removeClass(this.player.getContainer(), ['svp-countdown-active', 'svp-countdown-loaded']);\n\n this.trigger('end');\n },\n\n\n /**\n * Format number by adding leading zeros eg 7 -> 07\n *\n * @param num\n * @param length\n * @returns {string|*}\n */\n leadingZeros: function (numValue, numLen) {\n const length = numLen || 2;\n let num = String(numValue);\n\n while (num.length < length) {\n num = `0${num}`;\n }\n\n return num;\n },\n\n getDateData: function (endDate) {\n let diff = (endDate - Date.parse(new Date())) / 1000;\n\n // end of counting\n if (diff <= 0) {\n diff = 0;\n\n if (this.intervalId) {\n this.stop();\n }\n }\n\n const dateData = {\n years: 0,\n days: 0,\n hours: 0,\n min: 0,\n sec: 0\n };\n\n if (diff >= (365.25 * 86400)) {\n dateData.years = Math.floor(diff / (365.25 * 86400));\n diff -= dateData.years * 365.25 * 86400;\n }\n\n if (diff >= 86400) {\n dateData.days = Math.floor(diff / 86400);\n diff -= dateData.days * 86400;\n }\n\n if (diff >= 3600) {\n dateData.hours = Math.floor(diff / 3600);\n diff -= dateData.hours * 3600;\n }\n\n if (diff >= 60) {\n dateData.min = Math.floor(diff / 60);\n diff -= dateData.min * 60;\n }\n\n dateData.sec = Math.floor(diff);\n\n return dateData;\n },\n\n /**\n * Get translated month name\n *\n * @param date\n * @returns {*}\n */\n getMonthName: function(date) {\n return this.player.locale.getMonthName(date);\n },\n\n /**\n * Check whatever countdown or date should be displayed\n * Countdown is active when less than 1 hour reminded to start\n * @returns {boolean}\n */\n isCountdownActive: function() {\n const now = new Date();\n\n // less than 1 hour\n return (Math.abs(this.start.getTime() - now.getTime())) < 3599999;\n }\n});\n\nexport default CountdownPlugin;\n","/* eslint-disable no-underscore-dangle */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\nimport config from 'player/config';\nimport Asset from './asset';\nimport NextAsset from './next-asset';\n\n/**\n * Parse thata\n *\n * @param response\n * @param vendor\n * @returns {Array}\n */\nfunction onResponseSuccess(vendor, response) {\n const data = JSON.parse(response.responseText);\n const result = [];\n\n\n if (data._embedded && data._embedded.assets) {\n utils.each(data._embedded.assets, item => {\n result.push(new Asset(utils.extend(item, {\n vendor: vendor\n })));\n });\n }\n\n return result;\n}\n\n/**\n * Could not fetch any data\n *\n * @returns {string}\n */\nfunction onResponseError() {\n return 'noAssetsFound';\n}\n\nfunction fetch(vendor, url) {\n return new Promise((resolve, reject) => {\n utils.ajax(url, resolve, reject, true);\n }).then(onResponseSuccess.bind(this, vendor), onResponseError);\n}\n\nfunction fetchRecommendedItems(vendor, url) {\n return fetch(vendor, url).then(data => {\n if (utils.isArray(data) && data.length === 0) {\n // fetch with old related\n return fetch(vendor, url.replace('related-ml', 'related'));\n }\n\n return data;\n });\n}\n\nfunction fetchItemsByIds(vendor, assetsIds) {\n const url = config.api.getUrl(vendor, `/assets?&filter=assetId::${assetsIds.join(',')}&limit=${assetsIds.length}`);\n return fetch(vendor, url);\n}\n\nconst Recommended = function (options) {\n this.useMlEngine = options && options.ml;\n\n this.asset = options.asset;\n this.nextAsset = new NextAsset({\n asset: this.asset\n });\n};\n\nRecommended.prototype = {\n url: function () {\n const relatedEndpoint = (this.useMlEngine) ? 'related-ml?limit=20' : 'related';\n\n return config.api.getUrl(\n this.asset.getVendor(),\n `/assets/${this.asset.get('id')}/${relatedEndpoint}`\n );\n },\n\n /**\n * Fetch next asset\n *\n * @returns {Promise}\n */\n getNextAsset: function(options) {\n const nextAsset = this.asset;\n\n if (options && options.asset) {\n return this.nextAsset.fetchNextAssetById(\n // set vendor is specified or use main asset as default\n options.asset.vendor || this.asset.getVendor(),\n // asset can be object or number with asset id\n options.asset.id || options.asset\n );\n }\n\n return this.nextAsset.fetch(nextAsset, utils.extend({\n useMlEngine: this.useMlEngine\n }, options));\n },\n\n /**\n * Fetch recommended asset list\n * Fetch assets by ids when items provided as a param\n *\n * @param items optional array of ids\n * @returns {*}\n */\n getItems: function (items) {\n if (!utils.isArray(items) || items.length === 0) {\n return fetchRecommendedItems(this.asset.getVendor(), this.url());\n }\n\n return fetchItemsByIds(this.asset.getVendor(), items);\n }\n};\n\nutils.extend(Recommended.prototype, Model);\n\nexport default Recommended;\n","import utils from 'utils/utils';\nimport image from 'utils/image';\nimport Recommended from 'player/model/recommended';\nimport closeIcon from 'icons/close.svg';\nimport nextIcon from 'icons/chevron-right.svg';\nimport recommendedTemplate from './recommended/recommended.html';\nimport nextAssetTemplate from './recommended/next-asset.html';\nimport gridTemplate from './recommended/grid.html';\nimport PluginModel from './model';\n/**\n * Renders countdown clock for streams which are not published yet\n *\n * @param options\n * @constructor\n */\nconst RecommendedPlugin = function (options) {\n PluginModel.call(this, options);\n\n // time in seconds from end of stream\n this.countdownTime = (options.settings && options.settings.next && options.settings.next.countdown) || 10;\n this.nextAsset = null;\n this.settings = utils.extend({\n grid: {\n items: []\n },\n next: {}\n }, options.settings);\n\n // check if grid items are available\n this.gridItemsReady = false;\n};\n\nRecommendedPlugin.prototype = utils.inherit(PluginModel.prototype); // Here's where the inheritance occurs\nRecommendedPlugin.prototype.constructor = RecommendedPlugin;\n\n/**\n * Play next asset from the list\n *\n * @param assetId - SVP Asset id\n * @param source - source of playnext (auto - when autoplay next, single, grid)\n */\nfunction playNext(assetId, source) {\n const clear = () => {\n utils.removeClass(this.el, ['is-grid-visible', 'is-next-visible', 'is-counting', 'is-next-closing']);\n };\n\n this.stopListening(this.player, 'complete');\n\n // autoplay of asset can be turned off from config\n if (this.settings.autoplay !== false) {\n this.player.playNext(assetId);\n }\n\n // nextAsset case, triggered by autoplay or user\n if (source === 'single' || source === 'auto') {\n this.trigger('nextAssetPlay', this.nextAsset, (source === 'auto') ? 'auto' : 'click');\n\n utils.addClass(this.el, 'is-next-closing');\n setTimeout(clear, 700);\n } else {\n // grid click\n this.trigger('playRecommended', assetId);\n clear();\n }\n}\n\n/**\n * Turn off autoplay of recommended next asset\n */\nfunction disableNext() {\n this.trigger('nextAssetClose', this.nextAsset);\n this.nextAsset = null;\n utils.removeClass(this.el, 'is-next-visible is-counting is-next-visible');\n}\n\n/**\n * Retrieve full url for play next and grid assets thumbnails\n *\n * @param key\n * @returns {*}\n */\nfunction getThumbnailUrl(key) {\n return image.getImageSrc(key, 'poster', 200);\n}\n\n/**\n * Add snap scroll for mobile grid\n */\nfunction initSnapScroll() {\n const scrollSnapPrefix = utils.getScrollSnapPrefix();\n const gridItem = this.getByClass('svp-player-recommended-item')[0];\n\n // check if snap points are supported\n if (scrollSnapPrefix !== false) {\n this.el.style[`${scrollSnapPrefix}scroll-snap-type`] = 'mandatory';\n this.el.style[`${scrollSnapPrefix}scroll-snap-points-x`] = `repeat(${gridItem.clientWidth}px)`;\n }\n}\n/**\n * Click handler for recommended grid\n *\n * @param node\n */\nfunction onGridItemClicked(node) {\n utils.addClass(node, 'svp-to-active');\n\n this.listenToOnce(this.player, 'assetPlay', function() {\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n }, this);\n\n setTimeout(() => {\n playNext.call(this, parseInt(node.dataset.id, 10), 'grid');\n utils.removeClass(this.el, 'is-grid-visible');\n }, 500);\n}\n\n/**\n * Fetch recommended assets when player is ready\n */\nfunction onPlaybackStart() {\n const recommended = new Recommended({\n asset: this.player.getAsset(),\n ml: (this.settings.ml === true)\n });\n\n // restore default state for each new asset\n this.gridItemsReady = false;\n\n // turn off option for grid\n if (this.settings.grid !== false) {\n recommended.getItems(this.settings.grid.items).then(items => {\n if (utils.isArray(items) && items.length > 0) {\n this.gridItemsReady = true;\n this.trigger('gridItemsReady', items);\n } else {\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n }\n }).catch(() => {\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n });\n }\n\n // next asset is available by default but can be turned off\n if (this.settings.next !== false) {\n recommended.getNextAsset(this.settings.next).then(data => {\n this.nextAsset = data.asset;\n\n this.trigger('nextAssetReady', this.nextAsset, {\n source: data.source\n });\n }).catch(() => {\n utils.removeClass(this.el, ['is-next-visible', 'is-counting', 'is-next-closing']);\n });\n }\n}\n\n/**\n * Initialize lazy fetching\n */\nfunction onInitialize() {\n // fetch recommended 15s before playback end\n let fetchDuration = this.player.getDuration() - 15;\n\n // for streams shorter than 15s load next in 2s\n if (fetchDuration < 0) {\n fetchDuration = 2;\n }\n\n // do not enable recommended for live streams\n if (!this.player.model.getStream().isLive()) {\n this.listenTo(this.player, 'time', function (time) {\n if (fetchDuration > 0 && time > fetchDuration) {\n fetchDuration = -1;\n onPlaybackStart.call(this);\n }\n }, this);\n }\n}\n\n/**\n * Handler for stream end (countdown end) event\n * Stream complete can't be used due to circular events triggering\n */\nfunction onPlaybackComplete(reason) {\n // do not take any action if complete is triggered by playNext\n if (reason === 'playNext') {\n return;\n }\n\n if (this.nextAsset) {\n this.trigger('nextAssetComplete', this.nextAsset);\n playNext.call(this, this.nextAsset.get('id'), 'auto');\n } else if (this.gridItemsReady) {\n // display grid only when items are available\n utils.addClass(this.el, 'is-grid-visible');\n utils.addClass(this.player.getContainer(), 'is-recommended-grid-visible');\n\n initSnapScroll.call(this);\n this.trigger('gridVisible');\n }\n}\n\n/**\n * Handler for checking time in which playNext should be available\n * @param time\n * @param duration\n */\nfunction onTimeNextVisible(time, duration) {\n if (duration - time < this.countdownTime) {\n this.trigger('playNextVisible', Math.floor(duration - time));\n }\n}\n\n/**\n * Display play next in given time\n *\n * @param timeout - duration of countdown\n */\nfunction onPlayNextVisible(timeout) {\n utils.addClass(this.el, 'is-next-visible is-counting');\n\n this.stopListening(this.player, 'time', onTimeNextVisible);\n // update transition duration as it may be smaller than default due to seek\n this.getByClass('svp-player-recommended-countdown')[0].style.transitionDuration = `${timeout}s`;\n}\n\n/**\n * Handler triggered when nextAsset is available for current stream\n */\nfunction onNextAssetReady() {\n const img = new Image();\n // prefetch image\n img.src = getThumbnailUrl(this.nextAsset.getThumbnail());\n\n this.listenTo(this.player, 'time', onTimeNextVisible, this);\n\n this.getByClass('svp-player-recommended-next')[0].innerHTML = utils.template(nextAssetTemplate, {\n next: this.nextAsset,\n countdown: this.countdownTime, // default countdown\n getThumbnail: getThumbnailUrl,\n closeIcon: closeIcon,\n nextIcon: nextIcon\n });\n\n this.getByClass('svp-player-recommended-image')[0]\n .addEventListener('click', playNext.bind(this, this.nextAsset.get('id'), 'single'));\n\n this.getByClass('svp-player-recommended-close')[0]\n .addEventListener('click', disableNext.bind(this));\n}\n\n/**\n * Triggered when grid items are available\n */\nfunction onGridItemsReady(recommended) {\n this.getByClass('svp-player-recommended-grid')[0].innerHTML = utils.template(gridTemplate, {\n recommended: recommended,\n getThumbnail: getThumbnailUrl,\n utils: utils\n });\n\n utils.each(this.getByClass('svp-player-recommended-item'), item => {\n item.addEventListener('click', onGridItemClicked.bind(this, item));\n });\n}\n\n/**\n * Triggered when recommended grid is displayed\n */\nfunction onGridVisible() {\n // replay asset triggers play\n // clicking on grid not intersects with this\n this.listenToOnce(this.player, 'play', this.trigger.bind(this, 'assetReplay'));\n}\n\n/**\n * Event fired when user decided to restart video\n */\nfunction onAssetReplay() {\n // attach events to allow again display of grid\n this.setup();\n // cleanup state\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n utils.removeClass(this.el, ['is-grid-visible', 'is-next-visible', 'is-counting', 'is-next-closing']);\n}\n\nutils.extend(RecommendedPlugin.prototype, {\n getName: function() {\n return 'RecommendedPlugin';\n },\n\n setup: function() {\n // assetPlay\n this.stopListening(this.player);\n this.listenToOnce(this.player, 'assetPlay', this.render, this);\n this.listenToOnce(this.player, 'assetPlay', onInitialize, this);\n this.listenToOnce(this.player, 'complete', onPlaybackComplete, this);\n\n this.once('playNextVisible', onPlayNextVisible, this);\n this.once('nextAssetReady', onNextAssetReady, this);\n this.once('gridItemsReady', onGridItemsReady, this);\n this.once('gridVisible', onGridVisible, this);\n this.once('assetReplay', onAssetReplay, this);\n },\n\n /**\n * Get current element child node by class name\n *\n * @param className\n * @returns {NodeList|*}\n */\n getByClass: function(className) {\n return this.el.getElementsByClassName(className);\n },\n\n /**\n * Render default view holder for play next and recommended\n *\n */\n render: function() {\n const container = this.player.getContainer();\n const previousEl = container.getElementsByClassName('svp-player-recommended-box');\n\n // clean if previously grid was displayed\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n\n // cleanup old element\n // recommended is \"async\" so it can't be destroyed like normal plugin\n if (previousEl.length > 0) {\n container.removeChild(previousEl[0]);\n }\n\n this.el = utils.createNode(utils.template(recommendedTemplate));\n\n container.appendChild(this.el);\n }\n});\n\nexport default RecommendedPlugin;\n","/* global console */\nimport utils from 'utils/utils';\n\nconst ClickTracker = {\n vendor: null,\n\n mode: 'TRACK',\n url: '//click.vgnett.no/svp.gif?s=',\n\n /**\n * Track media event\n *\n * @param data\n */\n trackMediaEvent: function (data) {\n const query = [];\n\n query.push(`d=${this.getDeviceType()}`);\n query.push(`v=${data.assetId}`);\n\n this.sendRequest('media', query.join('&'));\n },\n\n /**\n * Track playback events in certain time\n *\n * @param data\n */\n trackStreamEvent: function (data) {\n const query = [];\n\n query.push(`d=${this.getDeviceType()}`);\n query.push(`v=${data.assetId}`);\n query.push(`p=${data.time}`);\n\n // randomize request time for avoiding api peaks\n setTimeout(this.sendRequest.bind(this, 'stream', query.join('&')), Math.floor((Math.random() * 100) + 1));\n },\n\n /**\n * Send API request using 1x1px image\n *\n * @param type\n * @param queryString\n */\n sendRequest: function (type, queryString) {\n const image = new Image();\n const apiUrl = this.getApiUrl(type);\n const hypen = apiUrl.indexOf('?') > -1 ? '&' : '?';\n\n // track only if tracker is initialized\n if (this.vendor) {\n if (this.mode === 'LOG') {\n // eslint-disable-next-line no-console\n console.log('SVP STATS: ', [\n queryString,\n `${apiUrl + hypen + queryString}&cb=${Math.random() * 10000}`\n ]);\n }\n\n image.src = `${apiUrl + hypen + queryString}&cb=${Math.random() * 10000}`;\n }\n\n return image;\n },\n\n /**\n * Return full API endpoint url\n *\n * @returns {string}\n */\n getApiUrl: function (type) {\n if (this.vendor === 'vgtv' && type === 'media') {\n return '//click.vgnett.no/vgtv.gif';\n }\n\n return this.url + this.vendor;\n },\n\n /**\n * Tracking is divided by device type\n *\n * @returns {*}\n */\n getDeviceType: function () {\n if (utils.device.isTablet()) {\n return 'tablet';\n }\n\n if (utils.device.isMobile()) {\n return 'mobile';\n }\n\n return 'desktop';\n }\n};\n\nexport default ClickTracker;\n","import utils from 'utils/utils';\nimport ClickTracker from './svp-stats/tracker';\nimport PluginModel from './model';\n/**\n * Basic SVP statistics tool\n *\n * @param options\n * @constructor\n */\nconst SvpStatsPlugin = function (options) {\n PluginModel.call(this, options);\n\n this.env = options.env;\n this.vendor = options.vendor;\n this.mode = options.mode;\n};\n\nSvpStatsPlugin.prototype = utils.inherit(PluginModel.prototype); // Here's where the inheritance occurs\nSvpStatsPlugin.prototype.constructor = SvpStatsPlugin;\n\n/**\n * Seconds intervals for tracking\n * @returns {number}\n */\nfunction getTrackingInterval(duration) {\n // if duration is not set then do not track it\n if (duration > 0) {\n // for streams shorter than 250s tracking interval is 5seconds\n if (duration < 250) {\n return 5;\n }\n\n // otherwise it's every 2% of stream\n return Math.floor(duration * 0.02);\n }\n\n return -1;\n}\n\nutils.extend(SvpStatsPlugin.prototype, {\n getName: function () {\n return 'SvpStatsPlugin';\n },\n\n setup: function () {\n // stats can be turned off only on non production env\n if (this.mode === 'OFF' && this.env !== 'production') {\n return;\n }\n\n ClickTracker.mode = this.mode;\n ClickTracker.vendor = this.vendor;\n\n this.listenTo(this.player, 'assetPlay', function (startTime) {\n const asset = this.player.getAsset();\n const assetId = asset.get('id');\n const duration = this.player.getDuration();\n const trackingInterval = getTrackingInterval(duration);\n\n let initialStartTime = startTime || -1;\n let currentTime = -1;\n\n ClickTracker.trackMediaEvent({\n assetId: assetId\n });\n\n // tracking interval maybe invalid when stream is live or do not have proper duration\n if (trackingInterval > 0 && asset.get('streamType') !== 'live') {\n // assetPlay prevents from sending events when it has start time\n this.listenTo(this.player, 'time', playerTime => {\n const time = Math.floor(playerTime);\n\n // engagement tracking\n if (time !== currentTime && time % trackingInterval === 0 && time > initialStartTime) {\n currentTime = time;\n // reset start time counter for tracking seek before start point in indexed stream\n initialStartTime = -1;\n\n // prevent requests outside stream size\n if (time > -1 && time <= duration) {\n ClickTracker.trackStreamEvent({\n assetId: assetId,\n time: time\n });\n }\n }\n });\n }\n });\n\n this.listenTo(this.player, 'adSlotStart', function (adSlot) {\n if (adSlot.position === 'preroll') {\n ClickTracker.trackStreamEvent({\n assetId: this.player.getAsset().get('id'),\n time: -1\n });\n }\n });\n\n this.listenTo(this.player, 'adSlotComplete', function (adSlot) {\n if (adSlot.position === 'preroll') {\n ClickTracker.trackStreamEvent({\n assetId: this.player.getAsset().get('id'),\n time: -2\n });\n }\n });\n },\n\n destroy: function () {\n ClickTracker.vendor = null;\n this.stopListening(this.player);\n }\n});\n\nexport default SvpStatsPlugin;\n","/* jshint latedef:false */\n/* globals console */\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\nimport Asset from './model/asset';\nimport NextAsset from './model/next-asset';\nimport Stream from './model/stream';\nimport Locale from './model/locale';\nimport Config from './playback/config';\nimport Provider from './playback/provider';\nimport adAsset from './playback/ads/appnexus-ad-asset';\nimport Domain from './model/domain';\nimport SvpPlugins from './plugins';\nimport PausePlugin from './plugins/pause';\nimport AgeLimitPlugin from './plugins/age-limit';\nimport CountdownPlugin from './plugins/countdown';\nimport RecommendedPlugin from './plugins/recommended';\nimport SvpStatsPlugin from './plugins/svp-stats';\n\nimport statusCode, { NOT_FOUND, GENERAL_ERROR } from \"./playback/config/status-codes\";\n\nimport errorIcon from 'icons/error.svg';\n\nconst Player = function(options) {\n // Little bit of monkey patching\n config.api.vendor = options.vendor || 'vgtv';\n config.env = (config.env === 'production') ? 'production' : (options.env || config.env || 'production');\n\n // Restrict player on blacklisted domains\n if (Domain.isBlacklisted(options.vendor)) {\n return;\n }\n\n logger('SVP').log('config', utils.extend({}, options));\n\n if (options.vendor === 'appnexus') {\n options.asset = adAsset();\n delete options.id;\n }\n\n // load locales for player\n // norwegian by default\n this.locale = new Locale(config.translations(options.locale || 'no'));\n\n // create configuration for SVP player\n this.config = new Config();\n this.listenToOnce(this.config, 'ready', onceConfigReady, this);\n\n this.config.setLocale(this.locale);\n this.config.initialize(options);\n\n // set dynamic api url\n if (options.api) {\n config.api.url = options.api;\n }\n\n // allow to override token api url\n if (options.tokenUrl) {\n config.api.tokenUrl = options.tokenUrl;\n }\n\n // allow to override thumbnails api url\n if (options.thumbnailsUrl) {\n config.api.thumbnailsUrl = options.thumbnailsUrl;\n }\n\n /**\n * Available plugins\n * PausePlugin, EndposterPlugin, ChaptersPlugin, ContinuePlayingPlugin\n *\n * Plugins registered by default (can not be removed)\n * CountdownPlugin, AgeLimitPlugin\n * @type {Object}\n */\n this.plugins = {};\n\n /**\n * Check if stream has completed playback\n * @type {boolean}\n */\n this.isCompleted = false;\n\n this.isPlayNextAvailable = true;\n\n // sync browser time with server\n if (!options.serverTime) {\n ServerTime.fetch(config.time);\n }\n\n // fetch config for privileged settings to speedup setup\n if (options.settings) {\n Domain.fetch(options.vendor);\n }\n\n logger('SVP').log(function(message) {\n this.on('all', function(event) {\n message(event, Array.prototype.slice.call(arguments, 1));\n });\n }.bind(this));\n};\n\n/**\n * Remove single plugin instance\n * Clear all listeners\n * Remove from plugins hashmap\n *\n * @param plugin\n */\nfunction destroyPlugin(plugin) {\n if (plugin.off) {\n plugin.off();\n }\n plugin.destroy();\n\n this.stopListening(plugin);\n delete this.plugins[plugin.getName()];\n}\n\n\n/**\n * Clear error message\n * @param node\n */\nfunction clearError(node) {\n const previousErrorNode = node.getElementsByClassName('svp-player-error-wrapper');\n\n // clear old node\n if (previousErrorNode.length > 0) {\n utils.removeClass(node, ['svp-player-error', 'svp-player-error-hasImage']);\n node.removeChild(previousErrorNode[0]);\n }\n}\n\n/**\n * Display error message in given node\n * @param node\n * @param message\n * @param code\n */\nfunction displayError(node, message, code = null) {\n let template = `
${errorIcon}${message}`;\n\n if(code) {\n template += `
${this.locale.translate('Error code')}: ${code}
`;\n }\n\n template += '
';\n\n const posterSrc = this.model && this.model.getStream() && this.model.getPoster(this.model.getStream(), node);\n\n clearError(node);\n utils.addClass(node, 'svp-player-error');\n\n // add image\n if (posterSrc) {\n utils.addClass(node, 'svp-player-error-hasImage');\n template += `
`;\n }\n\n const errorNode = utils.createNode(`
${template}
`);\n\n node.appendChild(errorNode);\n\n this.once('complete', function() {\n utils.removeClass(node, ['svp-player-error', 'svp-player-error-hasImage']);\n node.removeChild(errorNode);\n }, this);\n}\n\n/**\n *\n *\n * @param options Caution, param is bound in constructor\n */\nfunction onceConfigReady(options, settings) {\n this.model = new Provider(this.config);\n\n // todo move locale to single instance\n this.model.setLocale(this.locale);\n\n // important listeners has to be attached before setup\n this.listenTo(this.model, 'all', onPlayerEvent, this);\n\n this.listenTo(this.model, 'play', function() {\n this.isCompleted = false;\n }, this);\n\n // turn on cachebreaker for preview mode\n if (settings && settings.preview === true) {\n config.api.cb = true;\n }\n\n // once per player instance error append stylesheet\n this.once('error', function() {\n utils.addStyleSheet(this.config.get('skin').url);\n }, this);\n\n Promise.all([\n new Promise((resolve) => {\n this.once('assetReady', resolve);\n }),\n SvpPlugins.load(options.plugins)\n ]).then(() => {\n utils.each(options.plugins, (config, plugin) => {\n const Plugin = SvpPlugins.get(plugin);\n\n if (Plugin) {\n this.addPlugin(new Plugin(config));\n }\n });\n\n this.model.setup();\n });\n\n // asset can be passed as id or an object\n this.setAsset((options.asset || options.id));\n}\n\n/**\n * this always points to Player object\n */\nfunction onAssetReady() {\n const { config } = this;\n\n const stream = new Stream(this.asset.attributes);\n const settings = config.getSettings();\n\n config.setStream(stream);\n\n // add hasNext checking\n stream.set('hasNext', NextAsset.prototype.hasPlayNext.call(null, this.asset));\n\n // cleanup plugins as they maybe not required for new stream\n utils.each(this.plugins, destroyPlugin, this);\n\n // set start time if chapter is provided\n if (config.get('chapter')) {\n const chapter = this.asset.getChapter(config.get('chapter'));\n\n if (chapter) {\n this.config.set('time', chapter.timeline);\n }\n }\n\n // set playahead time\n if (config.get('time')) {\n stream.set('playAhead', config.get('time'));\n }\n\n if (config.hasRecommended()) {\n this.addPlugin(new RecommendedPlugin({\n settings: config.getRecommended()\n }));\n }\n\n // stream is not available yet, display countdown\n if (stream.getTimeToStart() > 0) {\n // countdown is disable in preview mode on non live streams\n if (settings.preview !== true || stream.isLive()) {\n this.addPlugin(new CountdownPlugin({\n start: new Date((new Date().getTime()) + stream.getTimeToStart() * 1000)\n }));\n\n // play stream after countdown ends\n this.on('countdown:end', this.play, this);\n }\n }\n\n if (this.asset.getAgeLimit() > -1) {\n this.addPlugin(new AgeLimitPlugin({\n ageLimit: this.asset.getAgeLimit()\n }));\n }\n\n this.addPlugin(new SvpStatsPlugin({\n vendor: config.get('vendor'),\n mode: config.get('stats'),\n env: config.get('env')\n }));\n\n this.addPlugin(new PausePlugin());\n\n // set stream to display error\n this.model.setStream(stream);\n\n this.config.isStreamPlayable().then(() => {\n this.trigger('assetReady');\n }).catch((code) => {\n this.trigger('assetError', {\n message: statusCode(code),\n code\n });\n\n onError.call(this, 'error', {\n type: 'assetError',\n // message is translated in next functions\n message: statusCode(code),\n code\n });\n });\n}\n\n/**\n * Asset fetch failed. Usually happens when network issue occurred\n */\nfunction onAssetError() {\n const code = NOT_FOUND;\n\n this.trigger('assetError', {\n message: this.locale.translate(code),\n code\n });\n\n // load stylesheet as player is not attached\n onError.call(this, 'error', {\n type: 'assetFetchError',\n message: statusCode(code),\n code\n });\n}\n\n/**\n * Player initialized and single playlistItem is laoded\n */\nfunction onPlaylistItem() {\n const container = this.getContainer();\n // add class for live streams\n\n utils.removeClass(container, 'svp-player-live');\n\n if (this.model.getStream().isLive()) {\n utils.addClass(container, 'svp-player-live');\n // add translation for live button via data-label\n container.getElementsByClassName('jw-icon-display')[0]\n .setAttribute('data-label', this.locale.translate('Live button'));\n }\n\n this.trigger('playlistItem');\n}\n\n/**\n * Stream completed, fired for every item in playlist\n * Clear settings which are only for one stream\n */\nfunction onComplete(reason) {\n if (!this.isCompleted) {\n this.isCompleted = true;\n\n this.config.set('time', null);\n this.config.set('chapter', null);\n\n this.trigger('complete', reason);\n }\n}\n\n/**\n * Display error message\n *\n * @param event\n * @param details\n */\nfunction onError(event, details = {}) {\n const node = document.getElementById(this.config.get('node'));\n\n const code = details.code;\n const message = details.message;\n\n let translatedMessage = this.locale.translate(message);\n\n // translation not found\n if(translatedMessage === message) {\n translatedMessage = this.locale.translate(statusCode(GENERAL_ERROR));\n }\n\n // details - message in english\n // message - localized, displayed message\n const errorDetails = {\n code,\n details: message,\n message: translatedMessage\n };\n\n if(details.type) {\n errorDetails.type = details.type;\n }\n\n displayError.call(this, node, translatedMessage, code);\n\n if (this.model.player) {\n this.model.player.stop();\n }\n\n this.trigger(event, errorDetails);\n}\n\n/**\n * Proxy player events\n */\nfunction onPlayerEvent(event) {\n let callFunction;\n\n switch (event) {\n case 'playlistItem':\n callFunction = onPlaylistItem;\n break;\n case 'complete':\n callFunction = onComplete;\n break;\n case 'error':\n callFunction = onError;\n break;\n default:\n callFunction = this.trigger;\n }\n\n callFunction.apply(this, arguments);\n}\n\n/**\n * Player public API\n */\nPlayer.prototype = {\n /**\n * Play\n * @param position - seconds (int)\n */\n play: function(position) {\n // stream will play only if publication date is valid\n if (this.model.getStream().getTimeToStart() < 0) {\n if (position) {\n this.once('play', this.seek.bind(this, position));\n }\n\n this.model.play();\n }\n },\n\n /**\n * Pause playback\n * @param force - toggle playback when param is omitted\n */\n pause: function(force) {\n // pause with force can start stream which is wrong\n if (this.model.getStream().getTimeToStart() < 0) {\n this.model.pause(!force);\n }\n },\n\n /**\n * Seek in seconds\n * @param time\n */\n seek: function(time) {\n this.model.seek(time);\n },\n\n /**\n * Destroy the player instance, reset DOM, clean up listeners\n */\n remove: function() {\n this.stopListening();\n\n if (this.model) {\n this.model.remove();\n }\n },\n\n /**\n * Play next asset by given id\n *\n * @param id\n */\n playNext: function(id) {\n const onNextAssetReady = function () {\n // trick to avoid create of new stream as it's set in assetReady\n this.model.playNext(this.model.getStream());\n this.isPlayNextAvailable = true;\n }.bind(this);\n\n if (this.isPlayNextAvailable) {\n // complete current stream\n onComplete.call(this, 'playNext');\n\n // block multiple occurences\n this.isPlayNextAvailable = false;\n\n this.once('assetReady', onNextAssetReady, this);\n\n this.once('assetError', function() {\n this.isPlayNextAvailable = true;\n this.off('assetReady', onNextAssetReady);\n });\n this.setAsset(id);\n }\n },\n\n /**\n * Set playback volume\n *\n * @param volume - number between 0 and 100\n */\n setVolume: function(volume) {\n this.model.setVolume(volume);\n },\n\n /**\n * Get playback volume\n * @returns {*}\n */\n getVolume: function() {\n return this.model.getVolume();\n },\n\n /**\n * Get player state\n */\n getState: function() {\n return this.model.getState();\n },\n\n /**\n * Get stream duration\n *\n * @returns {*}\n */\n getDuration: function() {\n return this.model.getDuration();\n },\n\n /**\n * Get current playback time\n */\n getCurrentTime: function() {\n return this.model.getCurrentTime();\n },\n\n /**\n * Get quarter of stream.\n * Can be used for tracking\n *\n * @returns {number}\n */\n getCurrentQuartile: function() {\n return Math.ceil((this.getCurrentTime() / this.getDuration()) / 0.25);\n },\n\n /**\n * Get device type\n *\n * @returns {*}\n */\n getDeviceType: function () {\n if (utils.device.isIPhone()) {\n return 'iPhone';\n }\n\n if (utils.device.isIPad()) {\n return 'iPad';\n }\n\n if (utils.device.isAndroid()) {\n return 'android';\n }\n\n return 'desktop';\n },\n\n /**\n * Get current playback provider\n */\n getProvider: function() {\n return this.model.getProvider();\n },\n\n /**\n * Get current captions list\n */\n getCaptionsList: function () {\n return this.model.getCaptionsList();\n },\n\n /**\n * Get currently playing captions\n */\n getCurrentCaptions: function () {\n return this.model.getCurrentCaptions();\n },\n\n /**\n * Set current captions by passing its index\n * Setting 0 will hide all captions\n */\n setCurrentCaptions: function (index) {\n return this.model.setCurrentCaptions(index);\n },\n\n /**\n * Override captions styles\n * @param styles\n */\n setCaptionsStyles: function (styles) {\n return this.model.setCaptionsStyles(styles);\n },\n\n /**\n * Get Player DOM Node\n *\n * @returns {*}\n */\n getContainer: function() {\n return this.model.getContainer();\n },\n\n /**\n * Set asset resource\n * @param asset - Asset model or stream id\n */\n setAsset: function(asset) {\n // cleanup old asset\n if (this.asset) {\n this.stopListening(this.asset);\n this.asset.destroy();\n this.asset = null;\n }\n\n // change asset to object if it is a number\n if (utils.isNumber(asset)) {\n // eslint-disable-next-line no-param-reassign\n asset = {\n id: asset\n };\n }\n\n this.asset = (asset instanceof Asset) ? asset : new Asset(asset);\n\n // set vendor for player's default if nothing has been passed\n if (!this.asset.get('vendor')) {\n this.asset.set('vendor', this.config.get('vendor'));\n }\n\n // asset is ready if status field is in response\n if (this.asset.get('status')) {\n onAssetReady.call(this);\n } else {\n this.listenTo(this.asset, 'fetchSuccess', onAssetReady, this);\n this.listenTo(this.asset, 'fetchError', onAssetError, this);\n\n this.asset.fetch();\n }\n\n this.once('assetPlay', function() {\n clearError(this.getContainer());\n }, this);\n },\n\n /**\n * Get current loaded asset\n * @returns {null}\n */\n getAsset: function() {\n return this.asset;\n },\n\n /**\n * Add plugin to the player\n *\n * @param plugin\n */\n addPlugin: function(plugin) {\n const proxyPluginEvent = function() {\n const args = Array.prototype.slice.call(arguments);\n args[0] = `${plugin.getName()}:${args[0]}`;\n\n this.trigger(...args);\n };\n\n plugin.setPlayer(this);\n this.listenTo(plugin, 'all', proxyPluginEvent, this);\n\n this.plugins[plugin.getName()] = plugin;\n },\n\n /**\n * Get plugin by name\n *\n * @param plugin - name of the plugin\n * @returns {*}\n */\n getPlugin: function(plugin) {\n return this.plugins[plugin];\n }\n};\n\n\n/**\n * Checks if device can autoplay stream\n *\n * @returns {*}\n */\nPlayer.canDeviceAutoplay = function () {\n // eslint-disable-next-line no-console\n if (console && console.warn) {\n // eslint-disable-next-line no-console\n console.warn('SVP Player SKD deprecation warning. Due to changes in browser policies, player will detect itself if it can autoplay.');\n }\n\n return utils.device.canAutoplay();\n};\n\nPlayer.Plugins = SvpPlugins;\nutils.extend(Player.prototype, utils.Events);\n\nexport default Player;\n","import config from \"./player/config\";\nimport Player from 'player/player';\nimport image from 'utils/image';\nimport utils from 'utils/utils';\nimport Domain from 'player/model/domain';\nimport HomadAds from 'player/playback/ads/homad';\n\nconst SVP = {};\nSVP.Player = Player;\nSVP.Player.version = config.version;\n\n// by default antiadblock is turned off\nObject.defineProperty(SVP.Player, 'defaults', {\n get: function() {\n return this.__defaults || {};\n },\n set: function(value) {\n // if params are not object then\n // override and force to object\n if(value !== Object(value)) {\n value = {};\n }\n\n Object.defineProperty(SVP.Player, '__defaults', {\n value: value,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n});\n\nconst initialize = () => {\n image.initialize(utils.extend(config.images, {\n getPixelRatio: utils.device.getPixelRatio\n }));\n\n Domain.initialize(location.hostname);\n\n// load homad only for desktop\n if (utils.device.getDeviceType() === 'desktop' && SVP.Player.defaults.aab === true) {\n HomadAds.initialize();\n }\n};\n\nexport default SVP;\nexport { initialize };","function loadScript(path, onSuccess, onError) {\n var script = document.createElement(\"script\"),\n done = false;\n\n const callback = onSuccess || function () {};\n\n script.type = \"text/javascript\";\n script.src = path;\n script.async = true;\n script.onreadystatechange = script.onload = function() {\n if ( !done && (!this.readyState ||\n this.readyState === \"loaded\" || this.readyState === \"complete\") ) {\n done = true;\n callback();\n\n // Handle memory leak in IE\n script.onload = script.onreadystatechange = null;\n }\n };\n\n script.onerror = onError;\n\n document.body.appendChild(script);\n}\n\nexport default (path) => {\n return new Promise((resolve, reject) => loadScript(path, resolve, reject));\n}","import config from \"player/config\";\nimport scriptLoader from 'utils/script-loader';\n\nconst loadSvpLibrary = async () => {\n return import( /* webpackMode: \"eager\"*/ './index').then(SVP => [\n SVP.default,\n SVP.initialize\n ]);\n};\n\nconst loadJwPlayer = async (root) => {\n const PLAYER_LIB = config.cdn.player + '/jwplayer.js';\n\n if (root.define && root.define.amd) {\n return new Promise((resolve) => {\n root.require([PLAYER_LIB], function (jwplayer) {\n root.jwplayer = jwplayer;\n resolve(jwplayer);\n });\n })\n } else {\n return scriptLoader(PLAYER_LIB);\n }\n};\n\n\n(async function(root) {\n const onReady = root.onSvpPlayerReady;\n\n // onSvpPlayerReady is required callback to handle due to SDK async loading\n if(onReady) {\n loadJwPlayer(root)\n .then(loadSvpLibrary)\n .then(library => {\n const [SVP, initialize] = library;\n root.SVP = SVP;\n onReady();\n initialize();\n });\n }\n}(window));\n"],"sourceRoot":""}