{"version":3,"file":"unify-videoplayer-dailymotion-embed-bundle.iife.min.js","sources":["../../../../Vendor/auf/afLogger.js","../../src/trackers/aufVideoLogger.ts","../../src/enums/publishable-events.enum.ts","../../src/enums/video-plugins.enum.ts","../../src/enums/aspect-ratio.enum.ts","../../src/enums/dailymotion-internal-events.enum.ts","../../src/enums/player-position.enum.ts","../../src/enums/players.enum.ts","../../node_modules/pubsub-js/src/pubsub.js","../../src/plugins/analytics/analytics.ts","../../src/utils/video-logger.ts","../../node_modules/lodash.debounce/index.js","../../src/plugins/autoplay/autoplay.ts","../../src/plugins/debug/debug.ts","../../node_modules/rxjs/src/internal/util/isFunction.ts","../../node_modules/rxjs/src/internal/config.ts","../../node_modules/rxjs/src/internal/util/hostReportError.ts","../../node_modules/rxjs/src/internal/Observer.ts","../../node_modules/rxjs/src/internal/util/isObject.ts","../../node_modules/rxjs/src/internal/util/UnsubscriptionError.ts","../../node_modules/rxjs/src/internal/Subscription.ts","../../node_modules/rxjs/src/internal/symbol/rxSubscriber.ts","../../node_modules/rxjs/src/internal/Subscriber.ts","../../node_modules/rxjs/src/internal/util/identity.ts","../../node_modules/rxjs/src/internal/util/pipe.ts","../../node_modules/rxjs/src/internal/Observable.ts","../../node_modules/rxjs/src/internal/util/toSubscriber.ts","../../node_modules/rxjs/src/internal/util/canReportError.ts","../../node_modules/rxjs/src/internal/util/subscribeToArray.ts","../../node_modules/rxjs/src/internal/symbol/iterator.ts","../../node_modules/rxjs/src/internal/util/isPromise.ts","../../node_modules/rxjs/src/internal/util/subscribeTo.ts","../../node_modules/rxjs/src/internal/util/subscribeToObservable.ts","../../node_modules/rxjs/src/internal/util/subscribeToPromise.ts","../../node_modules/rxjs/src/internal/util/subscribeToIterable.ts","../../node_modules/rxjs/src/internal/innerSubscribe.ts","../../node_modules/rxjs/src/internal/util/isScheduler.ts","../../node_modules/rxjs/src/internal/scheduled/scheduleArray.ts","../../node_modules/rxjs/src/internal/observable/fromArray.ts","../../node_modules/rxjs/src/internal/scheduled/scheduled.ts","../../node_modules/rxjs/src/internal/util/isInteropObservable.ts","../../node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts","../../node_modules/rxjs/src/internal/scheduled/schedulePromise.ts","../../node_modules/rxjs/src/internal/util/isIterable.ts","../../node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts","../../node_modules/rxjs/src/internal/observable/from.ts","../../node_modules/rxjs/src/internal/operators/map.ts","../../node_modules/rxjs/src/internal/operators/mergeMap.ts","../../node_modules/rxjs/src/internal/operators/mergeAll.ts","../../node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts","../../node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts","../../node_modules/rxjs/src/internal/SubjectSubscription.ts","../../node_modules/rxjs/src/internal/Subject.ts","../../node_modules/rxjs/src/internal/operators/mapTo.ts","../../src/enums/sticky-formats.enum.ts","../../node_modules/rxjs/src/internal/BehaviorSubject.ts","../../node_modules/redom/dist/redom.es.js","../../src/plugins/sticky/utils/get-classname.util.ts","../../src/plugins/sticky/enums/buttons-events.enum.ts","../../src/plugins/sticky/enums/visibility.enum.ts","../../src/plugins/sticky/components/base-element.ts","../../src/plugins/sticky/components/global/placeholder/placeholder.component.ts","../../node_modules/rxjs/src/internal/observable/fromEvent.ts","../../src/plugins/sticky/components/global/buttons/buttons.util.ts","../../src/plugins/sticky/components/global/buttons/button.component.ts","../../src/plugins/sticky/components/global/buttons-bar/buttons-bar.component.ts","../../node_modules/rxjs/src/internal/observable/merge.ts","../../src/plugins/sticky/components/layouts/base-layout.ts","../../src/plugins/sticky/sticky-core.ts","../../src/plugins/sticky/utils/merge-functions.util.ts","../../src/plugins/sticky/components/layouts/flying/flying.layout.component.ts","../../src/plugins/sticky/components/layouts/banner/banner-layout.component.ts","../../src/plugins/sticky/utils/session-storage.util.ts","../../src/plugins/sticky/utils/dom.util.ts","../../src/utils/time-utils.service.ts","../../src/plugins/sticky/utils/translate.util.ts","../../src/store.ts","../../src/utils/utils.ts","../../src/manager.ts","../../src/adPlayers/_adapter.ts","../../src/adPlayers/dailymotion-embed.ts","../../node_modules/bowser/src/constants.js","../../node_modules/bowser/src/utils.js","../../node_modules/bowser/src/parser-browsers.js","../../node_modules/bowser/src/parser-os.js","../../node_modules/bowser/src/parser-platforms.js","../../node_modules/bowser/src/parser-engines.js","../../node_modules/bowser/src/parser.js","../../src/trackers/utils/ga-tracking.util.ts","../../src/trackers/GAVideoTracking.ts","../../src/spawner.ts","../../node_modules/bowser/src/bowser.js","../../src/main.ts","../../src/utils/permutive.service.ts","../../src/utils/detect-device.util.ts","../../src/utils/events.util.ts","../../src/players/_adapter.ts","../../src/players/dailymotion-embed.ts","../../src/starters/dailymotion-embed.starter.ts"],"sourcesContent":["/* globals XDomainRequest */\nvar Aflog = window.Aflog || {};\n\n// TODO: replace with a proper array queue to remove dependancy with afLogger object:\n// - before: Aflog.cmd.push(function() { afLogger.logConsole('async log'); } ):\n// - after: Aflog('logConsole', 'async log');\nAflog.Queue = (function () {\n var queue = function (cmd) {\n this.push(cmd);\n };\n\n queue.prototype = {\n constructor: queue,\n push: function () {\n for (var i = 0; i < arguments.length; i++) {\n try {\n if (typeof arguments[i] === 'function') {\n arguments[i]();\n }\n } catch (e) {\n if (window.afLogger) {\n afLogger.logError('Aflog command queue error: ' + e);\n }\n }\n }\n }\n };\n\n return queue;\n})();\n\nAflog.Logger =\n Aflog.Logger ||\n (function () {\n var BEACON_URL = 'https://pixels.afcdn.com/logpix.php'; // Logging beacon URL for all Unify sites\n var LEGACY_ERROR_PIXEL_PATH = '/reloaded/errpix.php'; // Legacy pixel (PHP stats&logs)\n\n var CHANNEL = 'JS Logger';\n\n var EXTERNAL_DOMAINS_REGEXP =\n /onmeda|netmums|itsrosy|livingly|lonny|mabelandmoxie|stylebistro|zimbio|lesnumeriques|cnetfrance|beaute-test|gamekult|zdnet|programmez|paroledemamans|avisdemamans|paroledesagesfemmes/i;\n var EXTERNAL_DOMAINS_REGEXP_LEGACY = /doctissimo/i;\n\n var SESSIONS_SERVICE_NAME = 'session'; // Service name used in dataviz tool\n var SESSIONS_SAMPLE_RATE = 10; // In percent of all events, set false to disable sampling and log everything\n\n var ERRORS_SERVICE_NAME = 'statslogs'; // Service name used in dataviz tool\n var ERRORS_SAMPLE_RATE = 10; // Default error rate, in percent of all JS errors\n\n var EVENTS_SAMPLE_RATE = 100; // Default sample rate, in percent of all JS events\n\n // Cloud Functions + BigQuery logging\n var REALTIME_SAMPLE_RATE = 0;\n var REALTIME_ENDPOINT =\n 'https://europe-west1-realtime-logging-228816.cloudfunctions.net/realtime-logs';\n var REALTIME_MAXQUEUE = 50;\n var REALTIME_TIMEOUT = 10000; // ms\n\n // TODO: move to HB logger!\n var REALTIME_LOGGING_HEADER_BIDDING_MAPPING = {\n // GLOBAL data\n content_type: 'datalayer.pageInfo.contentType',\n site: 'datalayer.siteInfo.platform',\n segment: 'datalayer.userInfo.segment',\n device: 'datalayer.userInfo.device',\n browser: '#UA_BROWSER#',\n browser_version: '#UA_BROWSER_VER#',\n os: '#UA_OS#',\n os_version: '#UA_OS_VER#',\n\n // HB Data\n account: 'headerBidding.account',\n adserver: 'headerBidding.adserver',\n bidder: 'headerBidding.bidder',\n cpm: 'headerBidding.cpm',\n format: 'headerBidding.format',\n size: 'headerBidding.size',\n target: 'headerBidding.target',\n\n // New Prebid Fields\n ad_unit_path: 'headerBidding.ad_unit_path',\n line_item_id: 'headerBidding.line_item_id',\n campaign_id: 'headerBidding.campaign_id',\n creative_id: 'headerBidding.creative_id'\n };\n\n var logger = function (options) {\n this.init(options);\n };\n\n let sessionDataDisabled;\n\n logger.prototype = {\n verbose: {},\n context: {},\n\n init: function (options) {\n // Init datalayer if any, otherwise try to fallback to Unify global datalayer\n this.datalayer =\n options && options.datalayer\n ? options.datalayer\n : window.af_dataLayer\n ? af_dataLayer[0]\n : null;\n\n sessionDataDisabled = options ? options.disableSessionData : false;\n\n this.initCommandQueue();\n this.initContext(options);\n this.initSessionsLogger();\n\n window.onbeforeunload = function () {\n this.sendLogsToBigQuery();\n return;\n }.bind(this);\n },\n\n // Replace command queue array with function calls\n initCommandQueue: function () {\n Aflog.cmd = new Aflog.Queue(Aflog.cmd);\n },\n\n initContext: function (options) {\n // Init global context if available in options\n if (options && options.context) {\n this.context = options.context;\n }\n\n // Retrieve basic informations about user network\n var connection = navigator.connection || {};\n this.context.network = {\n downlink: connection.downlink,\n effectiveType: connection.effectiveType,\n rtt: connection.rtt,\n saveData: connection.saveData\n };\n\n // Retrieve basic informations about browser & OS\n var bowser = window.bowser;\n if (!bowser) {\n return;\n }\n\n this.context.browser = getBowserContext(bowser);\n\n // TODO: useless, check with money team to remove it\n this.realtimeLoggingPlaceholders = {\n '#UA_BROWSER#': this.context.browser.name,\n '#UA_BROWSER_VER#': this.context.browser.version,\n '#UA_OS#': this.context.browser.osName,\n '#UA_OS_VER#': this.context.browser.osVersion\n };\n\n /***\n * @param d Bowser informations\n * @return Context informations from Bowser\n */\n function getBowserContext(d) {\n if (!d && !d.name && !d.browser) {\n console.error(\n '[Analytics] [VIDEO] Bowser package is not loaded !!'\n );\n return;\n }\n\n const browserInformations = {\n name: d.name || d.browser?.name,\n version: d.version || d.browser?.version\n };\n\n const osInformations = {\n osName: d.osname || d.os?.name,\n osVersion: d.osversion || d.os?.version\n };\n\n return {\n ...browserInformations,\n ...osInformations\n };\n }\n },\n addContext: function (data) {\n // In case Bowser is from NPM (Videoplayer)\n if (!this.context.browser) {\n // Reinit context as this script is IIFE so exectuted at the import time before bowser is executed\n this.initContext();\n }\n\n data = data || {};\n data.datalayer = data.datalayer || this.getFilteredDatalayer();\n data.session =\n data.session || !sessionDataDisabled\n ? this.getSessionData()\n : undefined;\n data.browser = this.context.browser;\n data.network = this.context.network;\n\n return data;\n },\n\n setVerbose: function (service, enabled) {\n if (!service) {\n this.logError('Failed activating verbose - missing service name');\n return;\n }\n\n var key = service.toLowerCase() + '_verbose';\n this.verbose[service] = enabled || this.getConfig(key) ? '1' : '0';\n localStorage.setItem(key, this.verbose[service]);\n },\n\n setDataLayer: function (datalayer) {\n this.datalayer = datalayer;\n },\n\n logConsole: function (logs, format, service, error) {\n if (!window.console) {\n return;\n }\n\n // Only display console logs when verbose mode is enable for current service\n if (service && !this.getConfig(service.toLowerCase() + '_verbose')) {\n return;\n }\n\n // Adjust display format according to log type\n format = format || 'log';\n if (typeof logs === 'object' && !Array.isArray(logs)) {\n format = 'table';\n } else if (service) {\n logs = [].concat('[' + service + '] ', logs);\n }\n\n // Log in console\n if (format === 'table') {\n console.table(logs);\n } else if (format === 'count') {\n console.count(logs);\n } else if (format === 'error' && error) {\n console.error(error);\n } else {\n console[format].apply(console, [].concat(logs));\n }\n },\n\n logError: function (message, pool, consoleOnly, data, error) {\n // Classic log in console\n // TODO: replace with custom decorate() function\n var prefix = pool ? '[' + pool + '] ' : '';\n\n this.logConsole(prefix + message, 'error', undefined, error);\n\n // Sampling to reduce costs\n var sampleRate =\n data && data.sampleRate !== undefined\n ? data.sampleRate\n : ERRORS_SAMPLE_RATE;\n if (\n consoleOnly ||\n (sampleRate && sampleRate < Math.floor(Math.random() * 100))\n ) {\n return;\n }\n\n // Add useful informations to error logs\n var data = data || {};\n data.pool = pool || 'JS';\n data.coef = Math.floor(100 / sampleRate); // Multiplier, used for dataviz tool\n data.revision = this.context.revision || 'N/A';\n data.stacktrace = data.stacktrace || 'N/A';\n data = this.addContext(data);\n\n // Send log to legacy stats&logs pixel (old way)\n // TODO: remove and log in stats&logs via the new pixel\n var reversedMessage = message.split('').reverse().join(''); // Prevent from being catched by SQL anti-injection\n var stackMessage = data.stacktrace.split('').reverse().join(''); // Prevent from being catched by SQL anti-injection\n var url =\n this.getLogPixelDomain() +\n LEGACY_ERROR_PIXEL_PATH +\n '?s=' +\n data.coef + // sampling\n '&d=' +\n encodeURIComponent(reversedMessage) +\n '&st=' +\n encodeURIComponent(stackMessage) +\n '&t=' +\n Math.round(Math.random() * 99999) + // random timestamp to prevent browser caching\n (pool ? '&c=' + encodeURIComponent(data.pool) : '');\n this.sendBeacon(url);\n\n // Send log to global pixel\n this.sendLogToPixel(ERRORS_SERVICE_NAME, message, data);\n },\n logErrorWithContext: function (message, pool, data) {\n this.logError(message, pool, false, data);\n },\n\n logEvent: function (service, message, data) {\n if (!service) {\n this.logError('Log event without specifying service');\n }\n\n // Add context informations to event logs\n data = data || {};\n data = this.addContext(data);\n\n // Add multiplier coef, for proper dataviz\n var sampleRate =\n data.sampleRate !== undefined ? data.sampleRate : EVENTS_SAMPLE_RATE;\n data.coef = Math.floor(100 / sampleRate);\n\n // Always log events in console for debugging\n this.logConsole([message, data], 'log', service);\n\n // Send beacon to logging pixel endpoint with sampling, to reduce costs\n var isSampled =\n (data && data.sampled) ||\n Math.floor(Math.random() * 100) > EVENTS_SAMPLE_RATE;\n if (!isSampled) {\n this.sendLogToPixel(service, message, data);\n }\n },\n\n // Format and send logs to the queue\n // TODO: mutualize with logEvent and add a \"sync\" flag to handle bulk mode\n logAnalytics: function (service, logs, applySampling) {\n // Arrify logs\n if (!(logs instanceof Array)) {\n logs = [logs];\n }\n\n if (logs.length < 1) {\n return;\n }\n\n var datalayer = this.getFilteredDatalayer();\n var sessionData = !sessionDataDisabled\n ? this.getSessionData()\n : undefined;\n\n for (var i = 0, l = logs.length; i < l; i++) {\n logs[i].sessionData = sessionData;\n logs[i].datalayer = datalayer;\n logs[i].url = window.location.href;\n }\n\n this.addLogsToQueue(service, logs, applySampling);\n },\n\n /*\n * Gets the current data for the current session for the user\n */\n getSessionData: function () {\n if (!window.afSession) {\n this.logError('Failed retrieving session data');\n return;\n }\n\n return {\n visitor: afSession.getVisitorId(),\n session: afSession.getSessionId(),\n pageview: afSession.getPageviewId(),\n wave: afSession.getWaveId(),\n rank: afSession.getRankId()\n };\n },\n\n getFilteredDatalayer: function () {\n // Fallback for sites without datalayer\n if (!this.datalayer) {\n return {\n siteInfo: {\n platform: document.domain.replace('www.', '').replace('m.', '')\n }\n };\n }\n\n var filteredDatalayer = {};\n if (this.datalayer.userInfo || this.datalayer.user) {\n var key = this.datalayer.userInfo ? 'userInfo' : 'user';\n\n filteredDatalayer.userInfo = {\n du: this.datalayer[key].du || this.datalayer[key].dom,\n device: this.datalayer[key].device,\n adblocker: this.datalayer[key].adblocker ? true : false,\n screenResolution: this.datalayer[key].screenResolution,\n segment: this.datalayer[key].segment\n };\n filteredDatalayer.vuid =\n this.datalayer[key].vuid || this.datalayer[key].id;\n }\n if (\n this.datalayer.pageInfo ||\n (this.datalayer.page && this.datalayer.page)\n ) {\n var key = this.datalayer.userInfo ? 'pageInfo' : 'page';\n\n filteredDatalayer[key] = {\n version: this.datalayer[key].version || null,\n contentType:\n this.datalayer[key].contentType || this.datalayer.content.type,\n section: this.datalayer[key].section,\n subsection:\n this.datalayer[key].subsection || this.datalayer[key].subSection,\n tag: this.datalayer[key].tag || this.datalayer[key].mainTag,\n category: this.datalayer[key].category || null,\n adstack: this.datalayer[key].adstack || null\n };\n }\n if (this.datalayer.campaignInfo || this.datalayer.campaignInfo) {\n var key = this.datalayer.userInfo ? 'campaignInfo' : 'utm';\n\n filteredDatalayer.campaignInfo = {\n utmSource:\n this.datalayer[key].utmSource || this.datalayer[key].source,\n utmCampaign:\n this.datalayer[key].utmCampaign || this.datalayer[key].campaign,\n utmMedium:\n this.datalayer[key].utmMedium || this.datalayer[key].medium,\n paid:\n this.datalayer[key].paid ||\n ['cpc', 'cpc-vertical', 'cpc-horizontal'].includes(\n this.datalayer[key].medium\n )\n };\n }\n if (this.datalayer.siteInfo || this.datalayer.site) {\n var key = this.datalayer.siteInfo ? 'siteInfo' : 'site';\n\n var isMobile = null;\n if (this.datalayer[key].isMobile !== 'undefined') {\n isMobile = this.datalayer[key].isMobile;\n } else if (filteredDatalayer.userInfo) {\n isMobile = filteredDatalayer.userInfo !== 'desktop' ? 1 : 0;\n }\n\n filteredDatalayer.siteInfo = {\n platform: this.datalayer[key].platform,\n isMobile: isMobile\n };\n }\n\n return filteredDatalayer;\n },\n\n // === COMMON LOGGER FOR SESSIONS ===\n\n initSessionsLogger: function () {\n // Only activate on sites with PubSub lib\n if (!window.PubSub) {\n return;\n }\n\n var that = this;\n\n // Send logs on each pageview ..\n PubSub.subscribe('datalayer.ready', function () {\n that.logSessions();\n });\n\n // .. and also each AJAX pageview (albums, games, etc.)\n PubSub.subscribe('tracking.call', function () {\n that.logSessions();\n });\n },\n\n logSessions: function () {\n if (\n SESSIONS_SAMPLE_RATE &&\n Math.floor(Math.random() * 100) > SESSIONS_SAMPLE_RATE\n ) {\n return;\n }\n\n this.logEvent(SESSIONS_SERVICE_NAME, 'pageview');\n },\n\n // === REAL-TIME LOGGING with Unify pixel ===\n\n sendLogToPixel: function (service, message, data) {\n var payload = JSON.stringify({\n service_name: service,\n channel: CHANNEL,\n message: message,\n data: data\n });\n this.sendBeacon(BEACON_URL, payload);\n },\n\n getLogPixelDomain: function () {\n var domain = location.hostname;\n\n // Remove subdomain if any\n var hostnameArr = location.hostname.split('.');\n if (hostnameArr.length > 2) {\n hostnameArr.shift();\n domain = hostnameArr.join('.');\n }\n\n // Add subdomain for log pixel\n if (EXTERNAL_DOMAINS_REGEXP.test(location.hostname)) {\n domain = 'https://aufeminin.' + domain;\n } else if (EXTERNAL_DOMAINS_REGEXP_LEGACY.test(location.hostname)) {\n domain = 'https://dfp.' + domain; // TODO: replace with standard domain name (used only by Doctissimo)\n } else if (location.hostname.indexOf('local.') >= 0) {\n domain = 'https://local.' + domain;\n } else {\n domain = 'https://www.' + domain;\n }\n\n return domain;\n },\n\n // === REAL-TIME LOGGING with Google Cloud Functions + BigQuery ===\n\n realtimeLogs: {},\n realtimeTimer: null,\n realtimeLogTime: null,\n realtimeLoggingMapping: {\n HEADER_BIDDING: REALTIME_LOGGING_HEADER_BIDDING_MAPPING,\n HEADER_BIDDING_BOOKED: REALTIME_LOGGING_HEADER_BIDDING_MAPPING,\n HEADER_BIDDING_RENDER: REALTIME_LOGGING_HEADER_BIDDING_MAPPING\n },\n\n addLogsToQueue: function (service, logs, applySampling) {\n // Sampling to reduce costs\n if (\n applySampling &&\n REALTIME_SAMPLE_RATE &&\n Math.floor(Math.random() * 100) > REALTIME_SAMPLE_RATE\n ) {\n return;\n }\n\n for (var i = 0, l = logs.length; i < l; i++) {\n var formattedLog = this.getFormattedRealtimeLog(service, logs[i]);\n if (typeof formattedLog !== 'undefined') {\n if (!this.realtimeLogs.hasOwnProperty(service)) {\n this.realtimeLogs[service] = [];\n }\n this.realtimeLogs[service].push(formattedLog);\n }\n }\n\n var nbLogs = 0;\n for (var type in this.realtimeLogs) {\n nbLogs += this.realtimeLogs[type].length;\n }\n\n if (nbLogs > REALTIME_MAXQUEUE) {\n this.sendLogsToBigQuery();\n } else {\n var that = this;\n this.realtimeTimer = window.setTimeout(function () {\n that.sendLogsToBigQuery();\n }, REALTIME_TIMEOUT);\n }\n },\n\n // Pyramid of doom spotted!\n // TODO: rework to avoid nested if statements\n getFormattedRealtimeLog: function (service, log) {\n var formattedLog = {};\n\n if (this.realtimeLoggingMapping.hasOwnProperty(service)) {\n var mapping = this.realtimeLoggingMapping[service];\n\n for (var key in mapping) {\n if (mapping.hasOwnProperty(key)) {\n var value = mapping[key];\n if (this.realtimeLoggingPlaceholders.hasOwnProperty(value)) {\n formattedLog[key] = this.realtimeLoggingPlaceholders[value];\n } else {\n var path = value.split('.');\n for (var i = 0; i < path.length; i++) {\n if (\n formattedLog.hasOwnProperty(key) &&\n formattedLog[key].hasOwnProperty(path[i])\n ) {\n formattedLog[key] = formattedLog[key][path[i]];\n } else if (\n !formattedLog.hasOwnProperty(key) &&\n log.hasOwnProperty(path[i])\n ) {\n formattedLog[key] = log[path[i]];\n } else {\n formattedLog[key] = null;\n break;\n }\n }\n }\n }\n }\n } else {\n return;\n }\n\n return formattedLog;\n },\n\n sendLogsToBigQuery: function () {\n var data = [];\n\n for (var service in this.realtimeLogs) {\n if (this.realtimeLogs[service].length > 0) {\n data.push({\n logtype: service,\n logs: this.realtimeLogs[service]\n });\n }\n }\n\n this.realtimeLogs = {};\n window.clearTimeout(this.realtimeTimer);\n\n if (data.length > 0) {\n this.logConsole(['real-time bulk logging', data], '', 'realtime');\n\n var headers = [{ header: 'Content-Type', value: 'application/json' }];\n\n // TODO: replace XHR request with sendBeacon (check with money team first)\n // var blob = new Blob([JSON.stringify(data)], headers);\n // return this.sendBeacon(REALTIME_ENDPOINT, blob);\n return this.sendXhrRequest('POST', REALTIME_ENDPOINT, data, headers);\n }\n },\n\n // === UTILS FUNCTIONS ===\n\n getConfig: function (key) {\n if (!this.hashs) {\n this.hashs = this.getLocationHash();\n }\n\n return (\n this.hashs[key] ||\n (window.localStorage && localStorage.getItem(key)) ||\n ''\n );\n },\n\n sendBeacon: function (url, data) {\n if (navigator.sendBeacon) {\n navigator.sendBeacon(url, data);\n } else {\n // Fallback to synchronous request for old browsers, bad because it blocks next page loading ..\n this.sendXhrRequest('POST', url, data);\n }\n },\n\n sendXhrRequest: function (method, url, payload, headers) {\n var request = window.XDomainRequest\n ? new XDomainRequest()\n : new XMLHttpRequest();\n request.open(method, url, true);\n\n if (!window.XDomainRequest && headers && headers.length) {\n for (var i = 0, l = headers.length; i < l; i++) {\n request.setRequestHeader(headers[i].header, headers[i].value);\n }\n }\n\n request.onerror = function (response) {\n this.logError('Error while sending XHR request to ' + url);\n };\n\n var body = JSON.stringify(payload);\n\n return request.send(body);\n },\n\n /*\n * List location.hash parameters into an object.\n * TODO: move to global utils object\n */\n getLocationHash: function () {\n var hashParams = {};\n var e,\n a = /\\+/g, // Regex for replacing addition symbol with a space\n r = /([^&;=]+)=?([^&;]*)/g,\n d = function (s) {\n return decodeURIComponent(s.replace(a, ' '));\n },\n q = window.location.hash.substring(1);\n\n while ((e = r.exec(q))) {\n hashParams[d(e[1])] = d(e[2]);\n }\n\n return hashParams;\n }\n };\n\n return logger;\n })();\n\nwindow.module = {};\nmodule.exports = Aflog.Logger;\nwindow.module = undefined;\n","import { PlayerPosition } from 'src/enums/player-position.enum';\nimport AfLogger from '@vendor/auf/afLogger';\nexport interface VideoLoggerOptions {\n\tcontext: VideoLoggerContext;\n}\n\ninterface VideoLoggerContext {\n\tadPlayer: any;\n\tplayer: {\n\t\tversion: string;\n\t\tname: string;\n\t\tvideoId: string;\n\t\tcontext: any;\n\t\tposition: PlayerPosition;\n\t};\n}\n\nenum VideoLogType {\n\tVIDEO_ERROR = 'VIDEO_ERROR',\n\tVIDEO_LOG = 'VIDEO_LOG'\n}\n\nconst afLogger = new AfLogger({ disableSessionData: true });\n\nexport class VideoLogger {\n\tprivate serviceName = 'video';\n\tprivate sampleRate = 10;\n\tprivate noisyErrorSampleRate = 1;\n\tprivate noisyErrors = [\n\t\t'play() can only be initiated by a user gesture',\n\t\t'The request is not allowed by the user agent',\n\t\t'The play() request was interrupted by a call to pause()',\n\t\t\"play() failed because the user didn't interact with the document first.\",\n\t\t'The operation was aborted.', // Safari error due to browser settings or unmuted autoplay\n\t\t'The operation is not supported.' // Safari error that can be caused by lot of player errors\n\t];\n\tprivate logged: Map> = new Map<\n\t\tstring,\n\t\tMap\n\t>([\n\t\t[VideoLogType.VIDEO_ERROR, new Map()],\n\t\t[VideoLogType.VIDEO_LOG, new Map()]\n\t]);\n\n\tprivate sampled = this.sampleRate < Math.floor(Math.random() * 100);\n\tprivate context: any;\n\tprivate logger: any;\n\n\tconstructor(options: VideoLoggerOptions) {\n\t\tthis.initContext(options.context);\n\t}\n\n\tsetVerbose = (isEnabled: boolean) =>\n\t\tafLogger.setVerbose(this.serviceName, isEnabled);\n\n\tlogError(message: string, category: string, data: any) {\n\t\tconst pool = `${this.serviceName} ${category ? ':' + category : ''}`;\n\n\t\t// Sampling to reduce cost & noise\n\t\tconst errorRate = this.getErrorRate(message);\n\t\tif (errorRate && Math.floor(Math.random() * 100) > errorRate) {\n\t\t\tafLogger.logConsole('[' + pool + '] ' + message, 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tdata = this.addContext({ ...data, sampleRate: errorRate });\n\t\tafLogger.logErrorWithContext(message, pool, data);\n\t}\n\n\tlogEventOnce(message: string, videoData: any) {\n\t\tif (this.logged.get(VideoLogType.VIDEO_LOG)?.get(message)) return;\n\n\t\tthis.logged.get(VideoLogType.VIDEO_LOG)?.set(message, true);\n\t\tthis.logEvent(message, videoData);\n\t}\n\n\tlogEvent = (\n\t\tmessage,\n\t\tvideoData = {\n\t\t\tduration: undefined,\n\t\t\tfile: undefined,\n\t\t\tposition: undefined,\n\t\t\turl: undefined\n\t\t}\n\t) =>\n\t\tafLogger.logEvent(\n\t\t\tthis.serviceName,\n\t\t\tmessage,\n\t\t\tthis.addContext({\n\t\t\t\tsampled: this.sampled,\n\t\t\t\tsampleRate: this.sampleRate,\n\t\t\t\tvideo: {\n\t\t\t\t\tduration: videoData.duration,\n\t\t\t\t\tfile: videoData.file,\n\t\t\t\t\tposition: videoData.position,\n\t\t\t\t\turl: videoData.url\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\n\tprivate initContext(context: VideoLoggerContext) {\n\t\tif (!context) return;\n\n\t\tthis.context = context;\n\t}\n\n\tprivate getErrorRate = (message) =>\n\t\tthis.noisyErrors.indexOf(message) > -1\n\t\t\t? this.noisyErrorSampleRate\n\t\t\t: this.sampleRate;\n\n\tprivate addContext = (data: any) => {\n\t\tconst result = { ...data, ...this.context };\n\t\treturn result;\n\t};\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.Tracker = window.AufVideo.Tracker || {};\nwindow.AufVideo.Tracker.VideoLogger = VideoLogger;\n","export enum PublishableVideoPlayerEvents {\n\t// Global\n\tEND = 'video.player.end',\n\tPAUSE = 'video.player.pause',\n\tPLAY = 'video.player.play',\n\tREADY = 'video.player.ready',\n\tSEEKING = 'video.player.seek',\n\tSEEKED = 'video.player.seeked',\n\tSTART = 'video.player.start',\n\tUNMUTE = 'video.player.unmute',\n\tINITIALIZATION_ERROR = 'video.player.initialization.error',\n\tBEFORE_COMPLETE = 'video.player.beforeComplete',\n\tBEFORE_PLAY = 'video.player.beforePlay',\n\tCONTROLS_CHANGE = 'video.player.controlschange',\n\tFULLSCREEN_CHANGE = 'video.player.fullscreenchange',\n\tPLAYBACK_READY = 'video.player.playback_ready',\n\tVIDEO_CHANGE = 'video.player.videochange',\n\tVOLUME_CHANGE = 'video.player.volumechange',\n\tCRITICAL_PATH_READY = 'video.player.dailymotion-embed.criticalready',\n\tDAILYMOTION_EMBED_LAZY_READY = 'video.player.dailymotion-embed.lazy-ready'\n}\n\nexport enum PublishableVideoContentEvents {\n\tTIME_UPDATE = 'video.player.inProgress',\n\tVIDEO_END = 'video.player.complete',\n\tDURATION_CHANGE = 'video.player.content.duration_change',\n\tLOADED_METADATA = 'video.player.content.loaded_metadata',\n\tSUBTITLE_CHANGE = 'video.player.content.subtitle_change',\n\tSUBTITLES_AVAILABLE = 'video.player.content.subtitles_available',\n\tPLAYBACK_RESOLUTION = 'video.player.content.playback_resolution',\n\tPLAYING = 'video.player.content.playing',\n\tQUALITIES_AVAILABLE = 'video.player.content.qualities_available',\n\tQUALITIES_CHANGED = 'video.player.content.qualities_changed',\n\tPROGRESS = 'video.player.content.progress',\n\tVIDEO_START = 'video.player.content.start',\n\tWAITING = 'video.player.content.waiting'\n}\n\nexport enum PublishableVideoUserEvents {\n\tTOGGLE_PLAY_PAUSE = 'video.player.user.togglePlayPause'\n}\n\nexport enum PublishableVideoLogEvents {\n\tERROR = 'video.player.log.error'\n}\n\nexport enum PublishableVideoAdEvents {\n\tAD_CLICK = 'video.ad.click',\n\tAD_COMPANIONS = 'video.ad.companions',\n\tAD_END = 'video.ad.complete',\n\tAD_PAUSE = 'video.ad.pause',\n\tAD_PLAY = 'video.ad.play',\n\tAD_READY = 'video.ad.ready',\n\tAD_START = 'video.ad.start',\n\tAD_TAG_READY = 'video.ad.tag.ready',\n\tAD_TIMEUPDATE = 'video.ad.time_update',\n\tAD_IMPRESSION = 'video.ad.impression',\n\tAD_REQUEST = 'video.ad.request',\n\tAD_BLOCKED = 'video.ad.block',\n\tAD_RESUME = 'video.ad.resume',\n\tAD_LOADED = 'video.ad.loaded',\n\tAD_CONTENT_RESUME = 'video.ad.contentresume',\n\tAD_BID_FOUND = 'video.ad.bidfound',\n\tAD_CANCEL = 'video.ad.cancel',\n\tAD_UNFILLED = 'video.ad.unfilled',\n\tAD_DURATIONCHANGE = 'video.ad.duration_change',\n\tHEAVY_ADS = 'video.ad.heavy_ad_error'\n}\n\nexport enum PublishableVideoStoreEvents {\n\tADD_INSTANCE = 'video.store.addInstance'\n}\n\nexport enum PublishableVideoStickyEvents {\n\tSTICKY_READY = 'video.sticky.ready',\n\tSTICKY_CONTENT_START = 'video.sticky.content.start',\n\tSTICK = 'video.player.sticky.stick',\n\tUNSTICK = 'video.player.sticky.unstick',\n\tSTICKED = 'video.player.sticky.sticked',\n\tUNSTICKED = 'video.player.sticky.unsticked',\n\tSCROLL_TO_PLAYER = 'video.player.sticky.gotoplayer',\n\tCLOSE = 'video.player.sticky.close'\n}\n\n(window as any).PublishableVideoPlayerEvents = PublishableVideoPlayerEvents;\n(window as any).PublishableVideoContentEvents = PublishableVideoContentEvents;\n(window as any).PublishableVideoUserEvents = PublishableVideoUserEvents;\n(window as any).PublishableVideoLogEvents = PublishableVideoLogEvents;\n(window as any).PublishableVideoAdEvents = PublishableVideoAdEvents;\n(window as any).PublishableVideoStoreEvents = PublishableVideoStoreEvents;\n(window as any).PublishableVideoStickyEvents = PublishableVideoStickyEvents;\n","export enum VideoPlugins {\n AUTOPLAY = 'Autoplay',\n STICKY = 'Sticky',\n ANALYTICS = 'Analytics',\n DEBUG = 'Debug'\n}\n","export enum AspectRatio {\n Ratio_16_9 = '16-9'\n}\n","export enum DailymotionInternalEvents {\n\tAPI_READY = 'apiready',\n\tCONTROLS_CHANGE = 'controlschange',\n\tSTART = 'start',\n\tEND = 'end',\n\tENDED = 'ended',\n\tERROR = 'error',\n\tFULLSCREEN_CHANGE = 'fullscreenchange',\n\tPLAYBACK_READY = 'playback_ready',\n\tSEEKING = 'seeking',\n\tSEEKED = 'seeked',\n\tVIDEO_CHANGE = 'videochange',\n\tVOLUME_CHANGE = 'volumechange',\n VIDEO_START = 'video_start',\n VIDEO_END = 'video_end',\n PAUSE = 'pause',\n PLAY = 'play',\n PLAYING = 'playing',\n DURATION_CHANGE = 'durationchange',\n LOADED_METADATA = 'loadedmetadata',\n WAITING = 'waiting',\n SUBTITLE_CHANGE = 'subtitlechange',\n SUBTITLES_AVAILABLE = 'subtitlesavailable',\n QUALITIES_AVAILABLE = 'qualitiesavailable',\n QUALITIES_CHANGED = 'qualitieschanged',\n TIMEUPDATE = 'timeupdate',\n PROGRESS = 'progress',\n PLAYBACK_RESOLUTION = 'playback_resolution',\n AD_START = 'ad_start',\n AD_END = 'ad_end',\n AD_PAUSE = 'ad_pause',\n AD_PLAY = 'ad_play',\n AD_TIMEUPDATE = 'ad_timeupdate',\n AD_COMPANIONS = 'ad_companions',\n AD_CLICK = 'ad_click',\n AD_LOADED = 'ad_loaded',\n AD_IMPRESSION = 'ad_impression',\n AD_BUFFERSTART = 'ad_bufferStart',\n AD_BUFFERFINISH = 'ad_bufferFinish',\n\tPLAYER_HEAVYADSINTERVENTION = 'PLAYER_HEAVYADSINTERVENTION' // https://faq.dailymotion.com/hc/fr/articles/4414693854738-G%C3%A9rer-l-int%C3%A9gration-du-player-d%C3%A9tect%C3%A9-par-Heavy-Ad\n}\n\nexport enum DailymotionEmbedInternalEvents {\n\tPLAYER_ASPECTRATIOCHANGE = 'PLAYER_ASPECTRATIOCHANGE',\n\tPLAYER_CONTROLSCHANGE = 'PLAYER_CONTROLSCHANGE',\n\tPLAYER_CRITICALPATHREADY = 'PLAYER_CRITICALPATHREADY',\n\tPLAYER_END = 'PLAYER_END',\n\tPLAYER_ERROR = 'PLAYER_ERROR',\n\tPLAYER_PIPEXPANDEDCHANGE = 'PLAYER_PIPEXPANDEDCHANGE',\n\tPLAYER_PLAYBACKPERMISSION = 'PLAYER_PLAYBACKPERMISSION',\n\tPLAYER_PRESENTATIONMODECHANGE = 'PLAYER_PRESENTATIONMODECHANGE',\n\tPLAYER_SCALEMODECHANGE = 'PLAYER_SCALEMODECHANGE',\n\tPLAYER_START = 'PLAYER_START',\n\tPLAYER_VIDEOCHANGE = 'PLAYER_VIDEOCHANGE',\n\tPLAYER_VIEWABILITYCHANGE = 'PLAYER_VIEWABILITYCHANGE',\n\tPLAYER_VOLUMECHANGE = 'PLAYER_VOLUMECHANGE',\n\tPLAYER_HEAVYADSINTERVENTION = 'PLAYER_HEAVYADSINTERVENTION',\n\tVIDEO_BUFFERING = 'VIDEO_BUFFERING',\n\tVIDEO_DURATIONCHANGE = 'VIDEO_DURATIONCHANGE',\n\tVIDEO_END = 'VIDEO_END',\n\tVIDEO_PAUSE = 'VIDEO_PAUSE',\n\tVIDEO_PLAY = 'VIDEO_PLAY',\n\tVIDEO_PLAYING = 'VIDEO_PLAYING',\n\tVIDEO_PROGRESS = 'VIDEO_PROGRESS',\n\tVIDEO_QUALITIESREADY = 'VIDEO_QUALITIESREADY',\n\tVIDEO_QUALITYCHANGE = 'VIDEO_QUALITYCHANGE',\n\tVIDEO_SEEKEND = 'VIDEO_SEEKEND',\n\tVIDEO_SEEKSTART = 'VIDEO_SEEKSTART',\n\tVIDEO_SUBTITLESCHANGE = 'VIDEO_SUBTITLESCHANGE',\n\tVIDEO_SUBTITLESREADY = 'VIDEO_SUBTITLESREADY',\n\tVIDEO_START = 'VIDEO_START',\n\tVIDEO_TIMECHANGE = 'VIDEO_TIMECHANGE',\n\tAD_COMPANIONSREADY = 'AD_COMPANIONSREADY',\n\tAD_DURATIONCHANGE = 'AD_DURATIONCHANGE',\n\tAD_END = 'AD_END',\n\tAD_IMPRESSION = 'AD_IMPRESSION',\n\tAD_LOADED = 'AD_LOADED',\n\tAD_PAUSE = 'AD_PAUSE',\n\tAD_PLAY = 'AD_PLAY',\n\tAD_START = 'AD_START',\n\tAD_TIMECHANGE = 'AD_TIMECHANGE',\n\tAD_CLICK = 'AD_CLICK'\n}\n","export enum PlayerPosition {\n ATF = 'ATF',\n MTF_CONTENT = 'MTF_CONTENT',\n BTF = 'BTF'\n}\n","export enum Players {\n\tDAILYMOTION = 'dailymotion',\n\tDAILYMOTION_EMBED = 'dailymotion-embed',\n\tJWPLAYER = 'jwplayer',\n\tVIDEOJS = 'videojs'\n}\n\n(window as any).VideoPlayers = Players;\n","/**\n * Copyright (c) 2010,2011,2012,2013,2014 Morgan Roderick http://roderick.dk\n * License: MIT - http://mrgnrdrck.mit-license.org\n *\n * https://github.com/mroderick/PubSubJS\n */\n\n(function (root, factory){\n 'use strict';\n\n var PubSub = {};\n\n if (root.PubSub) {\n PubSub = root.PubSub;\n console.warn(\"PubSub already loaded, using existing version\");\n } else {\n root.PubSub = PubSub;\n factory(PubSub);\n }\n // CommonJS and Node.js module support\n if (typeof exports === 'object'){\n if (module !== undefined && module.exports) {\n exports = module.exports = PubSub; // Node.js specific `module.exports`\n }\n exports.PubSub = PubSub; // CommonJS module 1.1.1 spec\n module.exports = exports = PubSub; // CommonJS\n }\n // AMD support\n /* eslint-disable no-undef */\n else if (typeof define === 'function' && define.amd){\n define(function() { return PubSub; });\n /* eslint-enable no-undef */\n }\n\n}(( typeof window === 'object' && window ) || this, function (PubSub){\n 'use strict';\n\n var messages = {},\n lastUid = -1,\n ALL_SUBSCRIBING_MSG = '*';\n\n function hasKeys(obj){\n var key;\n\n for (key in obj){\n if ( Object.prototype.hasOwnProperty.call(obj, key) ){\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns a function that throws the passed exception, for use as argument for setTimeout\n * @alias throwException\n * @function\n * @param { Object } ex An Error object\n */\n function throwException( ex ){\n return function reThrowException(){\n throw ex;\n };\n }\n\n function callSubscriberWithDelayedExceptions( subscriber, message, data ){\n try {\n subscriber( message, data );\n } catch( ex ){\n setTimeout( throwException( ex ), 0);\n }\n }\n\n function callSubscriberWithImmediateExceptions( subscriber, message, data ){\n subscriber( message, data );\n }\n\n function deliverMessage( originalMessage, matchedMessage, data, immediateExceptions ){\n var subscribers = messages[matchedMessage],\n callSubscriber = immediateExceptions ? callSubscriberWithImmediateExceptions : callSubscriberWithDelayedExceptions,\n s;\n\n if ( !Object.prototype.hasOwnProperty.call( messages, matchedMessage ) ) {\n return;\n }\n\n for (s in subscribers){\n if ( Object.prototype.hasOwnProperty.call(subscribers, s)){\n callSubscriber( subscribers[s], originalMessage, data );\n }\n }\n }\n\n function createDeliveryFunction( message, data, immediateExceptions ){\n return function deliverNamespaced(){\n var topic = String( message ),\n position = topic.lastIndexOf( '.' );\n\n // deliver the message as it is now\n deliverMessage(message, message, data, immediateExceptions);\n\n // trim the hierarchy and deliver message to each level\n while( position !== -1 ){\n topic = topic.substr( 0, position );\n position = topic.lastIndexOf('.');\n deliverMessage( message, topic, data, immediateExceptions );\n }\n\n deliverMessage(message, ALL_SUBSCRIBING_MSG, data, immediateExceptions);\n };\n }\n\n function hasDirectSubscribersFor( message ) {\n var topic = String( message ),\n found = Boolean(Object.prototype.hasOwnProperty.call( messages, topic ) && hasKeys(messages[topic]));\n\n return found;\n }\n\n function messageHasSubscribers( message ){\n var topic = String( message ),\n found = hasDirectSubscribersFor(topic) || hasDirectSubscribersFor(ALL_SUBSCRIBING_MSG),\n position = topic.lastIndexOf( '.' );\n\n while ( !found && position !== -1 ){\n topic = topic.substr( 0, position );\n position = topic.lastIndexOf( '.' );\n found = hasDirectSubscribersFor(topic);\n }\n\n return found;\n }\n\n function publish( message, data, sync, immediateExceptions ){\n message = (typeof message === 'symbol') ? message.toString() : message;\n\n var deliver = createDeliveryFunction( message, data, immediateExceptions ),\n hasSubscribers = messageHasSubscribers( message );\n\n if ( !hasSubscribers ){\n return false;\n }\n\n if ( sync === true ){\n deliver();\n } else {\n setTimeout( deliver, 0 );\n }\n return true;\n }\n\n /**\n * Publishes the message, passing the data to it's subscribers\n * @function\n * @alias publish\n * @param { String } message The message to publish\n * @param {} data The data to pass to subscribers\n * @return { Boolean }\n */\n PubSub.publish = function( message, data ){\n return publish( message, data, false, PubSub.immediateExceptions );\n };\n\n /**\n * Publishes the message synchronously, passing the data to it's subscribers\n * @function\n * @alias publishSync\n * @param { String } message The message to publish\n * @param {} data The data to pass to subscribers\n * @return { Boolean }\n */\n PubSub.publishSync = function( message, data ){\n return publish( message, data, true, PubSub.immediateExceptions );\n };\n\n /**\n * Subscribes the passed function to the passed message. Every returned token is unique and should be stored if you need to unsubscribe\n * @function\n * @alias subscribe\n * @param { String } message The message to subscribe to\n * @param { Function } func The function to call when a new message is published\n * @return { String }\n */\n PubSub.subscribe = function( message, func ){\n if ( typeof func !== 'function'){\n return false;\n }\n\n message = (typeof message === 'symbol') ? message.toString() : message;\n\n // message is not registered yet\n if ( !Object.prototype.hasOwnProperty.call( messages, message ) ){\n messages[message] = {};\n }\n\n // forcing token as String, to allow for future expansions without breaking usage\n // and allow for easy use as key names for the 'messages' object\n var token = 'uid_' + String(++lastUid);\n messages[message][token] = func;\n\n // return token for unsubscribing\n return token;\n };\n\n PubSub.subscribeAll = function( func ){\n return PubSub.subscribe(ALL_SUBSCRIBING_MSG, func);\n };\n\n /**\n * Subscribes the passed function to the passed message once\n * @function\n * @alias subscribeOnce\n * @param { String } message The message to subscribe to\n * @param { Function } func The function to call when a new message is published\n * @return { PubSub }\n */\n PubSub.subscribeOnce = function( message, func ){\n var token = PubSub.subscribe( message, function(){\n // before func apply, unsubscribe message\n PubSub.unsubscribe( token );\n func.apply( this, arguments );\n });\n return PubSub;\n };\n\n /**\n * Clears all subscriptions\n * @function\n * @public\n * @alias clearAllSubscriptions\n */\n PubSub.clearAllSubscriptions = function clearAllSubscriptions(){\n messages = {};\n };\n\n /**\n * Clear subscriptions by the topic\n * @function\n * @public\n * @alias clearAllSubscriptions\n * @return { int }\n */\n PubSub.clearSubscriptions = function clearSubscriptions(topic){\n var m;\n for (m in messages){\n if (Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0){\n delete messages[m];\n }\n }\n };\n\n /**\n Count subscriptions by the topic\n * @function\n * @public\n * @alias countSubscriptions\n * @return { Array }\n */\n PubSub.countSubscriptions = function countSubscriptions(topic){\n var m;\n // eslint-disable-next-line no-unused-vars\n var token;\n var count = 0;\n for (m in messages) {\n if (Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0) {\n for (token in messages[m]) {\n count++;\n }\n break;\n }\n }\n return count;\n };\n\n\n /**\n Gets subscriptions by the topic\n * @function\n * @public\n * @alias getSubscriptions\n */\n PubSub.getSubscriptions = function getSubscriptions(topic){\n var m;\n var list = [];\n for (m in messages){\n if (Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0){\n list.push(m);\n }\n }\n return list;\n };\n\n /**\n * Removes subscriptions\n *\n * - When passed a token, removes a specific subscription.\n *\n\t * - When passed a function, removes all subscriptions for that function\n *\n\t * - When passed a topic, removes all subscriptions for that topic (hierarchy)\n * @function\n * @public\n * @alias subscribeOnce\n * @param { String | Function } value A token, function or topic to unsubscribe from\n * @example // Unsubscribing with a token\n * var token = PubSub.subscribe('mytopic', myFunc);\n * PubSub.unsubscribe(token);\n * @example // Unsubscribing with a function\n * PubSub.unsubscribe(myFunc);\n * @example // Unsubscribing from a topic\n * PubSub.unsubscribe('mytopic');\n */\n PubSub.unsubscribe = function(value){\n var descendantTopicExists = function(topic) {\n var m;\n for ( m in messages ){\n if ( Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0 ){\n // a descendant of the topic exists:\n return true;\n }\n }\n\n return false;\n },\n isTopic = typeof value === 'string' && ( Object.prototype.hasOwnProperty.call(messages, value) || descendantTopicExists(value) ),\n isToken = !isTopic && typeof value === 'string',\n isFunction = typeof value === 'function',\n result = false,\n m, message, t;\n\n if (isTopic){\n PubSub.clearSubscriptions(value);\n return;\n }\n\n for ( m in messages ){\n if ( Object.prototype.hasOwnProperty.call( messages, m ) ){\n message = messages[m];\n\n if ( isToken && message[value] ){\n delete message[value];\n result = value;\n // tokens are unique, so we can just stop here\n break;\n }\n\n if (isFunction) {\n for ( t in message ){\n if (Object.prototype.hasOwnProperty.call(message, t) && message[t] === value){\n delete message[t];\n result = true;\n }\n }\n }\n }\n }\n\n return result;\n };\n}));\n","import {\n\tPublishableVideoAdEvents,\n\tPublishableVideoContentEvents,\n\tPublishableVideoLogEvents,\n\tPublishableVideoPlayerEvents,\n\tPublishableVideoStickyEvents\n} from '../../enums/publishable-events.enum';\nimport { ListenerAction } from '../../interfaces/listener-action';\nimport { Store } from '../../store';\nimport PubSub from 'pubsub-js';\nimport { Players } from 'src/enums';\nimport { DailymotionEmbedPlayer } from 'src/players/dailymotion-embed';\n\nexport interface AnalyticsPluginOptions {\n\tstore: Store;\n}\n\nexport class AnalyticsPlugin {\n\tpublic name = 'analytics';\n\tprivate _store: Store;\n\tprivate _events: Map> = new Map<\n\t\tstring,\n\t\tMap\n\t>();\n\n\tprivate _playerListenersActions: ListenerAction[] = [\n\t\t{\n\t\t\tmessage: PublishableVideoLogEvents.ERROR,\n\t\t\tactionFn: (msg, data) =>\n\t\t\t\tthis._logError(data.message, data.category, data.id)\n\t\t},\n\t\t{\n\t\t\tmessage: 'video.player.log.event',\n\t\t\tactionFn: (msg, data) => {\n\t\t\t\tvar event = data.event;\n\t\t\t\tdelete data.event;\n\t\t\t\tthis._logEventOnce(event, data);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoPlayerEvents.READY,\n\t\t\tactionFn: (msg, data) => this._logEventOnce('player ready', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoPlayerEvents.START,\n\t\t\tactionFn: (msg, data) => {\n\t\t\t\tthis._logEventOnce('player start', data);\n\t\t\t\tthis._logEventOnce('ad opportunities', data); // TODO: remove when NR video dashboard has been migrated to the other event\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoPlayerEvents.PLAY,\n\t\t\tactionFn: (msg, data) => this._logEvent('player play', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoContentEvents.VIDEO_END,\n\t\t\tactionFn: (msg, data) => this._logEventOnce('player complete', data)\n\t\t},\n\t\t{\n\t\t\tmessage: 'video.player.revolver',\n\t\t\tactionFn: (msg, data) => this._logEventOnce('player revolver', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoStickyEvents.CLOSE,\n\t\t\tactionFn: (msg, data) => this._logEventOnce('sticky player closed', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoPlayerEvents.UNMUTE,\n\t\t\tactionFn: (msg, data) => this._logEvent('player unmute', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoPlayerEvents.INITIALIZATION_ERROR,\n\t\t\tactionFn: (msg, data) =>\n\t\t\t\tthis._logEvent('player initialization error', data)\n\t\t}\n\t];\n\n\tprivate _adPlayerListenersActions: ListenerAction[] = [\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_BLOCKED,\n\t\t\tactionFn: (msg, data) => this._logEventOnce('adblock detected', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_READY,\n\t\t\tactionFn: (msg, data) => this._logEvent('ad player ready', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_LOADED,\n\t\t\tactionFn: (msg, data) =>\n\t\t\t\tthis._logEvent('ad ' + data.videoBreak + ' ready', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_UNFILLED,\n\t\t\tactionFn: (msg, data) => this._logEvent('ad unfilled', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_PLAY,\n\t\t\tactionFn: (msg, data) =>\n\t\t\t\tthis._logEventOnceByVideo(\n\t\t\t\t\tdata.id,\n\t\t\t\t\t'ad ' + data.videoBreak + ' play',\n\t\t\t\t\tdata\n\t\t\t\t)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_START,\n\t\t\tactionFn: (msg, data) =>\n\t\t\t\tthis._logEventOnce('ad ' + data.videoBreak + ' start', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_REQUEST,\n\t\t\tactionFn: (msg, data) =>\n\t\t\t\tthis._logEventOnce('ad ' + data.videoBreak + ' call', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_END,\n\t\t\tactionFn: (msg, data) =>\n\t\t\t\tthis._logEvent('ad ' + data.videoBreak + ' end', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_CLICK,\n\t\t\tactionFn: (msg, data) =>\n\t\t\t\tthis._logEvent('ad ' + data.videoBreak + ' click', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_IMPRESSION,\n\t\t\tactionFn: (msg, data) =>\n\t\t\t\tthis._logEvent('ad ' + data.videoBreak + ' impression', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_CONTENT_RESUME,\n\t\t\tactionFn: (msg, data) => this._logEvent('ad content resume', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_BID_FOUND,\n\t\t\tactionFn: (msg, data) => this._logEvent('ad bid found', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.HEAVY_ADS,\n\t\t\tactionFn: (msg, data) => this._logEvent('heavy ad error', data)\n\t\t}\n\t];\n\n\tconstructor(options: AnalyticsPluginOptions) {\n\t\tthis._store = options.store;\n\t\tthis.init();\n\t}\n\n\tpublic init() {\n\t\tthis._initListeners([\n\t\t\t...this._playerListenersActions,\n\t\t\t...this._adPlayerListenersActions\n\t\t]);\n\t}\n\n\tprivate _getLogger = (instanceId: string) => {\n\t\ttry {\n\t\t\tconst storeInstance = this._store.getInstance(instanceId);\n\t\t\treturn storeInstance?.logger;\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t\tconsole.error(instanceId + ' store instance not found');\n\t\t}\n\t};\n\n\tprivate _logError = (message: string, category: string, instanceId: string) =>\n\t\tthis._getLogger(instanceId).logError(message, category);\n\n\tprivate _logEvent = (message, data) =>\n\t\tthis._getLogger(data.id).logEvent(message, data);\n\n\tprivate _logEventOnce = (message, data) =>\n\t\tthis._getLogger(data.id).logEventOnce(message, data);\n\n\tprivate async _logEventOnceByVideo(\n\t\tinstanceId: string,\n\t\taction: string,\n\t\tdata: any\n\t) {\n\t\tconst instance = this._store.getInstance(instanceId);\n\t\tconst player = instance?.player;\n\n\t\tif (!player || !instance)\n\t\t\tthrow new Error('Missing Store Instance or player');\n\n\t\tconst videoId =\n\t\t\tplayer.name === Players.DAILYMOTION_EMBED\n\t\t\t\t? await (player as DailymotionEmbedPlayer).getVideo()\n\t\t\t\t: player.videoId;\n\n\t\tthis._events[instanceId] = this._events[instanceId] || {};\n\n\t\tif (this._events[instanceId][action] === videoId) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._logEvent(action, data);\n\t\tthis._events[instanceId][action] = videoId;\n\t}\n\n\tprivate _initListeners = (listenersActions: ListenerAction[]) =>\n\t\tlistenersActions.forEach((listenAction) =>\n\t\t\tPubSub.subscribe(listenAction.message, listenAction.actionFn)\n\t\t);\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.Analytics = AnalyticsPlugin;\n","export type LogLevel = 'info' | 'debug' | 'warn' | 'error';\n\nexport class VideoConsoleLogger {\n\tconstructor() {}\n\n\t/**\n\t * Send colorized info console log\n\t *\n\t * Activate hidden logs this way: localStorage.setItem('log', JSON.stringify({videoPlayer: true}));\n\t *\n\t * @param msg {string} Message to be sent\n\t * @param hidden {boolean} - If true the message will be sent only if localStorage.logs.videoplayer is true\n\t * @param data {object} - Optional data to log\n\t */\n\tpublic info = (msg: string, data?: any, hidden: boolean = true) =>\n\t\tthis._writeLog(msg, 'info', hidden, data);\n\n\t/**\n\t * Send colorized warning console log\n\t *\n\t * Activate hidden logs this way: localStorage.setItem('log', JSON.stringify({videoPlayer: true}));\n\t *\n\t * @param msg {string} Message to be sent\n\t * @param hidden {boolean} - If true the message will be sent only if localStorage.logs.videoplayer is true\n\t * @param data {object} - Optional data to log\n\t */\n\tpublic warn = (msg: string, data?: any, hidden: boolean = true) =>\n\t\tthis._writeLog(msg, 'warn', hidden, data);\n\n\t/**\n\t * Send colorized debug console log\n\t *\n\t * Activate hidden logs this way: localStorage.setItem('log', JSON.stringify({videoPlayer: true}));\n\t *\n\t * @param msg {string} Message to be sent\n\t * @param hidden {boolean} - If true the message will be sent only if localStorage.logs.videoplayer is true\n\t * @param data {object} - Optional data to log\n\t */\n\tpublic debug = (msg: string, data?: any, hidden: boolean = true) =>\n\t\tthis._writeLog(msg, 'debug', hidden, data);\n\n\t/**\n\t * Send colorized error console log\n\t *\n\t * Activate hidden logs this way: localStorage.setItem('log', JSON.stringify({videoPlayer: true}));\n\t *\n\t * @param msg {string} Message to be sent\n\t * @param hidden {boolean} - If true the message will be sent only if localStorage.logs.videoplayer is true\n\t * @param data {object} - Optional data to log\n\t */\n\tpublic error = (msg: string, data?: any, hidden: boolean = true) =>\n\t\tthis._writeLog(msg, 'error', hidden, data);\n\n\t/**\n\t * Send colorized console logs\n\t *\n\t * Activate hidden logs this way: localStorage.setItem('log', JSON.stringify({videoPlayer: true}));\n\t *\n\t * @param msg {string} Message to be sent\n\t * @param level {LogLevel} Log level\n\t * @param hidden {boolean} - If true the message will be sent only if localStorage.logs.videoplayer is true\n\t * @param data {object} - Optional data to log\n\t */\n\tprivate _writeLog(\n\t\tmsg: string,\n\t\tlevel: LogLevel = 'info',\n\t\thidden: boolean = true,\n\t\tdata?: any\n\t): Function {\n\t\tif (\n\t\t\t(hidden && !localStorage.log) ||\n\t\t\t!JSON.parse(localStorage.log).videoPlayer\n\t\t) {\n\t\t\treturn () => {};\n\t\t}\n\n\t\tconst getColorString = (level: LogLevel): string => {\n\t\t\tlet frontColor: string;\n\t\t\tlet backgroundColor: string;\n\n\t\t\tswitch (level) {\n\t\t\t\tcase 'info':\n\t\t\t\t\t{\n\t\t\t\t\t\tfrontColor = 'yellow';\n\t\t\t\t\t\tbackgroundColor = 'Purple';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'debug':\n\t\t\t\t\t{\n\t\t\t\t\t\tfrontColor = 'orange';\n\t\t\t\t\t\tbackgroundColor = 'Purple';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'error':\n\t\t\t\t\t{\n\t\t\t\t\t\tfrontColor = 'red';\n\t\t\t\t\t\tbackgroundColor = 'Purple';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t{\n\t\t\t\t\t\tfrontColor = 'white';\n\t\t\t\t\t\tbackgroundColor = 'Purple';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn `color: ${frontColor}; background: ${backgroundColor};`;\n\t\t};\n\n\t\tconst color = getColorString(level);\n\t\tmsg = `%c( Video Player - ${level} )%c ${msg}`;\n\n\t\tconst fn =\n\t\t\tlevel === 'error'\n\t\t\t\t? console.error.bind(window.console, msg, color, data)\n\t\t\t\t: console.log.bind(window.console, msg, color, data);\n\n\t\treturn fn;\n\t}\n}\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","import { VideoConsoleLogger } from 'src/utils/video-logger';\nimport { Players } from '../../enums/players.enum';\nimport {\n\tPublishableVideoAdEvents,\n\tPublishableVideoContentEvents,\n\tPublishableVideoPlayerEvents,\n\tPublishableVideoStickyEvents,\n\tPublishableVideoUserEvents\n} from '../../enums/publishable-events.enum';\nimport { ListenerAction } from '../../interfaces/listener-action';\nimport { Store, StoreInstance } from '../../store';\nimport debounce from 'lodash.debounce';\nimport PubSub from 'pubsub-js';\nimport { StickyPlugin } from '../sticky/sticky-core';\n\nconst logger = new VideoConsoleLogger();\n\nexport interface AutoplayPluginOptions {\n\tstore: Store;\n}\n\nexport class AutoplayPlugin {\n\tpublic name = 'autoplay';\n\tprivate _store: Store;\n\tprivate _stickyEnabled: boolean;\n\tprivate _enabled = false;\n\tprivate _storeInstances: Map = new Map<\n\t\tstring,\n\t\tStoreInstance\n\t>();\n\tpublic scrollEvent: (...args: any[]) => void =\n\t\tthis._autoplayMainViewablePlayer.bind(this);\n\n\tpublic async _autoplayMainViewablePlayer(\n\t\tforceEnable?: boolean\n\t): Promise {\n\t\tif (!this._enabled && !forceEnable) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentInstance = this._store.getCurrentPlayableInstance();\n\n\t\t// Stop trying to autoplay if an instance is already playing and still viewable\n\t\tconst videoContainerViewable = currentInstance\n\t\t\t? this._store.isViewable(currentInstance)\n\t\t\t: false;\n\t\tconst playing = currentInstance\n\t\t\t? await this._store.isPlaying(currentInstance)\n\t\t\t: false;\n\t\tconst instanceIsPlayingAndViewable = playing && videoContainerViewable;\n\n\t\tif (instanceIsPlayingAndViewable) return;\n\n\t\tconst canAutoplay = (\n\t\t\tplaying: boolean,\n\t\t\tvideoContainerViewable: boolean,\n\t\t\tvideoStarted: boolean,\n\t\t\tadPaused: boolean\n\t\t) =>\n\t\t\t!playing && !adPaused\n\t\t\t\t? !videoStarted\n\t\t\t\t\t? videoContainerViewable\n\t\t\t\t\t: false\n\t\t\t\t: false;\n\n\t\tconst canPause = (\n\t\t\tplaying: boolean,\n\t\t\tvideoContainerViewable: boolean,\n\t\t\tisStickyEnabled: boolean,\n\t\t\tisSticked: boolean\n\t\t) =>\n\t\t\tplaying && !videoContainerViewable && !isStickyEnabled && !isSticked && !this._stickyClosing;\n\n\t\tconst playableInstances = Array.from(this._storeInstances.values()).filter(\n\t\t\t(instance) =>\n\t\t\t\tinstance.autoplay &&\n\t\t\t\tinstance.autoplay.enabled &&\n\t\t\t\tinstance.autoplay.startOnSight\n\t\t);\n\n\t\t// Every permits to break if return a falsy, we must return truthy to continue iterating\n\t\tfor (const instance of playableInstances) {\n\t\t\tconst adPaused: boolean =\n\t\t\t\tinstance.adPlayer &&\n\t\t\t\tinstance.adPlayer.adsState &&\n\t\t\t\tinstance.adPlayer.adsState.paused;\n\t\t\tconst playing = await this._store.isPlaying(instance);\n\t\t\tconst viewable = this._store.isViewable(instance);\n\t\t\tconst videoStarted = instance.player.videoStarted;\n\t\t\tconst isSticky = instance.player.isSticked;\n\t\t\tconst isStickyEnabled = this._stickyEnabled;\n\t\t\tconst playVideo = canAutoplay(playing, viewable, videoStarted, adPaused);\n\t\t\tconst pauseVideo = canPause(playing, viewable, isStickyEnabled, isSticky);\n\n\t\t\tif (playVideo) {\n\t\t\t\tlogger.debug('Should PLAY video')();\n\t\t\t\tlogger.info(\n\t\t\t\t\t`[${instance.player.id}] canAutoplay(${playing}, ${viewable}, ${videoStarted}, ${adPaused})`\n\t\t\t\t)();\n\t\t\t\tthis._store.getActivePlayer(instance).play(); // TODO: Use an async handler and delete sleep\n\t\t\t\tthis._sleep();\n\t\t\t} else if (pauseVideo) {\n\t\t\t\tlogger.debug('Should PAUSE video')();\n\t\t\t\t[instance.adPlayer, instance.player]\n\t\t\t\t\t.filter((p) => !!p)\n\t\t\t\t\t.forEach((player) => {\n\t\t\t\t\t\tplayer.pause();\n\t\t\t\t\t});\n\n\t\t\t\t// Permit to restick after a sticky disable (Taboola ...)\n\t\t\t\t// TODO: Refactor Taboola GTM tag and behavior\n\t\t\t\tinstance.sticky.enabled = true;\n\t\t\t}\n\n\t\t\tif (playVideo || pauseVideo) {\n\t\t\t\tthis._store.setCurrentPlayableInstanceId(instance.player.id);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _stickyClosing = false;\n\n\tprivate _listenersActions: ListenerAction[] = [\n\t\t{\n\t\t\tmessage: PublishableVideoPlayerEvents.READY,\n\t\t\tactionFn: (msg, data) => {\n\t\t\t\tthis._registerInstance.call(this, data.id);\n\t\t\t\tthis._debouncedAutoplay.call(this);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoContentEvents.VIDEO_END,\n\t\t\tactionFn: (msg, data) => this._unregisterInstance(data.id)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_READY,\n\t\t\tactionFn: () => this._debouncedAutoplay.call(this)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoUserEvents.TOGGLE_PLAY_PAUSE,\n\t\t\tactionFn: (msg, data) => this._toggle.bind(this, data.id)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoStickyEvents.CLOSE,\n\t\t\tactionFn: () => {\n\t\t\t\tthis._stickyEnabled = false;\n\t\t\t\tconst instance =\n\t\t\t\t\tthis._store.getCurrentPlayableInstance() as StoreInstance;\n\t\t\t\tthis._stickyCloseHandler.call(this, instance);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_END,\n\t\t\tactionFn: () => {\n\t\t\t\tconst instance =\n\t\t\t\t\tthis._store.getCurrentPlayableInstance() as StoreInstance;\n\t\t\t\tconst isSticky = instance.player.isSticked;\n\n\t\t\t\tif (!isSticky && this._stickyClosing) {\n\t\t\t\t\tthis._stickyCloseHandler.call(this, instance);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoPlayerEvents.DAILYMOTION_EMBED_LAZY_READY,\n\t\t\tactionFn: () => this._autoplayMainViewablePlayer(true)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoStickyEvents.STICKED,\n\t\t\tactionFn: () => {\n\t\t\t\tthis._stickyEnabled = true;\n\t\t\t\tthis._debouncedAutoplay.call(this);\n\t\t\t}\n\t\t}\n\t];\n\n\tconstructor(options: AutoplayPluginOptions) {\n\t\tthis._store = options.store;\n\t\tthis._initListeners(this._listenersActions);\n\t}\n\n\tprivate _initListeners = (listenersActions: ListenerAction[]) =>\n\t\tlistenersActions.forEach((listenAction) =>\n\t\t\tPubSub.subscribe(listenAction.message, listenAction.actionFn.bind(this))\n\t\t);\n\n\tprivate _stickyCloseHandler(instance: StoreInstance) {\n\t\tif (!instance) {\n\t\t\tthrow new Error('Missing mandatory `instance` parameter');\n\t\t}\n\t\tif (!instance.adPlayer) {\n\t\t\tthrow new Error('Missing mandatory `instance.adPlayer` parameter');\n\t\t}\n\n\t\tconst adsState = instance.adPlayer.adsState || {};\n\n\t\tthis._stickyClosing = isPlayingAds(instance, this._stickyClosing, adsState);\n\n\t\tif (this._stickyClosing) return;\n\n\t\tthis._store.getActivePlayer(instance).pause();\n\t\tthis._stickyClosing = !this._stickyClosing;\n\n\t\tfunction isPlayingAds(\n\t\t\tinstance: StoreInstance,\n\t\t\tstickyClosing: boolean,\n\t\t\tadsState: any\n\t\t) {\n\t\t\tlogger.debug(`getIsStickyClosing()`)();\n\n\t\t\tconst isPlayingAds =\n\t\t\t\t!stickyClosing &&\n\t\t\t\ttypeof adsState.playing === 'boolean' &&\n\t\t\t\tadsState.playing &&\n\t\t\t\t!adsState.ended;\n\n\t\t\tlogger.debug('isPlayingAds: ' + isPlayingAds)();\n\t\t\treturn isPlayingAds;\n\t\t}\n\t}\n\n\tprivate _registerInstance(id: string) {\n\t\tlogger.debug(`_registerInstance(${id})`)();\n\t\tconst instance = this._store.getInstance(id);\n\n\t\tif (!instance || !instance.autoplay || !instance.autoplay.startOnSight)\n\t\t\treturn;\n\n\t\tinstance.autoplay.enabled = true;\n\t\tthis._storeInstances.set(id, instance);\n\t\tthis._enabled = true;\n\t}\n\n\tprivate _unregisterInstance(id: string) {\n\t\tif (!this._storeInstances.has(id)) return;\n\n\t\tthis._storeInstances.delete(id);\n\t}\n\n\tprivate _debouncedAutoplay = () =>\n\t\tdebounce(this._autoplayMainViewablePlayer, 200, {\n\t\t\tleading: true,\n\t\t\tmaxWait: 200,\n\t\t\ttrailing: true\n\t\t}).call(this);\n\n\tprivate _toggle(id: string): void {\n\t\tconst instance = this._store.getInstance(id);\n\t\tif (!instance || !instance.autoplay) return;\n\n\t\tinstance.autoplay.enabled = !instance.autoplay.enabled;\n\t}\n\n\tprivate _sleep(timeout: number = 1000): void {\n\t\tthis._enabled = false;\n\t\tsetTimeout(() => (this._enabled = true), timeout);\n\t}\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.Autoplay = (options: AutoplayPluginOptions) =>\n\tnew AutoplayPlugin(options);\n","import { PublishableVideoPlayerEvents } from '../../enums/publishable-events.enum';\nimport { Store } from '../../store';\nimport PubSub from 'pubsub-js';\n\nexport interface DebugPluginOptions {\n\tstore: Store;\n}\n\nexport class DebugPlugin {\n\tpublic name = 'debug';\n\tprivate _store: Store;\n\n\tconstructor(options: DebugPluginOptions) {\n\t\tthis._store = options.store;\n\t\tthis._initListeners();\n\t}\n\n\tprivate _initListeners = () =>\n\t\tPubSub.subscribe(PublishableVideoPlayerEvents.READY, (msg, data) =>\n\t\t\tthis._showDebugElement(data.id)\n\t\t);\n\n\tprivate _showDebugElement(playerId: string) {\n\t\tconst instance = this._store.getInstance(playerId);\n\t\tif (!instance) return;\n\n\t\tconst player = instance.player;\n\n\t\tconst container = document.createElement('div');\n\t\tcontainer.style.cursor = 'pointer';\n\t\tcontainer.classList.add('debug-module-container', 'hidden');\n\t\tcontainer.innerHTML = '🐞';\n\t\tcontainer.onclick = () => console.info('debug', instance);\n\n\t\tconst playerContainer = document.getElementById(player.id + '-container');\n\t\tif (!playerContainer) throw new Error('Player container not found !');\n\t\tplayerContainer.classList.add('video-player.debug');\n\t\tplayerContainer.appendChild(container);\n\t}\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.Debug = DebugPlugin;\n","export function isFunction(x: any): x is Function {\n return typeof x === 'function';\n}\n","let _enable_super_gross_mode_that_will_cause_bad_things = false;\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like what Promise contructor should used to create Promises\n */\nexport const config = {\n /**\n * The promise constructor used by default for methods such as\n * {@link toPromise} and {@link forEach}\n */\n Promise: undefined as PromiseConstructorLike,\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BY TIME\n * FOR MIGRATION REASONS.\n */\n set useDeprecatedSynchronousErrorHandling(value: boolean) {\n if (value) {\n const error = new Error();\n console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \\n' + error.stack);\n } else if (_enable_super_gross_mode_that_will_cause_bad_things) {\n console.log('RxJS: Back to a better error behavior. Thank you. <3');\n }\n _enable_super_gross_mode_that_will_cause_bad_things = value;\n },\n\n get useDeprecatedSynchronousErrorHandling() {\n return _enable_super_gross_mode_that_will_cause_bad_things;\n },\n};\n","/**\n * Throws an error on another job so that it's picked up by the runtime's\n * uncaught error handling mechanism.\n * @param err the error to throw\n */\nexport function hostReportError(err: any) {\n setTimeout(() => { throw err; }, 0);\n}","import { Observer } from './types';\nimport { config } from './config';\nimport { hostReportError } from './util/hostReportError';\n\nexport const empty: Observer = {\n closed: true,\n next(value: any): void { /* noop */},\n error(err: any): void {\n if (config.useDeprecatedSynchronousErrorHandling) {\n throw err;\n } else {\n hostReportError(err);\n }\n },\n complete(): void { /*noop*/ }\n};\n","export function isObject(x: any): x is Object {\n return x !== null && typeof x === 'object';\n}\n","export interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n new(errors: any[]): UnsubscriptionError;\n}\n\nconst UnsubscriptionErrorImpl = (() => {\n function UnsubscriptionErrorImpl(this: any, errors: any[]) {\n Error.call(this);\n this.message = errors ?\n `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}` : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n return this;\n }\n\n UnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);\n\n return UnsubscriptionErrorImpl;\n})();\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = UnsubscriptionErrorImpl as any;","import { isArray } from './util/isArray';\nimport { isObject } from './util/isObject';\nimport { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic } from './types';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY: Subscription = (function(empty: any) {\n empty.closed = true;\n return empty;\n }(new Subscription()));\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n * @type {boolean}\n */\n public closed: boolean = false;\n\n /** @internal */\n protected _parentOrParents: Subscription | Subscription[] = null;\n /** @internal */\n private _subscriptions: SubscriptionLike[] = null;\n\n /**\n * @param {function(): void} [unsubscribe] A function describing how to\n * perform the disposal of resources when the `unsubscribe` method is called.\n */\n constructor(unsubscribe?: () => void) {\n if (unsubscribe) {\n (this as any)._ctorUnsubscribe = true;\n (this as any)._unsubscribe = unsubscribe;\n }\n }\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[];\n\n if (this.closed) {\n return;\n }\n\n let { _parentOrParents, _ctorUnsubscribe, _unsubscribe, _subscriptions } = (this as any);\n\n this.closed = true;\n this._parentOrParents = null;\n // null out _subscriptions first so any child subscriptions that attempt\n // to remove themselves from this subscription will noop\n this._subscriptions = null;\n\n if (_parentOrParents instanceof Subscription) {\n _parentOrParents.remove(this);\n } else if (_parentOrParents !== null) {\n for (let index = 0; index < _parentOrParents.length; ++index) {\n const parent = _parentOrParents[index];\n parent.remove(this);\n }\n }\n\n if (isFunction(_unsubscribe)) {\n // It's only possible to null _unsubscribe - to release the reference to\n // any teardown function passed in the constructor - if the property was\n // actually assigned in the constructor, as there are some classes that\n // are derived from Subscriber (which derives from Subscription) that\n // implement an _unsubscribe method as a mechanism for obtaining\n // unsubscription notifications and some of those subscribers are\n // recycled. Also, in some of those subscribers, _unsubscribe switches\n // from a prototype method to an instance property - see notifyNext in\n // RetryWhenSubscriber.\n if (_ctorUnsubscribe) {\n (this as any)._unsubscribe = undefined;\n }\n try {\n _unsubscribe.call(this);\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];\n }\n }\n\n if (isArray(_subscriptions)) {\n let index = -1;\n let len = _subscriptions.length;\n\n while (++index < len) {\n const sub = _subscriptions[index];\n if (isObject(sub)) {\n try {\n sub.unsubscribe();\n } catch (e) {\n errors = errors || [];\n if (e instanceof UnsubscriptionError) {\n errors = errors.concat(flattenUnsubscriptionErrors(e.errors));\n } else {\n errors.push(e);\n }\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n\n /**\n * Adds a tear down to be called during the unsubscribe() of this\n * Subscription. Can also be used to add a child subscription.\n *\n * If the tear down being added is a subscription that is already\n * unsubscribed, is the same reference `add` is being called on, or is\n * `Subscription.EMPTY`, it will not be added.\n *\n * If this subscription is already in an `closed` state, the passed\n * tear down logic will be executed immediately.\n *\n * When a parent subscription is unsubscribed, any child subscriptions that were added to it are also unsubscribed.\n *\n * @param {TeardownLogic} teardown The additional logic to execute on\n * teardown.\n * @return {Subscription} Returns the Subscription used or created to be\n * added to the inner subscriptions list. This Subscription can be used with\n * `remove()` to remove the passed teardown logic from the inner subscriptions\n * list.\n */\n add(teardown: TeardownLogic): Subscription {\n let subscription = (teardown);\n\n if (!teardown) {\n return Subscription.EMPTY;\n }\n\n switch (typeof teardown) {\n case 'function':\n subscription = new Subscription(<(() => void)>teardown);\n case 'object':\n if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {\n // This also covers the case where `subscription` is `Subscription.EMPTY`, which is always in `closed` state.\n return subscription;\n } else if (this.closed) {\n subscription.unsubscribe();\n return subscription;\n } else if (!(subscription instanceof Subscription)) {\n const tmp = subscription;\n subscription = new Subscription();\n subscription._subscriptions = [tmp];\n }\n break;\n default: {\n throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');\n }\n }\n\n // Add `this` as parent of `subscription` if that's not already the case.\n let { _parentOrParents } = subscription;\n if (_parentOrParents === null) {\n // If we don't have a parent, then set `subscription._parents` to\n // the `this`, which is the common case that we optimize for.\n subscription._parentOrParents = this;\n } else if (_parentOrParents instanceof Subscription) {\n if (_parentOrParents === this) {\n // The `subscription` already has `this` as a parent.\n return subscription;\n }\n // If there's already one parent, but not multiple, allocate an\n // Array to store the rest of the parent Subscriptions.\n subscription._parentOrParents = [_parentOrParents, this];\n } else if (_parentOrParents.indexOf(this) === -1) {\n // Only add `this` to the _parentOrParents list if it's not already there.\n _parentOrParents.push(this);\n } else {\n // The `subscription` already has `this` as a parent.\n return subscription;\n }\n\n // Optimize for the common case when adding the first subscription.\n const subscriptions = this._subscriptions;\n if (subscriptions === null) {\n this._subscriptions = [subscription];\n } else {\n subscriptions.push(subscription);\n }\n\n return subscription;\n }\n\n /**\n * Removes a Subscription from the internal list of subscriptions that will\n * unsubscribe during the unsubscribe process of this Subscription.\n * @param {Subscription} subscription The subscription to remove.\n * @return {void}\n */\n remove(subscription: Subscription): void {\n const subscriptions = this._subscriptions;\n if (subscriptions) {\n const subscriptionIndex = subscriptions.indexOf(subscription);\n if (subscriptionIndex !== -1) {\n subscriptions.splice(subscriptionIndex, 1);\n }\n }\n }\n}\n\nfunction flattenUnsubscriptionErrors(errors: any[]) {\n return errors.reduce((errs, err) => errs.concat((err instanceof UnsubscriptionError) ? err.errors : err), []);\n}\n","/** @deprecated do not use, this is no longer checked by RxJS internals */\nexport const rxSubscriber = (() =>\n typeof Symbol === 'function'\n ? Symbol('rxSubscriber')\n : '@@rxSubscriber_' + Math.random())();\n\n/**\n * @deprecated use rxSubscriber instead\n */\nexport const $$rxSubscriber = rxSubscriber;\n","import { isFunction } from './util/isFunction';\nimport { empty as emptyObserver } from './Observer';\nimport { Observer, PartialObserver, TeardownLogic } from './types';\nimport { Subscription } from './Subscription';\nimport { rxSubscriber as rxSubscriberSymbol } from '../internal/symbol/rxSubscriber';\nimport { config } from './config';\nimport { hostReportError } from './util/hostReportError';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n\n [rxSubscriberSymbol]() { return this; }\n\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param {function(x: ?T): void} [next] The `next` callback of an Observer.\n * @param {function(e: ?any): void} [error] The `error` callback of an\n * Observer.\n * @param {function(): void} [complete] The `complete` callback of an\n * Observer.\n * @return {Subscriber} A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n */\n static create(next?: (x?: T) => void,\n error?: (e?: any) => void,\n complete?: () => void): Subscriber {\n const subscriber = new Subscriber(next, error, complete);\n subscriber.syncErrorThrowable = false;\n return subscriber;\n }\n\n /** @internal */ syncErrorValue: any = null;\n /** @internal */ syncErrorThrown: boolean = false;\n /** @internal */ syncErrorThrowable: boolean = false;\n\n protected isStopped: boolean = false;\n protected destination: PartialObserver | Subscriber; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @param {Observer|function(value: T): void} [destinationOrNext] A partially\n * defined Observer or a `next` callback function.\n * @param {function(e: ?any): void} [error] The `error` callback of an\n * Observer.\n * @param {function(): void} [complete] The `complete` callback of an\n * Observer.\n */\n constructor(destinationOrNext?: PartialObserver | ((value: T) => void),\n error?: (e?: any) => void,\n complete?: () => void) {\n super();\n\n switch (arguments.length) {\n case 0:\n this.destination = emptyObserver;\n break;\n case 1:\n if (!destinationOrNext) {\n this.destination = emptyObserver;\n break;\n }\n if (typeof destinationOrNext === 'object') {\n if (destinationOrNext instanceof Subscriber) {\n this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;\n this.destination = destinationOrNext;\n destinationOrNext.add(this);\n } else {\n this.syncErrorThrowable = true;\n this.destination = new SafeSubscriber(this, > destinationOrNext);\n }\n break;\n }\n default:\n this.syncErrorThrowable = true;\n this.destination = new SafeSubscriber(this, <((value: T) => void)> destinationOrNext, error, complete);\n break;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (!this.isStopped) {\n this._next(value);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (!this.isStopped) {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (!this.isStopped) {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (this.closed) {\n return;\n }\n this.isStopped = true;\n super.unsubscribe();\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n this.destination.error(err);\n this.unsubscribe();\n }\n\n protected _complete(): void {\n this.destination.complete();\n this.unsubscribe();\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _unsubscribeAndRecycle(): Subscriber {\n const { _parentOrParents } = this;\n this._parentOrParents = null;\n this.unsubscribe();\n this.closed = false;\n this.isStopped = false;\n this._parentOrParents = _parentOrParents;\n return this;\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class SafeSubscriber extends Subscriber {\n\n private _context: any;\n\n constructor(private _parentSubscriber: Subscriber,\n observerOrNext?: PartialObserver | ((value: T) => void),\n error?: (e?: any) => void,\n complete?: () => void) {\n super();\n\n let next: ((value: T) => void);\n let context: any = this;\n\n if (isFunction(observerOrNext)) {\n next = (<((value: T) => void)> observerOrNext);\n } else if (observerOrNext) {\n next = (> observerOrNext).next;\n error = (> observerOrNext).error;\n complete = (> observerOrNext).complete;\n if (observerOrNext !== emptyObserver) {\n context = Object.create(observerOrNext);\n if (isFunction(context.unsubscribe)) {\n this.add(<() => void> context.unsubscribe.bind(context));\n }\n context.unsubscribe = this.unsubscribe.bind(this);\n }\n }\n\n this._context = context;\n this._next = next;\n this._error = error;\n this._complete = complete;\n }\n\n next(value?: T): void {\n if (!this.isStopped && this._next) {\n const { _parentSubscriber } = this;\n if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {\n this.__tryOrUnsub(this._next, value);\n } else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {\n this.unsubscribe();\n }\n }\n }\n\n error(err?: any): void {\n if (!this.isStopped) {\n const { _parentSubscriber } = this;\n const { useDeprecatedSynchronousErrorHandling } = config;\n if (this._error) {\n if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {\n this.__tryOrUnsub(this._error, err);\n this.unsubscribe();\n } else {\n this.__tryOrSetError(_parentSubscriber, this._error, err);\n this.unsubscribe();\n }\n } else if (!_parentSubscriber.syncErrorThrowable) {\n this.unsubscribe();\n if (useDeprecatedSynchronousErrorHandling) {\n throw err;\n }\n hostReportError(err);\n } else {\n if (useDeprecatedSynchronousErrorHandling) {\n _parentSubscriber.syncErrorValue = err;\n _parentSubscriber.syncErrorThrown = true;\n } else {\n hostReportError(err);\n }\n this.unsubscribe();\n }\n }\n }\n\n complete(): void {\n if (!this.isStopped) {\n const { _parentSubscriber } = this;\n if (this._complete) {\n const wrappedComplete = () => this._complete.call(this._context);\n\n if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {\n this.__tryOrUnsub(wrappedComplete);\n this.unsubscribe();\n } else {\n this.__tryOrSetError(_parentSubscriber, wrappedComplete);\n this.unsubscribe();\n }\n } else {\n this.unsubscribe();\n }\n }\n }\n\n private __tryOrUnsub(fn: Function, value?: any): void {\n try {\n fn.call(this._context, value);\n } catch (err) {\n this.unsubscribe();\n if (config.useDeprecatedSynchronousErrorHandling) {\n throw err;\n } else {\n hostReportError(err);\n }\n }\n }\n\n private __tryOrSetError(parent: Subscriber, fn: Function, value?: any): boolean {\n if (!config.useDeprecatedSynchronousErrorHandling) {\n throw new Error('bad call');\n }\n try {\n fn.call(this._context, value);\n } catch (err) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n parent.syncErrorValue = err;\n parent.syncErrorThrown = true;\n return true;\n } else {\n hostReportError(err);\n return true;\n }\n }\n return false;\n }\n\n /** @internal This is an internal implementation detail, do not use. */\n _unsubscribe(): void {\n const { _parentSubscriber } = this;\n this._context = null;\n this._parentSubscriber = null;\n _parentSubscriber.unsubscribe();\n }\n}\n","export function identity(x: T): T {\n return x;\n}\n","import { noop } from './noop';\nimport { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\n/* tslint:disable:max-line-length */\nexport function pipe(): UnaryFunction;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction, fn5: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction, fn5: UnaryFunction, fn6: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction, fn5: UnaryFunction, fn6: UnaryFunction, fn7: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction, fn5: UnaryFunction, fn6: UnaryFunction, fn7: UnaryFunction, fn8: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction, fn5: UnaryFunction, fn6: UnaryFunction, fn7: UnaryFunction, fn8: UnaryFunction, fn9: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction, fn5: UnaryFunction, fn6: UnaryFunction, fn7: UnaryFunction, fn8: UnaryFunction, fn9: UnaryFunction, ...fns: UnaryFunction[]): UnaryFunction;\n/* tslint:enable:max-line-length */\n\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n","import { Operator } from './Operator';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, PartialObserver, Subscribable } from './types';\nimport { canReportError } from './util/canReportError';\nimport { toSubscriber } from './util/toSubscriber';\nimport { iif } from './observable/iif';\nimport { throwError } from './observable/throwError';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n\n /** Internal implementation detail, do not use directly. */\n public _isScalar: boolean = false;\n\n /** @deprecated This is an internal implementation detail, do not use. */\n source: Observable;\n\n /** @deprecated This is an internal implementation detail, do not use. */\n operator: Operator;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new cold Observable by calling the Observable constructor\n * @static true\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new cold observable\n * @nocollapse\n * @deprecated use new Observable() instead\n */\n static create: Function = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n }\n\n /**\n * Creates a new Observable, with this Observable as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param {Operator} operator the operator defining the operation to take on the observable\n * @return {Observable} a new observable with the Operator applied\n */\n lift(operator: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observer?: PartialObserver): Subscription;\n /** @deprecated Use an observer instead of a complete callback */\n subscribe(next: null | undefined, error: null | undefined, complete: () => void): Subscription;\n /** @deprecated Use an observer instead of an error callback */\n subscribe(next: null | undefined, error: (error: any) => void, complete?: () => void): Subscription;\n /** @deprecated Use an observer instead of a complete callback */\n subscribe(next: (value: T) => void, error: null | undefined, complete: () => void): Subscription;\n subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided, all errors will\n * be left uncaught.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of Observer,\n * if you do not need to listen for something, you can omit a function, preferably by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to `error` function, just as before, if not provided, errors emitted by an Observable will be thrown.\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * ## Example\n * ### Subscribe with an Observer\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // \"Adding: 1\"\n * // \"Adding: 2\"\n * // \"Adding: 3\"\n * // \"Sum equals: 6\"\n * ```\n *\n * ### Subscribe with functions\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // \"Adding: 1\"\n * // \"Adding: 2\"\n * // \"Adding: 3\"\n * // \"Sum equals: 6\"\n * ```\n *\n * ### Cancel a subscription\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe(\n * num => console.log(num),\n * undefined,\n * () => {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * );\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // \"unsubscribed!\" after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {ISubscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(observerOrNext?: PartialObserver | ((value: T) => void),\n error?: (error: any) => void,\n complete?: () => void): Subscription {\n\n const { operator } = this;\n const sink = toSubscriber(observerOrNext, error, complete);\n\n if (operator) {\n sink.add(operator.call(sink, this.source));\n } else {\n sink.add(\n this.source || (config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?\n this._subscribe(sink) :\n this._trySubscribe(sink)\n );\n }\n\n if (config.useDeprecatedSynchronousErrorHandling) {\n if (sink.syncErrorThrowable) {\n sink.syncErrorThrowable = false;\n if (sink.syncErrorThrown) {\n throw sink.syncErrorValue;\n }\n }\n }\n\n return sink;\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n sink.syncErrorThrown = true;\n sink.syncErrorValue = err;\n }\n if (canReportError(sink)) {\n sink.error(err);\n } else {\n console.warn(err);\n }\n }\n }\n\n /**\n * @method forEach\n * @param {Function} next a handler for each value emitted by the observable\n * @param {PromiseConstructor} [promiseCtor] a constructor function used to instantiate the Promise\n * @return {Promise} a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n // Must be declared in a separate statement to avoid a ReferenceError when\n // accessing subscription below in the closure due to Temporal Dead Zone.\n let subscription: Subscription;\n subscription = this.subscribe((value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n if (subscription) {\n subscription.unsubscribe();\n }\n }\n }, reject, resolve);\n }) as Promise;\n }\n\n /** @internal This is an internal implementation detail, do not use. */\n _subscribe(subscriber: Subscriber): TeardownLogic {\n const { source } = this;\n return source && source.subscribe(subscriber);\n }\n\n // `if` and `throw` are special snow flakes, the compiler sees them as reserved words. Deprecated in\n // favor of iif and throwError functions.\n /**\n * @nocollapse\n * @deprecated In favor of iif creation function: import { iif } from 'rxjs';\n */\n static if: typeof iif;\n /**\n * @nocollapse\n * @deprecated In favor of throwError creation function: import { throwError } from 'rxjs';\n */\n static throw: typeof throwError;\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction, op7: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction, op7: OperatorFunction, op8: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction, op7: OperatorFunction, op8: OperatorFunction, op9: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction, op7: OperatorFunction, op8: OperatorFunction, op9: OperatorFunction, ...operations: OperatorFunction[]): Observable<{}>;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ### Example\n * ```ts\n * import { interval } from 'rxjs';\n * import { map, filter, scan } from 'rxjs/operators';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x))\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n if (operations.length === 0) {\n return this as any;\n }\n\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n toPromise(this: Observable): Promise;\n toPromise(this: Observable, PromiseCtor: typeof Promise): Promise;\n toPromise(this: Observable, PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: any;\n this.subscribe((x: T) => value = x, (err: any) => reject(err), () => resolve(value));\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n if (!promiseCtor) {\n promiseCtor = config.Promise || Promise;\n }\n\n if (!promiseCtor) {\n throw new Error('no Promise impl found');\n }\n\n return promiseCtor;\n}\n","import { Subscriber } from '../Subscriber';\nimport { rxSubscriber as rxSubscriberSymbol } from '../symbol/rxSubscriber';\nimport { empty as emptyObserver } from '../Observer';\nimport { PartialObserver } from '../types';\n\nexport function toSubscriber(\n nextOrObserver?: PartialObserver | ((value: T) => void),\n error?: (error: any) => void,\n complete?: () => void): Subscriber {\n\n if (nextOrObserver) {\n if (nextOrObserver instanceof Subscriber) {\n return (> nextOrObserver);\n }\n\n if (nextOrObserver[rxSubscriberSymbol]) {\n return nextOrObserver[rxSubscriberSymbol]();\n }\n }\n\n if (!nextOrObserver && !error && !complete) {\n return new Subscriber(emptyObserver);\n }\n\n return new Subscriber(nextOrObserver, error, complete);\n}\n","import { Subscriber } from '../Subscriber';\nimport { Subject } from '../Subject';\n\n/**\n * Determines whether the ErrorObserver is closed or stopped or has a\n * destination that is closed or stopped - in which case errors will\n * need to be reported via a different mechanism.\n * @param observer the observer\n */\nexport function canReportError(observer: Subscriber | Subject): boolean {\n while (observer) {\n const { closed, destination, isStopped } = observer as any;\n if (closed || isStopped) {\n return false;\n } else if (destination && destination instanceof Subscriber) {\n observer = destination;\n } else {\n observer = null;\n }\n }\n return true;\n}\n","import { Subscriber } from '../Subscriber';\n\n/**\n * Subscribes to an ArrayLike with a subscriber\n * @param array The array or array-like to subscribe to\n */\nexport const subscribeToArray = (array: ArrayLike) => (subscriber: Subscriber) => {\n for (let i = 0, len = array.length; i < len && !subscriber.closed; i++) {\n subscriber.next(array[i]);\n }\n subscriber.complete();\n};\n","export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n\n/**\n * @deprecated use {@link iterator} instead\n */\nexport const $$iterator = iterator;\n","/**\n * Tests to see if the object is an ES2015 (ES6) Promise\n * @see {@link https://www.ecma-international.org/ecma-262/6.0/#sec-promise-objects}\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return !!value && typeof (value).subscribe !== 'function' && typeof (value as any).then === 'function';\n}\n","import { ObservableInput } from '../types';\nimport { subscribeToArray } from './subscribeToArray';\nimport { subscribeToPromise } from './subscribeToPromise';\nimport { subscribeToIterable } from './subscribeToIterable';\nimport { subscribeToObservable } from './subscribeToObservable';\nimport { isArrayLike } from './isArrayLike';\nimport { isPromise } from './isPromise';\nimport { isObject } from './isObject';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { Subscription } from '../Subscription';\nimport { Subscriber } from '../Subscriber';\n\nexport const subscribeTo = (result: ObservableInput): (subscriber: Subscriber) => Subscription | void => {\n if (!!result && typeof result[Symbol_observable] === 'function') {\n return subscribeToObservable(result as any);\n } else if (isArrayLike(result)) {\n return subscribeToArray(result);\n } else if (isPromise(result)) {\n return subscribeToPromise(result as Promise);\n } else if (!!result && typeof result[Symbol_iterator] === 'function') {\n return subscribeToIterable(result as any);\n } else {\n const value = isObject(result) ? 'an invalid object' : `'${result}'`;\n const msg = `You provided ${value} where a stream was expected.`\n + ' You can provide an Observable, Promise, Array, or Iterable.';\n throw new TypeError(msg);\n }\n};\n","import { Subscriber } from '../Subscriber';\nimport { observable as Symbol_observable } from '../symbol/observable';\n\n/**\n * Subscribes to an object that implements Symbol.observable with the given\n * Subscriber.\n * @param obj An object that implements Symbol.observable\n */\nexport const subscribeToObservable = (obj: any) => (subscriber: Subscriber) => {\n const obs = obj[Symbol_observable]();\n if (typeof obs.subscribe !== 'function') {\n // Should be caught by observable subscribe function error handling.\n throw new TypeError('Provided object does not correctly implement Symbol.observable');\n } else {\n return obs.subscribe(subscriber);\n }\n};\n","import { Subscriber } from '../Subscriber';\nimport { hostReportError } from './hostReportError';\n\nexport const subscribeToPromise = (promise: PromiseLike) => (subscriber: Subscriber) => {\n promise.then(\n (value) => {\n if (!subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n },\n (err: any) => subscriber.error(err)\n )\n .then(null, hostReportError);\n return subscriber;\n};\n","import { Subscriber } from '../Subscriber';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\n\nexport const subscribeToIterable = (iterable: Iterable) => (subscriber: Subscriber) => {\n const iterator = (iterable as any)[Symbol_iterator]();\n\n do {\n let item: IteratorResult;\n try {\n item = iterator.next();\n } catch (err) {\n subscriber.error(err);\n return subscriber;\n }\n if (item.done) {\n subscriber.complete();\n break;\n }\n subscriber.next(item.value);\n if (subscriber.closed) {\n break;\n }\n } while (true);\n\n // Finalize the iterator if it happens to be a Generator\n if (typeof iterator.return === 'function') {\n subscriber.add(() => {\n if (iterator.return) {\n iterator.return();\n }\n });\n }\n\n return subscriber;\n};\n","/** @prettier */\nimport { Subscription } from './Subscription';\nimport { Subscriber } from './Subscriber';\nimport { Observable } from './Observable';\nimport { subscribeTo } from './util/subscribeTo';\n\ninterface SimpleOuterSubscriberLike {\n /**\n * A handler for inner next notifications from the inner subscription\n * @param innerValue the value nexted by the inner producer\n */\n notifyNext(innerValue: T): void;\n /**\n * A handler for inner error notifications from the inner subscription\n * @param err the error from the inner producer\n */\n notifyError(err: any): void;\n /**\n * A handler for inner complete notifications from the inner subscription.\n */\n notifyComplete(): void;\n}\n\nexport class SimpleInnerSubscriber extends Subscriber {\n constructor(private parent: SimpleOuterSubscriberLike) {\n super();\n }\n\n protected _next(value: T): void {\n this.parent.notifyNext(value);\n }\n\n protected _error(error: any): void {\n this.parent.notifyError(error);\n this.unsubscribe();\n }\n\n protected _complete(): void {\n this.parent.notifyComplete();\n this.unsubscribe();\n }\n}\n\nexport class ComplexInnerSubscriber extends Subscriber {\n constructor(private parent: ComplexOuterSubscriber, public outerValue: T, public outerIndex: number) {\n super();\n }\n\n protected _next(value: R): void {\n this.parent.notifyNext(this.outerValue, value, this.outerIndex, this);\n }\n\n protected _error(error: any): void {\n this.parent.notifyError(error);\n this.unsubscribe();\n }\n\n protected _complete(): void {\n this.parent.notifyComplete(this);\n this.unsubscribe();\n }\n}\n\nexport class SimpleOuterSubscriber extends Subscriber implements SimpleOuterSubscriberLike {\n notifyNext(innerValue: R): void {\n this.destination.next(innerValue);\n }\n\n notifyError(err: any): void {\n this.destination.error(err);\n }\n\n notifyComplete(): void {\n this.destination.complete();\n }\n}\n\n/**\n * DO NOT USE (formerly \"OuterSubscriber\")\n * TODO: We want to refactor this and remove it. It is retaining values it shouldn't for long\n * periods of time.\n */\nexport class ComplexOuterSubscriber extends Subscriber {\n /**\n * @param _outerValue Used by: bufferToggle, delayWhen, windowToggle\n * @param innerValue Used by: subclass default, combineLatest, race, bufferToggle, windowToggle, withLatestFrom\n * @param _outerIndex Used by: combineLatest, race, withLatestFrom\n * @param _innerSub Used by: delayWhen\n */\n notifyNext(_outerValue: T, innerValue: R, _outerIndex: number, _innerSub: ComplexInnerSubscriber): void {\n this.destination.next(innerValue);\n }\n\n notifyError(error: any): void {\n this.destination.error(error);\n }\n\n /**\n * @param _innerSub Used by: race, bufferToggle, delayWhen, windowToggle, windowWhen\n */\n notifyComplete(_innerSub: ComplexInnerSubscriber): void {\n this.destination.complete();\n }\n}\n\nexport function innerSubscribe(result: any, innerSubscriber: Subscriber): Subscription | undefined {\n if (innerSubscriber.closed) {\n return undefined;\n }\n if (result instanceof Observable) {\n return result.subscribe(innerSubscriber);\n }\n let subscription: Subscription;\n try {\n subscription = subscribeTo(result)(innerSubscriber) as Subscription;\n } catch (error) {\n innerSubscriber.error(error);\n }\n return subscription;\n}\n","import { SchedulerLike } from '../types';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && typeof (value).schedule === 'function';\n}\n","import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\nimport { Subscription } from '../Subscription';\n\nexport function scheduleArray(input: ArrayLike, scheduler: SchedulerLike) {\n return new Observable(subscriber => {\n const sub = new Subscription();\n let i = 0;\n sub.add(scheduler.schedule(function () {\n if (i === input.length) {\n subscriber.complete();\n return;\n }\n subscriber.next(input[i++]);\n if (!subscriber.closed) {\n sub.add(this.schedule());\n }\n }));\n return sub;\n });\n}\n","import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\nimport { subscribeToArray } from '../util/subscribeToArray';\nimport { scheduleArray } from '../scheduled/scheduleArray';\n\nexport function fromArray(input: ArrayLike, scheduler?: SchedulerLike) {\n if (!scheduler) {\n return new Observable(subscribeToArray(input));\n } else {\n return scheduleArray(input, scheduler);\n }\n}\n","import { scheduleObservable } from './scheduleObservable';\nimport { schedulePromise } from './schedulePromise';\nimport { scheduleArray } from './scheduleArray';\nimport { scheduleIterable } from './scheduleIterable';\nimport { ObservableInput, SchedulerLike, Observable } from 'rxjs';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isPromise } from '../util/isPromise';\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isIterable } from '../util/isIterable';\n\n/**\n * Converts from a common {@link ObservableInput} type to an observable where subscription and emissions\n * are scheduled on the provided scheduler.\n *\n * @see from\n * @see of\n *\n * @param input The observable, array, promise, iterable, etc you would like to schedule\n * @param scheduler The scheduler to use to schedule the subscription and emissions from\n * the returned observable.\n */\nexport function scheduled(input: ObservableInput, scheduler: SchedulerLike): Observable {\n if (input != null) {\n if (isInteropObservable(input)) {\n return scheduleObservable(input, scheduler);\n } else if (isPromise(input)) {\n return schedulePromise(input, scheduler);\n } else if (isArrayLike(input)) {\n return scheduleArray(input, scheduler);\n } else if (isIterable(input) || typeof input === 'string') {\n return scheduleIterable(input, scheduler);\n }\n }\n\n throw new TypeError((input !== null && typeof input || input) + ' is not observable');\n}\n","import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return input && typeof input[Symbol_observable] === 'function';\n}\n","import { Observable } from '../Observable';\nimport { Subscription } from '../Subscription';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { InteropObservable, SchedulerLike, Subscribable } from '../types';\n\nexport function scheduleObservable(input: InteropObservable, scheduler: SchedulerLike) {\n return new Observable(subscriber => {\n const sub = new Subscription();\n sub.add(scheduler.schedule(() => {\n const observable: Subscribable = input[Symbol_observable]();\n sub.add(observable.subscribe({\n next(value) { sub.add(scheduler.schedule(() => subscriber.next(value))); },\n error(err) { sub.add(scheduler.schedule(() => subscriber.error(err))); },\n complete() { sub.add(scheduler.schedule(() => subscriber.complete())); },\n }));\n }));\n return sub;\n });\n}\n","import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\nimport { Subscription } from '../Subscription';\n\nexport function schedulePromise(input: PromiseLike, scheduler: SchedulerLike) {\n return new Observable(subscriber => {\n const sub = new Subscription();\n sub.add(scheduler.schedule(() => input.then(\n value => {\n sub.add(scheduler.schedule(() => {\n subscriber.next(value);\n sub.add(scheduler.schedule(() => subscriber.complete()));\n }));\n },\n err => {\n sub.add(scheduler.schedule(() => subscriber.error(err)));\n }\n )));\n return sub;\n });\n}\n","import { iterator as Symbol_iterator } from '../symbol/iterator';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return input && typeof input[Symbol_iterator] === 'function';\n}\n","import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\nimport { Subscription } from '../Subscription';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\n\nexport function scheduleIterable(input: Iterable, scheduler: SchedulerLike) {\n if (!input) {\n throw new Error('Iterable cannot be null');\n }\n return new Observable(subscriber => {\n const sub = new Subscription();\n let iterator: Iterator;\n sub.add(() => {\n // Finalize generators\n if (iterator && typeof iterator.return === 'function') {\n iterator.return();\n }\n });\n sub.add(scheduler.schedule(() => {\n iterator = input[Symbol_iterator]();\n sub.add(scheduler.schedule(function () {\n if (subscriber.closed) {\n return;\n }\n let value: T;\n let done: boolean;\n try {\n const result = iterator.next();\n value = result.value;\n done = result.done;\n } catch (err) {\n subscriber.error(err);\n return;\n }\n if (done) {\n subscriber.complete();\n } else {\n subscriber.next(value);\n this.schedule();\n }\n }));\n }));\n return sub;\n });\n}\n","import { Observable } from '../Observable';\nimport { subscribeTo } from '../util/subscribeTo';\nimport { ObservableInput, SchedulerLike, ObservedValueOf } from '../types';\nimport { scheduled } from '../scheduled/scheduled';\n\nexport function from>(input: O): Observable>;\n/** @deprecated use {@link scheduled} instead. */\nexport function from>(input: O, scheduler: SchedulerLike): Observable>;\n\n/**\n * Creates an Observable from an Array, an array-like object, a Promise, an iterable object, or an Observable-like object.\n *\n * Converts almost anything to an Observable.\n *\n * ![](from.png)\n *\n * `from` converts various other objects and data types into Observables. It also converts a Promise, an array-like, or an\n * iterable\n * object into an Observable that emits the items in that promise, array, or iterable. A String, in this context, is treated\n * as an array of characters. Observable-like objects (contains a function named with the ES2015 Symbol for Observable) can also be\n * converted through this operator.\n *\n * ## Examples\n *\n * ### Converts an array to an Observable\n *\n * ```ts\n * import { from } from 'rxjs';\n *\n * const array = [10, 20, 30];\n * const result = from(array);\n *\n * result.subscribe(x => console.log(x));\n *\n * // Logs:\n * // 10\n * // 20\n * // 30\n * ```\n *\n * ---\n *\n * ### Convert an infinite iterable (from a generator) to an Observable\n *\n * ```ts\n * import { from } from 'rxjs';\n * import { take } from 'rxjs/operators';\n *\n * function* generateDoubles(seed) {\n * let i = seed;\n * while (true) {\n * yield i;\n * i = 2 * i; // double it\n * }\n * }\n *\n * const iterator = generateDoubles(3);\n * const result = from(iterator).pipe(take(10));\n *\n * result.subscribe(x => console.log(x));\n *\n * // Logs:\n * // 3\n * // 6\n * // 12\n * // 24\n * // 48\n * // 96\n * // 192\n * // 384\n * // 768\n * // 1536\n * ```\n *\n * ---\n *\n * ### With async scheduler\n *\n * ```ts\n * import { from, asyncScheduler } from 'rxjs';\n *\n * console.log('start');\n *\n * const array = [10, 20, 30];\n * const result = from(array, asyncScheduler);\n *\n * result.subscribe(x => console.log(x));\n *\n * console.log('end');\n *\n * // Logs:\n * // start\n * // end\n * // 10\n * // 20\n * // 30\n * ```\n *\n * @see {@link fromEvent}\n * @see {@link fromEventPattern}\n *\n * @param {ObservableInput} A subscription object, a Promise, an Observable-like,\n * an Array, an iterable, or an array-like object to be converted.\n * @param {SchedulerLike} An optional {@link SchedulerLike} on which to schedule the emission of values.\n * @return {Observable}\n * @name from\n * @owner Observable\n */\nexport function from(input: ObservableInput, scheduler?: SchedulerLike): Observable {\n if (!scheduler) {\n if (input instanceof Observable) {\n return input;\n }\n return new Observable(subscribeTo(input));\n } else {\n return scheduled(input, scheduler);\n }\n}\n","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { OperatorFunction } from '../types';\n\n/**\n * Applies a given `project` function to each value emitted by the source\n * Observable, and emits the resulting values as an Observable.\n *\n * Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),\n * it passes each source value through a transformation function to get\n * corresponding output values.\n *\n * ![](map.png)\n *\n * Similar to the well known `Array.prototype.map` function, this operator\n * applies a projection to each value and emits that projection in the output\n * Observable.\n *\n * ## Example\n * Map every click to the clientX position of that click\n * ```ts\n * import { fromEvent } from 'rxjs';\n * import { map } from 'rxjs/operators';\n *\n * const clicks = fromEvent(document, 'click');\n * const positions = clicks.pipe(map(ev => ev.clientX));\n * positions.subscribe(x => console.log(x));\n * ```\n *\n * @see {@link mapTo}\n * @see {@link pluck}\n *\n * @param {function(value: T, index: number): R} project The function to apply\n * to each `value` emitted by the source Observable. The `index` parameter is\n * the number `i` for the i-th emission that has happened since the\n * subscription, starting from the number `0`.\n * @param {any} [thisArg] An optional argument to define what `this` is in the\n * `project` function.\n * @return {Observable} An Observable that emits the values from the source\n * Observable transformed by the given `project` function.\n * @method map\n * @owner Observable\n */\nexport function map(project: (value: T, index: number) => R, thisArg?: any): OperatorFunction {\n return function mapOperation(source: Observable): Observable {\n if (typeof project !== 'function') {\n throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');\n }\n return source.lift(new MapOperator(project, thisArg));\n };\n}\n\nexport class MapOperator implements Operator {\n constructor(private project: (value: T, index: number) => R, private thisArg: any) {\n }\n\n call(subscriber: Subscriber, source: any): any {\n return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass MapSubscriber extends Subscriber {\n count: number = 0;\n private thisArg: any;\n\n constructor(destination: Subscriber,\n private project: (value: T, index: number) => R,\n thisArg: any) {\n super(destination);\n this.thisArg = thisArg || this;\n }\n\n // NOTE: This looks unoptimized, but it's actually purposefully NOT\n // using try/catch optimizations.\n protected _next(value: T) {\n let result: R;\n try {\n result = this.project.call(this.thisArg, value, this.count++);\n } catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n }\n}\n","import { Observable } from '../Observable';\nimport { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\nimport { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';\nimport { map } from './map';\nimport { from } from '../observable/from';\nimport { SimpleOuterSubscriber, SimpleInnerSubscriber, innerSubscribe } from '../innerSubscribe';\n\n/* tslint:disable:max-line-length */\nexport function mergeMap>(project: (value: T, index: number) => O, concurrent?: number): OperatorFunction>;\n/** @deprecated resultSelector no longer supported, use inner map instead */\nexport function mergeMap>(project: (value: T, index: number) => O, resultSelector: undefined, concurrent?: number): OperatorFunction>;\n/** @deprecated resultSelector no longer supported, use inner map instead */\nexport function mergeMap>(project: (value: T, index: number) => O, resultSelector: (outerValue: T, innerValue: ObservedValueOf, outerIndex: number, innerIndex: number) => R, concurrent?: number): OperatorFunction;\n/* tslint:enable:max-line-length */\n\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable.\n *\n * Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link mergeAll}.\n *\n * ![](mergeMap.png)\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger.\n *\n * ## Example\n * Map and flatten each letter to an Observable ticking every 1 second\n * ```ts\n * import { of, interval } from 'rxjs';\n * import { mergeMap, map } from 'rxjs/operators';\n *\n * const letters = of('a', 'b', 'c');\n * const result = letters.pipe(\n * mergeMap(x => interval(1000).pipe(map(i => x+i))),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // a0\n * // b0\n * // c0\n * // a1\n * // b1\n * // c1\n * // continues to list a,b,c with respective ascending integers\n * ```\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link merge}\n * @see {@link mergeAll}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): ObservableInput} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional deprecated `resultSelector`) to each item\n * emitted by the source Observable and merging the results of the Observables\n * obtained from this transformation.\n */\nexport function mergeMap>(\n project: (value: T, index: number) => O,\n resultSelector?: ((outerValue: T, innerValue: ObservedValueOf, outerIndex: number, innerIndex: number) => R) | number,\n concurrent: number = Number.POSITIVE_INFINITY\n): OperatorFunction|R> {\n if (typeof resultSelector === 'function') {\n // DEPRECATED PATH\n return (source: Observable) => source.pipe(\n mergeMap((a, i) => from(project(a, i)).pipe(\n map((b: any, ii: number) => resultSelector(a, b, i, ii)),\n ), concurrent)\n );\n } else if (typeof resultSelector === 'number') {\n concurrent = resultSelector;\n }\n return (source: Observable) => source.lift(new MergeMapOperator(project, concurrent));\n}\n\nexport class MergeMapOperator implements Operator {\n constructor(private project: (value: T, index: number) => ObservableInput,\n private concurrent: number = Number.POSITIVE_INFINITY) {\n }\n\n call(observer: Subscriber, source: any): any {\n return source.subscribe(new MergeMapSubscriber(\n observer, this.project, this.concurrent\n ));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class MergeMapSubscriber extends SimpleOuterSubscriber {\n private hasCompleted: boolean = false;\n private buffer: T[] = [];\n private active: number = 0;\n protected index: number = 0;\n\n constructor(destination: Subscriber,\n private project: (value: T, index: number) => ObservableInput,\n private concurrent: number = Number.POSITIVE_INFINITY) {\n super(destination);\n }\n\n protected _next(value: T): void {\n if (this.active < this.concurrent) {\n this._tryNext(value);\n } else {\n this.buffer.push(value);\n }\n }\n\n protected _tryNext(value: T) {\n let result: ObservableInput;\n const index = this.index++;\n try {\n result = this.project(value, index);\n } catch (err) {\n this.destination.error!(err);\n return;\n }\n this.active++;\n this._innerSub(result);\n }\n\n private _innerSub(ish: ObservableInput): void {\n const innerSubscriber = new SimpleInnerSubscriber(this);\n const destination = this.destination as Subscription;\n destination.add(innerSubscriber);\n const innerSubscription = innerSubscribe(ish, innerSubscriber);\n // The returned subscription will usually be the subscriber that was\n // passed. However, interop subscribers will be wrapped and for\n // unsubscriptions to chain correctly, the wrapper needs to be added, too.\n if (innerSubscription !== innerSubscriber) {\n destination.add(innerSubscription);\n }\n }\n\n protected _complete(): void {\n this.hasCompleted = true;\n if (this.active === 0 && this.buffer.length === 0) {\n this.destination.complete!();\n }\n this.unsubscribe();\n }\n\n notifyNext(innerValue: R): void {\n this.destination.next!(innerValue);\n }\n\n notifyComplete(): void {\n const buffer = this.buffer;\n this.active--;\n if (buffer.length > 0) {\n this._next(buffer.shift()!);\n } else if (this.active === 0 && this.hasCompleted) {\n this.destination.complete!();\n }\n }\n}\n\n/**\n * @deprecated renamed. Use {@link mergeMap}\n */\nexport const flatMap = mergeMap;","\nimport { mergeMap } from './mergeMap';\nimport { identity } from '../util/identity';\nimport { OperatorFunction, ObservableInput } from '../types';\n\n/**\n * Converts a higher-order Observable into a first-order Observable which\n * concurrently delivers all values that are emitted on the inner Observables.\n *\n * Flattens an Observable-of-Observables.\n *\n * ![](mergeAll.png)\n *\n * `mergeAll` subscribes to an Observable that emits Observables, also known as\n * a higher-order Observable. Each time it observes one of these emitted inner\n * Observables, it subscribes to that and delivers all the values from the\n * inner Observable on the output Observable. The output Observable only\n * completes once all inner Observables have completed. Any error delivered by\n * a inner Observable will be immediately emitted on the output Observable.\n *\n * ## Examples\n * Spawn a new interval Observable for each click event, and blend their outputs as one Observable\n * ```ts\n * import { fromEvent, interval } from 'rxjs';\n * import { map, mergeAll } from 'rxjs/operators';\n *\n * const clicks = fromEvent(document, 'click');\n * const higherOrder = clicks.pipe(map((ev) => interval(1000)));\n * const firstOrder = higherOrder.pipe(mergeAll());\n * firstOrder.subscribe(x => console.log(x));\n * ```\n *\n * Count from 0 to 9 every second for each click, but only allow 2 concurrent timers\n * ```ts\n * import { fromEvent, interval } from 'rxjs';\n * import { take, map, mergeAll } from 'rxjs/operators';\n *\n * const clicks = fromEvent(document, 'click');\n * const higherOrder = clicks.pipe(\n * map((ev) => interval(1000).pipe(take(10))),\n * );\n * const firstOrder = higherOrder.pipe(mergeAll(2));\n * firstOrder.subscribe(x => console.log(x));\n * ```\n *\n * @see {@link combineAll}\n * @see {@link concatAll}\n * @see {@link exhaust}\n * @see {@link merge}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switchAll}\n * @see {@link switchMap}\n * @see {@link zipAll}\n *\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits values coming from all the\n * inner Observables emitted by the source Observable.\n * @method mergeAll\n * @owner Observable\n */\nexport function mergeAll(concurrent: number = Number.POSITIVE_INFINITY): OperatorFunction, T> {\n return mergeMap(identity, concurrent);\n}\n","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { MonoTypeOperatorFunction, TeardownLogic } from '../types';\n\n/* tslint:disable:max-line-length */\nexport function distinctUntilChanged(compare?: (x: T, y: T) => boolean): MonoTypeOperatorFunction;\nexport function distinctUntilChanged(compare: (x: K, y: K) => boolean, keySelector: (x: T) => K): MonoTypeOperatorFunction;\n/* tslint:enable:max-line-length */\n\n/**\n * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item.\n *\n * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.\n *\n * If a comparator function is not provided, an equality check is used by default.\n *\n * ## Example\n * A simple example with numbers\n * ```ts\n * import { of } from 'rxjs';\n * import { distinctUntilChanged } from 'rxjs/operators';\n *\n * of(1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 4).pipe(\n * distinctUntilChanged(),\n * )\n * .subscribe(x => console.log(x)); // 1, 2, 1, 2, 3, 4\n * ```\n *\n * An example using a compare function\n * ```typescript\n * import { of } from 'rxjs';\n * import { distinctUntilChanged } from 'rxjs/operators';\n *\n * interface Person {\n * age: number,\n * name: string\n * }\n *\n * of(\n * { age: 4, name: 'Foo'},\n * { age: 7, name: 'Bar'},\n * { age: 5, name: 'Foo'},\n * { age: 6, name: 'Foo'},\n * ).pipe(\n * distinctUntilChanged((p: Person, q: Person) => p.name === q.name),\n * )\n * .subscribe(x => console.log(x));\n *\n * // displays:\n * // { age: 4, name: 'Foo' }\n * // { age: 7, name: 'Bar' }\n * // { age: 5, name: 'Foo' }\n * ```\n *\n * @see {@link distinct}\n * @see {@link distinctUntilKeyChanged}\n *\n * @param {function} [compare] Optional comparison function called to test if an item is distinct from the previous item in the source.\n * @return {Observable} An Observable that emits items from the source Observable with distinct values.\n * @method distinctUntilChanged\n * @owner Observable\n */\nexport function distinctUntilChanged(compare?: (x: K, y: K) => boolean, keySelector?: (x: T) => K): MonoTypeOperatorFunction {\n return (source: Observable) => source.lift(new DistinctUntilChangedOperator(compare, keySelector));\n}\n\nclass DistinctUntilChangedOperator implements Operator {\n constructor(private compare: (x: K, y: K) => boolean,\n private keySelector: (x: T) => K) {\n }\n\n call(subscriber: Subscriber, source: any): TeardownLogic {\n return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass DistinctUntilChangedSubscriber extends Subscriber {\n private key: K;\n private hasKey: boolean = false;\n\n constructor(destination: Subscriber,\n compare: (x: K, y: K) => boolean,\n private keySelector: (x: T) => K) {\n super(destination);\n if (typeof compare === 'function') {\n this.compare = compare;\n }\n }\n\n private compare(x: any, y: any): boolean {\n return x === y;\n }\n\n protected _next(value: T): void {\n let key: any;\n try {\n const { keySelector } = this;\n key = keySelector ? keySelector(value) : value;\n } catch (err) {\n return this.destination.error(err);\n }\n let result = false;\n if (this.hasKey) {\n try {\n const { compare } = this;\n result = compare(this.key, key);\n } catch (err) {\n return this.destination.error(err);\n }\n } else {\n this.hasKey = true;\n }\n if (!result) {\n this.key = key;\n this.destination.next(value);\n }\n }\n}\n","export interface ObjectUnsubscribedError extends Error {\n}\n\nexport interface ObjectUnsubscribedErrorCtor {\n new(): ObjectUnsubscribedError;\n}\n\nconst ObjectUnsubscribedErrorImpl = (() => {\n function ObjectUnsubscribedErrorImpl(this: any) {\n Error.call(this);\n this.message = 'object unsubscribed';\n this.name = 'ObjectUnsubscribedError';\n return this;\n }\n\n ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);\n\n return ObjectUnsubscribedErrorImpl;\n})();\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = ObjectUnsubscribedErrorImpl as any;","import { Subject } from './Subject';\nimport { Observer } from './types';\nimport { Subscription } from './Subscription';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class SubjectSubscription extends Subscription {\n closed: boolean = false;\n\n constructor(public subject: Subject, public subscriber: Observer) {\n super();\n }\n\n unsubscribe() {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n\n const subject = this.subject;\n const observers = subject.observers;\n\n this.subject = null;\n\n if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {\n return;\n }\n\n const subscriberIndex = observers.indexOf(this.subscriber);\n\n if (subscriberIndex !== -1) {\n observers.splice(subscriberIndex, 1);\n }\n }\n}\n","import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { SubjectSubscription } from './SubjectSubscription';\nimport { rxSubscriber as rxSubscriberSymbol } from '../internal/symbol/rxSubscriber';\n\n/**\n * @class SubjectSubscriber\n */\nexport class SubjectSubscriber extends Subscriber {\n constructor(protected destination: Subject) {\n super(destination);\n }\n}\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n *\n * @class Subject\n */\nexport class Subject extends Observable implements SubscriptionLike {\n\n [rxSubscriberSymbol]() {\n return new SubjectSubscriber(this);\n }\n\n observers: Observer[] = [];\n\n closed = false;\n\n isStopped = false;\n\n hasError = false;\n\n thrownError: any = null;\n\n constructor() {\n super();\n }\n\n /**@nocollapse\n * @deprecated use new Subject() instead\n */\n static create: Function = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n }\n\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator;\n return subject;\n }\n\n next(value?: T) {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n if (!this.isStopped) {\n const { observers } = this;\n const len = observers.length;\n const copy = observers.slice();\n for (let i = 0; i < len; i++) {\n copy[i].next(value);\n }\n }\n }\n\n error(err: any) {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n this.hasError = true;\n this.thrownError = err;\n this.isStopped = true;\n const { observers } = this;\n const len = observers.length;\n const copy = observers.slice();\n for (let i = 0; i < len; i++) {\n copy[i].error(err);\n }\n this.observers.length = 0;\n }\n\n complete() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n this.isStopped = true;\n const { observers } = this;\n const len = observers.length;\n const copy = observers.slice();\n for (let i = 0; i < len; i++) {\n copy[i].complete();\n }\n this.observers.length = 0;\n }\n\n unsubscribe() {\n this.isStopped = true;\n this.closed = true;\n this.observers = null;\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _trySubscribe(subscriber: Subscriber): TeardownLogic {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n } else {\n return super._trySubscribe(subscriber);\n }\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _subscribe(subscriber: Subscriber): Subscription {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n } else if (this.hasError) {\n subscriber.error(this.thrownError);\n return Subscription.EMPTY;\n } else if (this.isStopped) {\n subscriber.complete();\n return Subscription.EMPTY;\n } else {\n this.observers.push(subscriber);\n return new SubjectSubscription(this, subscriber);\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create customize Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable = new Observable();\n (observable).source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(protected destination?: Observer, source?: Observable) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n const { destination } = this;\n if (destination && destination.next) {\n destination.next(value);\n }\n }\n\n error(err: any) {\n const { destination } = this;\n if (destination && destination.error) {\n this.destination.error(err);\n }\n }\n\n complete() {\n const { destination } = this;\n if (destination && destination.complete) {\n this.destination.complete();\n }\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _subscribe(subscriber: Subscriber): Subscription {\n const { source } = this;\n if (source) {\n return this.source.subscribe(subscriber);\n } else {\n return Subscription.EMPTY;\n }\n }\n}\n","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { OperatorFunction } from '../types';\n\n/**\n * Emits the given constant value on the output Observable every time the source\n * Observable emits a value.\n *\n * Like {@link map}, but it maps every source value to\n * the same output value every time.\n *\n * ![](mapTo.png)\n *\n * Takes a constant `value` as argument, and emits that whenever the source\n * Observable emits a value. In other words, ignores the actual source value,\n * and simply uses the emission moment to know when to emit the given `value`.\n *\n * ## Example\n * Map every click to the string 'Hi'\n * ```ts\n * import { fromEvent } from 'rxjs';\n * import { mapTo } from 'rxjs/operators';\n *\n * const clicks = fromEvent(document, 'click');\n * const greetings = clicks.pipe(mapTo('Hi'));\n * greetings.subscribe(x => console.log(x));\n * ```\n *\n * @see {@link map}\n *\n * @param {any} value The value to map each source value to.\n * @return {Observable} An Observable that emits the given `value` every time\n * the source Observable emits something.\n * @method mapTo\n * @owner Observable\n */\nexport function mapTo(value: R): OperatorFunction {\n return (source: Observable) => source.lift(new MapToOperator(value));\n}\n\nclass MapToOperator implements Operator {\n\n value: R;\n\n constructor(value: R) {\n this.value = value;\n }\n\n call(subscriber: Subscriber, source: any): any {\n return source.subscribe(new MapToSubscriber(subscriber, this.value));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass MapToSubscriber extends Subscriber {\n\n value: R;\n\n constructor(destination: Subscriber, value: R) {\n super(destination);\n this.value = value;\n }\n\n protected _next(x: T) {\n this.destination.next(this.value);\n }\n}\n","export enum StickyFormats {\n\tFLYING = 'flying',\n\tBANNER = 'banner'\n}\n","import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { SubscriptionLike } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n if (subscription && !(subscription).closed) {\n subscriber.next(this._value);\n }\n return subscription;\n }\n\n getValue(): T {\n if (this.hasError) {\n throw this.thrownError;\n } else if (this.closed) {\n throw new ObjectUnsubscribedError();\n } else {\n return this._value;\n }\n }\n\n next(value: T): void {\n super.next(this._value = value);\n }\n}\n","function createElement (query, ns) {\n var ref = parse(query);\n var tag = ref.tag;\n var id = ref.id;\n var className = ref.className;\n var element = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n\n if (id) {\n element.id = id;\n }\n\n if (className) {\n if (ns) {\n element.setAttribute('class', className);\n } else {\n element.className = className;\n }\n }\n\n return element;\n}\n\nfunction parse (query) {\n var chunks = query.split(/([.#])/);\n var className = '';\n var id = '';\n\n for (var i = 1; i < chunks.length; i += 2) {\n switch (chunks[i]) {\n case '.':\n className += \" \" + (chunks[i + 1]);\n break;\n\n case '#':\n id = chunks[i + 1];\n }\n }\n\n return {\n className: className.trim(),\n tag: chunks[0] || 'div',\n id: id\n };\n}\n\nfunction unmount (parent, child) {\n var parentEl = getEl(parent);\n var childEl = getEl(child);\n\n if (child === childEl && childEl.__redom_view) {\n // try to look up the view if not provided\n child = childEl.__redom_view;\n }\n\n if (childEl.parentNode) {\n doUnmount(child, childEl, parentEl);\n\n parentEl.removeChild(childEl);\n }\n\n return child;\n}\n\nfunction doUnmount (child, childEl, parentEl) {\n var hooks = childEl.__redom_lifecycle;\n\n if (hooksAreEmpty(hooks)) {\n childEl.__redom_lifecycle = {};\n return;\n }\n\n var traverse = parentEl;\n\n if (childEl.__redom_mounted) {\n trigger(childEl, 'onunmount');\n }\n\n while (traverse) {\n var parentHooks = traverse.__redom_lifecycle || {};\n\n for (var hook in hooks) {\n if (parentHooks[hook]) {\n parentHooks[hook] -= hooks[hook];\n }\n }\n\n if (hooksAreEmpty(parentHooks)) {\n traverse.__redom_lifecycle = null;\n }\n\n traverse = traverse.parentNode;\n }\n}\n\nfunction hooksAreEmpty (hooks) {\n if (hooks == null) {\n return true;\n }\n for (var key in hooks) {\n if (hooks[key]) {\n return false;\n }\n }\n return true;\n}\n\n/* global Node, ShadowRoot */\n\nvar hookNames = ['onmount', 'onremount', 'onunmount'];\nvar shadowRootAvailable = typeof window !== 'undefined' && 'ShadowRoot' in window;\n\nfunction mount (parent, child, before, replace) {\n var parentEl = getEl(parent);\n var childEl = getEl(child);\n\n if (child === childEl && childEl.__redom_view) {\n // try to look up the view if not provided\n child = childEl.__redom_view;\n }\n\n if (child !== childEl) {\n childEl.__redom_view = child;\n }\n\n var wasMounted = childEl.__redom_mounted;\n var oldParent = childEl.parentNode;\n\n if (wasMounted && (oldParent !== parentEl)) {\n doUnmount(child, childEl, oldParent);\n }\n\n if (before != null) {\n if (replace) {\n var beforeEl = getEl(before);\n\n if (beforeEl.__redom_mounted) {\n trigger(before.el, 'onunmount');\n }\n\n parentEl.replaceChild(childEl, beforeEl);\n } else {\n parentEl.insertBefore(childEl, getEl(before));\n }\n } else {\n parentEl.appendChild(childEl);\n }\n\n doMount(child, childEl, parentEl, oldParent);\n\n return child;\n}\n\nfunction trigger (el, eventName) {\n if (eventName === 'onmount' || eventName === 'onremount') {\n el.__redom_mounted = true;\n } else if (eventName === 'onunmount') {\n el.__redom_mounted = false;\n }\n\n var hooks = el.__redom_lifecycle;\n\n if (!hooks) {\n return;\n }\n\n var view = el.__redom_view;\n var hookCount = 0;\n\n view && view[eventName] && view[eventName]();\n\n for (var hook in hooks) {\n if (hook) {\n hookCount++;\n }\n }\n\n if (hookCount) {\n var traverse = el.firstChild;\n\n while (traverse) {\n var next = traverse.nextSibling;\n\n trigger(traverse, eventName);\n\n traverse = next;\n }\n }\n}\n\nfunction doMount (child, childEl, parentEl, oldParent) {\n var hooks = childEl.__redom_lifecycle || (childEl.__redom_lifecycle = {});\n var remount = (parentEl === oldParent);\n var hooksFound = false;\n\n for (var i = 0, list = hookNames; i < list.length; i += 1) {\n var hookName = list[i];\n\n if (!remount) { // if already mounted, skip this phase\n if (child !== childEl) { // only Views can have lifecycle events\n if (hookName in child) {\n hooks[hookName] = (hooks[hookName] || 0) + 1;\n }\n }\n }\n if (hooks[hookName]) {\n hooksFound = true;\n }\n }\n\n if (!hooksFound) {\n childEl.__redom_lifecycle = {};\n return;\n }\n\n var traverse = parentEl;\n var triggered = false;\n\n if (remount || (traverse && traverse.__redom_mounted)) {\n trigger(childEl, remount ? 'onremount' : 'onmount');\n triggered = true;\n }\n\n while (traverse) {\n var parent = traverse.parentNode;\n var parentHooks = traverse.__redom_lifecycle || (traverse.__redom_lifecycle = {});\n\n for (var hook in hooks) {\n parentHooks[hook] = (parentHooks[hook] || 0) + hooks[hook];\n }\n\n if (triggered) {\n break;\n } else {\n if (traverse.nodeType === Node.DOCUMENT_NODE ||\n (shadowRootAvailable && (traverse instanceof ShadowRoot)) ||\n (parent && parent.__redom_mounted)\n ) {\n trigger(traverse, remount ? 'onremount' : 'onmount');\n triggered = true;\n }\n traverse = parent;\n }\n }\n}\n\nfunction setStyle (view, arg1, arg2) {\n var el = getEl(view);\n\n if (typeof arg1 === 'object') {\n for (var key in arg1) {\n setStyleValue(el, key, arg1[key]);\n }\n } else {\n setStyleValue(el, arg1, arg2);\n }\n}\n\nfunction setStyleValue (el, key, value) {\n el.style[key] = value == null ? '' : value;\n}\n\n/* global SVGElement */\n\nvar xlinkns = 'http://www.w3.org/1999/xlink';\n\nfunction setAttr (view, arg1, arg2) {\n setAttrInternal(view, arg1, arg2);\n}\n\nfunction setAttrInternal (view, arg1, arg2, initial) {\n var el = getEl(view);\n\n var isObj = typeof arg1 === 'object';\n\n if (isObj) {\n for (var key in arg1) {\n setAttrInternal(el, key, arg1[key], initial);\n }\n } else {\n var isSVG = el instanceof SVGElement;\n var isFunc = typeof arg2 === 'function';\n\n if (arg1 === 'style' && typeof arg2 === 'object') {\n setStyle(el, arg2);\n } else if (isSVG && isFunc) {\n el[arg1] = arg2;\n } else if (arg1 === 'dataset') {\n setData(el, arg2);\n } else if (!isSVG && (arg1 in el || isFunc) && (arg1 !== 'list')) {\n el[arg1] = arg2;\n } else {\n if (isSVG && (arg1 === 'xlink')) {\n setXlink(el, arg2);\n return;\n }\n if (initial && arg1 === 'class') {\n arg2 = el.className + ' ' + arg2;\n }\n if (arg2 == null) {\n el.removeAttribute(arg1);\n } else {\n el.setAttribute(arg1, arg2);\n }\n }\n }\n}\n\nfunction setXlink (el, arg1, arg2) {\n if (typeof arg1 === 'object') {\n for (var key in arg1) {\n setXlink(el, key, arg1[key]);\n }\n } else {\n if (arg2 != null) {\n el.setAttributeNS(xlinkns, arg1, arg2);\n } else {\n el.removeAttributeNS(xlinkns, arg1, arg2);\n }\n }\n}\n\nfunction setData (el, arg1, arg2) {\n if (typeof arg1 === 'object') {\n for (var key in arg1) {\n setData(el, key, arg1[key]);\n }\n } else {\n if (arg2 != null) {\n el.dataset[arg1] = arg2;\n } else {\n delete el.dataset[arg1];\n }\n }\n}\n\nfunction text (str) {\n return document.createTextNode((str != null) ? str : '');\n}\n\nfunction parseArgumentsInternal (element, args, initial) {\n for (var i = 0, list = args; i < list.length; i += 1) {\n var arg = list[i];\n\n if (arg !== 0 && !arg) {\n continue;\n }\n\n var type = typeof arg;\n\n if (type === 'function') {\n arg(element);\n } else if (type === 'string' || type === 'number') {\n element.appendChild(text(arg));\n } else if (isNode(getEl(arg))) {\n mount(element, arg);\n } else if (arg.length) {\n parseArgumentsInternal(element, arg, initial);\n } else if (type === 'object') {\n setAttrInternal(element, arg, null, initial);\n }\n }\n}\n\nfunction ensureEl (parent) {\n return typeof parent === 'string' ? html(parent) : getEl(parent);\n}\n\nfunction getEl (parent) {\n return (parent.nodeType && parent) || (!parent.el && parent) || getEl(parent.el);\n}\n\nfunction isNode (arg) {\n return arg && arg.nodeType;\n}\n\nfunction html (query) {\n var args = [], len = arguments.length - 1;\n while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n var element;\n\n var type = typeof query;\n\n if (type === 'string') {\n element = createElement(query);\n } else if (type === 'function') {\n var Query = query;\n element = new (Function.prototype.bind.apply( Query, [ null ].concat( args) ));\n } else {\n throw new Error('At least one argument required');\n }\n\n parseArgumentsInternal(getEl(element), args, true);\n\n return element;\n}\n\nvar el = html;\nvar h = html;\n\nhtml.extend = function extendHtml () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n return html.bind.apply(html, [ this ].concat( args ));\n};\n\nfunction setChildren (parent) {\n var children = [], len = arguments.length - 1;\n while ( len-- > 0 ) children[ len ] = arguments[ len + 1 ];\n\n var parentEl = getEl(parent);\n var current = traverse(parent, children, parentEl.firstChild);\n\n while (current) {\n var next = current.nextSibling;\n\n unmount(parent, current);\n\n current = next;\n }\n}\n\nfunction traverse (parent, children, _current) {\n var current = _current;\n\n var childEls = Array(children.length);\n\n for (var i = 0; i < children.length; i++) {\n childEls[i] = children[i] && getEl(children[i]);\n }\n\n for (var i$1 = 0; i$1 < children.length; i$1++) {\n var child = children[i$1];\n\n if (!child) {\n continue;\n }\n\n var childEl = childEls[i$1];\n\n if (childEl === current) {\n current = current.nextSibling;\n continue;\n }\n\n if (isNode(childEl)) {\n var next = current && current.nextSibling;\n var exists = child.__redom_index != null;\n var replace = exists && next === childEls[i$1 + 1];\n\n mount(parent, child, current, replace);\n\n if (replace) {\n current = next;\n }\n\n continue;\n }\n\n if (child.length != null) {\n current = traverse(parent, child, current);\n }\n }\n\n return current;\n}\n\nfunction listPool (View, key, initData) {\n return new ListPool(View, key, initData);\n}\n\nvar ListPool = function ListPool (View, key, initData) {\n this.View = View;\n this.initData = initData;\n this.oldLookup = {};\n this.lookup = {};\n this.oldViews = [];\n this.views = [];\n\n if (key != null) {\n this.key = typeof key === 'function' ? key : propKey(key);\n }\n};\n\nListPool.prototype.update = function update (data, context) {\n var ref = this;\n var View = ref.View;\n var key = ref.key;\n var initData = ref.initData;\n var keySet = key != null;\n\n var oldLookup = this.lookup;\n var newLookup = {};\n\n var newViews = Array(data.length);\n var oldViews = this.views;\n\n for (var i = 0; i < data.length; i++) {\n var item = data[i];\n var view = (void 0);\n\n if (keySet) {\n var id = key(item);\n\n view = oldLookup[id] || new View(initData, item, i, data);\n newLookup[id] = view;\n view.__redom_id = id;\n } else {\n view = oldViews[i] || new View(initData, item, i, data);\n }\n view.update && view.update(item, i, data, context);\n\n var el = getEl(view.el);\n\n el.__redom_view = view;\n newViews[i] = view;\n }\n\n this.oldViews = oldViews;\n this.views = newViews;\n\n this.oldLookup = oldLookup;\n this.lookup = newLookup;\n};\n\nfunction propKey (key) {\n return function (item) {\n return item[key];\n };\n}\n\nfunction list (parent, View, key, initData) {\n return new List(parent, View, key, initData);\n}\n\nvar List = function List (parent, View, key, initData) {\n this.View = View;\n this.initData = initData;\n this.views = [];\n this.pool = new ListPool(View, key, initData);\n this.el = ensureEl(parent);\n this.keySet = key != null;\n};\n\nList.prototype.update = function update (data, context) {\n if ( data === void 0 ) data = [];\n\n var ref = this;\n var keySet = ref.keySet;\n var oldViews = this.views;\n\n this.pool.update(data, context);\n\n var ref$1 = this.pool;\n var views = ref$1.views;\n var lookup = ref$1.lookup;\n\n if (keySet) {\n for (var i = 0; i < oldViews.length; i++) {\n var oldView = oldViews[i];\n var id = oldView.__redom_id;\n\n if (lookup[id] == null) {\n oldView.__redom_index = null;\n unmount(this, oldView);\n }\n }\n }\n\n for (var i$1 = 0; i$1 < views.length; i$1++) {\n var view = views[i$1];\n\n view.__redom_index = i$1;\n }\n\n setChildren(this, views);\n\n if (keySet) {\n this.lookup = lookup;\n }\n this.views = views;\n};\n\nList.extend = function extendList (parent, View, key, initData) {\n return List.bind(List, parent, View, key, initData);\n};\n\nlist.extend = List.extend;\n\n/* global Node */\n\nfunction place (View, initData) {\n return new Place(View, initData);\n}\n\nvar Place = function Place (View, initData) {\n this.el = text('');\n this.visible = false;\n this.view = null;\n this._placeholder = this.el;\n\n if (View instanceof Node) {\n this._el = View;\n } else if (View.el instanceof Node) {\n this._el = View;\n this.view = View;\n } else {\n this._View = View;\n }\n\n this._initData = initData;\n};\n\nPlace.prototype.update = function update (visible, data) {\n var placeholder = this._placeholder;\n var parentNode = this.el.parentNode;\n\n if (visible) {\n if (!this.visible) {\n if (this._el) {\n mount(parentNode, this._el, placeholder);\n unmount(parentNode, placeholder);\n\n this.el = getEl(this._el);\n this.visible = visible;\n } else {\n var View = this._View;\n var view = new View(this._initData);\n\n this.el = getEl(view);\n this.view = view;\n\n mount(parentNode, view, placeholder);\n unmount(parentNode, placeholder);\n }\n }\n this.view && this.view.update && this.view.update(data);\n } else {\n if (this.visible) {\n if (this._el) {\n mount(parentNode, placeholder, this._el);\n unmount(parentNode, this._el);\n\n this.el = placeholder;\n this.visible = visible;\n\n return;\n }\n mount(parentNode, placeholder, this.view);\n unmount(parentNode, this.view);\n\n this.el = placeholder;\n this.view = null;\n }\n }\n this.visible = visible;\n};\n\n/* global Node */\n\nfunction router (parent, Views, initData) {\n return new Router(parent, Views, initData);\n}\n\nvar Router = function Router (parent, Views, initData) {\n this.el = ensureEl(parent);\n this.Views = Views;\n this.initData = initData;\n};\n\nRouter.prototype.update = function update (route, data) {\n if (route !== this.route) {\n var Views = this.Views;\n var View = Views[route];\n\n this.route = route;\n\n if (View && (View instanceof Node || View.el instanceof Node)) {\n this.view = View;\n } else {\n this.view = View && new View(this.initData, data);\n }\n\n setChildren(this.el, [this.view]);\n }\n this.view && this.view.update && this.view.update(data, route);\n};\n\nvar ns = 'http://www.w3.org/2000/svg';\n\nfunction svg (query) {\n var args = [], len = arguments.length - 1;\n while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n var element;\n\n var type = typeof query;\n\n if (type === 'string') {\n element = createElement(query, ns);\n } else if (type === 'function') {\n var Query = query;\n element = new (Function.prototype.bind.apply( Query, [ null ].concat( args) ));\n } else {\n throw new Error('At least one argument required');\n }\n\n parseArgumentsInternal(getEl(element), args, true);\n\n return element;\n}\n\nvar s = svg;\n\nsvg.extend = function extendSvg () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n return svg.bind.apply(svg, [ this ].concat( args ));\n};\n\nsvg.ns = ns;\n\nexport { List, ListPool, Place, Router, el, h, html, list, listPool, mount, place, router, s, setAttr, setChildren, setData, setStyle, setXlink, svg, text, unmount };\n","export const getClassname = (\n\tclassList: string[] = [],\n\tcustomClassName: string | string[] = ''\n): string => {\n\tconst customClassList =\n\t\ttypeof customClassName === 'string' ? [customClassName] : customClassName;\n\n\tconst toMerge = customClassList\n\t\t? [...classList, ...customClassList]\n\t\t: [...classList];\n\n\treturn toMerge.join(' ').trim();\n};\n","export enum StickyButtonsEvents {\n\tGO_TO_PLAYER = 'gotoplayer',\n\tCLOSE = 'close'\n}\n","export enum Visibility {\n\tVISIBLE = 'visible',\n\tHIDDEN = 'hidden'\n}\n","export class StickyBaseElement {\n\tel: HTMLElement;\n\n\tconstructor(el: HTMLElement, className?: string) {\n\t\tthis.el = el;\n\t\tthis.el.className = className ?? '';\n\t}\n\n\thide() {\n\t\tthis.el.hidden = true;\n\t}\n\n\tshow() {\n\t\tthis.el.hidden = false;\n\t}\n}\n","import { el, mount } from 'redom';\nimport { getClassname } from 'src/plugins/sticky/utils/get-classname.util';\nimport { StickyBaseElement } from '../../base-element';\nimport { StickyPlaceholderOptions } from './placeholder.interface';\n\nconst DEFAULT_CLASSNAME = ['video-player-sticky-bg'];\n\nexport class StickyPlaceholder extends StickyBaseElement {\n\tel: HTMLDivElement;\n\n\tconstructor(settings: StickyPlaceholderOptions = {}) {\n\t\tconst { customClass } = settings;\n\n\t\tsuper(el('div'), getClassname(DEFAULT_CLASSNAME, customClass));\n\t}\n\n\tmount = (node: ParentNode) => mount(node, this);\n}\n","import { Observable } from '../Observable';\nimport { isArray } from '../util/isArray';\nimport { isFunction } from '../util/isFunction';\nimport { Subscriber } from '../Subscriber';\nimport { map } from '../operators/map';\n\nconst toString: Function = (() => Object.prototype.toString)();\n\nexport interface NodeStyleEventEmitter {\n addListener: (eventName: string | symbol, handler: NodeEventHandler) => this;\n removeListener: (eventName: string | symbol, handler: NodeEventHandler) => this;\n}\n\nexport type NodeEventHandler = (...args: any[]) => void;\n\n// For APIs that implement `addListener` and `removeListener` methods that may\n// not use the same arguments or return EventEmitter values\n// such as React Native\nexport interface NodeCompatibleEventEmitter {\n addListener: (eventName: string, handler: NodeEventHandler) => void | {};\n removeListener: (eventName: string, handler: NodeEventHandler) => void | {};\n}\n\nexport interface JQueryStyleEventEmitter {\n on: (eventName: string, handler: Function) => void;\n off: (eventName: string, handler: Function) => void;\n}\n\nexport interface HasEventTargetAddRemove {\n addEventListener(type: string, listener: ((evt: E) => void) | null, options?: boolean | AddEventListenerOptions): void;\n removeEventListener(type: string, listener?: ((evt: E) => void) | null, options?: EventListenerOptions | boolean): void;\n}\n\nexport type EventTargetLike = HasEventTargetAddRemove | NodeStyleEventEmitter | NodeCompatibleEventEmitter | JQueryStyleEventEmitter;\n\nexport type FromEventTarget = EventTargetLike | ArrayLike>;\n\nexport interface EventListenerOptions {\n capture?: boolean;\n passive?: boolean;\n once?: boolean;\n}\n\nexport interface AddEventListenerOptions extends EventListenerOptions {\n once?: boolean;\n passive?: boolean;\n}\n\n/* tslint:disable:max-line-length */\nexport function fromEvent(target: FromEventTarget, eventName: string): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function fromEvent(target: FromEventTarget, eventName: string, resultSelector: (...args: any[]) => T): Observable;\nexport function fromEvent(target: FromEventTarget, eventName: string, options: EventListenerOptions): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function fromEvent(target: FromEventTarget, eventName: string, options: EventListenerOptions, resultSelector: (...args: any[]) => T): Observable;\n/* tslint:enable:max-line-length */\n\n/**\n * Creates an Observable that emits events of a specific type coming from the\n * given event target.\n *\n * Creates an Observable from DOM events, or Node.js\n * EventEmitter events or others.\n *\n * ![](fromEvent.png)\n *\n * `fromEvent` accepts as a first argument event target, which is an object with methods\n * for registering event handler functions. As a second argument it takes string that indicates\n * type of event we want to listen for. `fromEvent` supports selected types of event targets,\n * which are described in detail below. If your event target does not match any of the ones listed,\n * you should use {@link fromEventPattern}, which can be used on arbitrary APIs.\n * When it comes to APIs supported by `fromEvent`, their methods for adding and removing event\n * handler functions have different names, but they all accept a string describing event type\n * and function itself, which will be called whenever said event happens.\n *\n * Every time resulting Observable is subscribed, event handler function will be registered\n * to event target on given event type. When that event fires, value\n * passed as a first argument to registered function will be emitted by output Observable.\n * When Observable is unsubscribed, function will be unregistered from event target.\n *\n * Note that if event target calls registered function with more than one argument, second\n * and following arguments will not appear in resulting stream. In order to get access to them,\n * you can pass to `fromEvent` optional project function, which will be called with all arguments\n * passed to event handler. Output Observable will then emit value returned by project function,\n * instead of the usual value.\n *\n * Remember that event targets listed below are checked via duck typing. It means that\n * no matter what kind of object you have and no matter what environment you work in,\n * you can safely use `fromEvent` on that object if it exposes described methods (provided\n * of course they behave as was described above). So for example if Node.js library exposes\n * event target which has the same method names as DOM EventTarget, `fromEvent` is still\n * a good choice.\n *\n * If the API you use is more callback then event handler oriented (subscribed\n * callback function fires only once and thus there is no need to manually\n * unregister it), you should use {@link bindCallback} or {@link bindNodeCallback}\n * instead.\n *\n * `fromEvent` supports following types of event targets:\n *\n * **DOM EventTarget**\n *\n * This is an object with `addEventListener` and `removeEventListener` methods.\n *\n * In the browser, `addEventListener` accepts - apart from event type string and event\n * handler function arguments - optional third parameter, which is either an object or boolean,\n * both used for additional configuration how and when passed function will be called. When\n * `fromEvent` is used with event target of that type, you can provide this values\n * as third parameter as well.\n *\n * **Node.js EventEmitter**\n *\n * An object with `addListener` and `removeListener` methods.\n *\n * **JQuery-style event target**\n *\n * An object with `on` and `off` methods\n *\n * **DOM NodeList**\n *\n * List of DOM Nodes, returned for example by `document.querySelectorAll` or `Node.childNodes`.\n *\n * Although this collection is not event target in itself, `fromEvent` will iterate over all Nodes\n * it contains and install event handler function in every of them. When returned Observable\n * is unsubscribed, function will be removed from all Nodes.\n *\n * **DOM HtmlCollection**\n *\n * Just as in case of NodeList it is a collection of DOM nodes. Here as well event handler function is\n * installed and removed in each of elements.\n *\n *\n * ## Examples\n * ### Emits clicks happening on the DOM document\n * ```ts\n * import { fromEvent } from 'rxjs';\n *\n * const clicks = fromEvent(document, 'click');\n * clicks.subscribe(x => console.log(x));\n *\n * // Results in:\n * // MouseEvent object logged to console every time a click\n * // occurs on the document.\n * ```\n *\n * ### Use addEventListener with capture option\n * ```ts\n * import { fromEvent } from 'rxjs';\n *\n * const clicksInDocument = fromEvent(document, 'click', true); // note optional configuration parameter\n * // which will be passed to addEventListener\n * const clicksInDiv = fromEvent(someDivInDocument, 'click');\n *\n * clicksInDocument.subscribe(() => console.log('document'));\n * clicksInDiv.subscribe(() => console.log('div'));\n *\n * // By default events bubble UP in DOM tree, so normally\n * // when we would click on div in document\n * // \"div\" would be logged first and then \"document\".\n * // Since we specified optional `capture` option, document\n * // will catch event when it goes DOWN DOM tree, so console\n * // will log \"document\" and then \"div\".\n * ```\n *\n * @see {@link bindCallback}\n * @see {@link bindNodeCallback}\n * @see {@link fromEventPattern}\n *\n * @param {FromEventTarget} target The DOM EventTarget, Node.js\n * EventEmitter, JQuery-like event target, NodeList or HTMLCollection to attach the event handler to.\n * @param {string} eventName The event name of interest, being emitted by the\n * `target`.\n * @param {EventListenerOptions} [options] Options to pass through to addEventListener\n * @return {Observable}\n * @name fromEvent\n */\nexport function fromEvent(\n target: FromEventTarget,\n eventName: string,\n options?: EventListenerOptions | ((...args: any[]) => T),\n resultSelector?: ((...args: any[]) => T)\n): Observable {\n\n if (isFunction(options)) {\n // DEPRECATED PATH\n resultSelector = options;\n options = undefined;\n }\n if (resultSelector) {\n // DEPRECATED PATH\n return fromEvent(target, eventName, options).pipe(\n map(args => isArray(args) ? resultSelector(...args) : resultSelector(args))\n );\n }\n\n return new Observable(subscriber => {\n function handler(e: T) {\n if (arguments.length > 1) {\n subscriber.next(Array.prototype.slice.call(arguments));\n } else {\n subscriber.next(e);\n }\n }\n setupSubscription(target, eventName, handler, subscriber, options as EventListenerOptions);\n });\n}\n\nfunction setupSubscription(sourceObj: FromEventTarget, eventName: string,\n handler: (...args: any[]) => void, subscriber: Subscriber,\n options?: EventListenerOptions) {\n let unsubscribe: () => void;\n if (isEventTarget(sourceObj)) {\n const source = sourceObj;\n sourceObj.addEventListener(eventName, handler, options);\n unsubscribe = () => source.removeEventListener(eventName, handler, options);\n } else if (isJQueryStyleEventEmitter(sourceObj)) {\n const source = sourceObj;\n sourceObj.on(eventName, handler);\n unsubscribe = () => source.off(eventName, handler);\n } else if (isNodeStyleEventEmitter(sourceObj)) {\n const source = sourceObj;\n sourceObj.addListener(eventName, handler as NodeEventHandler);\n unsubscribe = () => source.removeListener(eventName, handler as NodeEventHandler);\n } else if (sourceObj && (sourceObj as any).length) {\n for (let i = 0, len = (sourceObj as any).length; i < len; i++) {\n setupSubscription(sourceObj[i], eventName, handler, subscriber, options);\n }\n } else {\n throw new TypeError('Invalid event target');\n }\n\n subscriber.add(unsubscribe);\n}\n\nfunction isNodeStyleEventEmitter(sourceObj: any): sourceObj is NodeStyleEventEmitter {\n return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';\n}\n\nfunction isJQueryStyleEventEmitter(sourceObj: any): sourceObj is JQueryStyleEventEmitter {\n return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';\n}\n\nfunction isEventTarget(sourceObj: any): sourceObj is HasEventTargetAddRemove {\n return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';\n}\n","import { el } from 'redom';\n\nexport const getChildren = (icon?: string, text?: string): HTMLElement[] => {\n\tconst children: HTMLElement[] = [];\n\tif (icon) {\n\t\tconst iconEl = el('i');\n\t\ticonEl.className = `icon ${icon}`;\n\t\tchildren.push(iconEl);\n\t}\n\n\tif (text) {\n\t\tconst textEl = el('span');\n\t\ttextEl.className = 'button-label';\n\t\tchildren.push(textEl);\n\t}\n\n\treturn children;\n};\n","import { el, setChildren } from 'redom';\nimport { fromEvent, Observable } from 'rxjs';\n\nimport { StickyButtonOptions } from './button.interface';\nimport { getChildren } from './buttons.util';\nimport { getClassname } from '../../../utils/get-classname.util';\nimport { StickyBaseElement } from '../../base-element';\nimport { ReactiveClickableElement } from '../../../interfaces/reactive-clickable-element.interface';\n\nconst DEFAULT_CLASSLIST = ['video-player-sticky-custom-btn'];\n\nexport class StickyButton\n\textends StickyBaseElement\n\timplements ReactiveClickableElement\n{\n\tel: HTMLButtonElement;\n\tclicked$: Observable;\n\n\tconstructor(settings: StickyButtonOptions) {\n\t\tconst { icon, text, customClass } = settings;\n\n\t\tsuper(el('button'), getClassname(DEFAULT_CLASSLIST, customClass));\n\t\tsetChildren(this.el, getChildren(icon, text));\n\t\tthis.clicked$ = fromEvent(this.el, 'click');\n\t}\n}\n","import { setChildren, el } from 'redom';\nimport { merge, Observable, Subject } from 'rxjs';\nimport { mapTo } from 'rxjs/operators';\nimport { StickyButtonsEvents } from 'src/plugins/sticky/enums/buttons-events.enum';\nimport { Visibility } from 'src/plugins/sticky/enums/visibility.enum';\nimport { StickyButtonVisibilityEvent } from 'src/plugins/sticky/interfaces/sticky-button-visibility-event.interface';\nimport { getClassname } from 'src/plugins/sticky/utils/get-classname.util';\nimport { StickyBaseElement } from '../../base-element';\nimport { StickyButton } from '../../global/buttons/button.component';\nimport { StickyButtonsBarOptions } from './buttons-bar.interface';\n\nexport class StickyButtonsBar extends StickyBaseElement {\n\tgoBackButton: StickyButton;\n\tcloseButton: StickyButton;\n\tevents$: Observable;\n\n\tswitchVisibility$ = new Subject();\n\n\tconstructor(settings: StickyButtonsBarOptions) {\n\t\tconst { customClass } = settings;\n\t\tsuper(el('buttons-bar'), getClassname(['sticky-buttons-bar'], customClass));\n\n\t\tthis.goBackButton = new StickyButton({\n\t\t\ticon: 'icon-arrow-up',\n\t\t\tcustomClass: ['af-btn-v2', 'af-btn-v2-center', 'gotoplayer']\n\t\t});\n\t\tthis.closeButton = new StickyButton({\n\t\t\tcustomClass: 'close'\n\t\t});\n\n\t\tthis.events$ = merge(\n\t\t\tthis.goBackButton.clicked$.pipe(mapTo(StickyButtonsEvents.GO_TO_PLAYER)),\n\t\t\tthis.closeButton.clicked$.pipe(mapTo(StickyButtonsEvents.CLOSE))\n\t\t);\n\n\t\tthis.switchVisibility$.subscribe((event: StickyButtonVisibilityEvent) => {\n\t\t\tconst doSwitchVisibilty = (target: StickyButton, state: Visibility) => {\n\t\t\t\tif (state === Visibility.HIDDEN) {\n\t\t\t\t\ttarget.el.classList.add('hidden');\n\t\t\t\t} else if (state === Visibility.VISIBLE) {\n\t\t\t\t\ttarget.el.classList.remove('hidden');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch (event.btn) {\n\t\t\t\tcase StickyButtonsEvents.CLOSE: {\n\t\t\t\t\tdoSwitchVisibilty(this.closeButton, event.state);\n\t\t\t\t} break;\n\n\t\t\t\tcase StickyButtonsEvents.GO_TO_PLAYER: {\n\t\t\t\t\tdoSwitchVisibilty(this.goBackButton, event.state);\n\t\t\t\t} break;\n\n\t\t\t\tdefault: {\n\t\t\t\t\tconsole.error('This button visibility switch is not yet implemented');\n\t\t\t\t} break;\n\t\t\t}\n\t\t});\n\n\t\tsetChildren(this.el, [this.goBackButton, this.closeButton]);\n\t}\n}\n","import { Observable } from '../Observable';\nimport { ObservableInput, SchedulerLike} from '../types';\nimport { isScheduler } from '../util/isScheduler';\nimport { mergeAll } from '../operators/mergeAll';\nimport { fromArray } from './fromArray';\n\n/* tslint:disable:max-line-length */\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, concurrent: number, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, concurrent: number, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, concurrent: number, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, concurrent: number, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, concurrent: number, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput, concurrent: number, scheduler: SchedulerLike): Observable;\n\nexport function merge(v1: ObservableInput): Observable;\nexport function merge(v1: ObservableInput, concurrent?: number): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, concurrent?: number): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, concurrent?: number): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, concurrent?: number): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, concurrent?: number): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput, concurrent?: number): Observable;\nexport function merge(...observables: (ObservableInput | number)[]): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(...observables: (ObservableInput | SchedulerLike | number)[]): Observable;\nexport function merge(...observables: (ObservableInput | number)[]): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(...observables: (ObservableInput | SchedulerLike | number)[]): Observable;\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which concurrently emits all values from every\n * given input Observable.\n *\n * Flattens multiple Observables together by blending\n * their values into one Observable.\n *\n * ![](merge.png)\n *\n * `merge` subscribes to each given input Observable (as arguments), and simply\n * forwards (without doing any transformation) all the values from all the input\n * Observables to the output Observable. The output Observable only completes\n * once all input Observables have completed. Any error delivered by an input\n * Observable will be immediately emitted on the output Observable.\n *\n * ## Examples\n * ### Merge together two Observables: 1s interval and clicks\n * ```ts\n * import { merge, fromEvent, interval } from 'rxjs';\n *\n * const clicks = fromEvent(document, 'click');\n * const timer = interval(1000);\n * const clicksOrTimer = merge(clicks, timer);\n * clicksOrTimer.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // timer will emit ascending values, one every second(1000ms) to console\n * // clicks logs MouseEvents to console everytime the \"document\" is clicked\n * // Since the two streams are merged you see these happening\n * // as they occur.\n * ```\n *\n * ### Merge together 3 Observables, but only 2 run concurrently\n * ```ts\n * import { merge, interval } from 'rxjs';\n * import { take } from 'rxjs/operators';\n *\n * const timer1 = interval(1000).pipe(take(10));\n * const timer2 = interval(2000).pipe(take(6));\n * const timer3 = interval(500).pipe(take(10));\n * const concurrent = 2; // the argument\n * const merged = merge(timer1, timer2, timer3, concurrent);\n * merged.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // - First timer1 and timer2 will run concurrently\n * // - timer1 will emit a value every 1000ms for 10 iterations\n * // - timer2 will emit a value every 2000ms for 6 iterations\n * // - after timer1 hits its max iteration, timer2 will\n * // continue, and timer3 will start to run concurrently with timer2\n * // - when timer2 hits its max iteration it terminates, and\n * // timer3 will continue to emit a value every 500ms until it is complete\n * ```\n *\n * @see {@link mergeAll}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n *\n * @param {...ObservableInput} observables Input Observables to merge together.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {SchedulerLike} [scheduler=null] The {@link SchedulerLike} to use for managing\n * concurrency of input Observables.\n * @return {Observable} an Observable that emits items that are the result of\n * every input Observable.\n * @static true\n * @name merge\n * @owner Observable\n */\nexport function merge(...observables: Array | SchedulerLike | number>): Observable {\n let concurrent = Number.POSITIVE_INFINITY;\n let scheduler: SchedulerLike = null;\n let last: any = observables[observables.length - 1];\n if (isScheduler(last)) {\n scheduler = observables.pop();\n if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {\n concurrent = observables.pop();\n }\n } else if (typeof last === 'number') {\n concurrent = observables.pop();\n }\n\n if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable) {\n return >observables[0];\n }\n\n return mergeAll(concurrent)(fromArray(observables, scheduler));\n}\n","import { el } from 'redom';\nimport { Observable, Subject, BehaviorSubject } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { VideoConsoleLogger } from 'src/utils/video-logger';\nimport { Visibility } from '../../enums/visibility.enum';\nimport { StickyLayoutEvents } from '../../types/sticky-events.type';\n\nimport { getClassname } from '../../utils/get-classname.util';\nimport { mergeFunctions } from '../../utils/merge-functions.util';\nimport { StickyBaseElement } from '../base-element';\nimport { StickyLayoutOptions } from './base-layout.interface';\n\nconst DEFAULT_CLASSLIST = ['video-player-sticky-container'];\nconst logger = new VideoConsoleLogger();\n\nexport class StickyBaseLayout extends StickyBaseElement {\n\tel: HTMLDivElement;\n\tplayerWrapper: HTMLElement;\n\tparentNode: ParentNode;\n\tplayerElement: HTMLElement;\n\ttoggleableElements: StickyBaseElement[] = [];\n\n\tsticked$ = new Subject();\n\tstickedClasses: string[];\n\n\tcloseBtnVisibility$: BehaviorSubject;\n\n\tevents$: Observable;\n\n\tconstructor(settings: StickyLayoutOptions) {\n\t\tconst { customClass, playerContainerId, playerId, stickedClasses } =\n\t\t\tsettings;\n\t\tsuper(el('div'), getClassname(DEFAULT_CLASSLIST, customClass));\n\n\t\tthis.stickedClasses = stickedClasses;\n\n\t\ttry {\n\t\t\tthis.playerWrapper = this._getPlayerWrapper(playerContainerId);\n\t\t\tthis.parentNode = this._getParentNode(this.playerWrapper);\n\t\t\tthis.playerElement = this._getPlayer(playerId);\n\t\t} catch (error) {\n\t\t\tlogger.error(error)();\n\t\t\tthrow new Error(error);\n\t\t}\n\n\t\tthis.sticked$\n\t\t\t.pipe(distinctUntilChanged())\n\t\t\t.subscribe(mergeFunctions(this.toggleElements, this.toggleStickedClass));\n\n\t\tconst defaultCloseBtnVisibility = settings.closeBtnSwitchFeatureEnabled ? Visibility.HIDDEN : Visibility.VISIBLE;\n\t\tthis.closeBtnVisibility$ = new BehaviorSubject(defaultCloseBtnVisibility);\n\t}\n\n\tprotected toggleElements = (sticked: boolean) =>\n\t\tthis.toggleableElements.forEach((el) => (sticked ? el.show() : el.hide()));\n\tprotected toggleStickedClass = (sticked: boolean) =>\n\t\tthis.playerWrapper.classList[sticked ? 'add' : 'remove'].apply(\n\t\t\tthis.playerWrapper.classList,\n\t\t\tthis.stickedClasses\n\t\t);\n\n\tprivate _getPlayer = (playerId: string) => {\n\t\tconst playerContainer = document.getElementById(playerId);\n\n\t\tif (!playerContainer) {\n\t\t\tthrow new Error(`Cannot find player with id \"${playerId}\"`);\n\t\t}\n\n\t\treturn playerContainer;\n\t};\n\n\tprivate _getPlayerWrapper = (playerContainerId: string) => {\n\t\tconst playerContainer = document.getElementById(playerContainerId);\n\n\t\tif (!playerContainer) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot find player container with id \"${playerContainerId}\"`\n\t\t\t);\n\t\t}\n\n\t\treturn playerContainer;\n\t};\n\n\tprivate _getParentNode = (playerContainer: HTMLElement) => {\n\t\tconst parentNode = playerContainer?.parentNode;\n\n\t\tif (!parentNode) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot find parent node of player with id \"${playerContainer.id}\"`\n\t\t\t);\n\t\t}\n\n\t\treturn parentNode;\n\t};\n}\n","import { distinctUntilChanged } from 'rxjs/operators';\nimport {\n\tPublishableVideoAdEvents,\n\tPublishableVideoContentEvents,\n\tPublishableVideoPlayerEvents,\n\tPublishableVideoStickyEvents,\n\tPublishableVideoStoreEvents\n} from 'src/enums/publishable-events.enum';\nimport { StickyFormats } from 'src/enums/sticky-formats.enum';\nimport { ListenerAction } from 'src/interfaces/listener-action';\nimport {\n\tBannerStickyOptions,\n\tFlyingStickyOptions\n} from 'src/interfaces/sticky-formats-options.interface';\nimport { PlayerInstance } from 'src/types/player-instance.type';\nimport { StickyFormatOptions } from 'src/types/stickyFormatOptions.type';\nimport { Store, StoreInstance } from '../../store';\nimport { FlyingStickyLayout } from './components/layouts/flying/flying.layout.component';\nimport { StickyButtonsEvents } from './enums/buttons-events.enum';\nimport { StickyLayoutEvents } from './types/sticky-events.type';\nimport { VideoConsoleLogger } from 'src/utils/video-logger';\nimport { BannerStickyLayout } from './components/layouts/banner/banner-layout.component';\nimport { formatSecondsToMinutes } from 'src/utils/time-utils.service';\nimport { fromEvent } from 'rxjs';\nimport {\n\tisStickySessionDisabled,\n\tsetDisabledStickyForSessionState\n} from './utils/session-storage.util';\nimport { getElementPosition, getWindowPosition } from './utils/dom.util';\nimport { applyCssTranslate } from './utils/translate.util';\nimport PubSub from 'pubsub-js';\nimport { Visibility } from './enums/visibility.enum';\n\nconst l = new VideoConsoleLogger();\nexport interface StickyPluginOptions {\n\tstore: Store;\n}\n\nenum VP_TOP {\n\tIS_BELOW_CONTAINER_TOP = 'vp-top-below-top',\n\tIS_BELOW_CONTAINER_MIDDLE = 'vp-top-below-middle'\n}\n\nenum VP_BOTTOM {\n\tIS_ABOVE_CONTAINER_BOTTOM = 'vp-bottom-above-bottom',\n\tIS_ABOVE_CONTAINER_MIDDLE = 'vp-bottom-above-middle',\n\tIS_BELOW_CONTAINER_MIDDLE = 'vp-bottom-below-middle'\n}\n\nenum CONTAINER_POSITION {\n\tIS_PARTIALLY_WITHIN_VP = 'partially-within-vp',\n\tIS_WITHIN_VP = 'within-vp'\n}\n\nenum DEFAULT_SETTINGS {\n\tONCOMPLETE_TIMEOUT = 11000,\n\tSCROLL_OFFSET = 200\n}\n\ntype StickyLayout = FlyingStickyLayout | BannerStickyLayout;\n\nexport class StickyPlugin {\n\tpublic name: 'sticky';\n\tpublic scrollEvent: (...args: []) => any =\n\t\tthis.stickMainViewablePlayer.bind(this);\n\n\tprivate _layout: StickyLayout;\n\tprivate _id: string;\n\tprivate _player: PlayerInstance;\n\tprivate _instance: StoreInstance;\n\n\tprivate _stickyFormat: StickyFormats;\n\tprivate _stickyFormatOptions: StickyFormatOptions;\n\tprivate _stickTo: string;\n\tprivate _disabledForPage = false;\n\n\tprivate _container: HTMLElement | Element;\n\tprivate _stickyRect: DOMRect | null;\n\n\tpublic enabled = false;\n\tprivate _closedByUser = false;\n\tprivate _onCompleteTimeout: ReturnType | null;\n\tprivate _isSticked = false;\n\tprivate _stickyReady = false;\n\tprivate _disabledByElementOnScreen = false;\n\tprivate _scrollUp: boolean;\n\n\t// Handle collisions of sticky player over floating elements (popup, ads)\n\tprivate _xPos: number | string = 0;\n\tprivate _yPos: number | string = 0;\n\tprivate _xPosExtra = 0;\n\tprivate _yPosExtra = 0;\n\n\tprivate _waitForAdLoaded = false;\n\tprivate _adLoaded = false;\n\tprivate _stickBothSide = false;\n\n\tprivate _store: Store;\n\n\tprivate screenOrientationChanged$ = fromEvent(screen.orientation, 'change');\n\n\tprivate _listenersActions: ListenerAction[] = [\n\t\t{\n\t\t\t// Once an instance is added to the store, register it\n\t\t\tmessage: PublishableVideoStoreEvents.ADD_INSTANCE,\n\t\t\tactionFn: (msg, instanceData) => {\n\t\t\t\tconst instance = instanceData.instance;\n\n\t\t\t\tif (instance.id !== this._id) {\n\t\t\t\t\tl.debug('Message is not for this sticky plugin, skipping ...')();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Do not register instance if sticky not enabled or an instance is already initialized\n\t\t\t\tif (!instance.sticky.stickTo || this._instance) {\n\t\t\t\t\tif (!instance.sticky.stickTo) {\n\t\t\t\t\t\tthis.enabled = false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis._registerInstance(instance);\n\t\t\t\tthis._initLayout(this._stickyFormat, this._stickyFormatOptions);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t// Once a player is ready, init plugin\n\t\t\tmessage: PublishableVideoStickyEvents.STICKY_READY,\n\t\t\tactionFn: (msg, readyData: { id: string }) => {\n\t\t\t\tthis._onPlayerReady.call(this, readyData.id);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_LOADED,\n\t\t\tactionFn: () => {\n\t\t\t\tif (!this._waitForAdLoaded) return;\n\n\t\t\t\tthis._adLoaded = true;\n\t\t\t\tthis._onPlayerReady.call(this, this._id);\n\t\t\t\tthis.stickMainViewablePlayer.call(this);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoAdEvents.AD_START,\n\t\t\tactionFn: () => {\n\t\t\t\t// Hide close button if layout is compatible and needed\n\t\t\t\tif (!this._stickyFormatOptions.closeBtnSwitchFeatureEnabled) return;\n\t\t\t\tthis._layout.closeBtnVisibility$.next(Visibility.HIDDEN);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoContentEvents.VIDEO_START,\n\t\t\tactionFn: () => {\n\t\t\t\t// Hide close button if layout is compatible and needed\n\t\t\t\tif (!this._stickyFormatOptions.closeBtnSwitchFeatureEnabled) return;\n\t\t\t\tthis._layout.closeBtnVisibility$.next(Visibility.VISIBLE);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoStickyEvents.STICKY_CONTENT_START,\n\t\t\tactionFn: () => {\n\t\t\t\tif (\n\t\t\t\t\t!this._stickyReady &&\n\t\t\t\t\t(!this._waitForAdLoaded || (this._waitForAdLoaded && !this._adLoaded))\n\t\t\t\t) {\n\t\t\t\t\tthis._adLoaded = true;\n\t\t\t\t\tthis._onPlayerReady(this._id, true);\n\t\t\t\t\tthis.stickMainViewablePlayer();\n\t\t\t\t}\n\n\t\t\t\tif (!this._stickyReady || this._closedByUser) return;\n\n\t\t\t\t// If sticky already ready, re-enable sticky if not blocked permanently\n\t\t\t\t// to permit to relaunch the video player and get the sticky feature again\n\t\t\t\tthis.enabled = !isStickySessionDisabled() && !this._disabledForPage;\n\t\t\t\tthis._cancelDisablingTimeout();\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoContentEvents.VIDEO_END,\n\t\t\tactionFn: () => {\n\t\t\t\tconst _disableWithDelay = (timeout: number) => {\n\t\t\t\t\t// Set only one \"unstick\" timer (lock for concurrent calls)\n\t\t\t\t\tif (this._onCompleteTimeout) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._onCompleteTimeout = setTimeout(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\ttypeof this._player.playlist === 'undefined'\n\t\t\t\t\t\t\t\t? this._disable(false, false, 'disableWithDelay')\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\ttimeout\n\t\t\t\t\t);\n\t\t\t\t};\n\n\t\t\t\t_disableWithDelay(DEFAULT_SETTINGS.ONCOMPLETE_TIMEOUT);\n\t\t\t\t// Unstick player after a few seconds when video is finished\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoPlayerEvents.SEEKING,\n\t\t\tactionFn: this._cancelDisablingTimeout\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoPlayerEvents.PAUSE,\n\t\t\tactionFn: this._cancelDisablingTimeout\n\t\t},\n\t\t{\n\t\t\tmessage: 'mrtn-selection-box:open',\n\t\t\tactionFn: () => {\n\t\t\t\tconst that = this;\n\t\t\t\tif (!this._stickyReady) return;\n\n\t\t\t\tonPopupShow(0, 110); // TODO: retrieve value from mrtnSelectionBox, with data.height\n\n\t\t\t\tfunction onPopupShow(xPos, yPos) {\n\t\t\t\t\tif (!that._isSticked) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthat._xPosExtra = xPos;\n\t\t\t\t\tthat._yPosExtra = yPos;\n\t\t\t\t\tthat._moveStickyToCollisionPosition.call(this);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: 'mrtn-selection-box:close',\n\t\t\tactionFn: () => {\n\t\t\t\tif (!this._stickyReady) return;\n\t\t\t\tthis._resetStickyPosition.call(this);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoPlayerEvents.CRITICAL_PATH_READY,\n\t\t\tactionFn: () => this.stickMainViewablePlayer()\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoStickyEvents.STICK,\n\t\t\tactionFn: () => this.stick()\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoStickyEvents.UNSTICK,\n\t\t\tactionFn: () => this.unstick()\n\t\t}\n\t];\n\n\tconstructor(options: StickyPluginOptions) {\n\t\tthis._init();\n\t\tthis._store = options.store;\n\t}\n\n\t/**\n\t * Stick the player\n\t */\n\tpublic stick() {\n\t\t// Do nothing if player is already sticked\n\t\tif (!this._player || this._isSticked) return;\n\n\t\t// Stick container and check for collisions with other HTML elements of the page behavior displaying it\n\t\tthis._player.isSticked = this._isSticked = true;\n\t\tthis._layout.sticked$.next(true);\n\t\tthis._moveStickyToCollisionPosition();\n\t\tthis._updatePlayerBoundingRect();\n\t\tthis._player.publish(PublishableVideoStickyEvents.STICKED);\n\t}\n\n\t/**\n\t * Unstick the player\n\t */\n\tpublic unstick() {\n\t\t// Do nothing if player is already unsticked\n\t\tif (!this._player || !this._isSticked) return;\n\n\t\t// Unstick container and reset collisions\n\t\tthis._player.isSticked = this._isSticked = false;\n\t\tthis._layout.sticked$.next(false);\n\t\tthis._resetStickyPosition();\n\n\t\tthis._player.publish(PublishableVideoStickyEvents.UNSTICKED);\n\t}\n\n\t/**\n\t * Event that stick / unstick player on scroll\n\t */\n\tpublic stickMainViewablePlayer() {\n\t\tconst that = this;\n\n\t\tif (!this._layout) return;\n\n\t\tconst stickUnstickHandler = (shouldDisable: boolean) => {\n\t\t\t// Do nothing if sticky is disabled\n\t\t\tif (!this.enabled && !that._disabledByElementOnScreen) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (shouldDisable) {\n\t\t\t\tthis._disable(false, false, 'handler');\n\t\t\t\tthis._disabledByElementOnScreen = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet action;\n\n\t\t\tif (this._stickBothSide) {\n\t\t\t\tconst topBelowMiddle = isViewportPositionned(\n\t\t\t\t\tVP_TOP.IS_BELOW_CONTAINER_MIDDLE\n\t\t\t\t);\n\t\t\t\tconst bottomAboveMiddle = isViewportPositionned(\n\t\t\t\t\tVP_BOTTOM.IS_ABOVE_CONTAINER_MIDDLE\n\t\t\t\t);\n\t\t\t\taction = topBelowMiddle || bottomAboveMiddle ? 'stick' : 'unstick';\n\t\t\t} else if (!this._scrollUp) {\n\t\t\t\t// Scroll down (default behavior): stick when viewport is below the original container\n\t\t\t\taction = isViewportPositionned(VP_TOP.IS_BELOW_CONTAINER_MIDDLE)\n\t\t\t\t\t? 'stick'\n\t\t\t\t\t: 'unstick';\n\t\t\t} else {\n\t\t\t\t// Scroll up (specific case): stick when viewport is above the original container\n\t\t\t\t// ⚠️ Original player container must have be seen at least once before firing any \"scroll-up\" sticky\n\t\t\t\tif (!this._isSticked) {\n\t\t\t\t\taction =\n\t\t\t\t\t\tisViewportPositionned(CONTAINER_POSITION.IS_PARTIALLY_WITHIN_VP) &&\n\t\t\t\t\t\tisViewportPositionned(VP_BOTTOM.IS_ABOVE_CONTAINER_MIDDLE)\n\t\t\t\t\t\t\t? 'stick'\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t} else {\n\t\t\t\t\taction = isViewportPositionned(VP_BOTTOM.IS_BELOW_CONTAINER_MIDDLE)\n\t\t\t\t\t\t? 'unstick'\n\t\t\t\t\t\t: undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!action) return;\n\t\t\tl.debug(`Sticky will ${action}`);\n\t\t\tconst actionFn = this[action].bind(this);\n\n\t\t\tif (this._waitForAdLoaded && !this._adLoaded) {\n\t\t\t\tif (action === 'stick' && !this._store.isViewable(this._instance)) {\n\t\t\t\t\tthis._instance.player.play();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttypeof actionFn === 'function' && actionFn();\n\n\t\t\tif (action === 'stick' && this._disabledByElementOnScreen) {\n\t\t\t\tthis.enabled = true;\n\t\t\t\tthis._instance.player.play();\n\t\t\t\tthis._disabledByElementOnScreen = !this._disabledByElementOnScreen;\n\t\t\t}\n\n\t\t\tfunction isViewportPositionned(condition) {\n\t\t\t\tlet res;\n\t\t\t\tconst containerSize = getElementPosition(that._layout.el);\n\t\t\t\tconst windowSize = getWindowPosition();\n\n\t\t\t\tswitch (condition) {\n\t\t\t\t\tcase VP_TOP.IS_BELOW_CONTAINER_TOP:\n\t\t\t\t\t\tres = windowSize.top >= containerSize.top;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase VP_TOP.IS_BELOW_CONTAINER_MIDDLE:\n\t\t\t\t\t\tres =\n\t\t\t\t\t\t\twindowSize.top >= containerSize.top + containerSize.height / 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase VP_BOTTOM.IS_ABOVE_CONTAINER_BOTTOM:\n\t\t\t\t\t\tres = windowSize.bottom <= containerSize.bottom;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase VP_BOTTOM.IS_ABOVE_CONTAINER_MIDDLE:\n\t\t\t\t\t\tres =\n\t\t\t\t\t\t\twindowSize.bottom <= containerSize.top + containerSize.height / 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase VP_BOTTOM.IS_BELOW_CONTAINER_MIDDLE:\n\t\t\t\t\t\tres =\n\t\t\t\t\t\t\twindowSize.bottom >= containerSize.top + containerSize.height / 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase CONTAINER_POSITION.IS_PARTIALLY_WITHIN_VP:\n\t\t\t\t\t\tres =\n\t\t\t\t\t\t\twindowSize.bottom >= containerSize.top &&\n\t\t\t\t\t\t\twindowSize.top <= containerSize.bottom;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase CONTAINER_POSITION.IS_WITHIN_VP:\n\t\t\t\t\t\tres =\n\t\t\t\t\t\t\twindowSize.top <= containerSize.top &&\n\t\t\t\t\t\t\twindowSize.bottom >= containerSize.bottom;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t'This position from viewport (' +\n\t\t\t\t\t\t\t\tcondition +\n\t\t\t\t\t\t\t\t') is not yet implemented'\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\treturn res;\n\t\t\t}\n\t\t};\n\n\t\tconst shouldDisable = stickyIsOnElement(\n\t\t\t'#taboola-below-article-thumbnails, #taboola-mobile-below-article-thumbnails',\n\t\t\tthis._stickyRect as DOMRect\n\t\t);\n\t\tstickUnstickHandler(shouldDisable);\n\n\t\tfunction stickyIsOnElement(selector: string, stickyRect: DOMRect) {\n\t\t\tlet targetEl: Element | null = null;\n\t\t\tlet targetRect: DOMRect | null = null;\n\n\t\t\tif (!selector) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[Sticky Player Plugin::_stickyIsOnElement] Missing mandatory `selector` parameter'\n\t\t\t\t);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\ttargetEl = document.querySelector(selector);\n\t\t\ttargetRect = targetEl\n\t\t\t\t? (targetEl as HTMLElement).getBoundingClientRect()\n\t\t\t\t: null;\n\n\t\t\treturn stickyIsOnTarget(targetRect, stickyRect);\n\n\t\t\t/**\n\t\t\t * Check if the sticky is inside the target\n\t\t\t * @param {DOMRect} targetRect The target DOMRect\n\t\t\t * @param {DOMRect} stickyRect The sticky DOMRect\n\t\t\t * @returns Wether the sticky is entered on target element. False if there is no sticky or no target\n\t\t\t */\n\t\t\tfunction stickyIsOnTarget(\n\t\t\t\ttargetRect: DOMRect | null,\n\t\t\t\tstickyRect: DOMRect | null\n\t\t\t) {\n\t\t\t\treturn !targetRect || !stickyRect\n\t\t\t\t\t? false\n\t\t\t\t\t: // TODO: Implement resize function and uncomment the following lines to be able to check horizontally\n\t\t\t\t\t // targetRect.left < stickyRect.right &&\n\t\t\t\t\t // targetRect.right > stickyRect.left &&\n\t\t\t\t\t targetRect.top <= stickyRect.bottom &&\n\t\t\t\t\t\t\ttargetRect.bottom >= stickyRect.top;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Initialize the feature\n\t */\n\tprivate _init() {\n\t\tthis.enabled = !isStickySessionDisabled();\n\t\tif (!this.enabled) return;\n\n\t\tthis._initListeners(this._listenersActions);\n\n\t\tthis.screenOrientationChanged$.subscribe(this._updatePlayerBoundingRect);\n\t}\n\n\tprivate _updatePlayerBoundingRect() {\n\t\tl.debug('Updating Layout Bounding Rect')();\n\t\tthis._stickyRect = this._layout.playerWrapper.getBoundingClientRect();\n\t}\n\n\tprivate _initListeners = (listenersActions: ListenerAction[]) =>\n\t\tlistenersActions.forEach((listenAction) =>\n\t\t\tPubSub.subscribe(listenAction.message, listenAction.actionFn.bind(this))\n\t\t);\n\n\tprivate _initLayout = (\n\t\tlayout: StickyFormats,\n\t\toptions: StickyFormatOptions\n\t) => {\n\t\t/**\n\t\t * Select and Spawn the layout\n\t\t */\n\t\tconst getLayout = (\n\t\t\tformat: StickyFormats,\n\t\t\toptions: StickyFormatOptions\n\t\t): StickyLayout => {\n\t\t\tlet layout: StickyLayout;\n\t\t\tconst closeBtnSwitchFeatureEnabled = typeof this._stickyFormatOptions\n\t\t\t\t.closeBtnSwitchFeatureEnabled\n\t\t\t\t? Boolean(this._stickyFormatOptions.closeBtnSwitchFeatureEnabled)\n\t\t\t\t: true;\n\t\t\tconst defaultSettings = {\n\t\t\t\tplayerId: this._instance.player.id,\n\t\t\t\tplayerContainerId: this._instance.player.id + '-container',\n\t\t\t\tcloseBtnSwitchFeatureEnabled\n\t\t\t};\n\t\t\tconst defaultStickyClass = 'sticky-player';\n\n\t\t\tswitch (format) {\n\t\t\t\tcase StickyFormats.BANNER:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst stickedClasses = [defaultStickyClass];\n\t\t\t\t\t\tconst formatOptions = options as BannerStickyOptions;\n\n\t\t\t\t\t\tlayout = new BannerStickyLayout({\n\t\t\t\t\t\t\t...defaultSettings,\n\t\t\t\t\t\t\tstickedClasses,\n\t\t\t\t\t\t\tdisplayVideosInfos: formatOptions.displayDetails,\n\t\t\t\t\t\t\tposition: formatOptions.position\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: {\n\t\t\t\t\tconst stickedClasses = [\n\t\t\t\t\t\tdefaultStickyClass,\n\t\t\t\t\t\t`sticky-${this._stickTo}`\n\t\t\t\t\t];\n\n\t\t\t\t\tconst formatOptions = options as FlyingStickyOptions;\n\n\t\t\t\t\tif (formatOptions && formatOptions.size === 'large') {\n\t\t\t\t\t\tstickedClasses.push('flying-sticky-large');\n\t\t\t\t\t}\n\n\t\t\t\t\tlayout = new FlyingStickyLayout({\n\t\t\t\t\t\t...defaultSettings,\n\t\t\t\t\t\tstickedClasses\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn layout;\n\t\t};\n\n\t\tconst handleLayoutEvents = (event: StickyLayoutEvents) => {\n\t\t\tconst handlers = {\n\t\t\t\t[StickyButtonsEvents.CLOSE]: this._disable.bind(\n\t\t\t\t\tthis,\n\t\t\t\t\tfalse,\n\t\t\t\t\ttrue,\n\t\t\t\t\t'user closing'\n\t\t\t\t),\n\t\t\t\t[StickyButtonsEvents.GO_TO_PLAYER]: this._scrollToPlayer,\n\t\t\t\tnotYetImplemented: () =>\n\t\t\t\t\tconsole.error(`This event is not yet implemented: ${event}`)\n\t\t\t};\n\n\t\t\tconst actionFn = handlers[event] || handlers.notYetImplemented;\n\t\t\tactionFn.apply(this);\n\t\t};\n\n\t\tthis._layout = getLayout(layout, options);\n\t\tthis._layout.events$.subscribe(handleLayoutEvents);\n\n\t\tconst shouldUpdateDetails =\n\t\t\tlayout === StickyFormats.BANNER &&\n\t\t\t(options as BannerStickyOptions).displayDetails;\n\n\t\tif (!shouldUpdateDetails) return;\n\n\t\t// Update video infos if needed\n\t\tconst subject$ = (this._layout as BannerStickyLayout)\n\t\t\t.stickyBannerVideosInfos$;\n\n\t\tthis._instance.player.videoInfos$\n\t\t\t.pipe(distinctUntilChanged())\n\t\t\t.subscribe((videoInfos) => {\n\t\t\t\tconst duration = videoInfos.durationSeconds\n\t\t\t\t\t? formatSecondsToMinutes(videoInfos.durationSeconds)\n\t\t\t\t\t: undefined;\n\n\t\t\t\tsubject$.next({\n\t\t\t\t\ttitle: videoInfos.title,\n\t\t\t\t\tduration\n\t\t\t\t});\n\t\t\t});\n\t};\n\n\tprivate _onPlayerReady(id: string, contentStarted?: boolean) {\n\t\tif (\n\t\t\t!this.enabled ||\n\t\t\tid !== this._id ||\n\t\t\t(!contentStarted && this._waitForAdLoaded && !this._adLoaded)\n\t\t) {\n\t\t\tif (this._waitForAdLoaded && !this._adLoaded) {\n\t\t\t\tif (this._scrollUp) return; // Do not force play if video cannot stick right now\n\n\t\t\t\t// Force play as the player could not be visible and we are waiting for ad loaded to activate sticky\n\t\t\t\tthis._instance.player.play();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis._player = this._instance.player;\n\n\t\tconst playerContainer = this._player.getContainer();\n\t\tif (!playerContainer) return;\n\n\t\tthis._container = playerContainer;\n\t\tthis._stickyReady = true;\n\t}\n\n\t/**\n\t * Register the first player instance and generate\n\t * @param {StoreInstance} storeInstance\n\t */\n\tprivate _registerInstance(storeInstance: StoreInstance) {\n\t\tconst getDefaultFormatOptions = (\n\t\t\tformat: StickyFormats\n\t\t): StickyFormatOptions => {\n\t\t\tlet res: any;\n\n\t\t\tswitch (format) {\n\t\t\t\tcase StickyFormats.FLYING:\n\t\t\t\t\t{\n\t\t\t\t\t\t(res as FlyingStickyOptions) = {\n\t\t\t\t\t\t\tsize: 'normal'\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase StickyFormats.BANNER:\n\t\t\t\t\t{\n\t\t\t\t\t\t(res as BannerStickyOptions) = {\n\t\t\t\t\t\t\tdisplayDetails: false,\n\t\t\t\t\t\t\tposition: 'bottom'\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t{\n\t\t\t\t\t\tthrow new Error(`Sticky format '${format}' is not yet implemented`);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tres.closeBtnSwitchFeatureEnabled = true;\n\t\t\treturn res;\n\t\t};\n\n\t\tconst player = storeInstance.player;\n\t\tconst stickyOptions = storeInstance.sticky;\n\n\t\tthis._instance = storeInstance;\n\t\tthis._id = player.id;\n\t\tthis._stickTo = stickyOptions.stickTo;\n\t\tthis._waitForAdLoaded = stickyOptions.waitForAdLoaded;\n\t\tthis._scrollUp = stickyOptions.scrollUp;\n\t\tthis._stickBothSide = stickyOptions.stickBothSide;\n\t\tthis._stickyFormat = stickyOptions.format || StickyFormats.FLYING;\n\t\tthis._stickyFormatOptions =\n\t\t\tstickyOptions.formatOptions ||\n\t\t\tgetDefaultFormatOptions(this._stickyFormat);\n\t}\n\t66;\n\tprivate _scrollToPlayer() {\n\t\tconst topPosition =\n\t\t\tthis._layout.el.getBoundingClientRect().top +\n\t\t\tdocument.documentElement.scrollTop -\n\t\t\tDEFAULT_SETTINGS.SCROLL_OFFSET;\n\n\t\twindow.scrollTo({\n\t\t\ttop: topPosition,\n\t\t\tbehavior: 'smooth'\n\t\t});\n\n\t\tthis._updatePlayerBoundingRect();\n\t}\n\n\t/**\n\t * Cancel the disabling timeout\n\t */\n\tprivate _cancelDisablingTimeout() {\n\t\tclearTimeout(this._onCompleteTimeout as any);\n\t\tthis._onCompleteTimeout = null;\n\t}\n\n\t/**\n\t * Disable the sticky feature\n\t * @param {boolean} persistant\n\t */\n\tprivate _disable(\n\t\tdisabledForSession?: boolean,\n\t\tdisabledForPage?: boolean,\n\t\treason?: string\n\t) {\n\t\tl.info(`Sticky disabled. Reason: ${reason}`);\n\n\t\tthis.enabled = false;\n\t\tthis.unstick();\n\n\t\tif (disabledForPage || disabledForSession) {\n\t\t\tif (disabledForPage) {\n\t\t\t\tthis._disabledForPage = true;\n\t\t\t}\n\n\t\t\tif (disabledForSession) {\n\t\t\t\tsetDisabledStickyForSessionState();\n\t\t\t}\n\n\t\t\tthis._player.publish(PublishableVideoStickyEvents.CLOSE);\n\t\t}\n\t}\n\n\t/**\n\t * Move the player to avoid collisions\n\t */\n\tprivate _moveStickyToCollisionPosition() {\n\t\tthis._movePlayer(\n\t\t\t'-' + this._xPosExtra + 'px',\n\t\t\t'-' + this._yPosExtra + 'px'\n\t\t);\n\t}\n\n\t/**\n\t * Reset sticky to initial position\n\t */\n\tprivate _resetStickyPosition() {\n\t\tthis._movePlayer(0, 0);\n\t}\n\n\t/**\n\t * Move the player to the give x y position\n\t * @param {number} xPos Horizontal position\n\t * @param {number} yPos Vertical position\n\t */\n\tprivate _movePlayer(xPos: number | string, yPos: number | string) {\n\t\t// Do nothing if new position is the same\n\t\tif (xPos === this._xPos && yPos === this._yPos) return;\n\n\t\t// Save new position\n\t\tthis._xPos = xPos;\n\t\tthis._yPos = yPos;\n\n\t\tapplyCssTranslate(\n\t\t\tthis._container.parentNode as HTMLElement,\n\t\t\t+this._xPos,\n\t\t\t+this._yPos\n\t\t);\n\t}\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.Sticky = (options: StickyPluginOptions) =>\n\tnew StickyPlugin(options);\n","export function mergeFunctions(...funcs: Function[]) {\n\treturn function (...args: any[]) {\n\t\tfuncs.filter((fn) => !!fn).forEach((fn) => fn?.(...args));\n\t};\n}\n","import { setChildren, mount } from 'redom';\nimport { getClassname } from 'src/plugins/sticky/utils/get-classname.util';\nimport { StickyPlaceholder } from '../../global/placeholder/placeholder.component';\nimport { StickyButtonsBar } from '../../global/buttons-bar/buttons-bar.component';\nimport { StickyBaseLayout } from '../base-layout';\nimport { FlyingLayoutSettings } from './flying-layout.interface';\nimport { from } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { StickyButtonsEvents } from 'src/plugins/sticky/enums/buttons-events.enum';\nimport { Visibility } from 'src/plugins/sticky/enums/visibility.enum';\n\nexport class FlyingStickyLayout extends StickyBaseLayout {\n\tbackground: StickyPlaceholder;\n\tbuttonsBar: StickyButtonsBar;\n\n\tconstructor(settings: FlyingLayoutSettings) {\n\t\tconst { customClass } = settings;\n\t\tsuper({\n\t\t\t...settings,\n\t\t\tcustomClass: getClassname(['sticky-flying-layout'], customClass)\n\t\t});\n\n\t\tthis.background = new StickyPlaceholder({\n\t\t\tcustomClass: 'flying-layout-background'\n\t\t});\n\t\tthis.buttonsBar = new StickyButtonsBar({\n\t\t\tcustomClass: 'flying-layout-buttons'\n\t\t});\n\n\t\tsetChildren(this.playerWrapper, [this.buttonsBar, this.playerElement]);\n\t\tsetChildren(this.el, [this.background, this.playerWrapper]);\n\n\t\tthis.toggleableElements = [this.background, this.buttonsBar];\n\n\t\tthis.events$ = from(this.buttonsBar.events$);\n\t\tthis.sticked$.next(false);\n\n\t\tthis.closeBtnVisibility$.pipe(distinctUntilChanged()).subscribe((state: Visibility) => {\n\t\t\tthis.buttonsBar.switchVisibility$.next({\n\t\t\t\tbtn: StickyButtonsEvents.CLOSE,\n\t\t\t\tstate\n\t\t\t})\n\t\t});\n\n\t\tthis.mount();\n\t}\n\n\tmount = () => mount(this.parentNode, this);\n}\n","import { setChildren, mount, el } from 'redom';\nimport { getClassname } from 'src/plugins/sticky/utils/get-classname.util';\nimport { StickyPlaceholder } from '../../global/placeholder/placeholder.component';\nimport { StickyButtonsBar } from '../../global/buttons-bar/buttons-bar.component';\nimport { StickyBaseLayout } from '../base-layout';\nimport { from, Subject, Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { BannerLayoutSettings } from './banner-layout.interface';\nimport { StickyBaseElement } from '../../base-element';\nimport { Visibility } from 'src/plugins/sticky/enums/visibility.enum';\nimport { StickyButtonsEvents } from 'src/plugins/sticky/enums/buttons-events.enum';\n\nexport interface StickyBannerVideoInfo {\n\ttitle: string;\n\tduration?: string;\n}\n\nexport class BannerStickyLayout extends StickyBaseLayout {\n\tbackground: StickyPlaceholder;\n\tbuttonsBar: StickyButtonsBar;\n\tcontentWrapper: StickyBaseElement;\n\tvideoInfosElement: StickyBaseElement;\n\tstickyBannerVideosInfos$ = new Subject();\n\n\tprivate _subscriptions: Subscription[] = [];\n\tprivate _videoTitleElement: StickyBaseElement;\n\tprivate _videoDurationElement: StickyBaseElement;\n\n\tconstructor(settings: BannerLayoutSettings) {\n\t\tlet { customClass, displayVideosInfos, position = 'bottom' } = settings;\n\t\tcustomClass = customClass ?? [];\n\n\t\tconst customClassList =\n\t\t\ttypeof customClass === 'string' ? [customClass] : customClass;\n\n\t\tsuper({\n\t\t\t...settings,\n\t\t\tcustomClass: getClassname(['sticky-banner-layout'], customClassList)\n\t\t});\n\n\t\tthis.background = new StickyPlaceholder({\n\t\t\tcustomClass: 'banner-layout-background'\n\t\t});\n\n\t\tthis.buttonsBar = new StickyButtonsBar({\n\t\t\tcustomClass: 'banner-layout-buttons'\n\t\t});\n\n\t\tthis.contentWrapper = new StickyBaseElement(\n\t\t\tel('sticky-content-wrapper'),\n\t\t\t'sticky-content-wrapper'\n\t\t);\n\n\t\tthis.videoInfosElement = new StickyBaseElement(\n\t\t\tel('sticky-video-infos'),\n\t\t\t'sticky-video-infos'\n\t\t);\n\n\t\tthis._videoTitleElement = new StickyBaseElement(el('p'), 'video-title');\n\t\tthis._videoDurationElement = new StickyBaseElement(\n\t\t\tel('p'),\n\t\t\t'video-duration'\n\t\t);\n\t\tsetChildren(this.videoInfosElement, [\n\t\t\tthis._videoTitleElement,\n\t\t\tthis._videoDurationElement\n\t\t]);\n\n\t\tsetChildren(this.contentWrapper, [\n\t\t\tthis.playerElement,\n\t\t\tthis.videoInfosElement\n\t\t]);\n\t\tsetChildren(this.playerWrapper, [this.buttonsBar, this.contentWrapper]);\n\t\tsetChildren(this.el, [this.background, this.playerWrapper]);\n\n\t\tthis.toggleableElements = [\n\t\t\tthis.background,\n\t\t\tthis.buttonsBar,\n\t\t\tthis.videoInfosElement\n\t\t];\n\n\t\tthis.events$ = from(this.buttonsBar.events$);\n\n\t\tthis.setPosition(position);\n\t\tthis.toggleVideosInfo(displayVideosInfos ? true : false);\n\t\tthis.sticked$.next(false);\n\n\t\tthis.closeBtnVisibility$.pipe(distinctUntilChanged()).subscribe((state: Visibility) => {\n\t\t\tthis.buttonsBar.switchVisibility$.next({\n\t\t\t\tbtn: StickyButtonsEvents.CLOSE,\n\t\t\t\tstate\n\t\t\t})\n\t\t});\n\n\t\tthis.mount();\n\t}\n\n\tonmount() {\n\t\tconst subscription = this.stickyBannerVideosInfos$.subscribe(\n\t\t\t(videoInfo) => {\n\t\t\t\tthis._videoTitleElement.el.textContent = videoInfo.title;\n\t\t\t\tthis._videoDurationElement.el.textContent = '' + videoInfo.duration;\n\t\t\t}\n\t\t);\n\n\t\tthis._subscriptions.push(subscription);\n\t}\n\n\tonunmount() {\n\t\tthis._subscriptions.forEach((sub) => sub.unsubscribe());\n\t}\n\n\ttoggleVideosInfo(force: boolean) {\n\t\tthis.el.classList.toggle('video-infos-displayed', force);\n\t}\n\n\tsetPosition(position: 'top' | 'bottom') {\n\t\tconst addedClass = position === 'top' ? 'position-top' : 'position-bottom';\n\t\tconst removedClass =\n\t\t\tposition === 'top' ? 'position-bottom' : 'position-top';\n\n\t\tthis.el.classList.remove(removedClass);\n\t\tthis.el.classList.add(addedClass);\n\t}\n\n\tmount = () => mount(this.parentNode, this);\n}\n","const disabledStickySessionVarName = 'stickySessionDisabled';\n\nconst isStickySessionDisabled = () =>\n\ttypeof sessionStorage.getItem(disabledStickySessionVarName) !== 'undefined' &&\n\tBoolean(sessionStorage.getItem(disabledStickySessionVarName));\n\nconst setDisabledStickyForSessionState = () =>\n\tsessionStorage.setItem(disabledStickySessionVarName, 'true');\n\nexport { isStickySessionDisabled, setDisabledStickyForSessionState };\n","//get element size+position\ninterface ElementPosition {\n\tleft: number;\n\ttop: number;\n\tright: number;\n\tbottom: number;\n\twidth: number;\n\theight: number;\n}\n\nconst getElementPosition = (o: HTMLElement): ElementPosition => {\n\tlet left = 0;\n\tlet top = 0;\n\tlet right = 0;\n\tlet bottom = 0;\n\n\tlet body = document.body;\n\tlet width = o.offsetWidth;\n\tlet height = o.offsetHeight;\n\n\tlet offSetParent = o.offsetParent;\n\n\tif (offSetParent) {\n\t\tlet p: any = o;\n\t\tleft = o.offsetLeft - o.scrollLeft;\n\t\ttop = o.offsetTop - o.scrollTop;\n\t\twhile ((p = p.offsetParent)) {\n\t\t\tif (!p) break;\n\t\t\tleft += p.offsetLeft - (p != body ? p.scrollLeft : 0);\n\t\t\ttop += p.offsetTop - (p != body ? p.scrollTop : 0);\n\t\t}\n\t}\n\n\tright = left + width;\n\tbottom = top + height;\n\n\treturn { left, top, right, bottom, width, height };\n};\n\n// Get window size + position\nconst getWindowPosition = (): ElementPosition => {\n\tconst w = window,\n\t\te = document.documentElement,\n\t\tb = document.body;\n\n\tconst width = w.innerWidth\n\t\t? w.innerWidth\n\t\t: e && e.clientWidth\n\t\t? e.clientWidth\n\t\t: b && b.clientWidth\n\t\t? b.clientWidth\n\t\t: 0;\n\n\tconst height = w.innerHeight\n\t\t? w.innerHeight\n\t\t: e && e.clientHeight\n\t\t? e.clientHeight\n\t\t: b && b.clientHeight\n\t\t? b.clientHeight\n\t\t: 0;\n\n\tconst left = w.pageXOffset\n\t\t? w.pageXOffset\n\t\t: e && e.scrollLeft\n\t\t? e.scrollLeft\n\t\t: b && b.scrollLeft\n\t\t? b.scrollLeft\n\t\t: 0;\n\n\tconst top = w.pageYOffset\n\t\t? w.pageYOffset\n\t\t: e && e.scrollTop\n\t\t? e.scrollTop\n\t\t: b && b.scrollTop\n\t\t? b.scrollTop\n\t\t: 0;\n\n\tconst right = left + width;\n\tconst bottom = top + height;\n\n\treturn { left, top, right, bottom, width, height };\n};\n\n/**\n * Get visibility percent of element in viewport\n */\nconst percentInViewport = (el: Element | null, topOffset?: number): number => {\n\tif (!el) {\n\t\treturn 0;\n\t}\n\n\tvar rect = el.getBoundingClientRect();\n\tvar wSize = getWindowPosition();\n\tvar visibleHeight = rect.height - (topOffset || 0);\n\tvar visibleWidth = rect.width;\n\tvar totalSize = visibleHeight * visibleWidth;\n\n\t// A part of element is above viewport\n\tif (rect.top < 0 && rect.bottom > 0) {\n\t\tvisibleHeight += rect.top;\n\t}\n\n\t// A part of element is below viewport\n\tif (rect.bottom > wSize.height && rect.top < wSize.height) {\n\t\tvisibleHeight += wSize.height - rect.bottom;\n\t}\n\n\t// Element is totally above or below viewport\n\tif (\n\t\tMath.max(rect.top, rect.bottom) < 0 ||\n\t\tMath.min(rect.bottom, rect.top) > wSize.height\n\t) {\n\t\tvisibleHeight = 0;\n\t}\n\n\t// A part of element is on the left of viewport\n\tif (rect.left < 0 && rect.right > 0) {\n\t\tvisibleWidth += rect.left;\n\t}\n\n\t// A part of element is on the right of viewport\n\tif (rect.right > wSize.width && rect.left < wSize.width) {\n\t\tvisibleWidth += wSize.width - rect.right;\n\t}\n\n\t// Element is totally on the right/left of viewport\n\tif (\n\t\tMath.max(rect.left, rect.right) < 0 ||\n\t\tMath.min(rect.left, rect.right) > wSize.width\n\t) {\n\t\tvisibleWidth = 0;\n\t}\n\n\treturn (visibleHeight * visibleWidth) / totalSize;\n};\n\n/**\n * Detect if element is in viewport\n */\nconst isInViewport = (\n\tel: HTMLElement | null,\n\tpercent = 1,\n\ttopOffset?: number\n): boolean => percentInViewport(el, topOffset) >= percent;\n\nexport { getElementPosition, getWindowPosition, isInViewport };\n","export const formatSecondsToMinutes = (s: number): string => {\n\tconst minutes = Math.floor(s / 60);\n\tconst seconds = Math.floor(s % 60);\n\tconst mn = minutes < 10 ? '0' + minutes : minutes;\n\tconst sec = seconds < 10 ? '0' + seconds : seconds;\n\n\treturn `${mn}:${sec}`;\n};\n","export const applyCssTranslate = (elt: HTMLElement, x: number, y: number) => {\n\twindow.requestAnimationFrame(() =>\n\t\t'transform webkitTransform mozTransform oTransform msTransform'\n\t\t\t.split(' ')\n\t\t\t.forEach(\n\t\t\t\t(prefix) =>\n\t\t\t\t\t(elt.style[prefix] = `translate(' + ${x} + ', ' + ${y} + ')`)\n\t\t\t)\n\t);\n};\n","// This file's responsability is to centralize all data about all specific videoplayers instances\n\nimport { StickySettings } from './interfaces/sticky-settings.interface';\nimport { DailymotionEmbedPlayer } from './players/dailymotion-embed';\nimport { JwPlayer } from './players/jwplayer';\nimport { VJsPlayer } from './players/video-js';\nimport { isInViewport } from './plugins/sticky/utils/dom.util';\nimport PubSub from 'pubsub-js';\n\nexport interface StoreInstance {\n\tplayer: JwPlayer | VJsPlayer | DailymotionEmbedPlayer;\n\tadPlayer: any;\n\tlogger: any;\n\tsticky: StickySettings & { enabled?: boolean };\n\tautoplay: any;\n\tcontext: any;\n\tposition: any;\n}\n\nexport class Store {\n\tprivate viewableTreshold = 0.5;\n\tprivate static instance: Store;\n\tprivate constructor() {}\n\tinstances: Map = new Map();\n\tcurrentPlayableInstanceId: string;\n\n\tpublic addInstance(id: string, instance: StoreInstance): void {\n\t\tif (!instance.player) {\n\t\t\tinstance.logger.logError(\n\t\t\t\t'Invalid player instance: a mandatory information is missing'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log('id', id);\n\t\tconst thisInstance = this.instances.get(id);\n\t\tif (thisInstance) {\n\t\t\tinstance.logger.logError(\n\t\t\t\t'A player has already been initialized with this id: ' + id\n\t\t\t);\n\n\t\t\tconsole.error('found instance', thisInstance);\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Block autoplay by default until player is ready\n\t\tinstance.autoplay.enabled = instance.autoplay.enabled || false;\n\n\t\t// Add everything to the store\n\t\tthis.instances.set(id, instance);\n\n\t\tPubSub.publish('video.store.addInstance', {\n\t\t\tid: id,\n\t\t\tinstance: this.instances.get(id)\n\t\t});\n\t}\n\n\tpublic getInstance(id: string) {\n\t\treturn this.instances.get(id);\n\t}\n\n\tpublic getCurrentPlayableInstance(): StoreInstance | undefined {\n\t\treturn this.getInstance(this.currentPlayableInstanceId);\n\t}\n\n\tpublic setCurrentPlayableInstanceId(id: string): void {\n\t\tthis.currentPlayableInstanceId = id;\n\t}\n\n\tpublic isPlaying = async (instance: StoreInstance): Promise =>\n\t\tinstance &&\n\t\t((instance.adPlayer && instance.adPlayer.isPlaying()) ||\n\t\t\tawait instance.player?.isPlaying());\n\n\tpublic getActivePlayer = (instance) =>\n\t\tinstance.adPlayer && instance.adPlayer.isActive()\n\t\t\t? instance.adPlayer\n\t\t\t: instance.player;\n\n\tpublic isViewable = (instance: StoreInstance): boolean =>\n\t\tinstance &&\n\t\tisInViewport(\n\t\t\tinstance.player?.getContainer() as HTMLElement,\n\t\t\tthis.viewableTreshold\n\t\t);\n\n\tpublic static get(): Store {\n\t\tif (!Store.instance) {\n\t\t\tStore.instance = new Store();\n\t\t}\n\n\t\treturn Store.instance;\n\t}\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.Store = window.AufVideo.Store || Store;\n","export class AufVideoUtils {\n\tpublic static addClickListener(\n\t\tcontainerId: string,\n\t\tclassNames: string[],\n\t\tcallback: (...args: any[]) => any,\n\t\toptions?: any\n\t) {\n\t\tclassNames.forEach(function (className) {\n\t\t\tconst elements = document\n\t\t\t\t.getElementById(containerId)!\n\t\t\t\t.getElementsByClassName(className);\n\n\t\t\telements[0].addEventListener('click', function (e) {\n\t\t\t\tcallback();\n\t\t\t\tif (options && options.stopPropagation) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tpublic static getCookieValue(cname: string): string {\n\t\tconst name = cname + '=';\n\t\tconst decodedCookie = decodeURIComponent(document.cookie);\n\t\tconst ca = decodedCookie.split(';');\n\t\tfor (let i = 0; i < ca.length; i++) {\n\t\t\tlet c = ca[i];\n\t\t\twhile (c.charAt(0) == ' ') {\n\t\t\t\tc = c.substring(1);\n\t\t\t}\n\t\t\tif (c.indexOf(name) == 0) {\n\t\t\t\treturn c.substring(name.length, c.length);\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t}\n\n\tpublic static getDFPFormattedKeywords(keywords: string) {\n\t\tlet formattedKeywords = '';\n\n\t\t// First we clean keywords to be sure to respect DFP syntax\n\t\tconst cleanedKeywords = keywords\n\t\t\t.replace(/^\\W/, '') // Remove non-word character\n\t\t\t.replace(/;/g, '&') // Replace Smart keywords separator ; by &\n\t\t\t.replace(/&+/g, '&'); // Replace multiple &\n\n\t\tcleanedKeywords.split('&').forEach(function (keyValue) {\n\t\t\tconst keyValueArr = keyValue.split('=');\n\t\t\tconst key = keyValueArr[0];\n\t\t\tconst value = keyValueArr[1];\n\n\t\t\tif (!key || typeof value === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst keyQS = '&' + key + '=';\n\t\t\tconst keyQSPos = formattedKeywords.indexOf(keyQS);\n\n\t\t\t// Key already exists\n\t\t\tif (keyQSPos !== -1) {\n\t\t\t\tlet keyValues = formattedKeywords.substr(keyQSPos + keyQS.length);\n\n\t\t\t\t// Extract only values\n\t\t\t\tif (keyValues.indexOf('&') !== -1) {\n\t\t\t\t\tkeyValues = keyValues.substr(0, keyValues.indexOf('&'));\n\t\t\t\t}\n\n\t\t\t\t// Dedupe same values\n\t\t\t\tif (keyValues.indexOf(value) !== -1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Add new value for the key\n\t\t\t\tformattedKeywords =\n\t\t\t\t\tformattedKeywords.substr(0, keyQSPos + keyQS.length) +\n\t\t\t\t\tvalue +\n\t\t\t\t\t',' +\n\t\t\t\t\tformattedKeywords.substr(keyQSPos + keyQS.length);\n\t\t\t} else {\n\t\t\t\tformattedKeywords += keyQS + value;\n\t\t\t}\n\t\t});\n\n\t\t// Remove first separator\n\t\tif (formattedKeywords.indexOf('&') === 0) {\n\t\t\tformattedKeywords = formattedKeywords.substr(1);\n\t\t}\n\n\t\treturn formattedKeywords;\n\t}\n\n\tpublic static throttle(\n\t\tfunc: (...args: any[]) => any,\n\t\twait: number,\n\t\toptions: { leading?: boolean; trailing?: boolean }\n\t) {\n\t\tlet context, args, result;\n\t\tlet timeout: number | null = null;\n\t\tlet previous = 0;\n\t\tif (!options) options = {};\n\t\tlet later = function () {\n\t\t\tprevious = options.leading === false ? 0 : Date.now();\n\t\t\ttimeout = null;\n\t\t\tresult = func.apply(context, args);\n\t\t\tif (!timeout) context = args = null;\n\t\t};\n\t\treturn function () {\n\t\t\tlet now = Date.now();\n\t\t\tif (!previous && options.leading === false) previous = now;\n\t\t\tlet remaining = wait - (now - previous);\n\t\t\tcontext = this;\n\t\t\targs = arguments;\n\t\t\tif (remaining <= 0 || remaining > wait) {\n\t\t\t\tif (timeout) {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\ttimeout = null;\n\t\t\t\t}\n\t\t\t\tprevious = now;\n\t\t\t\tresult = func.apply(context, args);\n\t\t\t\tif (!timeout) context = args = null;\n\t\t\t} else if (!timeout && options.trailing !== false) {\n\t\t\t\ttimeout = window.setTimeout(later, remaining);\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t}\n\n\tpublic static isPreview() {\n\t\tconst search = window.location.search;\n\t\tconst params = search.substring(search.lastIndexOf('?') + 1).split('&');\n\n\t\treturn params.includes('preview');\n\t}\n\n\tpublic static injectScript(\n\t\td: Document,\n\t\tsrc: string,\n\t\tcb: Function,\n\t\tparams?: any[]\n\t) {\n\t\tvar script = d.createElement('script');\n\t\tscript.type = 'text/javascript';\n\t\tscript.async = true;\n\t\tscript.onload = function () {\n\t\t\t// remote script has loaded\n\t\t\tif (cb && typeof cb === 'function') {\n\t\t\t\tcb(params);\n\t\t\t}\n\t\t};\n\t\tscript.src = src;\n\t\td.getElementsByTagName('head')[0].appendChild(script);\n\t}\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.Utils = AufVideoUtils;\n","/**\n * This file's responsability is to initialize objects previously created by the spawner\n */\n\nimport DailymotionEmbedAdPlayer from './adPlayers/dailymotion-embed';\nimport { PublishableVideoStickyEvents } from './enums/publishable-events.enum';\nimport { VideoPlugins } from './enums/video-plugins.enum';\nimport { AdsParams } from './interfaces';\nimport { DailymotionEmbedPlayer } from './players/dailymotion-embed';\nimport { AnalyticsPlugin } from './plugins/analytics/analytics';\nimport { AutoplayPlugin } from './plugins/autoplay/autoplay';\nimport { DebugPlugin } from './plugins/debug/debug';\nimport { StickyPlugin } from './plugins/sticky/sticky-core';\n\nimport { Store, StoreInstance } from './store';\nimport { PlayerInstance } from './types/player-instance.type';\nimport { AufVideoUtils } from './utils/utils';\nimport { VideoConsoleLogger } from './utils/video-logger';\nimport AfLogger from '@vendor/auf/afLogger';\nimport PubSub from 'pubsub-js';\nimport { PegasusResponseBids } from './interfaces/pegasus-response-bids.interface';\n\nconst logger = new VideoConsoleLogger();\nconst afLogger = new AfLogger({ disableSessionData: true });\n\nexport interface ManagerOptions {\n\tlabels?: any;\n}\n\nconst PEGASUS_TIMEOUT = 7000;\n\nexport class Manager {\n\tprivate labels;\n\tprivate store: Store;\n\tprivate storeInstance: StoreInstance;\n\tpublic plugins: Map = new Map();\n\tprivate static instance: Manager;\n\n\tconstructor(options: ManagerOptions = {}) {\n\t\tthis.labels = options.labels;\n\t\tthis._init();\n\t}\n\n\t// TODO @4lador: Check if that still deserve a purpose\n\tpublic logConsole = (logs: string, service?: string) =>\n\t\tafLogger.logConsole(logs, 'log', service);\n\n\tprivate _init(): void {\n\t\t// Mandatory initializations\n\t\tthis.store = Store.get();\n\n\t\tthis._initListeners();\n\n\t\tconst plugins = [\n\t\t\tVideoPlugins.ANALYTICS,\n\t\t\tVideoPlugins.STICKY,\n\t\t\tVideoPlugins.AUTOPLAY\n\t\t];\n\n\t\tconst isLocal = location.host.indexOf('local') === 0;\n\n\t\tif (isLocal) {\n\t\t\tplugins.push(VideoPlugins.DEBUG);\n\t\t}\n\n\t\tthis._initPlugins(plugins);\n\t\tthis._initScrollListener();\n\t}\n\n\tprivate _initListeners(): void {\n\t\tconst that = this;\n\n\t\t// Init instance once it has been registered to the store\n\t\tPubSub.subscribe(\n\t\t\t'video.store.addInstance',\n\t\t\tasync (msg, data) => {\n\t\t\t\tlogger.debug(`AddInstance msg received from ${data?.instance?.player?.id}`)();\n\t\t\t\tawait this._initInstance(data.instance);\n\t\t\t}\n\t\t);\n\n\t\tinitAutopause();\n\n\t\tfunction initAutopause() {\n\t\t\t// Automatically pause the previous playing instance when a player starts / resumes\n\t\t\tPubSub.subscribe('video.store.playingInstance.update', (msg, data) =>\n\t\t\t\tthat._pausePreviousPlayingInstance(data.id)\n\t\t\t);\n\t\t\tPubSub.subscribe('video.ad.start', (msg, data) =>\n\t\t\t\tthat._pausePreviousPlayingInstance(data.id)\n\t\t\t);\n\t\t\tPubSub.subscribe('video.ad.resume', (msg, data) =>\n\t\t\t\tthat._pausePreviousPlayingInstance(data.id)\n\t\t\t);\n\t\t\tPubSub.subscribe('video.player.start', (msg, data) =>\n\t\t\t\tthat._pausePreviousPlayingInstance(data.id)\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async _initInstance(instance: StoreInstance): Promise {\n\t\tthis.storeInstance = instance;\n\n\t\tif (!(window as any).gdprAppliesGlobally) {\n\t\t\tawait this._initPlayers(instance);\n\t\t}\n\n\t\t// TODO: Type Didomi\n\t\tconst didomiOnReady = ((window as any).didomiOnReady =\n\t\t\t(window as any).didomiOnReady || []);\n\n\t\tdidomiOnReady.push(async () => {\n\t\t\tconst didomi = (window as any).Didomi;\n\t\t\tconst consentShouldBeCollected = didomi.shouldConsentBeCollected();\n\t\t\tconst didomiEventListeners: { event: string; listener: Function }[] = (\n\t\t\t\twindow as any\n\t\t\t).didomiEventListeners;\n\n\t\t\tif (consentShouldBeCollected) {\n\t\t\t\t// If CMP consent notice popup is shown, defer players init until popup has been closed\n\t\t\t\tdidomiEventListeners.push({\n\t\t\t\t\tevent: 'notice.hidden',\n\t\t\t\t\tlistener: async () => await this._initPlayers(instance)\n\t\t\t\t});\n\n\t\t\t\tlogger.debug(`Init player ${instance.player.id} pushed to Didomi listener`)();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Otherwise init players directly because it means user has already given his consent\n\t\t\tawait this._initPlayers(instance);\n\t\t});\n\t}\n\n\tprivate async _initPlayers(\n\t\tinstance: StoreInstance = this.storeInstance\n\t): Promise {\n\t\tconst player = instance.player;\n\t\tconst adPlayer = instance.adPlayer;\n\t\tconst npaActivated = adPlayer && adPlayer._getNpaFromCmp() === '0';\n\t\tconst usePegasus = adPlayer && npaActivated && adPlayer.needPegasus;\n\t\tconst pegasus = (window as any).top.pegasus || { cmd: [] };\n\t\tconst lazyLoadDailymotion =\n\t\t\tusePegasus && instance.player.name === 'dailymotion-embed';\n\t\tconst that = this;\n\n\t\tconst pushToPegasus = () => {\n\t\t\tconst pegasusHandler = async (responseBids: PegasusResponseBids) =>\n\t\t\t\tawait playerInitWithPegasus(player, adPlayer, responseBids);\n\n\t\t\tconst cbName = adPlayer._hbVideoActive\n\t\t\t\t? 'onHbVideoReady'\n\t\t\t\t: 'globalTargeted';\n\n\t\t\tpegasus.cmd.push({ disabledPreroll: pegasusHandler });\n\t\t\tpegasus.cmd.push({\n\t\t\t\t[cbName]: pegasusHandler\n\t\t\t});\n\n\t\t\tlogger.info(`init pushed to pegasus on ${cbName}`)();\n\t\t};\n\n\t\tif (usePegasus) {\n\t\t\tif (lazyLoadDailymotion) {\n\t\t\t\t(instance.player as DailymotionEmbedPlayer)\n\t\t\t\t\t.createLazyPlayer()\n\t\t\t\t\t.then(pushToPegasus);\n\t\t\t} else {\n\t\t\t\tpushToPegasus();\n\t\t\t}\n\n\t\t\tsetTimeout(async () => {\n\t\t\t\tconst isPegasusInitialized = (pegasus && pegasus.version) || (pegasus && pegasus.VERSION);\n\n\t\t\t\tif (!isPegasusInitialized) {\n\t\t\t\t\tlogger.error('Pegasus is not responding')();\n\n\t\t\t\t\t(instance.adPlayer as DailymotionEmbedAdPlayer).needPegasus = false;\n\t\t\t\t\tawait initPlayerWithoutPegasus();\n\t\t\t\t}\n\t\t\t}, PEGASUS_TIMEOUT);\n\t\t} else {\n\t\t\tawait initPlayerWithoutPegasus();\n\t\t}\n\n\t\tasync function initPlayerWithoutPegasus() {\n\t\t\tlogger.debug('initPlayerWithoutPegasus()')();\n\n\t\t\tawait player.init(await getAdParams(adPlayer), _playerInitCb);\n\n\t\t\tlogger.debug('Player initialized')();\n\n\t\t\tasync function _playerInitCb(): Promise {\n\t\t\t\tplayer.publish(PublishableVideoStickyEvents.STICKY_READY);\n\n\t\t\t\tif (!adPlayer) return Promise.resolve();\n\n\t\t\t\tawait initAdPlayer(that.store, player);\n\n\t\t\t\treturn Promise.resolve();\n\t\t\t}\n\t\t}\n\n\t\t// TODO: Type this function && type adPlayer && type responseBids\n\t\tasync function playerInitWithPegasus(\n\t\t\tplayer: PlayerInstance,\n\t\t\tadPlayer: any,\n\t\t\tresponseBids?: any\n\t\t) {\n\t\t\tlogger.debug('Player Init With Pegasus')();\n\t\t\tconst isPrerollDisabled = ((\n\t\t\t\tplayer as DailymotionEmbedPlayer\n\t\t\t).isAdDisabled = (window as any).pegasus.getData(\n\t\t\t\t'adops.disableAdPreroll'\n\t\t\t));\n\n\t\t\tconst isResponseBids = typeof responseBids !== 'undefined';\n\t\t\tif (isResponseBids) {\n\t\t\t\tadPlayer.setHbResponses(responseBids);\n\t\t\t}\n\n\t\t\t// TODO: Type Pegasus\n\t\t\tconst pegasusAccount = (window as any).pegasus.getData(\n\t\t\t\t'adserver.dfp.account'\n\t\t\t);\n\n\t\t\tconst pegasusAdUnit = (window as any).pegasus.getData(\n\t\t\t\t'slots.instream.adUnitPath'\n\t\t\t);\n\n\t\t\tadPlayer.adUnit = '/' + pegasusAccount + '/' + pegasusAdUnit;\n\n\t\t\tlet adParams: AdsParams | undefined;\n\t\t\tif (isPrerollDisabled) {\n\t\t\t\t_disablePreroll(player);\n\t\t\t} else {\n\t\t\t\tadParams = await getAdParams(adPlayer);\n\t\t\t}\n\n\t\t\tlogger.info('Player init with Pegasus using adParams', adParams)();\n\n\t\t\tawait player.init(adParams, () =>\n\t\t\t\t_onPlayerInit(isPrerollDisabled, player)\n\t\t\t);\n\n\t\t\tfunction _disablePreroll(player: PlayerInstance): void {\n\t\t\t\tlogger.debug('_disablePreroll(player)', player)();\n\t\t\t\tplayer.cancelAdvertising();\n\t\t\t}\n\n\t\t\tasync function _onPlayerInit(\n\t\t\t\tdisablePreroll: boolean,\n\t\t\t\tplayer: PlayerInstance\n\t\t\t): Promise {\n\t\t\t\tif (!adPlayer || disablePreroll) return;\n\n\t\t\t\treplaceVariable();\n\t\t\t\tawait initAdPlayer(that.store, player);\n\n\t\t\t\t// Check if that deserve a real purpose\n\t\t\t\tplayer.publish(PublishableVideoStickyEvents.STICKY_READY);\n\n\t\t\t\tfunction replaceVariable() {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!adPlayer.replaceVariable ||\n\t\t\t\t\t\ttypeof adPlayer.replaceVariable !== 'function'\n\t\t\t\t\t)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tadPlayer.replaceVariable();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// TODO: Move that to Dailymotion adPlayer\n\t\tasync function getAdParams(adPlayerInstance) {\n\t\t\treturn adPlayerInstance\n\t\t\t\t? {\n\t\t\t\t\t\tui: adPlayerInstance.adUnit, // TODO cast to right class (not abstract)\n\t\t\t\t\t\tcustom: await adPlayerInstance.getAdTagCustomParameters()\n\t\t\t\t }\n\t\t\t\t: undefined;\n\t\t}\n\n\t\tasync function initAdPlayer(store: Store, player?: any): Promise {\n\t\t\tawait adPlayer.init(store, player);\n\t\t\tadPlayer.onApiLoaded();\n\t\t\treturn Promise.resolve();\n\t\t}\n\t}\n\n\tprivate _logError = (message: string, category?: string) =>\n\t\tafLogger.logError(message, category);\n\n\tprivate _pausePreviousPlayingInstance(id: string) {\n\t\tconst previousInstance = this.store.getCurrentPlayableInstance();\n\t\tif (previousInstance && id !== previousInstance.player.id) {\n\t\t\tif (previousInstance.adPlayer) {\n\t\t\t\tpreviousInstance.adPlayer.pause();\n\t\t\t}\n\n\t\t\tpreviousInstance.player.pause();\n\t\t}\n\n\t\t// Set current instance as the new playing instance\n\t\tthis.store.setCurrentPlayableInstanceId(id);\n\t}\n\n\t// Create a global listener on user scroll\n\tprivate _initScrollListener() {\n\t\tconst pluginsWithScrollHandlers = [\n\t\t\tthis.plugins.get('sticky'),\n\t\t\tthis.plugins.get('autoplay')\n\t\t];\n\n\t\tfunction globalScrollHandler() {\n\t\t\t// Handlers are called in the correct order and are not debounced functions as we need to control the execution order\n\t\t\t// As this global handler is already using debounce we don't need to chain debounced handlers\n\t\t\tpluginsWithScrollHandlers.forEach(function (plugin = {}) {\n\t\t\t\tconst handler = plugin.scrollEvent;\n\t\t\t\tif (handler && typeof handler === 'function') {\n\t\t\t\t\thandler.apply();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tdocument.addEventListener(\n\t\t\t'scroll',\n\t\t\tAufVideoUtils.throttle(globalScrollHandler, 50, {\n\t\t\t\tleading: true\n\t\t\t}),\n\t\t\t{ passive: true }\n\t\t);\n\t}\n\n\tprivate _initPlugins(plugins: string[]) {\n\t\tplugins.forEach((plugin) => {\n\t\t\tswitch (plugin) {\n\t\t\t\tcase VideoPlugins.STICKY:\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.plugins.set(\n\t\t\t\t\t\t\tplugin.toLocaleLowerCase(),\n\t\t\t\t\t\t\tnew StickyPlugin({\n\t\t\t\t\t\t\t\tstore: this.store\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlogger.debug('Sticky plugin loaded')();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase VideoPlugins.AUTOPLAY:\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.plugins.set(\n\t\t\t\t\t\t\tplugin.toLocaleLowerCase(),\n\t\t\t\t\t\t\tnew AutoplayPlugin({\n\t\t\t\t\t\t\t\tstore: this.store\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlogger.debug('Autoplay plugin loaded')();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase VideoPlugins.ANALYTICS:\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.plugins.set(\n\t\t\t\t\t\t\tplugin.toLocaleLowerCase(),\n\t\t\t\t\t\t\tnew AnalyticsPlugin({\n\t\t\t\t\t\t\t\tstore: this.store\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlogger.debug('Analytics plugin loaded')();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase VideoPlugins.DEBUG:\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.plugins.set(\n\t\t\t\t\t\t\tplugin.toLocaleLowerCase(),\n\t\t\t\t\t\t\tnew DebugPlugin({\n\t\t\t\t\t\t\t\tstore: this.store\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlogger.debug('Debug plugin loaded')();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n\n\t// Related contents\n\t// TODO @yohanauf: move init to a separate plugin\n\t// TODO @damien: Check if that still deserve a purpose\n\tpublic initRelatedContents(player) {\n\t\tconst RelatedContents = (window as any).AufVideo.RelatedContents;\n\t\tif (!RelatedContents) return;\n\n\t\tconst afRelatedContent = new RelatedContents();\n\t\tafRelatedContent.init({\n\t\t\tid: player.id,\n\t\t\tplayer,\n\t\t\tlabels: this.labels,\n\t\t\trevolver: false\n\t\t});\n\t}\n\n\t// TODO @damien: Check if that still deserve a purpose\n\tprivate _getInstancesAdsInfo() {\n\t\tconst infos: { playerId: string; placement: string }[] = [];\n\t\tconst instances = this.store.instances;\n\n\t\tinstances.forEach((instance: StoreInstance, key: string) => {\n\t\t\tif (instance.adPlayer) {\n\t\t\t\tinfos.push({\n\t\t\t\t\tplayerId: instance.adPlayer.id,\n\t\t\t\t\tplacement: instance.adPlayer.adUnit.split('/').pop()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static get(options?: ManagerOptions): Manager {\n\t\tif (!Manager.instance) {\n\t\t\tManager.instance = new Manager(options);\n\t\t}\n\n\t\treturn Manager.instance;\n\t}\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.Manager = window.AufVideo.Manager || Manager;\n","import {\n\tPublishableVideoAdEvents,\n\tPublishableVideoLogEvents\n} from 'src/enums/publishable-events.enum';\nimport { Manager } from 'src/manager';\nimport { Store } from 'src/store';\nimport { AufVideoUtils } from 'src/utils/utils';\nimport { VideoConsoleLogger } from 'src/utils/video-logger';\nimport { PlayerPosition } from '../enums/player-position.enum';\nimport { PlayerInstance } from '../types/player-instance.type';\nimport PubSub from 'pubsub-js';\nimport {\n\tAdUnitCode,\n\tPegasusAmazonItem,\n\tPegasusPreBidItem,\n\tPegasusResponseBids\n} from 'src/interfaces/pegasus-response-bids.interface';\n\nconst logger = new VideoConsoleLogger();\n\nlet SETTINGS: any = {\n\tDEFAULTplayer_WIDTH: 640,\n\tDEFAULTplayer_HEIGHT: 480,\n\tHB_VIDEO_TIMEOUT: 3000,\n\tDEFAULT_AD_TAG_URL:\n\t\t'https://securepubads.g.doubleclick.net/gampad/ads' +\n\t\t'?sz=640x480' + // Size of master video ad slot, use pipe for multiple sizes\n\t\t'&impl=s' + // The request mode. Here, s for sync\n\t\t'&gdfp_req=1' + // Indicates that the user is on the DFP schema\n\t\t'&env=vp' + // Indicates that the request is from a video player\n\t\t'&output=vast' + // Output format of ad, vast => network's default setting\n\t\t'&unviewed_position_start=1', // Setting this to 1 turns on delayed impressions,\n\tCMP_AD_SERVER_KEY: 'google'\n};\n\nSETTINGS.DEBUG_AD_TAG_URL =\n\tSETTINGS.DEFAULT_AD_TAG_URL +\n\t'&iu=/124319096/external/single_ad_samples' +\n\t'&ciu_szs=300x250' +\n\t'&cust_params=deployment%3Ddevsite%26sample_ct%3Dskippablelinear';\n\nexport interface AdPlayerOptions {\n\tid: string;\n\tname: string;\n\tplayer: PlayerInstance;\n\tadUnit: string;\n\tadTargeting: any; // TODO: Type that\n\tallowMultipleTinyAds: boolean;\n\tsiteId: number;\n\tposition: PlayerPosition;\n\tadScheduleId: string;\n\tplayPreroll: boolean;\n\tneedPegasus: boolean;\n\thbVideoActive?: boolean;\n\tjwpAdvertisingParameters?: boolean;\n\tisCM?: boolean;\n\tadRule?: boolean;\n\tviewableVideo?: boolean;\n}\n\nexport interface AdData {}\n\nexport interface AdState {\n\tplaying: boolean;\n\tstarted: boolean;\n\tended: boolean;\n\tpaused: boolean;\n\tpods: number;\n\teventsLists: string[];\n}\n\ndeclare global {\n\tinterface Window {\n\t\tDidomi: any;\n\t\tunify_dataSlayer: any;\n\t\tafAdblock: any;\n\t\tpegasusConf: any;\n\t\tsas_target: any;\n\t\tpegasus: any;\n\t}\n}\n\nexport default abstract class AdPlayer {\n\tpublic adsState: AdState = {\n\t\tplaying: false,\n\t\tstarted: false,\n\t\tended: false,\n\t\tpaused: false,\n\t\tpods: 0,\n\t\teventsLists: []\n\t};\n\tprivate _hbResponses: PegasusResponseBids; // TODO: Type that (if hb still needed)\n\tprivate _adTagUrl: string;\n\tprivate _debug = false;\n\tprivate _allowMultipleTinyAds = false;\n\tprivate _adTargeting: any; // TODO: Type that\n\tprivate _adRule: boolean;\n\tprivate _isCM: boolean;\n\tprotected _jwpAdvertisingParameters: boolean;\n\tprotected _playPreroll: boolean;\n\tprotected _viewableVideo: boolean;\n\tprotected _id: string;\n\tprotected _ready = false;\n\tprotected _player: PlayerInstance;\n\tprotected _hbVideoActive: boolean;\n\tprotected _adScheduleId: string;\n\tpublic adUnit: string;\n\tpublic position: PlayerPosition;\n\tpublic needPegasus: boolean;\n\tpublic name: string;\n\tpublic siteId: number;\n\n\tconstructor(options: AdPlayerOptions) {\n\t\tthis._id = options.id;\n\n\t\tif (!options.id || !options.player || !options.adUnit) {\n\t\t\tthis.logError('Unable to init ad player (missing options)');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.name = options.name;\n\t\tthis.siteId = options.siteId;\n\t\tthis._player = options.player;\n\t\tthis.adUnit = options.adUnit;\n\t\tthis._adTargeting = options.adTargeting;\n\t\tthis._allowMultipleTinyAds = options.allowMultipleTinyAds;\n\t\tthis.position = options.position;\n\t\tthis._adScheduleId = options.adScheduleId;\n\t\tthis._hbVideoActive = options.hbVideoActive || false;\n\t\tthis._jwpAdvertisingParameters = options.jwpAdvertisingParameters || false;\n\t\tthis.needPegasus = options.needPegasus || false;\n\t\tthis._isCM = options.isCM || false;\n\t\tthis._playPreroll = options.playPreroll;\n\t\tthis._adRule = options.adRule || false;\n\t\tthis._viewableVideo = false;\n\t}\n\n\tpublic async init(store?: Store, player?: any): Promise {\n\t\tthis._player = player;\n\n\t\t// If user got an adBlocker or if website uses a CMP and user doesn't consent to ad server, do not init ad player\n\t\tconst adsDisabled =\n\t\t\tthis._userHasAdBlock() ||\n\t\t\t(window.Didomi &&\n\t\t\t\t!window.Didomi.getUserConsentStatusForVendor(\n\t\t\t\t\tSETTINGS.CMP_AD_SERVER_KEY\n\t\t\t\t));\n\n\t\tif (adsDisabled) return Promise.resolve();\n\n\t\tPubSub.subscribe(\n\t\t\tPublishableVideoAdEvents.AD_TAG_READY,\n\t\t\t(\n\t\t\t\tevent,\n\t\t\t\tparams: { adTagUrl: string; typeAd: string; position: string }\n\t\t\t) => {\n\t\t\t\tif (params.position !== this.position) return;\n\n\t\t\t\tthis._playAdInstant(params.adTagUrl);\n\t\t\t}\n\t\t);\n\n\t\tawait this._postInit(store, player);\n\t\treturn Promise.resolve();\n\t}\n\n\t// (Ima & Jwplayer) Ad tag: regenerate URL on each request because some key/values are updated on the fly for some 3rd party\n\t// RECO Damien: Déplacer vers un service plutot que dans l'adplayer\n\tprotected async getAdTagUrl(typeAd: string = 'preroll') {\n\t\tif (this._debug) {\n\t\t\treturn SETTINGS.DEBUG_AD_TAG_URL + '&correlator=' + Date.now(); // A random positive number;\n\t\t}\n\n\t\tconst isVposSet =\n\t\t\tthis._adTagUrl &&\n\t\t\tthis._adTagUrl.split('&vpos=') &&\n\t\t\tthis._adTagUrl.split('&vpos=')[1] === typeAd;\n\n\t\t// If ad tag URL is available, return it directly\n\t\tif (isVposSet) return this._adTagUrl;\n\n\t\tconst customParameters = await this.getAdTagCustomParameters();\n\t\tconst nonPersonalizedAds = this._getNpaFromCmp();\n\n\t\tfunction buildAdTagUrl(\n\t\t\tiu: string,\n\t\t\turl: string,\n\t\t\tcustomParams: string,\n\t\t\tnpa: string,\n\t\t\tvpos: string,\n\t\t\tadRule?: number\n\t\t) {\n\t\t\tlet params: any = {\n\t\t\t\tiu,\n\t\t\t\turl: encodeURIComponent(url),\n\t\t\t\tdescription_url: encodeURIComponent(url),\n\t\t\t\tcust_params: encodeURIComponent(customParams),\n\t\t\t\tnpa,\n\t\t\t\tcorrelator: Date.now(),\n\t\t\t\tvpos\n\t\t\t};\n\n\t\t\tif (adRule) {\n\t\t\t\tparams = {\n\t\t\t\t\t...params,\n\t\t\t\t\tad_rule: adRule\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn `${SETTINGS.DEFAULT_AD_TAG_URL}&${Object.keys(params)\n\t\t\t\t.map((k) => `${k}=${params[k]}`)\n\t\t\t\t.join('&')}`;\n\t\t}\n\n\t\treturn buildAdTagUrl(\n\t\t\tthis.adUnit,\n\t\t\tlocation.href,\n\t\t\tcustomParameters,\n\t\t\tnonPersonalizedAds,\n\t\t\ttypeAd,\n\t\t\tthis._allowMultipleTinyAds ? 1 : undefined\n\t\t);\n\t}\n\n\tprotected logError(message: string) {\n\t\tthis.publish(PublishableVideoLogEvents.ERROR, {\n\t\t\tmessage: message,\n\t\t\tcategory: this.name\n\t\t});\n\t}\n\n\tprotected _playAdInstant(adTagUrl: string): boolean {\n\t\tif (!adTagUrl) return false;\n\n\t\tthis._adTagUrl = adTagUrl;\n\t\tthis._postPlayAdInstant();\n\t\treturn true;\n\t}\n\n\tpublic publish(event: string, data: any = {}) {\n\t\tdata.id = this._id; // To retrieve current instance\n\t\tPubSub.publish(event, data);\n\n\t\tconst blacklistedFromConsoleLogs = ['video.ad.time_update'];\n\t\tif (blacklistedFromConsoleLogs.includes(event)) return;\n\n\t\tlogger.debug(`Publishing ${event}`, data)();\n\t}\n\n\tpublic publishApiEvent(event: string, ad?: AdData) {\n\t\tconst data = {\n\t\t\tad: this._getAdData(ad), // Add extra data about ads\n\t\t\tvideoBreak: this._getVideoBreak(ad), // Instream video ad break (preroll, postroll, ..)\n\t\t\tvideo: this._player ? this._player.videoId : undefined,\n\t\t\turl: document.URL\n\t\t};\n\n\t\tthis.publish(event, data);\n\t}\n\n\tpublic onApiLoaded() {\n\t\tif (this._ready) return;\n\n\t\tthis._initApiListeners();\n\t\tthis._initErrorsListeners();\n\n\t\tif (this._player.muted && this.mute) {\n\t\t\tthis.mute();\n\t\t}\n\n\t\tthis.publishApiEvent(PublishableVideoAdEvents.AD_READY);\n\t\tthis._ready = true;\n\t}\n\n\tpublic async getAdTagCustomParameters() {\n\t\t// Keywords targeting\n\t\tlet customParameters = await this._getAdTargetingFormated(this.position);\n\t\tconst playerWidth =\n\t\t\tthis._player && this._player.ready\n\t\t\t\t? this._player.getWidth()\n\t\t\t\t: SETTINGS.DEFAULTplayer_WIDTH;\n\t\tconst playerHeight =\n\t\t\tthis._player && this._player.ready\n\t\t\t\t? this._player.getHeight()\n\t\t\t\t: SETTINGS.DEFAULTplayer_HEIGHT;\n\n\t\tcustomParameters +=\n\t\t\t'&playerwidth=' + playerWidth + '&playerheight=' + playerHeight;\n\n\t\treturn customParameters;\n\t}\n\n\tpublic setHbResponses = (hbResponses) => (this._hbResponses = hbResponses);\n\tpublic isPlaying = () => this.adsState.playing;\n\tpublic isPaused = () => !this.adsState.playing;\n\tpublic isActive = () => this.adsState.started && !this.adsState.ended;\n\n\tprivate _logConsole = (logs: string, format?: string) =>\n\t\tManager.get().logConsole(logs, format);\n\n\tprivate _userHasAdBlock = () =>\n\t\twindow.afAdblock && window.afAdblock.status === 0;\n\n\tprotected _getNpaFromCmp() {\n\t\tif (!window.Didomi) {\n\t\t\treturn '0'; // NPA allowed by default if no CMP\n\t\t}\n\n\t\t// If website uses Didomi CMP, check for user content to non-personalized ads\n\t\tconst userConsentToPersonalizedAds =\n\t\t\twindow.Didomi.getUserConsentStatusForPurpose('cookies') &&\n\t\t\twindow.Didomi.getUserConsentStatusForPurpose('select_basic_ads') &&\n\t\t\twindow.Didomi.getUserConsentStatusForPurpose('create_ads_profile') &&\n\t\t\twindow.Didomi.getUserConsentStatusForPurpose('select_personalized_ads') &&\n\t\t\twindow.Didomi.getUserConsentStatusForPurpose('measure_ad_performance') &&\n\t\t\twindow.Didomi.getUserConsentStatusForPurpose('market_research') &&\n\t\t\twindow.Didomi.getUserConsentStatusForPurpose('improve_products');\n\n\t\treturn userConsentToPersonalizedAds ? '0' : '1';\n\t}\n\n\tprivate _getPegasusBids(hbResponse: PegasusResponseBids): string {\n\t\tconst amazon = hbResponse.amazon;\n\t\tconst prebid = hbResponse.prebid;\n\n\t\tfunction getBids(\n\t\t\titem:\n\t\t\t\t| { [adUnitCode in AdUnitCode]: PegasusPreBidItem | PegasusAmazonItem }\n\t\t\t\t| undefined\n\t\t) {\n\t\t\titem = item ? item[Object.keys(item)[0]] : undefined;\n\t\t\tconst prebidItem = item as unknown as PegasusPreBidItem;\n\t\t\tconst amazonItem = item as unknown as PegasusAmazonItem;\n\t\t\tconst isPrebid =\n\t\t\t\tprebidItem &&\n\t\t\t\tprebidItem.bids &&\n\t\t\t\tArray.isArray(prebidItem.bids) &&\n\t\t\t\tprebidItem.bids.length;\n\t\t\tconst isAmazon =\n\t\t\t\tamazonItem && amazonItem.bids && amazonItem.bids?.targeting;\n\n\t\t\treturn isPrebid\n\t\t\t\t? prebidItem.targeting\n\t\t\t\t: isAmazon\n\t\t\t\t? amazonItem.targeting\n\t\t\t\t: {};\n\t\t}\n\n\t\tconst targetings = {\n\t\t\t...getBids(amazon),\n\t\t\t...getBids(prebid)\n\t\t};\n\n\t\treturn Object.keys(targetings)\n\t\t\t.map((k) => `${k}=${targetings[k]}`)\n\t\t\t.join(';');\n\t}\n\n\tprivate async _getAdTargetingFormated(position: PlayerPosition) {\n\t\tlogger.debug('_getAdTargetingFormated()')();\n\n\t\tlet adTargeting = `video_pos=${\n\t\t\tposition.toLowerCase().startsWith('mtf') ? 'mtf' : position.toLowerCase()\n\t\t};`;\n\n\t\t// Add GoFeminin targeting if needed\n\t\tadTargeting +=\n\t\t\tthis.siteId === 4\n\t\t\t\t? getGoFemininTargeting(window.unify_dataSlayer, this._player.isMobile)\n\t\t\t\t: '';\n\n\t\t// Add pegasus hb responses\n\t\tconst hasHbResponses = this._hasHbResponses(this._hbResponses);\n\t\tif (hasHbResponses) {\n\t\t\tconst pegasusBids = this._getPegasusBids(this._hbResponses);\n\n\t\t\tif (pegasusBids)\n\t\t\t\tthis.publishApiEvent(PublishableVideoAdEvents.AD_BID_FOUND);\n\n\t\t\tadTargeting += pegasusBids;\n\t\t}\n\n\t\t// Add debug targeting\n\t\tconst debugPrerollAdTargeting = localStorage.getItem('video_force_preroll')\n\t\t\t? 'adtest=preroll'\n\t\t\t: '';\n\t\tadTargeting += `${window.sas_target};${this._adTargeting};${debugPrerollAdTargeting}`;\n\n\t\t// Add Pegasus Conf Keywords\n\t\tconst pegasusConfKeywords = window.pegasusConf?.params?.keywords;\n\t\tconst pegasusDotConfKeywords = window.pegasus?.conf?.params?.keywords;\n\t\tadTargeting += pegasusConfKeywords ? `;${pegasusConfKeywords}` : '';\n\t\tadTargeting += pegasusDotConfKeywords ? `;${pegasusDotConfKeywords}` : '';\n\n\t\t// Add Global targeting from Pegasus\n\t\tif (this.needPegasus) {\n\t\t\tlogger.debug('_getAdTargetingFormated() : Need Pegasus')();\n\t\t\tconst pegasusReady = async (): Promise => {\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\tlet pegasusReady = false;\n\n\t\t\t\t\tconst pegasusReadyInterval = window.setInterval(() => {\n\t\t\t\t\t\tconst pegasus = window.pegasus;\n\t\t\t\t\t\tconst googletag = window.googletag;\n\t\t\t\t\t\tif (pegasus.getGlobalTargeting && googletag.pubads) {\n\t\t\t\t\t\t\tpegasusReady = true;\n\t\t\t\t\t\t\twindow.clearInterval(pegasusReadyInterval);\n\t\t\t\t\t\t\treturn resolve(pegasusReady);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 150);\n\n\t\t\t\t\twindow.setTimeout(() => {\n\t\t\t\t\t\tif (!pegasusReady) {\n\t\t\t\t\t\t\tconst err = 'Pegasus timed out';\n\t\t\t\t\t\t\tlogger.error(err + ', clearing interval')();\n\t\t\t\t\t\t\twindow.clearInterval(pegasusReadyInterval);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 10000);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tawait pegasusReady();\n\t\t\t} catch (error) {\n\t\t\t\treturn Promise.reject(error);\n\t\t\t}\n\n\t\t\tconst globalTargeting = window.pegasus.getGlobalTargeting() || {};\n\t\t\tconst pegasusTargetting = Object.keys(globalTargeting)\n\t\t\t\t.map(function (k) {\n\t\t\t\t\treturn k + '=' + window.pegasus.getGlobalTargeting()[k].join(',');\n\t\t\t\t})\n\t\t\t\t.join(';');\n\n\t\t\tadTargeting += `;${pegasusTargetting}`;\n\t\t}\n\n\t\tfunction getGoFemininTargeting(\n\t\t\tdatalayer: any[],\n\t\t\tisMobile?: boolean\n\t\t): string {\n\t\t\tdatalayer = datalayer && Array.isArray(datalayer) ? datalayer : [];\n\t\t\tconst pageItem = datalayer.find((elem) => elem.page);\n\t\t\tconst lockVerz = pageItem\n\t\t\t\t? `lokverz1=${pageItem.page.section};lokverz2=${pageItem.page.subSection};`\n\t\t\t\t: '';\n\n\t\t\treturn `pos=preroll;loktitel=gofeminin;${\n\t\t\t\tisMobile ? 'environment=mob;' : 'environment=sta;'\n\t\t\t}${lockVerz}`;\n\t\t}\n\n\t\treturn Promise.resolve(AufVideoUtils.getDFPFormattedKeywords(adTargeting));\n\t}\n\n\tprotected _getAdRule = () => (this._adRule ? 1 : 0);\n\n\tprotected _setAdsState(state) {\n\t\tswitch (state) {\n\t\t\tcase PublishableVideoAdEvents.AD_START:\n\t\t\t\tthis.adsState.started = true;\n\t\t\t\tthis.adsState.ended = false;\n\t\t\t\tthis.adsState.pods++;\n\t\t\t\tbreak;\n\n\t\t\tcase PublishableVideoAdEvents.AD_END:\n\t\t\t\tthis.adsState.started = false;\n\t\t\t\tthis.adsState.playing = false;\n\t\t\t\tthis.adsState.ended = true;\n\t\t\t\tbreak;\n\n\t\t\tcase PublishableVideoAdEvents.AD_PAUSE:\n\t\t\t\tthis.adsState.playing = false;\n\t\t\t\tthis.adsState.paused = true;\n\t\t\t\tbreak;\n\n\t\t\tcase PublishableVideoAdEvents.AD_PLAY:\n\t\t\tcase PublishableVideoAdEvents.AD_RESUME:\n\t\t\t\tthis.adsState.paused = false;\n\t\t\t\tthis.adsState.started = true;\n\t\t\t\tthis.adsState.playing = true;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis._pushToEventsList(state);\n\t}\n\n\tprivate _pushToEventsList(eventName) {\n\t\tthis.adsState.eventsLists.push(this.name + ': ' + eventName);\n\t}\n\n\tprivate _hasHbResponses(hbResponses: PegasusResponseBids) {\n\t\tconst prebid = hbResponses && hbResponses.prebid;\n\t\tconst amazon = hbResponses && hbResponses.amazon;\n\n\t\tconst hasPrebidProps = prebid\n\t\t\t? Object.getOwnPropertyNames(hbResponses.prebid).length\n\t\t\t: undefined;\n\t\tconst hasAmazonProps = amazon\n\t\t\t? Object.getOwnPropertyNames(hbResponses.amazon).length\n\t\t\t: undefined;\n\n\t\treturn hasPrebidProps || hasAmazonProps;\n\t}\n\n\tprotected abstract _getAdData(ad?: any): any;\n\tprotected abstract _getVideoBreak(ad: any): any;\n\tprotected abstract _postInit(store?: Store, player?: any): Promise;\n\tprotected abstract _postPlayAdInstant(): any;\n\tprotected abstract _initApiListeners(): void;\n\tprotected abstract _initErrorsListeners(): void;\n\tpublic abstract mute(): void;\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.AdPlayer = AdPlayer;\n","import { DailymotionEmbedPlayer } from 'src/players/dailymotion-embed';\nimport {\n\tPublishableVideoAdEvents,\n\tPublishableVideoPlayerEvents,\n\tPublishableVideoStickyEvents\n} from '../enums/publishable-events.enum';\nimport { ListenerAction } from '../interfaces/listener-action';\nimport AdPlayer, { AdPlayerOptions } from './_adapter';\nimport PubSub from 'pubsub-js';\n\nexport interface DailymotionAdPlayerOptions extends AdPlayerOptions {\n\tplayPreroll: boolean;\n}\n\nexport default class DailymotionEmbedAdPlayer extends AdPlayer {\n\tprivate dailymotion = window.dailymotion;\n\n\tprivate _apiListenersActions: ListenerAction[] = [\n\t\t{\n\t\t\tmessage: this.dailymotion.events.AD_START,\n\t\t\tactionFn: () => {\n\t\t\t\tthis._emitEventHandler(\n\t\t\t\t\tPublishableVideoAdEvents.AD_START,\n\t\t\t\t\tthis._getAdData({})\n\t\t\t\t);\n\t\t\t\tthis.publish(PublishableVideoStickyEvents.STICKY_CONTENT_START);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: this.dailymotion.events.AD_END,\n\t\t\tactionFn: () =>\n\t\t\t\tthis._emitEventHandler(\n\t\t\t\t\tPublishableVideoAdEvents.AD_END,\n\t\t\t\t\tthis._getAdData({})\n\t\t\t\t)\n\t\t},\n\t\t{\n\t\t\tmessage: this.dailymotion.events.AD_IMPRESSION,\n\t\t\tactionFn: () =>\n\t\t\t\tthis._emitEventHandler(\n\t\t\t\t\tPublishableVideoAdEvents.AD_IMPRESSION,\n\t\t\t\t\tthis._getAdData({})\n\t\t\t\t)\n\t\t},\n\t\t{\n\t\t\tmessage: this.dailymotion.events.AD_PAUSE,\n\t\t\tactionFn: () =>\n\t\t\t\tthis._emitEventHandler(\n\t\t\t\t\tPublishableVideoAdEvents.AD_PAUSE,\n\t\t\t\t\tthis._getAdData({})\n\t\t\t\t)\n\t\t},\n\t\t{\n\t\t\tmessage: this.dailymotion.events.AD_PLAY,\n\t\t\tactionFn: () => {\n\t\t\t\tthis._emitEventHandler(\n\t\t\t\t\tPublishableVideoAdEvents.AD_PLAY,\n\t\t\t\t\tthis._getAdData({})\n\t\t\t\t);\n\t\t\t\tthis._emitEventHandler(\n\t\t\t\t\tPublishableVideoAdEvents.AD_IMPRESSION,\n\t\t\t\t\tthis._getAdData({})\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: this.dailymotion.events.AD_TIMECHANGE,\n\t\t\tactionFn: () =>\n\t\t\t\tthis._emitEventHandler(PublishableVideoAdEvents.AD_TIMEUPDATE)\n\t\t},\n\t\t{\n\t\t\tmessage: this.dailymotion.events.AD_COMPANIONSREADY,\n\t\t\tactionFn: () =>\n\t\t\t\tthis._emitEventHandler(PublishableVideoAdEvents.AD_COMPANIONS)\n\t\t},\n\t\t{\n\t\t\tmessage: this.dailymotion.events.AD_DURATIONCHANGE,\n\t\t\tactionFn: () =>\n\t\t\t\tthis._emitEventHandler(PublishableVideoAdEvents.AD_DURATIONCHANGE)\n\t\t},\n\t\t{\n\t\t\tmessage: this.dailymotion.events.AD_CLICK,\n\t\t\tactionFn: () => this._emitEventHandler(PublishableVideoAdEvents.AD_CLICK)\n\t\t},\n\t\t{\n\t\t\tmessage: this.dailymotion.events.AD_LOADED,\n\t\t\tactionFn: () =>\n\t\t\t\tthis._emitEventHandler(\n\t\t\t\t\tPublishableVideoAdEvents.AD_LOADED,\n\t\t\t\t\tthis._getAdData({})\n\t\t\t\t)\n\t\t},\n\t\t{\n\t\t\tmessage: this.dailymotion.events.PLAYER_HEAVYADSINTERVENTION,\n\t\t\tactionFn: (report) => {\n\t\t\t\tconsole.error('HEAVY_ADS_REPORT', report);\n\t\t\t\tthis._emitEventHandler(PublishableVideoAdEvents.HEAVY_ADS, report);\n\t\t\t}\n\t\t}\n\t];\n\n\tconstructor(options: DailymotionAdPlayerOptions) {\n\t\tsuper({ ...options, name: 'dmp-embed-ads' });\n\t}\n\n\tprotected async _postInit(): Promise {\n\t\tPubSub.subscribe(\n\t\t\tPublishableVideoPlayerEvents.READY,\n\t\t\tthis.onApiLoaded.bind(this)\n\t\t);\n\t\treturn Promise.resolve();\n\t}\n\n\tprotected _postPlayAdInstant = () => {}; // Do Nothing here\n\n\tprotected _initApiListeners() {\n\t\tthis.dailymotion.getPlayer(this._player.id).then((player) => {\n\t\t\tthis._apiListenersActions.forEach((listener) =>\n\t\t\t\tplayer.on(listener.message, listener.actionFn)\n\t\t\t);\n\t\t});\n\t}\n\n\tprotected _initErrorsListeners = () => {}; // Do Nothing here\n\n\t/**\n\t * Emet un evenement\n\t * @param evt Mon event\n\t * @param ad Mon ad\n\t */\n\tprivate _emitEventHandler(evt: PublishableVideoAdEvents, ad?: any): void {\n\t\tthis._setAdsState(evt);\n\t\tthis.publishApiEvent(evt, ad);\n\t}\n\n\t// @Dam: TODO: Typer correctement cette methode\n\tprotected _getAdData = (ad: any) =>\n\t\tthis._player.api && (this._player.api as any).adData\n\t\t\t? (this._player.api as any).adData\n\t\t\t: null;\n\n\tprotected _getVideoBreak = (ad: any) =>\n\t\t(this._player as DailymotionEmbedPlayer).getRollPosition();\n\n\tpublic play = () => (this._ready ? this._player.api.play() : undefined);\n\tpublic pause = () => (this._ready ? this._player.api.pause() : undefined);\n\tpublic mute = () =>\n\t\tthis._ready ? (this._player as DailymotionEmbedPlayer).mute() : undefined;\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.DailymotionEmbedAdPlayer = DailymotionEmbedAdPlayer;\n","// NOTE: this list must be up-to-date with browsers listed in\n// test/acceptance/useragentstrings.yml\nexport const BROWSER_ALIASES_MAP = {\n 'Amazon Silk': 'amazon_silk',\n 'Android Browser': 'android',\n Bada: 'bada',\n BlackBerry: 'blackberry',\n Chrome: 'chrome',\n Chromium: 'chromium',\n Electron: 'electron',\n Epiphany: 'epiphany',\n Firefox: 'firefox',\n Focus: 'focus',\n Generic: 'generic',\n 'Google Search': 'google_search',\n Googlebot: 'googlebot',\n 'Internet Explorer': 'ie',\n 'K-Meleon': 'k_meleon',\n Maxthon: 'maxthon',\n 'Microsoft Edge': 'edge',\n 'MZ Browser': 'mz',\n 'NAVER Whale Browser': 'naver',\n Opera: 'opera',\n 'Opera Coast': 'opera_coast',\n PhantomJS: 'phantomjs',\n Puffin: 'puffin',\n QupZilla: 'qupzilla',\n QQ: 'qq',\n QQLite: 'qqlite',\n Safari: 'safari',\n Sailfish: 'sailfish',\n 'Samsung Internet for Android': 'samsung_internet',\n SeaMonkey: 'seamonkey',\n Sleipnir: 'sleipnir',\n Swing: 'swing',\n Tizen: 'tizen',\n 'UC Browser': 'uc',\n Vivaldi: 'vivaldi',\n 'WebOS Browser': 'webos',\n WeChat: 'wechat',\n 'Yandex Browser': 'yandex',\n Roku: 'roku',\n};\n\nexport const BROWSER_MAP = {\n amazon_silk: 'Amazon Silk',\n android: 'Android Browser',\n bada: 'Bada',\n blackberry: 'BlackBerry',\n chrome: 'Chrome',\n chromium: 'Chromium',\n electron: 'Electron',\n epiphany: 'Epiphany',\n firefox: 'Firefox',\n focus: 'Focus',\n generic: 'Generic',\n googlebot: 'Googlebot',\n google_search: 'Google Search',\n ie: 'Internet Explorer',\n k_meleon: 'K-Meleon',\n maxthon: 'Maxthon',\n edge: 'Microsoft Edge',\n mz: 'MZ Browser',\n naver: 'NAVER Whale Browser',\n opera: 'Opera',\n opera_coast: 'Opera Coast',\n phantomjs: 'PhantomJS',\n puffin: 'Puffin',\n qupzilla: 'QupZilla',\n qq: 'QQ Browser',\n qqlite: 'QQ Browser Lite',\n safari: 'Safari',\n sailfish: 'Sailfish',\n samsung_internet: 'Samsung Internet for Android',\n seamonkey: 'SeaMonkey',\n sleipnir: 'Sleipnir',\n swing: 'Swing',\n tizen: 'Tizen',\n uc: 'UC Browser',\n vivaldi: 'Vivaldi',\n webos: 'WebOS Browser',\n wechat: 'WeChat',\n yandex: 'Yandex Browser',\n};\n\nexport const PLATFORMS_MAP = {\n tablet: 'tablet',\n mobile: 'mobile',\n desktop: 'desktop',\n tv: 'tv',\n};\n\nexport const OS_MAP = {\n WindowsPhone: 'Windows Phone',\n Windows: 'Windows',\n MacOS: 'macOS',\n iOS: 'iOS',\n Android: 'Android',\n WebOS: 'WebOS',\n BlackBerry: 'BlackBerry',\n Bada: 'Bada',\n Tizen: 'Tizen',\n Linux: 'Linux',\n ChromeOS: 'Chrome OS',\n PlayStation4: 'PlayStation 4',\n Roku: 'Roku',\n};\n\nexport const ENGINE_MAP = {\n EdgeHTML: 'EdgeHTML',\n Blink: 'Blink',\n Trident: 'Trident',\n Presto: 'Presto',\n Gecko: 'Gecko',\n WebKit: 'WebKit',\n};\n","import { BROWSER_MAP, BROWSER_ALIASES_MAP } from './constants.js';\n\nexport default class Utils {\n /**\n * Get first matched item for a string\n * @param {RegExp} regexp\n * @param {String} ua\n * @return {Array|{index: number, input: string}|*|boolean|string}\n */\n static getFirstMatch(regexp, ua) {\n const match = ua.match(regexp);\n return (match && match.length > 0 && match[1]) || '';\n }\n\n /**\n * Get second matched item for a string\n * @param regexp\n * @param {String} ua\n * @return {Array|{index: number, input: string}|*|boolean|string}\n */\n static getSecondMatch(regexp, ua) {\n const match = ua.match(regexp);\n return (match && match.length > 1 && match[2]) || '';\n }\n\n /**\n * Match a regexp and return a constant or undefined\n * @param {RegExp} regexp\n * @param {String} ua\n * @param {*} _const Any const that will be returned if regexp matches the string\n * @return {*}\n */\n static matchAndReturnConst(regexp, ua, _const) {\n if (regexp.test(ua)) {\n return _const;\n }\n return void (0);\n }\n\n static getWindowsVersionName(version) {\n switch (version) {\n case 'NT': return 'NT';\n case 'XP': return 'XP';\n case 'NT 5.0': return '2000';\n case 'NT 5.1': return 'XP';\n case 'NT 5.2': return '2003';\n case 'NT 6.0': return 'Vista';\n case 'NT 6.1': return '7';\n case 'NT 6.2': return '8';\n case 'NT 6.3': return '8.1';\n case 'NT 10.0': return '10';\n default: return undefined;\n }\n }\n\n /**\n * Get macOS version name\n * 10.5 - Leopard\n * 10.6 - Snow Leopard\n * 10.7 - Lion\n * 10.8 - Mountain Lion\n * 10.9 - Mavericks\n * 10.10 - Yosemite\n * 10.11 - El Capitan\n * 10.12 - Sierra\n * 10.13 - High Sierra\n * 10.14 - Mojave\n * 10.15 - Catalina\n *\n * @example\n * getMacOSVersionName(\"10.14\") // 'Mojave'\n *\n * @param {string} version\n * @return {string} versionName\n */\n static getMacOSVersionName(version) {\n const v = version.split('.').splice(0, 2).map(s => parseInt(s, 10) || 0);\n v.push(0);\n if (v[0] !== 10) return undefined;\n switch (v[1]) {\n case 5: return 'Leopard';\n case 6: return 'Snow Leopard';\n case 7: return 'Lion';\n case 8: return 'Mountain Lion';\n case 9: return 'Mavericks';\n case 10: return 'Yosemite';\n case 11: return 'El Capitan';\n case 12: return 'Sierra';\n case 13: return 'High Sierra';\n case 14: return 'Mojave';\n case 15: return 'Catalina';\n default: return undefined;\n }\n }\n\n /**\n * Get Android version name\n * 1.5 - Cupcake\n * 1.6 - Donut\n * 2.0 - Eclair\n * 2.1 - Eclair\n * 2.2 - Froyo\n * 2.x - Gingerbread\n * 3.x - Honeycomb\n * 4.0 - Ice Cream Sandwich\n * 4.1 - Jelly Bean\n * 4.4 - KitKat\n * 5.x - Lollipop\n * 6.x - Marshmallow\n * 7.x - Nougat\n * 8.x - Oreo\n * 9.x - Pie\n *\n * @example\n * getAndroidVersionName(\"7.0\") // 'Nougat'\n *\n * @param {string} version\n * @return {string} versionName\n */\n static getAndroidVersionName(version) {\n const v = version.split('.').splice(0, 2).map(s => parseInt(s, 10) || 0);\n v.push(0);\n if (v[0] === 1 && v[1] < 5) return undefined;\n if (v[0] === 1 && v[1] < 6) return 'Cupcake';\n if (v[0] === 1 && v[1] >= 6) return 'Donut';\n if (v[0] === 2 && v[1] < 2) return 'Eclair';\n if (v[0] === 2 && v[1] === 2) return 'Froyo';\n if (v[0] === 2 && v[1] > 2) return 'Gingerbread';\n if (v[0] === 3) return 'Honeycomb';\n if (v[0] === 4 && v[1] < 1) return 'Ice Cream Sandwich';\n if (v[0] === 4 && v[1] < 4) return 'Jelly Bean';\n if (v[0] === 4 && v[1] >= 4) return 'KitKat';\n if (v[0] === 5) return 'Lollipop';\n if (v[0] === 6) return 'Marshmallow';\n if (v[0] === 7) return 'Nougat';\n if (v[0] === 8) return 'Oreo';\n if (v[0] === 9) return 'Pie';\n return undefined;\n }\n\n /**\n * Get version precisions count\n *\n * @example\n * getVersionPrecision(\"1.10.3\") // 3\n *\n * @param {string} version\n * @return {number}\n */\n static getVersionPrecision(version) {\n return version.split('.').length;\n }\n\n /**\n * Calculate browser version weight\n *\n * @example\n * compareVersions('1.10.2.1', '1.8.2.1.90') // 1\n * compareVersions('1.010.2.1', '1.09.2.1.90'); // 1\n * compareVersions('1.10.2.1', '1.10.2.1'); // 0\n * compareVersions('1.10.2.1', '1.0800.2'); // -1\n * compareVersions('1.10.2.1', '1.10', true); // 0\n *\n * @param {String} versionA versions versions to compare\n * @param {String} versionB versions versions to compare\n * @param {boolean} [isLoose] enable loose comparison\n * @return {Number} comparison result: -1 when versionA is lower,\n * 1 when versionA is bigger, 0 when both equal\n */\n /* eslint consistent-return: 1 */\n static compareVersions(versionA, versionB, isLoose = false) {\n // 1) get common precision for both versions, for example for \"10.0\" and \"9\" it should be 2\n const versionAPrecision = Utils.getVersionPrecision(versionA);\n const versionBPrecision = Utils.getVersionPrecision(versionB);\n\n let precision = Math.max(versionAPrecision, versionBPrecision);\n let lastPrecision = 0;\n\n const chunks = Utils.map([versionA, versionB], (version) => {\n const delta = precision - Utils.getVersionPrecision(version);\n\n // 2) \"9\" -> \"9.0\" (for precision = 2)\n const _version = version + new Array(delta + 1).join('.0');\n\n // 3) \"9.0\" -> [\"000000000\"\", \"000000009\"]\n return Utils.map(_version.split('.'), chunk => new Array(20 - chunk.length).join('0') + chunk).reverse();\n });\n\n // adjust precision for loose comparison\n if (isLoose) {\n lastPrecision = precision - Math.min(versionAPrecision, versionBPrecision);\n }\n\n // iterate in reverse order by reversed chunks array\n precision -= 1;\n while (precision >= lastPrecision) {\n // 4) compare: \"000000009\" > \"000000010\" = false (but \"9\" > \"10\" = true)\n if (chunks[0][precision] > chunks[1][precision]) {\n return 1;\n }\n\n if (chunks[0][precision] === chunks[1][precision]) {\n if (precision === lastPrecision) {\n // all version chunks are same\n return 0;\n }\n\n precision -= 1;\n } else if (chunks[0][precision] < chunks[1][precision]) {\n return -1;\n }\n }\n\n return undefined;\n }\n\n /**\n * Array::map polyfill\n *\n * @param {Array} arr\n * @param {Function} iterator\n * @return {Array}\n */\n static map(arr, iterator) {\n const result = [];\n let i;\n if (Array.prototype.map) {\n return Array.prototype.map.call(arr, iterator);\n }\n for (i = 0; i < arr.length; i += 1) {\n result.push(iterator(arr[i]));\n }\n return result;\n }\n\n /**\n * Array::find polyfill\n *\n * @param {Array} arr\n * @param {Function} predicate\n * @return {Array}\n */\n static find(arr, predicate) {\n let i;\n let l;\n if (Array.prototype.find) {\n return Array.prototype.find.call(arr, predicate);\n }\n for (i = 0, l = arr.length; i < l; i += 1) {\n const value = arr[i];\n if (predicate(value, i)) {\n return value;\n }\n }\n return undefined;\n }\n\n /**\n * Object::assign polyfill\n *\n * @param {Object} obj\n * @param {Object} ...objs\n * @return {Object}\n */\n static assign(obj, ...assigners) {\n const result = obj;\n let i;\n let l;\n if (Object.assign) {\n return Object.assign(obj, ...assigners);\n }\n for (i = 0, l = assigners.length; i < l; i += 1) {\n const assigner = assigners[i];\n if (typeof assigner === 'object' && assigner !== null) {\n const keys = Object.keys(assigner);\n keys.forEach((key) => {\n result[key] = assigner[key];\n });\n }\n }\n return obj;\n }\n\n /**\n * Get short version/alias for a browser name\n *\n * @example\n * getBrowserAlias('Microsoft Edge') // edge\n *\n * @param {string} browserName\n * @return {string}\n */\n static getBrowserAlias(browserName) {\n return BROWSER_ALIASES_MAP[browserName];\n }\n\n /**\n * Get short version/alias for a browser name\n *\n * @example\n * getBrowserAlias('edge') // Microsoft Edge\n *\n * @param {string} browserAlias\n * @return {string}\n */\n static getBrowserTypeByAlias(browserAlias) {\n return BROWSER_MAP[browserAlias] || '';\n }\n}\n","/**\n * Browsers' descriptors\n *\n * The idea of descriptors is simple. You should know about them two simple things:\n * 1. Every descriptor has a method or property called `test` and a `describe` method.\n * 2. Order of descriptors is important.\n *\n * More details:\n * 1. Method or property `test` serves as a way to detect whether the UA string\n * matches some certain browser or not. The `describe` method helps to make a result\n * object with params that show some browser-specific things: name, version, etc.\n * 2. Order of descriptors is important because a Parser goes through them one by one\n * in course. For example, if you insert Chrome's descriptor as the first one,\n * more then a half of browsers will be described as Chrome, because they will pass\n * the Chrome descriptor's test.\n *\n * Descriptor's `test` could be a property with an array of RegExps, where every RegExp\n * will be applied to a UA string to test it whether it matches or not.\n * If a descriptor has two or more regexps in the `test` array it tests them one by one\n * with a logical sum operation. Parser stops if it has found any RegExp that matches the UA.\n *\n * Or `test` could be a method. In that case it gets a Parser instance and should\n * return true/false to get the Parser know if this browser descriptor matches the UA or not.\n */\n\nimport Utils from './utils.js';\n\nconst commonVersionIdentifier = /version\\/(\\d+(\\.?_?\\d+)+)/i;\n\nconst browsersList = [\n /* Googlebot */\n {\n test: [/googlebot/i],\n describe(ua) {\n const browser = {\n name: 'Googlebot',\n };\n const version = Utils.getFirstMatch(/googlebot\\/(\\d+(\\.\\d+))/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n\n /* Opera < 13.0 */\n {\n test: [/opera/i],\n describe(ua) {\n const browser = {\n name: 'Opera',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:opera)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n\n /* Opera > 13.0 */\n {\n test: [/opr\\/|opios/i],\n describe(ua) {\n const browser = {\n name: 'Opera',\n };\n const version = Utils.getFirstMatch(/(?:opr|opios)[\\s/](\\S+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/SamsungBrowser/i],\n describe(ua) {\n const browser = {\n name: 'Samsung Internet for Android',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:SamsungBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/Whale/i],\n describe(ua) {\n const browser = {\n name: 'NAVER Whale Browser',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:whale)[\\s/](\\d+(?:\\.\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/MZBrowser/i],\n describe(ua) {\n const browser = {\n name: 'MZ Browser',\n };\n const version = Utils.getFirstMatch(/(?:MZBrowser)[\\s/](\\d+(?:\\.\\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/focus/i],\n describe(ua) {\n const browser = {\n name: 'Focus',\n };\n const version = Utils.getFirstMatch(/(?:focus)[\\s/](\\d+(?:\\.\\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/swing/i],\n describe(ua) {\n const browser = {\n name: 'Swing',\n };\n const version = Utils.getFirstMatch(/(?:swing)[\\s/](\\d+(?:\\.\\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/coast/i],\n describe(ua) {\n const browser = {\n name: 'Opera Coast',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:coast)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/opt\\/\\d+(?:.?_?\\d+)+/i],\n describe(ua) {\n const browser = {\n name: 'Opera Touch',\n };\n const version = Utils.getFirstMatch(/(?:opt)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/yabrowser/i],\n describe(ua) {\n const browser = {\n name: 'Yandex Browser',\n };\n const version = Utils.getFirstMatch(/(?:yabrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/ucbrowser/i],\n describe(ua) {\n const browser = {\n name: 'UC Browser',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:ucbrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/Maxthon|mxios/i],\n describe(ua) {\n const browser = {\n name: 'Maxthon',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:Maxthon|mxios)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/epiphany/i],\n describe(ua) {\n const browser = {\n name: 'Epiphany',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:epiphany)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/puffin/i],\n describe(ua) {\n const browser = {\n name: 'Puffin',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:puffin)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/sleipnir/i],\n describe(ua) {\n const browser = {\n name: 'Sleipnir',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:sleipnir)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/k-meleon/i],\n describe(ua) {\n const browser = {\n name: 'K-Meleon',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:k-meleon)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/micromessenger/i],\n describe(ua) {\n const browser = {\n name: 'WeChat',\n };\n const version = Utils.getFirstMatch(/(?:micromessenger)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/qqbrowser/i],\n describe(ua) {\n const browser = {\n name: (/qqbrowserlite/i).test(ua) ? 'QQ Browser Lite' : 'QQ Browser',\n };\n const version = Utils.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\\d+(\\.?_?\\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/msie|trident/i],\n describe(ua) {\n const browser = {\n name: 'Internet Explorer',\n };\n const version = Utils.getFirstMatch(/(?:msie |rv:)(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/\\sedg\\//i],\n describe(ua) {\n const browser = {\n name: 'Microsoft Edge',\n };\n\n const version = Utils.getFirstMatch(/\\sedg\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/edg([ea]|ios)/i],\n describe(ua) {\n const browser = {\n name: 'Microsoft Edge',\n };\n\n const version = Utils.getSecondMatch(/edg([ea]|ios)\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/vivaldi/i],\n describe(ua) {\n const browser = {\n name: 'Vivaldi',\n };\n const version = Utils.getFirstMatch(/vivaldi\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/seamonkey/i],\n describe(ua) {\n const browser = {\n name: 'SeaMonkey',\n };\n const version = Utils.getFirstMatch(/seamonkey\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/sailfish/i],\n describe(ua) {\n const browser = {\n name: 'Sailfish',\n };\n\n const version = Utils.getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/silk/i],\n describe(ua) {\n const browser = {\n name: 'Amazon Silk',\n };\n const version = Utils.getFirstMatch(/silk\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/phantom/i],\n describe(ua) {\n const browser = {\n name: 'PhantomJS',\n };\n const version = Utils.getFirstMatch(/phantomjs\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/slimerjs/i],\n describe(ua) {\n const browser = {\n name: 'SlimerJS',\n };\n const version = Utils.getFirstMatch(/slimerjs\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/blackberry|\\bbb\\d+/i, /rim\\stablet/i],\n describe(ua) {\n const browser = {\n name: 'BlackBerry',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/(web|hpw)[o0]s/i],\n describe(ua) {\n const browser = {\n name: 'WebOS Browser',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/w(?:eb)?[o0]sbrowser\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/bada/i],\n describe(ua) {\n const browser = {\n name: 'Bada',\n };\n const version = Utils.getFirstMatch(/dolfin\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/tizen/i],\n describe(ua) {\n const browser = {\n name: 'Tizen',\n };\n const version = Utils.getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.?_?\\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/qupzilla/i],\n describe(ua) {\n const browser = {\n name: 'QupZilla',\n };\n const version = Utils.getFirstMatch(/(?:qupzilla)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/firefox|iceweasel|fxios/i],\n describe(ua) {\n const browser = {\n name: 'Firefox',\n };\n const version = Utils.getFirstMatch(/(?:firefox|iceweasel|fxios)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/electron/i],\n describe(ua) {\n const browser = {\n name: 'Electron',\n };\n const version = Utils.getFirstMatch(/(?:electron)\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/MiuiBrowser/i],\n describe(ua) {\n const browser = {\n name: 'Miui',\n };\n const version = Utils.getFirstMatch(/(?:MiuiBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/chromium/i],\n describe(ua) {\n const browser = {\n name: 'Chromium',\n };\n const version = Utils.getFirstMatch(/(?:chromium)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/chrome|crios|crmo/i],\n describe(ua) {\n const browser = {\n name: 'Chrome',\n };\n const version = Utils.getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n {\n test: [/GSA/i],\n describe(ua) {\n const browser = {\n name: 'Google Search',\n };\n const version = Utils.getFirstMatch(/(?:GSA)\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n\n /* Android Browser */\n {\n test(parser) {\n const notLikeAndroid = !parser.test(/like android/i);\n const butAndroid = parser.test(/android/i);\n return notLikeAndroid && butAndroid;\n },\n describe(ua) {\n const browser = {\n name: 'Android Browser',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n\n /* PlayStation 4 */\n {\n test: [/playstation 4/i],\n describe(ua) {\n const browser = {\n name: 'PlayStation 4',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n\n /* Safari */\n {\n test: [/safari|applewebkit/i],\n describe(ua) {\n const browser = {\n name: 'Safari',\n };\n const version = Utils.getFirstMatch(commonVersionIdentifier, ua);\n\n if (version) {\n browser.version = version;\n }\n\n return browser;\n },\n },\n\n /* Something else */\n {\n test: [/.*/i],\n describe(ua) {\n /* Here we try to make sure that there are explicit details about the device\n * in order to decide what regexp exactly we want to apply\n * (as there is a specific decision based on that conclusion)\n */\n const regexpWithoutDeviceSpec = /^(.*)\\/(.*) /;\n const regexpWithDeviceSpec = /^(.*)\\/(.*)[ \\t]\\((.*)/;\n const hasDeviceSpec = ua.search('\\\\(') !== -1;\n const regexp = hasDeviceSpec ? regexpWithDeviceSpec : regexpWithoutDeviceSpec;\n return {\n name: Utils.getFirstMatch(regexp, ua),\n version: Utils.getSecondMatch(regexp, ua),\n };\n },\n },\n];\n\nexport default browsersList;\n","import Utils from './utils.js';\nimport { OS_MAP } from './constants.js';\n\nexport default [\n /* Roku */\n {\n test: [/Roku\\/DVP/],\n describe(ua) {\n const version = Utils.getFirstMatch(/Roku\\/DVP-(\\d+\\.\\d+)/i, ua);\n return {\n name: OS_MAP.Roku,\n version,\n };\n },\n },\n\n /* Windows Phone */\n {\n test: [/windows phone/i],\n describe(ua) {\n const version = Utils.getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i, ua);\n return {\n name: OS_MAP.WindowsPhone,\n version,\n };\n },\n },\n\n /* Windows */\n {\n test: [/windows /i],\n describe(ua) {\n const version = Utils.getFirstMatch(/Windows ((NT|XP)( \\d\\d?.\\d)?)/i, ua);\n const versionName = Utils.getWindowsVersionName(version);\n\n return {\n name: OS_MAP.Windows,\n version,\n versionName,\n };\n },\n },\n\n /* Firefox on iPad */\n {\n test: [/Macintosh(.*?) FxiOS(.*?)\\//],\n describe(ua) {\n const result = {\n name: OS_MAP.iOS,\n };\n const version = Utils.getSecondMatch(/(Version\\/)(\\d[\\d.]+)/, ua);\n if (version) {\n result.version = version;\n }\n return result;\n },\n },\n\n /* macOS */\n {\n test: [/macintosh/i],\n describe(ua) {\n const version = Utils.getFirstMatch(/mac os x (\\d+(\\.?_?\\d+)+)/i, ua).replace(/[_\\s]/g, '.');\n const versionName = Utils.getMacOSVersionName(version);\n\n const os = {\n name: OS_MAP.MacOS,\n version,\n };\n if (versionName) {\n os.versionName = versionName;\n }\n return os;\n },\n },\n\n /* iOS */\n {\n test: [/(ipod|iphone|ipad)/i],\n describe(ua) {\n const version = Utils.getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i, ua).replace(/[_\\s]/g, '.');\n\n return {\n name: OS_MAP.iOS,\n version,\n };\n },\n },\n\n /* Android */\n {\n test(parser) {\n const notLikeAndroid = !parser.test(/like android/i);\n const butAndroid = parser.test(/android/i);\n return notLikeAndroid && butAndroid;\n },\n describe(ua) {\n const version = Utils.getFirstMatch(/android[\\s/-](\\d+(\\.\\d+)*)/i, ua);\n const versionName = Utils.getAndroidVersionName(version);\n const os = {\n name: OS_MAP.Android,\n version,\n };\n if (versionName) {\n os.versionName = versionName;\n }\n return os;\n },\n },\n\n /* WebOS */\n {\n test: [/(web|hpw)[o0]s/i],\n describe(ua) {\n const version = Utils.getFirstMatch(/(?:web|hpw)[o0]s\\/(\\d+(\\.\\d+)*)/i, ua);\n const os = {\n name: OS_MAP.WebOS,\n };\n\n if (version && version.length) {\n os.version = version;\n }\n return os;\n },\n },\n\n /* BlackBerry */\n {\n test: [/blackberry|\\bbb\\d+/i, /rim\\stablet/i],\n describe(ua) {\n const version = Utils.getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i, ua)\n || Utils.getFirstMatch(/blackberry\\d+\\/(\\d+([_\\s]\\d+)*)/i, ua)\n || Utils.getFirstMatch(/\\bbb(\\d+)/i, ua);\n\n return {\n name: OS_MAP.BlackBerry,\n version,\n };\n },\n },\n\n /* Bada */\n {\n test: [/bada/i],\n describe(ua) {\n const version = Utils.getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i, ua);\n\n return {\n name: OS_MAP.Bada,\n version,\n };\n },\n },\n\n /* Tizen */\n {\n test: [/tizen/i],\n describe(ua) {\n const version = Utils.getFirstMatch(/tizen[/\\s](\\d+(\\.\\d+)*)/i, ua);\n\n return {\n name: OS_MAP.Tizen,\n version,\n };\n },\n },\n\n /* Linux */\n {\n test: [/linux/i],\n describe() {\n return {\n name: OS_MAP.Linux,\n };\n },\n },\n\n /* Chrome OS */\n {\n test: [/CrOS/],\n describe() {\n return {\n name: OS_MAP.ChromeOS,\n };\n },\n },\n\n /* Playstation 4 */\n {\n test: [/PlayStation 4/],\n describe(ua) {\n const version = Utils.getFirstMatch(/PlayStation 4[/\\s](\\d+(\\.\\d+)*)/i, ua);\n return {\n name: OS_MAP.PlayStation4,\n version,\n };\n },\n },\n];\n","import Utils from './utils.js';\nimport { PLATFORMS_MAP } from './constants.js';\n\n/*\n * Tablets go first since usually they have more specific\n * signs to detect.\n */\n\nexport default [\n /* Googlebot */\n {\n test: [/googlebot/i],\n describe() {\n return {\n type: 'bot',\n vendor: 'Google',\n };\n },\n },\n\n /* Huawei */\n {\n test: [/huawei/i],\n describe(ua) {\n const model = Utils.getFirstMatch(/(can-l01)/i, ua) && 'Nova';\n const platform = {\n type: PLATFORMS_MAP.mobile,\n vendor: 'Huawei',\n };\n if (model) {\n platform.model = model;\n }\n return platform;\n },\n },\n\n /* Nexus Tablet */\n {\n test: [/nexus\\s*(?:7|8|9|10).*/i],\n describe() {\n return {\n type: PLATFORMS_MAP.tablet,\n vendor: 'Nexus',\n };\n },\n },\n\n /* iPad */\n {\n test: [/ipad/i],\n describe() {\n return {\n type: PLATFORMS_MAP.tablet,\n vendor: 'Apple',\n model: 'iPad',\n };\n },\n },\n\n /* Firefox on iPad */\n {\n test: [/Macintosh(.*?) FxiOS(.*?)\\//],\n describe() {\n return {\n type: PLATFORMS_MAP.tablet,\n vendor: 'Apple',\n model: 'iPad',\n };\n },\n },\n\n /* Amazon Kindle Fire */\n {\n test: [/kftt build/i],\n describe() {\n return {\n type: PLATFORMS_MAP.tablet,\n vendor: 'Amazon',\n model: 'Kindle Fire HD 7',\n };\n },\n },\n\n /* Another Amazon Tablet with Silk */\n {\n test: [/silk/i],\n describe() {\n return {\n type: PLATFORMS_MAP.tablet,\n vendor: 'Amazon',\n };\n },\n },\n\n /* Tablet */\n {\n test: [/tablet(?! pc)/i],\n describe() {\n return {\n type: PLATFORMS_MAP.tablet,\n };\n },\n },\n\n /* iPod/iPhone */\n {\n test(parser) {\n const iDevice = parser.test(/ipod|iphone/i);\n const likeIDevice = parser.test(/like (ipod|iphone)/i);\n return iDevice && !likeIDevice;\n },\n describe(ua) {\n const model = Utils.getFirstMatch(/(ipod|iphone)/i, ua);\n return {\n type: PLATFORMS_MAP.mobile,\n vendor: 'Apple',\n model,\n };\n },\n },\n\n /* Nexus Mobile */\n {\n test: [/nexus\\s*[0-6].*/i, /galaxy nexus/i],\n describe() {\n return {\n type: PLATFORMS_MAP.mobile,\n vendor: 'Nexus',\n };\n },\n },\n\n /* Mobile */\n {\n test: [/[^-]mobi/i],\n describe() {\n return {\n type: PLATFORMS_MAP.mobile,\n };\n },\n },\n\n /* BlackBerry */\n {\n test(parser) {\n return parser.getBrowserName(true) === 'blackberry';\n },\n describe() {\n return {\n type: PLATFORMS_MAP.mobile,\n vendor: 'BlackBerry',\n };\n },\n },\n\n /* Bada */\n {\n test(parser) {\n return parser.getBrowserName(true) === 'bada';\n },\n describe() {\n return {\n type: PLATFORMS_MAP.mobile,\n };\n },\n },\n\n /* Windows Phone */\n {\n test(parser) {\n return parser.getBrowserName() === 'windows phone';\n },\n describe() {\n return {\n type: PLATFORMS_MAP.mobile,\n vendor: 'Microsoft',\n };\n },\n },\n\n /* Android Tablet */\n {\n test(parser) {\n const osMajorVersion = Number(String(parser.getOSVersion()).split('.')[0]);\n return parser.getOSName(true) === 'android' && (osMajorVersion >= 3);\n },\n describe() {\n return {\n type: PLATFORMS_MAP.tablet,\n };\n },\n },\n\n /* Android Mobile */\n {\n test(parser) {\n return parser.getOSName(true) === 'android';\n },\n describe() {\n return {\n type: PLATFORMS_MAP.mobile,\n };\n },\n },\n\n /* desktop */\n {\n test(parser) {\n return parser.getOSName(true) === 'macos';\n },\n describe() {\n return {\n type: PLATFORMS_MAP.desktop,\n vendor: 'Apple',\n };\n },\n },\n\n /* Windows */\n {\n test(parser) {\n return parser.getOSName(true) === 'windows';\n },\n describe() {\n return {\n type: PLATFORMS_MAP.desktop,\n };\n },\n },\n\n /* Linux */\n {\n test(parser) {\n return parser.getOSName(true) === 'linux';\n },\n describe() {\n return {\n type: PLATFORMS_MAP.desktop,\n };\n },\n },\n\n /* PlayStation 4 */\n {\n test(parser) {\n return parser.getOSName(true) === 'playstation 4';\n },\n describe() {\n return {\n type: PLATFORMS_MAP.tv,\n };\n },\n },\n\n /* Roku */\n {\n test(parser) {\n return parser.getOSName(true) === 'roku';\n },\n describe() {\n return {\n type: PLATFORMS_MAP.tv,\n };\n },\n },\n];\n","import Utils from './utils.js';\nimport { ENGINE_MAP } from './constants.js';\n\n/*\n * More specific goes first\n */\nexport default [\n /* EdgeHTML */\n {\n test(parser) {\n return parser.getBrowserName(true) === 'microsoft edge';\n },\n describe(ua) {\n const isBlinkBased = /\\sedg\\//i.test(ua);\n\n // return blink if it's blink-based one\n if (isBlinkBased) {\n return {\n name: ENGINE_MAP.Blink,\n };\n }\n\n // otherwise match the version and return EdgeHTML\n const version = Utils.getFirstMatch(/edge\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n return {\n name: ENGINE_MAP.EdgeHTML,\n version,\n };\n },\n },\n\n /* Trident */\n {\n test: [/trident/i],\n describe(ua) {\n const engine = {\n name: ENGINE_MAP.Trident,\n };\n\n const version = Utils.getFirstMatch(/trident\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n engine.version = version;\n }\n\n return engine;\n },\n },\n\n /* Presto */\n {\n test(parser) {\n return parser.test(/presto/i);\n },\n describe(ua) {\n const engine = {\n name: ENGINE_MAP.Presto,\n };\n\n const version = Utils.getFirstMatch(/presto\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n engine.version = version;\n }\n\n return engine;\n },\n },\n\n /* Gecko */\n {\n test(parser) {\n const isGecko = parser.test(/gecko/i);\n const likeGecko = parser.test(/like gecko/i);\n return isGecko && !likeGecko;\n },\n describe(ua) {\n const engine = {\n name: ENGINE_MAP.Gecko,\n };\n\n const version = Utils.getFirstMatch(/gecko\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n engine.version = version;\n }\n\n return engine;\n },\n },\n\n /* Blink */\n {\n test: [/(apple)?webkit\\/537\\.36/i],\n describe() {\n return {\n name: ENGINE_MAP.Blink,\n };\n },\n },\n\n /* WebKit */\n {\n test: [/(apple)?webkit/i],\n describe(ua) {\n const engine = {\n name: ENGINE_MAP.WebKit,\n };\n\n const version = Utils.getFirstMatch(/webkit\\/(\\d+(\\.?_?\\d+)+)/i, ua);\n\n if (version) {\n engine.version = version;\n }\n\n return engine;\n },\n },\n];\n","import browserParsersList from './parser-browsers.js';\nimport osParsersList from './parser-os.js';\nimport platformParsersList from './parser-platforms.js';\nimport enginesParsersList from './parser-engines.js';\nimport Utils from './utils.js';\n\n/**\n * The main class that arranges the whole parsing process.\n */\nclass Parser {\n /**\n * Create instance of Parser\n *\n * @param {String} UA User-Agent string\n * @param {Boolean} [skipParsing=false] parser can skip parsing in purpose of performance\n * improvements if you need to make a more particular parsing\n * like {@link Parser#parseBrowser} or {@link Parser#parsePlatform}\n *\n * @throw {Error} in case of empty UA String\n *\n * @constructor\n */\n constructor(UA, skipParsing = false) {\n if (UA === void (0) || UA === null || UA === '') {\n throw new Error(\"UserAgent parameter can't be empty\");\n }\n\n this._ua = UA;\n\n /**\n * @typedef ParsedResult\n * @property {Object} browser\n * @property {String|undefined} [browser.name]\n * Browser name, like `\"Chrome\"` or `\"Internet Explorer\"`\n * @property {String|undefined} [browser.version] Browser version as a String `\"12.01.45334.10\"`\n * @property {Object} os\n * @property {String|undefined} [os.name] OS name, like `\"Windows\"` or `\"macOS\"`\n * @property {String|undefined} [os.version] OS version, like `\"NT 5.1\"` or `\"10.11.1\"`\n * @property {String|undefined} [os.versionName] OS name, like `\"XP\"` or `\"High Sierra\"`\n * @property {Object} platform\n * @property {String|undefined} [platform.type]\n * platform type, can be either `\"desktop\"`, `\"tablet\"` or `\"mobile\"`\n * @property {String|undefined} [platform.vendor] Vendor of the device,\n * like `\"Apple\"` or `\"Samsung\"`\n * @property {String|undefined} [platform.model] Device model,\n * like `\"iPhone\"` or `\"Kindle Fire HD 7\"`\n * @property {Object} engine\n * @property {String|undefined} [engine.name]\n * Can be any of this: `WebKit`, `Blink`, `Gecko`, `Trident`, `Presto`, `EdgeHTML`\n * @property {String|undefined} [engine.version] String version of the engine\n */\n this.parsedResult = {};\n\n if (skipParsing !== true) {\n this.parse();\n }\n }\n\n /**\n * Get UserAgent string of current Parser instance\n * @return {String} User-Agent String of the current object\n *\n * @public\n */\n getUA() {\n return this._ua;\n }\n\n /**\n * Test a UA string for a regexp\n * @param {RegExp} regex\n * @return {Boolean}\n */\n test(regex) {\n return regex.test(this._ua);\n }\n\n /**\n * Get parsed browser object\n * @return {Object}\n */\n parseBrowser() {\n this.parsedResult.browser = {};\n\n const browserDescriptor = Utils.find(browserParsersList, (_browser) => {\n if (typeof _browser.test === 'function') {\n return _browser.test(this);\n }\n\n if (_browser.test instanceof Array) {\n return _browser.test.some(condition => this.test(condition));\n }\n\n throw new Error(\"Browser's test function is not valid\");\n });\n\n if (browserDescriptor) {\n this.parsedResult.browser = browserDescriptor.describe(this.getUA());\n }\n\n return this.parsedResult.browser;\n }\n\n /**\n * Get parsed browser object\n * @return {Object}\n *\n * @public\n */\n getBrowser() {\n if (this.parsedResult.browser) {\n return this.parsedResult.browser;\n }\n\n return this.parseBrowser();\n }\n\n /**\n * Get browser's name\n * @return {String} Browser's name or an empty string\n *\n * @public\n */\n getBrowserName(toLowerCase) {\n if (toLowerCase) {\n return String(this.getBrowser().name).toLowerCase() || '';\n }\n return this.getBrowser().name || '';\n }\n\n\n /**\n * Get browser's version\n * @return {String} version of browser\n *\n * @public\n */\n getBrowserVersion() {\n return this.getBrowser().version;\n }\n\n /**\n * Get OS\n * @return {Object}\n *\n * @example\n * this.getOS();\n * {\n * name: 'macOS',\n * version: '10.11.12'\n * }\n */\n getOS() {\n if (this.parsedResult.os) {\n return this.parsedResult.os;\n }\n\n return this.parseOS();\n }\n\n /**\n * Parse OS and save it to this.parsedResult.os\n * @return {*|{}}\n */\n parseOS() {\n this.parsedResult.os = {};\n\n const os = Utils.find(osParsersList, (_os) => {\n if (typeof _os.test === 'function') {\n return _os.test(this);\n }\n\n if (_os.test instanceof Array) {\n return _os.test.some(condition => this.test(condition));\n }\n\n throw new Error(\"Browser's test function is not valid\");\n });\n\n if (os) {\n this.parsedResult.os = os.describe(this.getUA());\n }\n\n return this.parsedResult.os;\n }\n\n /**\n * Get OS name\n * @param {Boolean} [toLowerCase] return lower-cased value\n * @return {String} name of the OS — macOS, Windows, Linux, etc.\n */\n getOSName(toLowerCase) {\n const { name } = this.getOS();\n\n if (toLowerCase) {\n return String(name).toLowerCase() || '';\n }\n\n return name || '';\n }\n\n /**\n * Get OS version\n * @return {String} full version with dots ('10.11.12', '5.6', etc)\n */\n getOSVersion() {\n return this.getOS().version;\n }\n\n /**\n * Get parsed platform\n * @return {{}}\n */\n getPlatform() {\n if (this.parsedResult.platform) {\n return this.parsedResult.platform;\n }\n\n return this.parsePlatform();\n }\n\n /**\n * Get platform name\n * @param {Boolean} [toLowerCase=false]\n * @return {*}\n */\n getPlatformType(toLowerCase = false) {\n const { type } = this.getPlatform();\n\n if (toLowerCase) {\n return String(type).toLowerCase() || '';\n }\n\n return type || '';\n }\n\n /**\n * Get parsed platform\n * @return {{}}\n */\n parsePlatform() {\n this.parsedResult.platform = {};\n\n const platform = Utils.find(platformParsersList, (_platform) => {\n if (typeof _platform.test === 'function') {\n return _platform.test(this);\n }\n\n if (_platform.test instanceof Array) {\n return _platform.test.some(condition => this.test(condition));\n }\n\n throw new Error(\"Browser's test function is not valid\");\n });\n\n if (platform) {\n this.parsedResult.platform = platform.describe(this.getUA());\n }\n\n return this.parsedResult.platform;\n }\n\n /**\n * Get parsed engine\n * @return {{}}\n */\n getEngine() {\n if (this.parsedResult.engine) {\n return this.parsedResult.engine;\n }\n\n return this.parseEngine();\n }\n\n /**\n * Get engines's name\n * @return {String} Engines's name or an empty string\n *\n * @public\n */\n getEngineName(toLowerCase) {\n if (toLowerCase) {\n return String(this.getEngine().name).toLowerCase() || '';\n }\n return this.getEngine().name || '';\n }\n\n /**\n * Get parsed platform\n * @return {{}}\n */\n parseEngine() {\n this.parsedResult.engine = {};\n\n const engine = Utils.find(enginesParsersList, (_engine) => {\n if (typeof _engine.test === 'function') {\n return _engine.test(this);\n }\n\n if (_engine.test instanceof Array) {\n return _engine.test.some(condition => this.test(condition));\n }\n\n throw new Error(\"Browser's test function is not valid\");\n });\n\n if (engine) {\n this.parsedResult.engine = engine.describe(this.getUA());\n }\n\n return this.parsedResult.engine;\n }\n\n /**\n * Parse full information about the browser\n * @returns {Parser}\n */\n parse() {\n this.parseBrowser();\n this.parseOS();\n this.parsePlatform();\n this.parseEngine();\n\n return this;\n }\n\n /**\n * Get parsed result\n * @return {ParsedResult}\n */\n getResult() {\n return Utils.assign({}, this.parsedResult);\n }\n\n /**\n * Check if parsed browser matches certain conditions\n *\n * @param {Object} checkTree It's one or two layered object,\n * which can include a platform or an OS on the first layer\n * and should have browsers specs on the bottom-laying layer\n *\n * @returns {Boolean|undefined} Whether the browser satisfies the set conditions or not.\n * Returns `undefined` when the browser is no described in the checkTree object.\n *\n * @example\n * const browser = Bowser.getParser(window.navigator.userAgent);\n * if (browser.satisfies({chrome: '>118.01.1322' }))\n * // or with os\n * if (browser.satisfies({windows: { chrome: '>118.01.1322' } }))\n * // or with platforms\n * if (browser.satisfies({desktop: { chrome: '>118.01.1322' } }))\n */\n satisfies(checkTree) {\n const platformsAndOSes = {};\n let platformsAndOSCounter = 0;\n const browsers = {};\n let browsersCounter = 0;\n\n const allDefinitions = Object.keys(checkTree);\n\n allDefinitions.forEach((key) => {\n const currentDefinition = checkTree[key];\n if (typeof currentDefinition === 'string') {\n browsers[key] = currentDefinition;\n browsersCounter += 1;\n } else if (typeof currentDefinition === 'object') {\n platformsAndOSes[key] = currentDefinition;\n platformsAndOSCounter += 1;\n }\n });\n\n if (platformsAndOSCounter > 0) {\n const platformsAndOSNames = Object.keys(platformsAndOSes);\n const OSMatchingDefinition = Utils.find(platformsAndOSNames, name => (this.isOS(name)));\n\n if (OSMatchingDefinition) {\n const osResult = this.satisfies(platformsAndOSes[OSMatchingDefinition]);\n\n if (osResult !== void 0) {\n return osResult;\n }\n }\n\n const platformMatchingDefinition = Utils.find(\n platformsAndOSNames,\n name => (this.isPlatform(name)),\n );\n if (platformMatchingDefinition) {\n const platformResult = this.satisfies(platformsAndOSes[platformMatchingDefinition]);\n\n if (platformResult !== void 0) {\n return platformResult;\n }\n }\n }\n\n if (browsersCounter > 0) {\n const browserNames = Object.keys(browsers);\n const matchingDefinition = Utils.find(browserNames, name => (this.isBrowser(name, true)));\n\n if (matchingDefinition !== void 0) {\n return this.compareVersion(browsers[matchingDefinition]);\n }\n }\n\n return undefined;\n }\n\n /**\n * Check if the browser name equals the passed string\n * @param browserName The string to compare with the browser name\n * @param [includingAlias=false] The flag showing whether alias will be included into comparison\n * @returns {boolean}\n */\n isBrowser(browserName, includingAlias = false) {\n const defaultBrowserName = this.getBrowserName().toLowerCase();\n let browserNameLower = browserName.toLowerCase();\n const alias = Utils.getBrowserTypeByAlias(browserNameLower);\n\n if (includingAlias && alias) {\n browserNameLower = alias.toLowerCase();\n }\n return browserNameLower === defaultBrowserName;\n }\n\n compareVersion(version) {\n let expectedResults = [0];\n let comparableVersion = version;\n let isLoose = false;\n\n const currentBrowserVersion = this.getBrowserVersion();\n\n if (typeof currentBrowserVersion !== 'string') {\n return void 0;\n }\n\n if (version[0] === '>' || version[0] === '<') {\n comparableVersion = version.substr(1);\n if (version[1] === '=') {\n isLoose = true;\n comparableVersion = version.substr(2);\n } else {\n expectedResults = [];\n }\n if (version[0] === '>') {\n expectedResults.push(1);\n } else {\n expectedResults.push(-1);\n }\n } else if (version[0] === '=') {\n comparableVersion = version.substr(1);\n } else if (version[0] === '~') {\n isLoose = true;\n comparableVersion = version.substr(1);\n }\n\n return expectedResults.indexOf(\n Utils.compareVersions(currentBrowserVersion, comparableVersion, isLoose),\n ) > -1;\n }\n\n isOS(osName) {\n return this.getOSName(true) === String(osName).toLowerCase();\n }\n\n isPlatform(platformType) {\n return this.getPlatformType(true) === String(platformType).toLowerCase();\n }\n\n isEngine(engineName) {\n return this.getEngineName(true) === String(engineName).toLowerCase();\n }\n\n /**\n * Is anything? Check if the browser is called \"anything\",\n * the OS called \"anything\" or the platform called \"anything\"\n * @param {String} anything\n * @param [includingAlias=false] The flag showing whether alias will be included into comparison\n * @returns {Boolean}\n */\n is(anything, includingAlias = false) {\n return this.isBrowser(anything, includingAlias) || this.isOS(anything)\n || this.isPlatform(anything);\n }\n\n /**\n * Check if any of the given values satisfies this.is(anything)\n * @param {String[]} anythings\n * @returns {Boolean}\n */\n some(anythings = []) {\n return anythings.some(anything => this.is(anything));\n }\n}\n\nexport default Parser;\n","declare global {\n\tinterface Window {\n\t\tm_dataLayer: any;\n\t\taf_dataLayer: any;\n\t\tunify_dataSlayer: any;\n\t\t_gaq: any;\n\t\tgdprAppliesGlobally: boolean;\n\t\tdidomiOnReady: Function[];\n\t}\n}\n\ninterface GaEvent {\n\tevent: 'UA - Event' | 'uaevent';\n\teventCategory: string;\n\teventAction: string;\n\teventLabel?: string;\n\teventValue?: any;\n\teventNonInt: boolean;\n\tdata: any;\n}\n\ninterface MobileGAEvent {\n\tevent: 'UA-Event';\n\tuaEventCategory: string;\n\tuaEventAction: string;\n\tuaEventLibelle: string;\n\tuaEventValue: any;\n\tuaEventNonInt: boolean;\n\tdata: any;\n}\n\nexport const trackAnalyticsEvent = (\n\tcategory: string,\n\taction: string,\n\topt_label = '',\n\topt_value: any,\n\topt_noninteraction = false,\n\tprefix = '',\n\tsampling = 100,\n\tcustomData?: any\n) => {\n\t// Block useless events to avoid reaching GA limitations\n\tif (category === 'AF_Album' && action === 'go') return;\n\tif (category === 'AF_Album' && action === 'prev') return;\n\tif (category === 'AF_Album' && action === 'next') return;\n\n\t// Sample events\n\tif (\n\t\t!isNaN(parseInt('' + sampling)) &&\n\t\tMath.floor(Math.random() * 100) > +sampling\n\t) {\n\t\treturn;\n\t}\n\n\tconst eventBase = {\n\t\teventCategory: category,\n\t\teventAction: action,\n\t\teventLabel: opt_label,\n\t\teventValue: opt_value,\n\t\teventNonInt: true\n\t};\n\n\tlet event: GaEvent | MobileGAEvent;\n\n\tif (typeof window.m_dataLayer !== 'undefined') {\n\t\tevent = {\n\t\t\tevent: 'UA-Event',\n\t\t\tuaEventCategory: category,\n\t\t\tuaEventAction: action,\n\t\t\tuaEventLibelle: opt_label,\n\t\t\tuaEventValue: opt_value,\n\t\t\tuaEventNonInt: true,\n\t\t\t...customData\n\t\t};\n\n\t\twindow.m_dataLayer.push(event);\n\t} else if (typeof window.af_dataLayer !== 'undefined') {\n\t\tevent = {\n\t\t\tevent: 'UA - Event',\n\t\t\t...eventBase,\n\t\t\t...customData\n\t\t};\n\n\t\twindow.af_dataLayer.push(event);\n\t} else if (typeof window._gaq !== 'undefined') {\n\t\tif (prefix != '' && prefix.substr(-1) != '.') prefix += '.';\n\t\twindow._gaq.push([\n\t\t\tprefix + '_trackEvent',\n\t\t\tcategory,\n\t\t\taction,\n\t\t\topt_label,\n\t\t\topt_value,\n\t\t\topt_noninteraction\n\t\t]);\n\t}\n\n\tif (typeof window.unify_dataSlayer !== 'undefined') {\n\t\tevent = {\n\t\t\tevent: 'uaevent',\n\t\t\t...eventBase,\n\t\t\t...customData\n\t\t};\n\n\t\tif (window.gdprAppliesGlobally) {\n\t\t\t// Site with GDPR: wait for CMP consent before adding any GA event to the datalayer, otherwise these events are not tracked properly\n\t\t\twindow.didomiOnReady = window.didomiOnReady || [];\n\t\t\twindow.didomiOnReady.push(function () {\n\t\t\t\twindow.unify_dataSlayer.push(event);\n\t\t\t});\n\t\t} else {\n\t\t\t// Site without GDPR: fire events synchronously\n\t\t\twindow.unify_dataSlayer.push(event);\n\t\t}\n\t}\n};\n","import { Players } from 'src/enums/players.enum';\nimport {\n\tPublishableVideoContentEvents,\n\tPublishableVideoPlayerEvents\n} from 'src/enums/publishable-events.enum';\nimport { DailymotionEmbedPlayer } from 'src/players/dailymotion-embed';\nimport { ListenerAction } from '../interfaces/listener-action';\nimport { Store, StoreInstance } from '../store';\nimport { trackAnalyticsEvent } from './utils/ga-tracking.util';\nimport PubSub from 'pubsub-js';\n\nconst EVENT_CATEGORY = 'Video';\n\ninterface ExtraDailymotionVideoData {\n\ttype: string;\n\tdatePublication: string;\n}\n\nexport class GaVideoTracker {\n\tprivate _events: Map> = new Map<\n\t\tstring,\n\t\tMap\n\t>();\n\n\tprivate _store: Store;\n\tprivate static instance: GaVideoTracker;\n\tprivate _extraDailymotionData = new Map();\n\n\tprivate _listenersActions: ListenerAction[] = [\n\t\t{\n\t\t\tmessage: PublishableVideoContentEvents.VIDEO_START,\n\t\t\tactionFn: async (msg, data) =>\n\t\t\t\tawait this._trackEventOnceByVideo(data.id, 'Play', data)\n\t\t},\n\t\t{\n\t\t\tmessage: 'video.player.complete',\n\t\t\tactionFn: async (msg, data) =>\n\t\t\t\tawait this._trackEventOnceByVideo(data.id, 'Completed', data)\n\t\t},\n\t\t{\n\t\t\tmessage: PublishableVideoPlayerEvents.UNMUTE,\n\t\t\tactionFn: async (msg, data) =>\n\t\t\t\tawait this._trackEventOnceByVideo(data.id, 'player unmute', data)\n\t\t}\n\t];\n\n\tconstructor() {\n\t\tthis._init();\n\t}\n\n\tprivate _init() {\n\t\tthis._store = (window as any).AufVideo.Store.get();\n\t\tthis._initEventListeners(this._listenersActions);\n\t}\n\n\tprivate _initEventListeners(listenersActions: ListenerAction[]) {\n\t\tlistenersActions.forEach((listenAction) =>\n\t\t\tPubSub.subscribe(listenAction.message, listenAction.actionFn)\n\t\t);\n\t}\n\n\tprivate async _trackEventOnceByVideo(\n\t\tinstanceId: string,\n\t\taction: string,\n\t\tdata: any\n\t) {\n\t\tconst instance = this._store.getInstance(instanceId);\n\t\tconst player = instance?.player;\n\n\t\tif (!player || !instance)\n\t\t\tthrow new Error('Missing Store Instance or player');\n\n\t\tconst videoId =\n\t\t\tplayer.name === Players.DAILYMOTION_EMBED\n\t\t\t\t? await (player as DailymotionEmbedPlayer).getVideo()\n\t\t\t\t: player.videoId;\n\n\t\tthis._events[instanceId] = this._events[instanceId] || {};\n\n\t\tif (this._events[instanceId][action] === videoId) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._trackEvent(action, await this._getDataToSend(instance, data));\n\t\tthis._events[instanceId][action] = videoId;\n\t}\n\n\tprivate _trackEvent = (action: string, dataToSend: any) =>\n\t\ttrackAnalyticsEvent(\n\t\t\tEVENT_CATEGORY,\n\t\t\taction,\n\t\t\tdataToSend['video.title'],\n\t\t\t'',\n\t\t\tfalse,\n\t\t\t'',\n\t\t\t100,\n\t\t\tdataToSend\n\t\t);\n\n\tprivate async _getDataToSend(instance: StoreInstance, customData: any) {\n\t\tconst player = instance.player;\n\t\tconst videoFileUrl =\n\t\t\t(customData && customData.file) ||\n\t\t\t((player as any).getFile && (player as any).getFile.apply(player)) ||\n\t\t\t'';\n\n\t\tlet extraDailymotionData = this._extraDailymotionData.get(player.videoId);\n\t\tconst shouldFetch =\n\t\t\t!extraDailymotionData &&\n\t\t\tplayer.name === Players.DAILYMOTION_EMBED &&\n\t\t\tplayer.videoId;\n\t\tif (shouldFetch) {\n\t\t\tconst getExtraAnalyticsData = async (\n\t\t\t\tdailymotionId: string\n\t\t\t): Promise => {\n\t\t\t\ttry {\n\t\t\t\t\tconsole.log('window.location', window.location);\n\n\t\t\t\t\tconst routePath = `reloaded/api/videos/extraanalyticsdata/${dailymotionId}`;\n\t\t\t\t\tconst internalDomains =\n\t\t\t\t\t\t/alfemminile|aufeminin|marmiton|enfeminino|taofeminino|gofeminin|wewomen|sofeminin|1001cocktails|petitsplatsenequilibre/;\n\t\t\t\t\tconst routeUrl = window.location.origin.match(internalDomains)\n\t\t\t\t\t\t? `/${routePath}`\n\t\t\t\t\t\t: `https://www.aufeminin.com/${routePath}`;\n\n\t\t\t\t\tconst response = await fetch(routeUrl);\n\t\t\t\t\tconst json = await response.json();\n\n\t\t\t\t\treturn Promise.resolve({\n\t\t\t\t\t\ttype: json.videoType,\n\t\t\t\t\t\tdatePublication: json.datePublication\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst errMsg = 'Cannot retrieve extra Analytics data';\n\n\t\t\t\t\tconsole.error(errMsg, error);\n\n\t\t\t\t\t// Return an object with unknown to let processing continue\n\t\t\t\t\treturn Promise.resolve({\n\t\t\t\t\t\ttype: 'unknown',\n\t\t\t\t\t\tdatePublication: 'unknown'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\textraDailymotionData = await getExtraAnalyticsData(player.videoId);\n\t\t\tthis._extraDailymotionData.set(player.videoId, extraDailymotionData);\n\t\t}\n\n\t\treturn {\n\t\t\t'video.id': player.videoId,\n\t\t\t'video.context': instance.context,\n\t\t\t'video.place': instance.position,\n\t\t\t'video.url': videoFileUrl,\n\t\t\t'video.tags': '', // Not available\n\t\t\t'video.title': player.videoTitle,\n\t\t\t'video.player': player.name,\n\t\t\t'video.position': player.videosPlayed.length,\n\t\t\t'video.type': extraDailymotionData?.type,\n\t\t\t'video.date_publication': extraDailymotionData?.datePublication\n\t\t};\n\t}\n\n\tpublic static get(): GaVideoTracker {\n\t\tif (!GaVideoTracker.instance) {\n\t\t\tGaVideoTracker.instance = new GaVideoTracker();\n\t\t}\n\n\t\treturn GaVideoTracker.instance;\n\t}\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.Tracker = window.AufVideo.Tracker || {};\nwindow.AufVideo.Tracker.GA = GaVideoTracker;\n","import Bowser from \"bowser\";\n\nimport {\n\tJwPlayerPlaylist,\n\tPlaylistId\n} from './interfaces/player-playlist.interface';\nimport { VideoPlayerSettings } from './interfaces/VideoPlayerSettings.interface';\nimport { Manager } from './manager';\nimport { Store } from './store';\nimport { VideoConsoleLogger } from './utils/video-logger';\nimport { VideoLogger, VideoLoggerOptions } from './trackers/aufVideoLogger';\nimport { Players } from './enums/players.enum';\nimport { GaVideoTracker } from './trackers/GAVideoTracking';\n\nconst l = new VideoConsoleLogger();\nwindow.videoPlayerVersionNumber = '2.3.2';\nwindow.bowser = Bowser.parse(window.navigator.userAgent);\n\ndeclare global {\n\tinterface Window {\n\t\tvideoPhpVars: VideoPlayerSettings[];\n\t\tvideoPlayerVersionNumber: string;\n\t\tbowser: Bowser.Parser.ParsedResult;\n\t}\n}\n\nfunction buildVideoLogger(settings: VideoPlayerSettings) {\n\tconst videoLoggerSettings: VideoLoggerOptions = {\n\t\tcontext: {\n\t\t\tadPlayer:\n\t\t\t\tsettings.adTechno && settings.adTechno.name\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tname: settings.adTechno.name\n\t\t\t\t\t }\n\t\t\t\t\t: undefined,\n\t\t\tplayer: {\n\t\t\t\tversion: window.videoPlayerVersionNumber,\n\t\t\t\tname: settings.techno ? settings.techno.name : 'undefined',\n\t\t\t\tvideoId: settings.videoId,\n\t\t\t\tcontext: settings.context,\n\t\t\t\tposition: settings.position\n\t\t\t}\n\t\t}\n\t};\n\n\treturn new VideoLogger(videoLoggerSettings);\n}\n\nasync function buildVideoPlayer(\n\tplayerConstructor: any,\n\tsettings: VideoPlayerSettings\n) {\n\tconst isJwPlayer = settings.techno.id === Players.JWPLAYER;\n\tconst isDailymotion = settings.techno.id === Players.DAILYMOTION;\n\tconst isDailymotionEmbed = settings.techno.id === Players.DAILYMOTION_EMBED;\n\n\tlet playlist = isJwPlayer\n\t\t? ({\n\t\t\t\tsources: settings.sources,\n\t\t\t\timage: '' + settings.poster\n\t\t } as JwPlayerPlaylist)\n\t\t: isDailymotion || isDailymotionEmbed\n\t\t? (settings.dailymotionPlaylistID as PlaylistId)\n\t\t: undefined;\n\n\tconst playerSettings = {\n\t\tname: settings.techno?.name,\n\t\taspectRatio: settings.aspectRatio,\n\t\tfluid: Boolean(settings.aspectRatio),\n\t\theight: +settings.height,\n\t\tid: settings.playerId,\n\t\tmuted: settings.autoplay.startOnSight && settings.muted,\n\t\tplaylist: playlist ? playlist : undefined,\n\t\ttitle: settings.title,\n\t\ttype: settings.type,\n\t\tdatePublication: settings.datePublication,\n\t\tvideoId:\n\t\t\tisDailymotion || isDailymotionEmbed\n\t\t\t\t? settings.dailymotionId\n\t\t\t\t: settings.videoId,\n\t\tisAdDisabled: settings.isAdDisabled,\n\t\tisLazyLoadedPlayer: settings.isLazyLoadedPlayer,\n\t\tpmad: settings.pmad,\n\t\tpmxd: settings.pmxd\n\t};\n\n\tconst player = playerConstructor\n\t\t? new playerConstructor(playerSettings)\n\t\t: undefined;\n\n\treturn player;\n}\n\n/**\n * Configure ad video player\n */\nfunction buildAdPlayer(\n\tadPlayerConstructor: any,\n\tsettings: VideoPlayerSettings,\n\tadTargeting: any,\n\tplayer: any\n) {\n\tconst adsSettings: any = {\n\t\tid: settings.playerId,\n\t\tname: settings.adTechno?.name,\n\t\tplayer: player,\n\t\tadUnit: settings.adUnit,\n\t\tadTargeting,\n\t\tallowMultipleTinyAds: settings.allowMultipleTinyAds,\n\t\tsiteId: settings.siteId,\n\t\tisCM: settings.isCM,\n\t\tneedPegasus: settings.needPegasus,\n\t\thbVideoActive: settings.hbVideoActive,\n\t\tposition: '' + settings.position,\n\t\tadScheduleId: settings.adScheduleId,\n\t\tadLabel: settings.adLabel,\n\t\tlanguage: settings.adPlayerLanguage,\n\t\tmidrollActive: settings.midrollActive,\n\t\tminTimeMidroll: settings.minTimeMidroll,\n\t\tjwpAdvertisingParameters: settings.jwpAdvertisingParameters,\n\t\tadRule: settings.adRule\n\t};\n\n\treturn adPlayerConstructor ? new adPlayerConstructor(adsSettings) : undefined;\n}\n\nfunction addStoreInstance(\n\tlogger: VideoLogger,\n\tplayer: any,\n\tadPlayer: any,\n\tsettings: VideoPlayerSettings\n) {\n\tconst store: Store = Store.get();\n\tconst instanceProps = {\n\t\tlogger: logger,\n\t\tplayer: player,\n\t\tadPlayer: adPlayer,\n\t\tcontext: settings.context,\n\t\tposition: settings.position,\n\t\tautoplay: settings.autoplay,\n\t\tsticky: settings.sticky\n\t};\n\n\tstore.addInstance(settings.playerId, instanceProps);\n}\n\nexport async function initAll(\n\tplayerConstructor: any,\n\tadConstructor: any,\n\tsettings: VideoPlayerSettings\n) {\n\t/* * * * * * * * * * * * * * * * * *\n\t * Init trackers *\n\t * * * * * * * * * * * * * * * * * */\n\tGaVideoTracker.get(); // Note: gaTracker is not used afterwhile\n\tif (settings.isComScoreTrackingEnabled) {\n\t\t// comScore.init();\n\t}\n\n\t/* * * * * * * * * * * * * * * * * *\n\t * Instantiate Video Objects *\n\t * * * * * * * * * * * * * * * * * */\n\tconst logger = buildVideoLogger(settings);\n\tconst player = await buildVideoPlayer(playerConstructor, settings);\n\n\tconst adPlayer = !settings.isAdDisabled\n\t\t? buildAdPlayer(\n\t\t\t\tadConstructor,\n\t\t\t\tsettings,\n\t\t\t\t_getAdTargetingString(settings),\n\t\t\t\tplayer\n\t\t )\n\t\t: undefined;\n\n\tManager.get({\n\t\tlabels: {\n\t\t\tnextVideo: settings.nextVideoLabel\n\t\t}\n\t});\n\n\tif (!logger || !player || (!settings.isAdDisabled && !adPlayer)) {\n\t\tif (!logger) {\n\t\t\tl.error('VideoLogger is undefined !')();\n\t\t}\n\n\t\tif (!player) {\n\t\t\tl.error('Player is undefined !')();\n\t\t}\n\n\t\tif (!settings.isAdDisabled && !adPlayer) {\n\t\t\tl.error('AdPlayer is undefined !')();\n\t\t}\n\n\t\tthrow new Error('Missing mandatory object to add store instance');\n\t}\n\taddStoreInstance(logger, player, adPlayer, settings);\n\n\tfunction _getAdTargetingString(settings: VideoPlayerSettings) {\n\t\tconst newAdTargeting =\n\t\t\t';' +\n\t\t\t[\n\t\t\t\tsettings.adTarget,\n\t\t\t\t'player=' + settings.techno.id,\n\t\t\t\t'adplayer=' + settings.adTechno.id,\n\t\t\t\t'context=' + settings.context,\n\t\t\t\t'video=' + settings.videoId + 'v'\n\t\t\t].join(';');\n\n\t\treturn newAdTargeting;\n\t}\n}\n","/*!\n * Bowser - a browser detector\n * https://github.com/lancedikson/bowser\n * MIT License | (c) Dustin Diaz 2012-2015\n * MIT License | (c) Denis Demchenko 2015-2019\n */\nimport Parser from './parser.js';\nimport {\n BROWSER_MAP,\n ENGINE_MAP,\n OS_MAP,\n PLATFORMS_MAP,\n} from './constants.js';\n\n/**\n * Bowser class.\n * Keep it simple as much as it can be.\n * It's supposed to work with collections of {@link Parser} instances\n * rather then solve one-instance problems.\n * All the one-instance stuff is located in Parser class.\n *\n * @class\n * @classdesc Bowser is a static object, that provides an API to the Parsers\n * @hideconstructor\n */\nclass Bowser {\n /**\n * Creates a {@link Parser} instance\n *\n * @param {String} UA UserAgent string\n * @param {Boolean} [skipParsing=false] Will make the Parser postpone parsing until you ask it\n * explicitly. Same as `skipParsing` for {@link Parser}.\n * @returns {Parser}\n * @throws {Error} when UA is not a String\n *\n * @example\n * const parser = Bowser.getParser(window.navigator.userAgent);\n * const result = parser.getResult();\n */\n static getParser(UA, skipParsing = false) {\n if (typeof UA !== 'string') {\n throw new Error('UserAgent should be a string');\n }\n return new Parser(UA, skipParsing);\n }\n\n /**\n * Creates a {@link Parser} instance and runs {@link Parser.getResult} immediately\n *\n * @param UA\n * @return {ParsedResult}\n *\n * @example\n * const result = Bowser.parse(window.navigator.userAgent);\n */\n static parse(UA) {\n return (new Parser(UA)).getResult();\n }\n\n static get BROWSER_MAP() {\n return BROWSER_MAP;\n }\n\n static get ENGINE_MAP() {\n return ENGINE_MAP;\n }\n\n static get OS_MAP() {\n return OS_MAP;\n }\n\n static get PLATFORMS_MAP() {\n return PLATFORMS_MAP;\n }\n}\n\nexport default Bowser;\n","/**\n * This file responsability is to pilot the player instantiations modes\n */\n\nimport { Players } from './enums/players.enum';\nimport { VideoPlayerSettings } from './interfaces/VideoPlayerSettings.interface';\nimport { initAll } from './spawner';\nimport { AufVideoUtils } from './utils/utils';\nimport { VideoConsoleLogger } from './utils/video-logger';\n\nconst w = window as any;\nconst logger = new VideoConsoleLogger();\n\nfunction _isNoVideoTestMode() {\n\tconst queryParamsArr = location.search.slice(1).split('&');\n\n\treturn (\n\t\tqueryParamsArr.includes('utm_source=webperf') &&\n\t\tqueryParamsArr.includes('utm_medium=psi') &&\n\t\tqueryParamsArr.includes('utm_campaign=no-dailymotion')\n\t);\n}\n\nexport async function start(\n\tplayerConstructor: any,\n\tadPlayerConstructor: any,\n\tforce?: boolean\n) {\n\tw.videoPlayerUnifyInitDone =\n\t\ttypeof force !== 'undefined' ? false : w.videoPlayerUnifyInitDone;\n\n\tasync function ensureVideoVarsAreSet() {\n\t\tlet t = 0;\n\t\treturn new Promise(waitForVars);\n\n\t\tfunction waitForVars(resolve, reject) {\n\t\t\tif (window.videoPhpVars) {\n\t\t\t\tlogger.info('Player vars available after ' + t * 25 + ' ms')();\n\t\t\t\tresolve(window.videoPhpVars);\n\t\t\t} else {\n\t\t\t\tt++;\n\t\t\t\tsetTimeout(waitForVars.bind(this, resolve, reject), 25);\n\t\t\t}\n\t\t}\n\t}\n\n\t//Protection contre les instancations multiples du fait de plusieurs ESI dans la même page\n\tif (w.videoPlayerUnifyInitDone) {\n\t\treturn;\n\t}\n\tw.videoPlayerUnifyInitDone = true;\n\n\tawait ensureVideoVarsAreSet();\n\n\tlogger.info('Starting video players', w.videoPhpVars)();\n\n\tfor (let playerId in w.videoPhpVars) {\n\t\tconst settings = w.videoPhpVars[playerId] as VideoPlayerSettings;\n\t\tsettings.needPegasus = !AufVideoUtils.isPreview()\n\t\t\t? settings.needPegasus\n\t\t\t: false;\n\n\t\t// TODO: Déplacer ça dans le spawner\n\t\tvar isDailymotionEmbed = settings.techno.id === Players.DAILYMOTION_EMBED;\n\t\tsettings.isLazyLoadedPlayer = isDailymotionEmbed && settings.needPegasus;\n\n\t\t!_isNoVideoTestMode()\n\t\t\t? await initAll(playerConstructor, adPlayerConstructor, settings)\n\t\t\t: undefined;\n\t}\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.start = start;\n","/*\n * This file's responsability is to provide a permutive implementation for Dailymotion Embed\n * https://permutive.notion.site/DailyMotion-Integration-v2-8e19f3c592f34146a6e4dc6f872c7633\n * */\n\nimport { DailymotionEmbedApi } from 'src/interfaces/dailymotion-embed.interface';\nimport { VideoConsoleLogger } from './video-logger';\n\nconst logger = new VideoConsoleLogger();\n\nexport class PermutiveService {\n\tprivate _permutive: any;\n\tprivate _dailymotion: any;\n\tprivate _percentagePlayedMarkers = [25, 50, 75, 100];\n\tprivate _lastKnownPlayedPositionPercent: number;\n\tprivate _eventsToListen = [\n\t\t'PLAYER_START',\n\t\t'PLAYER_VOLUMECHANGE',\n\t\t'PLAYER_PRESENTATIONMODECHANGE',\n\t\t'VIDEO_START',\n\t\t'VIDEO_PLAY',\n\t\t'VIDEO_PAUSE',\n\t\t'AD_START',\n\t\t'AD_PLAY',\n\t\t'AD_PAUSE',\n\t\t'AD_CLICK'\n\t];\n\tprivate _allowedPermutiveEventProperties = [\n\t\t'adAdvertiserName',\n\t\t'adDuration',\n\t\t'adEndedReason',\n\t\t'adId',\n\t\t'adIsSkippable',\n\t\t'adPosition',\n\t\t'adTitle',\n\t\t'playerIsMuted',\n\t\t'playerIsViewable',\n\t\t'videoDuration',\n\t\t'videoId',\n\t\t'videoTitle'\n\t];\n\n\tconstructor(permutive: any, dailymotion: any) {\n\t\tthis._permutive = permutive || window.permutive;\n\t\tthis._dailymotion = dailymotion;\n\t}\n\n\tpublic attachPermutiveGoogleAdManagerTargeting() {\n\t\tthis._checkPermutive();\n\n\t\treturn encodeURIComponent(\n\t\t\t'&permutive=' +\n\t\t\t\tJSON.parse(window.localStorage._pdfps || '[]')\n\t\t\t\t\t.slice(0, 250)\n\t\t\t\t\t.toString() +\n\t\t\t\t'&puid=' +\n\t\t\t\twindow.localStorage.getItem('permutive-id') +\n\t\t\t\t'&ptime=' +\n\t\t\t\tDate.now().toString() +\n\t\t\t\t'&prmtvvid=' +\n\t\t\t\tthis._permutive.config.viewId +\n\t\t\t\t'&prmtvwid=' +\n\t\t\t\tthis._permutive.config.workspaceId\n\t\t);\n\t}\n\n\tpublic attachPermutiveEventsToDailyEmbed(player: DailymotionEmbedApi) {\n\t\tthis._checkPermutive();\n\n\t\t['VIDEO_TIMECHANGE', 'VIDEO_SEEKSTART', 'AD_TIMECHANGE'].forEach(\n\t\t\t(eventName) => {\n\t\t\t\tplayer.on(this._dailymotion.events[eventName], (state) => {\n\t\t\t\t\tthis._videoPercentagePlayed(eventName, state);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\tthis._eventsToListen.forEach((eventName) => {\n\t\t\tplayer.on(this._dailymotion.events[eventName], (state: any) => {\n\t\t\t\tstate.eventName = eventName;\n\t\t\t\tconst permutiveEventContent = {\n\t\t\t\t\teventName: eventName\n\t\t\t\t};\n\n\t\t\t\tthis._allowedPermutiveEventProperties.forEach((property) => {\n\t\t\t\t\tif (!state.hasOwnProperty(property) || !state[property]) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (property === 'videoCreatedTime') {\n\t\t\t\t\t\tpermutiveEventContent[property] = new Date(\n\t\t\t\t\t\t\tstate.videoCreatedTime\n\t\t\t\t\t\t).toISOString();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tpermutiveEventContent[property] = state[property];\n\t\t\t\t});\n\t\t\t\tthis._permutive.track('DailymotionState', permutiveEventContent);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate _videoPercentagePlayed = (eventName: string, state: any) => {\n\t\tlet playedPositionPercent = Math.floor(\n\t\t\t(state.videoTime * 100) / state.videoDuration\n\t\t);\n\t\tconst lastKnownPlayedPositionPercent = this._lastKnownPlayedPositionPercent;\n\t\tthis._lastKnownPlayedPositionPercent = playedPositionPercent;\n\n\t\tif (lastKnownPlayedPositionPercent === playedPositionPercent) return;\n\n\t\tthis._percentagePlayedMarkers.some((played_depth) => {\n\t\t\tif (\n\t\t\t\t(playedPositionPercent >= played_depth &&\n\t\t\t\t\tthis._lastKnownPlayedPositionPercent < played_depth) ||\n\t\t\t\t(playedPositionPercent <= played_depth &&\n\t\t\t\t\tlastKnownPlayedPositionPercent > played_depth)\n\t\t\t) {\n\t\t\t\tconst permutiveEventContent = {\n\t\t\t\t\teventName: eventName,\n\t\t\t\t\tplayed: played_depth / 100\n\t\t\t\t};\n\t\t\t\tthis._allowedPermutiveEventProperties.forEach(function (property) {\n\t\t\t\t\tif (!state.hasOwnProperty(property) || !state[property]) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tpermutiveEventContent[property] = state[property];\n\t\t\t\t});\n\t\t\t\tthis._permutive.track('DailymotionState', permutiveEventContent);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t};\n\n\tprivate _checkPermutive() {\n\t\t// As Permutive is loaded appart of the bundle, there is a race condition then reinit if needed;\n\t\tthis._permutive = this._permutive || window.permutive;\n\n\t\tif (!this._permutive) {\n\t\t\tconst errMsg = 'Cannot attach permutive targeting: permutive not found';\n\t\t\tlogger.error(errMsg)();\n\t\t\tthrow new Error(errMsg);\n\t\t}\n\t}\n}\n","// User-agent module\n// TODO: add OS detection\nexport const afUserAgent = (function () {\n\tvar _isMobile = false;\n\tvar _isTablet = false;\n\tvar _regexMobile =\n\t\t/(ipod|blackberry|phone|mobile|opera mini|pda|symbian|3ds|nokia|ericsson|alcatel)/gi;\n\tvar _regexTabletSmall =\n\t\t/(pad|lenovo|tab|GT-P5210|GT-P5110|Nexus 7|GT-N8010|GT-P3110)/gi;\n\tvar _regexTablet = /(pad|tab|android)/gi;\n\n\tvar _initialized = false;\n\tfunction _init() {\n\t\tif (_initialized) return;\n\n\t\t_initialized = true;\n\t\tif (navigator.userAgent.match(_regexMobile)) {\n\t\t\tif (navigator.userAgent.match(_regexTabletSmall)) {\n\t\t\t\t_isTablet = true;\n\t\t\t} else {\n\t\t\t\t_isMobile = true;\n\t\t\t}\n\t\t} else if (\n\t\t\tnavigator.userAgent.match(_regexTablet) &&\n\t\t\t!navigator.userAgent.match(/(pc)/gi)\n\t\t) {\n\t\t\t// TEMP: quick fix for IE11 detected as tablet\n\t\t\t_isTablet = true;\n\t\t}\n\t}\n\n\tfunction isMobile() {\n\t\t_init();\n\t\treturn _isMobile;\n\t}\n\n\tfunction isTablet() {\n\t\t_init();\n\t\treturn _isTablet;\n\t}\n\n\treturn {\n\t\tisMobile: isMobile,\n\t\tisTablet: isTablet\n\t};\n})();\n","// Event listener handler\nexport function afAddEvent(elt, event, listener, capture) {\n\tif (elt && elt.addEventListener) {\n\t\telt.addEventListener(event, listener, capture);\n\t\treturn true;\n\t} else if (elt && elt.attachEvent) {\n\t\treturn elt.attachEvent('on' + event, listener);\n\t} else if (elt) {\n\t\tvar oldListener = elt['on' + event];\n\t\telt['on' + event] = function (e) {\n\t\t\tif (oldListener) {\n\t\t\t\toldListener(e);\n\t\t\t}\n\t\t\treturn listener(e);\n\t\t};\n\t\treturn oldListener;\n\t}\n}\n","import { Subject } from 'rxjs';\nimport { VideoInfos } from 'src/interfaces/video-infos.interface.js';\nimport { VideoConsoleLogger } from 'src/utils/video-logger.js';\nimport { AspectRatio } from '../enums/aspect-ratio.enum.js';\nimport {\n\tPublishableVideoAdEvents,\n\tPublishableVideoContentEvents,\n\tPublishableVideoLogEvents,\n\tPublishableVideoPlayerEvents,\n\tPublishableVideoStickyEvents,\n\tPublishableVideoStoreEvents,\n\tPublishableVideoUserEvents\n} from '../enums/publishable-events.enum.js';\nimport { AdsParams } from '../interfaces/ads-params.interface.js';\nimport {\n\tPlayerErrorEventData,\n\tPlayerEventData\n} from '../interfaces/player-event-data.interface.js';\nimport { PlayerOptions } from '../interfaces/player-options.interface.js';\nimport PubSub from 'pubsub-js';\nimport { afUserAgent } from 'src/utils/detect-device.util.js';\nimport { afAddEvent } from 'src/utils/events.util.js';\n\nconst logger = new VideoConsoleLogger();\n\ntype PlayerEvent =\n\t| PublishableVideoPlayerEvents\n\t| PublishableVideoContentEvents\n\t| PublishableVideoUserEvents\n\t| PublishableVideoLogEvents\n\t| PublishableVideoAdEvents\n\t| PublishableVideoStoreEvents\n\t| PublishableVideoStickyEvents;\n\nexport default abstract class Player {\n\tpublic id: string;\n\tpublic name: string;\n\tpublic aspectRatio: AspectRatio;\n\tpublic muted: boolean;\n\tpublic videoId: string;\n\tpublic videoTitle: string;\n\tpublic videoDuration: number;\n\tpublic isMobile: boolean;\n\tpublic ready = false;\n\tpublic videoStarted = false;\n\tpublic isAdDisabled = false;\n\tpublic isSticked = false;\n\tpublic videosPlayed: VideoInfos[] = [];\n\tpublic videoInfos$ = new Subject();\n\n\tprotected _readyCb: ((...args: any[]) => any) | null;\n\tprotected _userUnmuted = false;\n\tprivate _aufIsMobile = afUserAgent.isMobile;\n\tprivate _aufAddEvent = afAddEvent;\n\n\tabstract api: HTMLMediaElement | any;\n\n\tconstructor(options: PlayerOptions) {\n\t\tif (\n\t\t\t!options ||\n\t\t\t!options.id ||\n\t\t\t!options.name ||\n\t\t\t!options.aspectRatio ||\n\t\t\ttypeof options.muted === 'undefined' ||\n\t\t\t!options.videoId ||\n\t\t\t!options.title\n\t\t) {\n\t\t\tthrow new Error('Missing mandatory parameter to initialize player');\n\t\t}\n\n\t\tthis.id = options.id;\n\t\tthis.name = options.name;\n\t\tthis.aspectRatio = options.aspectRatio;\n\t\tthis.muted = options.muted;\n\t\tthis.videoId = options.videoId;\n\t\tthis.videoTitle = options.title || 'none';\n\t\tthis.isAdDisabled = options.isAdDisabled || false;\n\t\tthis.isMobile = this._aufIsMobile(); // TODO: Créer un d.ts\n\t\tthis._readyCb = null;\n\n\t\tPubSub.subscribe(PublishableVideoAdEvents.AD_CANCEL, () => {\n\t\t\tthis.disableAds();\n\t\t});\n\t}\n\n\tpublic async init(\n\t\tadsParams?: AdsParams,\n\t\treadyCb?: (...args: any[]) => Promise\n\t): Promise {\n\t\tthis._readyCb = readyCb && typeof readyCb === 'function' ? readyCb : null;\n\n\t\ttry {\n\t\t\tthis.initListeners();\n\t\t\tawait this.initApi(adsParams);\n\t\t\tthis.initApiListeners();\n\t\t\tthis.initErrorsListeners();\n\t\t} catch (error) {\n\t\t\tlogger.error(error)();\n\t\t\treturn Promise.reject(error);\n\t\t}\n\n\t\treturn Promise.resolve();\n\t}\n\n\tpublic publish = (\n\t\tmessage: PlayerEvent | string,\n\t\tdata: PlayerEventData | PlayerErrorEventData = {}\n\t) => {\n\t\tPubSub.publish(message, { ...data, id: this.id });\n\n\t\tconst blacklistedFromConsoleLogs = [\n\t\t\t'video.player.content.progress',\n\t\t\t'video.player.inProgress'\n\t\t];\n\n\t\tif (blacklistedFromConsoleLogs.includes(message)) return;\n\t\tlogger.debug(`Publishing ${message}`)();\n\t};\n\n\tpublic logError = (message: string) =>\n\t\tthis.publish(PublishableVideoLogEvents.ERROR, {\n\t\t\tmessage,\n\t\t\tcategory: this.name\n\t\t});\n\n\tpublic cancelAdvertising = () =>\n\t\tthis.publish(PublishableVideoAdEvents.AD_CANCEL);\n\n\tpublic isPlaying = async () => {\n\t\tconst isPaused = await this.isPaused();\n\t\treturn !isPaused;\n\t};\n\n\tpublic getWidth = () => this.getContainer()?.getBoundingClientRect().width;\n\tpublic getHeight = () => this.getContainer()?.getBoundingClientRect().height;\n\n\t// -= Playback functions =-\n\tpublic async play() {\n\t\tif (await this.isPlaying()) return;\n\n\t\tconst successHandler = () => true;\n\t\tconst errorHandler = (error: Error) => {\n\t\t\tif (error) {\n\t\t\t\tthis.logError(error.message);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tlet play = (this.api as HTMLMediaElement).play();\n\n\t\treturn !(play && typeof play.then === 'function')\n\t\t\t? play\n\t\t\t: play.then(successHandler, errorHandler);\n\t}\n\n\tpublic pause() {\n\t\treturn this.api.pause();\n\t}\n\n\tprotected async onReady() {\n\t\tif (this.ready) return;\n\t\tthis.publish(PublishableVideoPlayerEvents.READY);\n\n\t\t// Send video complete event with completion rate when user closes the tab\n\t\tthis._aufAddEvent(\n\t\t\twindow,\n\t\t\t'beforeunload',\n\t\t\t() => this.publish(PublishableVideoPlayerEvents.END),\n\t\t\tfalse\n\t\t);\n\n\t\tif (this._readyCb && typeof this._readyCb === 'function') {\n\t\t\tawait this._readyCb();\n\t\t}\n\n\t\tthis.ready = true;\n\t\tthis.postReady();\n\t\treturn Promise.resolve();\n\t}\n\n\tprotected onPlay() {\n\t\tthis.prePlay();\n\n\t\tthis.videoStarted = true;\n\t\tthis.publish(PublishableVideoPlayerEvents.PLAY);\n\n\t\tthis.postPlay();\n\t}\n\n\tprotected initCommonListeners() {\n\t\tthis.api.on('ready', async () => await this.onReady());\n\t\tthis.api.on('play', this.onPlay.bind(this));\n\t\tthis.api.on('pause', this.onPause.bind(this));\n\t}\n\n\tprotected onPause = () => this.publish(PublishableVideoPlayerEvents.PAUSE);\n\n\tabstract isPaused(): boolean | Promise;\n\tabstract getContainer(): HTMLElement | Element | null;\n\n\tprotected abstract initApi(adsParams?: AdsParams): Promise;\n\tprotected abstract initListeners(): void;\n\tprotected abstract initApiListeners(): void;\n\tprotected abstract initErrorsListeners(): void;\n\tprotected abstract prePlay(): void;\n\tprotected abstract postPlay(): void;\n\tprotected abstract postReady(): void;\n\tprotected abstract disableAds(): void;\n}\n","import {\n\tDailymotionEmbedInternalEvents,\n\tDailymotionInternalEvents\n} from '../enums/dailymotion-internal-events.enum';\nimport { Players } from '../enums/players.enum';\nimport { AdsParams } from 'src/interfaces/ads-params.interface';\nimport {\n\tDailymotionEmbedApi,\n\tDailymotionEmbedSetupOptions,\n\tDailymotionState\n} from '../interfaces/dailymotion-embed.interface';\nimport { DailymotionEmbedPlayerOptions } from '../interfaces/player-options.interface';\nimport { PlaylistId } from '../interfaces/player-playlist.interface';\nimport { VideoInfos } from '../interfaces/video-infos.interface';\nimport { PermutiveService } from '../utils/permutive.service';\nimport { VideoConsoleLogger } from '../utils/video-logger';\nimport Player from './_adapter';\nimport {\n\tPublishableVideoAdEvents,\n\tPublishableVideoContentEvents,\n\tPublishableVideoPlayerEvents,\n\tPublishableVideoStickyEvents\n} from '../enums/publishable-events.enum';\nimport PubSub from 'pubsub-js';\n\nconst logger = new VideoConsoleLogger();\n\ndeclare global {\n\tinterface Window {\n\t\tdailymotion: any;\n\t\tAufVideo: any;\n\t\tpermutive: any;\n\t}\n}\n\nexport class DailymotionEmbedPlayer extends Player {\n\tpublic name = Players.DAILYMOTION_EMBED;\n\tpublic height: number;\n\tpublic contentStarted = false;\n\tpublic contentEnded = false;\n\tpublic setup: DailymotionEmbedSetupOptions;\n\tpublic api: DailymotionEmbedApi;\n\tpublic isAdDisabled = false;\n\tpublic adsRules: { pmad: number; pmxd: number } | undefined;\n\tpublic playlist: PlaylistId;\n\n\tprivate dailymotion = window.dailymotion;\n\tprivate _currentVolume: number;\n\tprivate _isLazyLoaded: boolean;\n\tprivate _playerBasicOptions: any;\n\tprivate _lazyContentLoaded = false;\n\tprivate _refreshAdsConfig = true;\n\n\tconstructor(options: DailymotionEmbedPlayerOptions) {\n\t\tsuper({ ...options, name: 'dailymotion-embed' });\n\n\t\tlogger.debug('Constructing DailymotionEmbedPlayer', options)();\n\n\t\tif (!this.dailymotion || !options) {\n\t\t\tthis.logError('Unable to init player (missing API or options)');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.height = options.height;\n\n\t\tif (options.playlist) {\n\t\t\tthis.playlist = options.playlist;\n\t\t}\n\n\t\tthis.adsRules =\n\t\t\toptions.pmad && options.pmxd\n\t\t\t\t? {\n\t\t\t\t\t\tpmad: options.pmad,\n\t\t\t\t\t\tpmxd: options.pmxd\n\t\t\t\t }\n\t\t\t\t: undefined;\n\n\t\tthis._isLazyLoaded = options.isLazyLoadedPlayer;\n\n\t\tthis._playerBasicOptions = {\n\t\t\tparams: {\n\t\t\t\tautoplay: false,\n\t\t\t\tmute: this.muted,\n\t\t\t\t'disable-queue': this.playlist ? true : false,\n\t\t\t\t'ui-logo': false,\n\t\t\t\tcustomConfig: {}\n\t\t\t}\n\t\t};\n\n\t\tthis.isAdDisabled = Boolean(options.isAdDisabled);\n\n\t\tif (this.isAdDisabled) {\n\t\t\tthis.disableAds();\n\t\t}\n\t}\n\n\tprotected disableAds() {\n\t\tlogger.info('Ads are now disabled')();\n\t\tthis._playerBasicOptions.params.customConfig = {\n\t\t\tcustomParams: 'noAds'\n\t\t};\n\t}\n\n\tpublic createLazyPlayer = async () => {\n\t\tthis.api = await this.dailymotion.createPlayer(\n\t\t\tthis.id,\n\t\t\tthis._playerBasicOptions\n\t\t);\n\n\t\treturn Promise.resolve();\n\t};\n\n\tprotected async initApi(adsParams: AdsParams): Promise {\n\t\tlogger.debug('Initializing Dailymotion API')();\n\n\t\tconst options = {\n\t\t\t...this._playerBasicOptions,\n\t\t\tvideo: this.videoId,\n\t\t\tplaylist: this.playlist\n\t\t};\n\n\t\tif (adsParams && adsParams.ui && adsParams.custom) {\n\t\t\tconst adsDailyParams: string[] = [];\n\t\t\tadsDailyParams.push(adsParams.ui);\n\n\t\t\t// Limit custom permutive chars number to avoid too long url error\n\t\t\tadsDailyParams.push(\n\t\t\t\tgetCustomParamsWithTruncatedPermutive(adsParams.custom, 250)\n\t\t\t);\n\n\t\t\toptions.params.customConfig = {\n\t\t\t\tcustomParams:\n\t\t\t\t\tencodeURIComponent(adsDailyParams[0]) +\n\t\t\t\t\t'/' +\n\t\t\t\t\tencodeURIComponent(adsDailyParams.slice(1).join('&'))\n\t\t\t};\n\n\t\t\t// Adds AdRules (should not be encoded to no be included into cust_params when it goes to gampad)\n\t\t\tif (this.adsRules) {\n\t\t\t\tvar adRulesStr =\n\t\t\t\t\t'pmad=' + this.adsRules.pmad + '&pmnd=0&pmxd=' + this.adsRules.pmxd;\n\t\t\t\toptions.params.customConfig.customParams += `&${adRulesStr}`;\n\t\t\t}\n\t\t}\n\n\t\tthis.setup = options;\n\t\tlogger.debug(JSON.stringify(this.setup))();\n\n\t\tthis.api =\n\t\t\tthis.api || (await this.dailymotion.createPlayer(this.id, this.setup));\n\n\t\t// Attach permutive events\n\t\tconst attachPermutive = () => {\n\t\t\tlogger.info('Attaching Permutive events to Dailymotion')();\n\t\t\tconst permutiveService = new PermutiveService(\n\t\t\t\twindow.permutive,\n\t\t\t\tthis.dailymotion\n\t\t\t);\n\t\t\tpermutiveService.attachPermutiveEventsToDailyEmbed(this.api);\n\t\t};\n\n\t\tconsole.log('window.permutive', window.permutive);\n\n\t\twindow.permutive\n\t\t\t? window.permutive.ready(attachPermutive, 'realtime')\n\t\t\t: window.addEventListener('PermutiveLoaded', attachPermutive, false);\n\n\t\tif (!this.api) {\n\t\t\tPubSub.publish('player_initialization_error', {\n\t\t\t\turl: window.location.href\n\t\t\t});\n\n\t\t\tconst errMsg = 'Dailymotion API not initialized';\n\t\t\tlogger.error(errMsg);\n\t\t\treturn Promise.reject(errMsg);\n\t\t}\n\n\t\tfunction getCustomParamsWithTruncatedPermutive(\n\t\t\tcustomParams: string,\n\t\t\tmaxValues: number\n\t\t) {\n\t\t\tlet res = customParams;\n\t\t\tconst matchPermutive = customParams.match(/permutive=([\\d,]+)/);\n\t\t\tconst permutiveValues = matchPermutive ? matchPermutive[1] : undefined;\n\n\t\t\tif (permutiveValues) {\n\t\t\t\tvar truncatedPermutiveValues = permutiveValues\n\t\t\t\t\t.split(',')\n\t\t\t\t\t.splice(0, maxValues)\n\t\t\t\t\t.join(',');\n\t\t\t\tres = customParams.replace(\n\t\t\t\t\t'permutive=' + permutiveValues,\n\t\t\t\t\t'permutive=' + truncatedPermutiveValues\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn res;\n\t\t}\n\n\t\treturn Promise.resolve();\n\t}\n\n\tprivate _lazyLoadContent() {\n\t\tif (this._isLazyLoaded && !this._lazyContentLoaded) {\n\t\t\tlogger.debug('_lazyLoadContent()')();\n\t\t\t// update values for advertising\n\t\t\tthis.dailymotion.getPlayer(this.id).then((player) => {\n\t\t\t\tplayer.setCustomConfig({\n\t\t\t\t\tcustomParams: this.setup.params.customConfig?.customParams\n\t\t\t\t});\n\n\t\t\t\tplayer.updateParams({\n\t\t\t\t\tmute: this.muted\n\t\t\t\t});\n\n\t\t\t\tplayer.loadContent({\n\t\t\t\t\tvideo: this.setup.video,\n\t\t\t\t\tplaylist: this.playlist\n\t\t\t\t});\n\n\t\t\t\tthis._lazyContentLoaded = true;\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected initListeners() {\n\t\tPubSub.subscribe(PublishableVideoPlayerEvents.READY, () => {\n\t\t\tlogger.debug('_initListeners(): Player Ready')();\n\n\t\t\tthis._lazyLoadContent();\n\t\t});\n\t}\n\n\tprotected initApiListeners() {\n\t\tthis.dailymotion.getPlayer(this.id).then((player) => {\n\t\t\t// Player Events\n\t\t\tplayer.on(this.dailymotion.events.PLAYER_CRITICALPATHREADY, async () => {\n\t\t\t\tawait this.onReady();\n\t\t\t\tthis.publish(PublishableVideoPlayerEvents.CRITICAL_PATH_READY);\n\t\t\t});\n\t\t\tplayer.on(this.dailymotion.events.PLAYER_CONTROLSCHANGE, () => {\n\t\t\t\tlogger.debug('controls changed')();\n\n\t\t\t\tthis.publish(PublishableVideoPlayerEvents.CONTROLS_CHANGE);\n\t\t\t});\n\t\t\tplayer.on(this.dailymotion.events.PLAYER_START, () =>\n\t\t\t\tthis.publish(PublishableVideoPlayerEvents.START)\n\t\t\t);\n\t\t\tplayer.on(this.dailymotion.events.PLAYER_END, () =>\n\t\t\t\tthis.publish(PublishableVideoPlayerEvents.END)\n\t\t\t);\n\t\t\tplayer.on(\n\t\t\t\tDailymotionInternalEvents.FULLSCREEN_CHANGE /* Nothing to bind */,\n\t\t\t\t() => this.publish(PublishableVideoPlayerEvents.FULLSCREEN_CHANGE)\n\t\t\t);\n\t\t\tplayer.on(this.dailymotion.events.VIDEO_SEEKSTART, () =>\n\t\t\t\tthis.publish(PublishableVideoPlayerEvents.SEEKING)\n\t\t\t);\n\t\t\tplayer.on(this.dailymotion.events.VIDEO_SEEKEND, () =>\n\t\t\t\tthis.publish(PublishableVideoPlayerEvents.SEEKED)\n\t\t\t);\n\t\t\tplayer.on(\n\t\t\t\tthis.dailymotion.events.PLAYER_VIDEOCHANGE,\n\t\t\t\tasync (state: DailymotionState) => {\n\t\t\t\t\tlogger.debug('video changed')();\n\n\t\t\t\t\t// Update internal values\n\t\t\t\t\tthis.videoId = state.videoId;\n\t\t\t\t\tthis.videoTitle = state.videoTitle;\n\t\t\t\t\tthis.videoDuration = state.videoDuration;\n\n\t\t\t\t\tthis.publish(PublishableVideoPlayerEvents.VIDEO_CHANGE);\n\n\t\t\t\t\tconst videoInfos: VideoInfos = {\n\t\t\t\t\t\tid: this.videoId,\n\t\t\t\t\t\ttitle: this.videoTitle,\n\t\t\t\t\t\tdurationSeconds: this.videoDuration\n\t\t\t\t\t};\n\n\t\t\t\t\t// Update current video infos\n\t\t\t\t\tthis.videosPlayed.push(videoInfos);\n\t\t\t\t\tthis.videoInfos$.next(videoInfos);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tplayer.on(\n\t\t\t\tthis.dailymotion.events.PLAYER_VOLUMECHANGE,\n\t\t\t\t(state: DailymotionState) => {\n\t\t\t\t\t// Track unmute once by player\n\t\t\t\t\tlogger.debug(`New Volume State: ${state.playerVolume}`);\n\t\t\t\t\tif (\n\t\t\t\t\t\tstate.playerVolume > 0 &&\n\t\t\t\t\t\t!state.playerIsMuted &&\n\t\t\t\t\t\tthis.muted &&\n\t\t\t\t\t\t!this._userUnmuted\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis._userUnmuted = true;\n\t\t\t\t\t\tthis.muted = false;\n\t\t\t\t\t\tthis.publish(PublishableVideoPlayerEvents.UNMUTE);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.publish(PublishableVideoPlayerEvents.VOLUME_CHANGE);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Video Events\n\t\t\tplayer.on(\n\t\t\t\tthis.dailymotion.events.VIDEO_START,\n\t\t\t\tasync (data: DailymotionState) => {\n\t\t\t\t\tthis.contentStarted = true;\n\t\t\t\t\tthis.contentEnded = false;\n\n\t\t\t\t\tthis._refreshAdsForNextVideo(this._refreshAdsConfig);\n\t\t\t\t\tawait this.onContentStart.call(this);\n\n\t\t\t\t\tthis.publish(PublishableVideoContentEvents.VIDEO_START);\n\t\t\t\t}\n\t\t\t);\n\t\t\tplayer.on(this.dailymotion.events.AD_START, async () => {\n\t\t\t\tawait this.onContentStart.call(this);\n\t\t\t});\n\t\t\tplayer.on(\n\t\t\t\tthis.dailymotion.events.VIDEO_END,\n\t\t\t\tthis.onContentEnd.bind(this)\n\t\t\t);\n\t\t\tplayer.on(this.dailymotion.events.VIDEO_PAUSE, this.onPause.bind(this));\n\t\t\tplayer.on(this.dailymotion.events.VIDEO_PLAY, this.onPlay.bind(this));\n\t\t\tplayer.on(this.dailymotion.events.VIDEO_PLAYING, () =>\n\t\t\t\tthis.publish(PublishableVideoContentEvents.PLAYING)\n\t\t\t);\n\t\t\tplayer.on(this.dailymotion.events.VIDEO_DURATIONCHANGE, () => {\n\t\t\t\tconst message = PublishableVideoContentEvents.DURATION_CHANGE;\n\t\t\t\tthis.publish(message);\n\t\t\t});\n\t\t\tplayer.on(this.dailymotion.events.VIDEO_SUBTITLESCHANGE, () =>\n\t\t\t\tthis.publish(PublishableVideoContentEvents.SUBTITLE_CHANGE)\n\t\t\t);\n\t\t\tplayer.on(this.dailymotion.events.VIDEO_SUBTITLESREADY, () =>\n\t\t\t\tthis.publish(PublishableVideoContentEvents.SUBTITLES_AVAILABLE)\n\t\t\t);\n\t\t\tplayer.on(this.dailymotion.events.VIDEO_QUALITIESREADY, () =>\n\t\t\t\tthis.publish(PublishableVideoContentEvents.QUALITIES_AVAILABLE)\n\t\t\t);\n\t\t\tplayer.on(this.dailymotion.events.VIDEO_QUALITYCHANGE, () =>\n\t\t\t\tthis.publish(PublishableVideoContentEvents.QUALITIES_CHANGED)\n\t\t\t);\n\t\t\tplayer.on(this.dailymotion.events.VIDEO_TIMECHANGE, () =>\n\t\t\t\tthis.publish(PublishableVideoContentEvents.TIME_UPDATE)\n\t\t\t);\n\t\t\tplayer.on(this.dailymotion.events.VIDEO_PROGRESS, () =>\n\t\t\t\tthis.publish(PublishableVideoContentEvents.PROGRESS)\n\t\t\t);\n\t\t});\n\t}\n\n\tprotected initErrorsListeners() {\n\t\t// https://developer.dailymotion.com/api/#error-codes\n\t\tthis.api.on(\n\t\t\tDailymotionEmbedInternalEvents.PLAYER_ERROR,\n\t\t\tfunction (err) {\n\t\t\t\tvar error = this.api.error || {\n\t\t\t\t\tcode: 'DM Unknown Error',\n\t\t\t\t\tmessage: 'Cannot catch DM error'\n\t\t\t\t};\n\t\t\t\tvar message =\n\t\t\t\t\t'[' + error.code + '] ' + error.message.replace(/\\+/g, ' ');\n\t\t\t\tlogger.error(message)();\n\t\t\t\tthis.logError(message);\n\t\t\t}.bind(this)\n\t\t);\n\t}\n\n\tpublic async init(...args: any[]): Promise {\n\t\tawait super.init(...args);\n\t\tawait this.onReady();\n\n\t\treturn Promise.resolve();\n\t}\n\n\tprotected prePlay = () => {}; // Do Nothing\n\tprotected postPlay = () => {}; // Do Nothing\n\tprotected postReady = () => {}; // Do Nothing\n\n\tprivate async onContentStart() {\n\t\tconst state = await this.api.getState();\n\n\t\t// Keep video volume to track unmute later\n\t\tconst userVolume = state.playerVolume;\n\t\tif (userVolume !== this._currentVolume) {\n\t\t\tthis._currentVolume = userVolume;\n\t\t}\n\n\t\tthis.publish(PublishableVideoStickyEvents.STICKY_CONTENT_START);\n\t}\n\n\tprivate _refreshAdsForNextVideo(shouldRefresh: boolean) {\n\t\tif (!shouldRefresh) return;\n\n\t\tconst doRefreshAdsConfig = async () => {\n\t\t\tconst state = await this.api.getState();\n\n\t\t\tconst timeLeft = state.videoDuration - state.videoTime;\n\t\t\tconst shouldRefresh = timeLeft < 10;\n\n\t\t\tif (shouldRefresh) {\n\t\t\t\tthis.api.setCustomConfig({\n\t\t\t\t\tcustomParams: this.setup.params.customConfig?.customParams\n\t\t\t\t});\n\n\t\t\t\twindow.clearInterval(reloadAdsConfigListener);\n\t\t\t}\n\t\t};\n\t\tconst reloadAdsConfigListener = window.setInterval(\n\t\t\tdoRefreshAdsConfig,\n\t\t\t2000\n\t\t);\n\t}\n\n\tprivate onContentEnd() {\n\t\tthis.contentEnded = true;\n\t\tthis.contentStarted = false;\n\t\tthis.publish(PublishableVideoContentEvents.VIDEO_END);\n\t}\n\n\tpublic getRollPosition() {\n\t\treturn this.isPreroll()\n\t\t\t? 'preroll'\n\t\t\t: this.isPostRoll()\n\t\t\t? 'postRoll'\n\t\t\t: this.isMidroll()\n\t\t\t? 'midroll'\n\t\t\t: undefined;\n\t}\n\n\t// ==== Player API functions\n\t// Playback functions\n\tpublic isPaused = async () => {\n\t\tconst state = await this.api.getState();\n\t\tconst isPlaying = state.playerIsPlaying;\n\t\treturn !isPlaying;\n\t};\n\tpublic isPreroll = () => !this.contentStarted;\n\tpublic isMidroll = () => this.contentStarted && !this.contentEnded;\n\tpublic isPostRoll = () => this.contentEnded;\n\tpublic isMuted = async () => (await this.api.getState()).playerIsMuted;\n\tpublic isFullscreen = async () =>\n\t\t(await this.api.getState()).playerPresentationMode === 'fullscreen';\n\tpublic load = (video: string, playlist: string, startTime?: number) =>\n\t\tthis.api.loadContent({ video, playlist, startTime });\n\n\t// Sound\n\tpublic mute = () => this.api.setMute(true);\n\tpublic unmute = () => {\n\t\tthis.muted = false;\n\t\tthis.publish(PublishableVideoPlayerEvents.UNMUTE);\n\n\t\treturn this.api.setMute(false);\n\t};\n\n\t// Player informations/unifygroup/aufeminin/aufeminin-php/-/clusters\n\tpublic getContainer = () => document.getElementById(this.id);\n\tpublic getPosition = async () => (await this.api.getState()).videoTime;\n\tpublic getDuration = async () => (await this.api.getState()).videoDuration;\n\tpublic getVideo = async () => (await this.api.getState()).videoId;\n\n\tprivate _getDailymotionIframe = () =>\n\t\tdocument.getElementsByClassName('dailymotion-player')[0];\n\n\tpublic getFile() {\n\t\tconst rx =\n\t\t\t/((?:http:\\/\\/)|(?:https:\\/\\/))(www.)?((?:[a-zA-Z0-9]+\\.[a-z]{3})|(?:\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(?::\\d+)?))([\\/a-zA-Z0-9\\.]*)/;\n\t\tconst iframeSrc = this._getDailymotionIframe()?.getAttribute('src');\n\t\tconst match = iframeSrc?.match(rx);\n\t\treturn match ? match[0] : undefined;\n\t}\n\n\tpublic getQuality = async () => (await this.api.getState()).videoQuality;\n\tpublic getVolume = async () => (await this.api.getState()).playerVolume;\n\t// Contains error code, title and message about the last error that occurred in the player\n\tpublic getLastError = async () => (await this.api.getState()).playerError;\n\tpublic hasControls = async () =>\n\t\t(await this.api.getSettings()).enableControls;\n}\n\nwindow.AufVideo = window.AufVideo || {};\nwindow.AufVideo.DailymotionEmbedPlayer = DailymotionEmbedPlayer;\n","import DailymotionEmbedAdPlayer from 'src/adPlayers/dailymotion-embed';\nimport { start } from 'src/main';\nimport { DailymotionEmbedPlayer } from 'src/players/dailymotion-embed';\n\n// Wait for Dailymotion to be defined before starting player\nconst interval = setInterval(function () {\n\t// get elem\n\tif (typeof window.dailymotion === 'undefined') return;\n\tclearInterval(interval);\n\n\t// the rest of the code\n\tstart(DailymotionEmbedPlayer, DailymotionEmbedAdPlayer);\n}, 100);\n"],"names":["queue","Aflog","window","Queue","cmd","this","push","prototype","constructor","i","arguments","length","e","afLogger","logError","Logger","EXTERNAL_DOMAINS_REGEXP","EXTERNAL_DOMAINS_REGEXP_LEGACY","REALTIME_LOGGING_HEADER_BIDDING_MAPPING","content_type","site","segment","device","browser","browser_version","os","os_version","account","adserver","bidder","cpm","format","size","target","ad_unit_path","line_item_id","campaign_id","creative_id","logger","options","init","sessionDataDisabled","verbose","context","datalayer","af_dataLayer","disableSessionData","initCommandQueue","initContext","initSessionsLogger","onbeforeunload","sendLogsToBigQuery","bind","connection","navigator","network","downlink","effectiveType","rtt","saveData","bowser","d","name","console","error","browserInformations","version","osInformations","osName","osname","osVersion","osversion","getBowserContext","realtimeLoggingPlaceholders","addContext","data","getFilteredDatalayer","session","getSessionData","undefined","setVerbose","service","enabled","key","toLowerCase","getConfig","localStorage","setItem","setDataLayer","logConsole","logs","Array","isArray","concat","table","count","apply","message","pool","consoleOnly","prefix","sampleRate","Math","floor","random","coef","revision","stacktrace","reversedMessage","split","reverse","join","stackMessage","url","getLogPixelDomain","encodeURIComponent","round","sendBeacon","sendLogToPixel","logErrorWithContext","logEvent","sampled","logAnalytics","applySampling","sessionData","l","location","href","addLogsToQueue","afSession","visitor","getVisitorId","getSessionId","pageview","getPageviewId","wave","getWaveId","rank","getRankId","siteInfo","platform","document","domain","replace","filteredDatalayer","userInfo","user","du","dom","adblocker","screenResolution","vuid","id","pageInfo","page","contentType","content","type","section","subsection","subSection","tag","mainTag","category","adstack","campaignInfo","utmSource","source","utmCampaign","campaign","utmMedium","medium","paid","includes","isMobile","PubSub","that","subscribe","logSessions","payload","JSON","stringify","service_name","channel","hostname","hostnameArr","shift","test","indexOf","realtimeLogs","realtimeTimer","realtimeLogTime","realtimeLoggingMapping","HEADER_BIDDING","HEADER_BIDDING_BOOKED","HEADER_BIDDING_RENDER","formattedLog","getFormattedRealtimeLog","hasOwnProperty","nbLogs","setTimeout","log","mapping","value","path","logtype","clearTimeout","sendXhrRequest","header","hashs","getLocationHash","getItem","method","headers","request","XDomainRequest","XMLHttpRequest","open","setRequestHeader","onerror","response","body","send","hashParams","a","r","s","decodeURIComponent","q","hash","substring","exec","module","VideoLogType","afLogger_1","PublishableVideoPlayerEvents","PublishableVideoContentEvents","PublishableVideoUserEvents","PublishableVideoLogEvents","PublishableVideoAdEvents","PublishableVideoStoreEvents","PublishableVideoStickyEvents","VideoPlugins","AfLogger","VideoLogger","_this","serviceName","noisyErrorSampleRate","noisyErrors","logged","Map","VIDEO_ERROR","VIDEO_LOG","isEnabled","videoData","duration","file","position","video","getErrorRate","errorRate","__assign","logEventOnce","_a","get","_b","set","AufVideo","Tracker","AspectRatio","DailymotionInternalEvents","DailymotionEmbedInternalEvents","PlayerPosition","Players","root","factory","warn","messages","lastUid","ALL_SUBSCRIBING_MSG","hasKeys","obj","Object","call","throwException","ex","callSubscriberWithDelayedExceptions","subscriber","callSubscriberWithImmediateExceptions","deliverMessage","originalMessage","matchedMessage","immediateExceptions","subscribers","callSubscriber","createDeliveryFunction","topic","String","lastIndexOf","substr","hasDirectSubscribersFor","Boolean","messageHasSubscribers","found","publish","sync","deliver","toString","publishSync","func","token","subscribeAll","subscribeOnce","unsubscribe","clearAllSubscriptions","clearSubscriptions","m","countSubscriptions","getSubscriptions","list","t","descendantTopicExists","isTopic","isToken","isFunction","result","exports","VideoPlayers","AnalyticsPlugin","_events","_playerListenersActions","ERROR","actionFn","msg","_logError","event","_logEventOnce","READY","START","PLAY","_logEvent","VIDEO_END","CLOSE","UNMUTE","INITIALIZATION_ERROR","_adPlayerListenersActions","AD_BLOCKED","AD_READY","AD_LOADED","videoBreak","AD_UNFILLED","AD_PLAY","_logEventOnceByVideo","AD_START","AD_REQUEST","AD_END","AD_CLICK","AD_IMPRESSION","AD_CONTENT_RESUME","AD_BID_FOUND","HEAVY_ADS","_getLogger","instanceId","storeInstance","_store","getInstance","_initListeners","listenersActions","forEach","listenAction","store","__spreadArray","action","instance","player","Error","DAILYMOTION_EMBED","getVideo","videoId","Analytics","VideoConsoleLogger","info","hidden","_writeLog","debug","level","parse","videoPlayer","color","frontColor","backgroundColor","getColorString","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","freeGlobal","global","freeSelf","self","Function","objectToString","nativeMax","max","nativeMin","min","now","Date","isObject","toNumber","isObjectLike","isSymbol","other","valueOf","isBinary","slice","lodash_debounce","wait","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","args","thisArg","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","remainingWait","debounced","isInvoking","cancel","flush","AutoplayPlugin","_enabled","_storeInstances","scrollEvent","_autoplayMainViewablePlayer","_stickyClosing","_listenersActions","_registerInstance","_debouncedAutoplay","_unregisterInstance","TOGGLE_PLAY_PAUSE","_toggle","_stickyEnabled","getCurrentPlayableInstance","_stickyCloseHandler","isSticked","DAILYMOTION_EMBED_LAZY_READY","STICKED","debounce","forceEnable","currentInstance","videoContainerViewable","isViewable","isPlaying","canAutoplay","playing","videoStarted","adPaused","canPause","isStickyEnabled","playableInstances","from","values","filter","autoplay","startOnSight","_i","playableInstances_1","adPlayer","adsState","paused","playing_1","sent","viewable","isSticky","playVideo","pauseVideo","getActivePlayer","play","_sleep","p","pause","sticky","setCurrentPlayableInstanceId","stickyClosing","isPlayingAds","ended","has","delete","timeout","Autoplay","DebugPlugin","_showDebugElement","playerId","container","createElement","style","cursor","classList","add","innerHTML","onclick","playerContainer","getElementById","appendChild","x","Debug","_enable_super_gross_mode_that_will_cause_bad_things","config","Promise","useDeprecatedSynchronousErrorHandling","stack","hostReportError","err","closed","next","complete","UnsubscriptionErrorImpl","errors","map","create","Subscription","_parentOrParents","_ctorUnsubscribe","_unsubscribe","_subscriptions","remove","index","UnsubscriptionError","flattenUnsubscriptionErrors","len","sub","teardown","subscription","EMPTY","tmp","subscriptions","subscriptionIndex","splice","empty","reduce","errs","rxSubscriber","Symbol","Subscriber","_super","syncErrorValue","syncErrorThrown","syncErrorThrowable","isStopped","destination","emptyObserver","destinationOrNext","SafeSubscriber","tslib_1.__extends","rxSubscriberSymbol","_next","_error","_complete","observerOrNext","_parentSubscriber","_context","__tryOrSetError","__tryOrUnsub","wrappedComplete","fn","parent","identity","pipeFromArray","fns","input","prev","Observable","_subscribe","lift","operator","observable","sink","nextOrObserver","_trySubscribe","observer","closed_1","canReportError","promiseCtor","getPromiseCtor","resolve","reject","Symbol_observable","pipe","operations","toPromise","subscribeToArray","array","iterator","getSymbolIterator","isPromise","then","subscribeTo","obs","isArrayLike","promise","Symbol_iterator","iterable","item","done","return","SimpleInnerSubscriber","notifyNext","notifyError","notifyComplete","SimpleOuterSubscriber","innerValue","isScheduler","schedule","scheduleArray","scheduler","scheduled","isInteropObservable","scheduleObservable","schedulePromise","isIterable","scheduleIterable","project","MapOperator","MapSubscriber","mergeMap","resultSelector","concurrent","Number","POSITIVE_INFINITY","b","ii","MergeMapOperator","MergeMapSubscriber","buffer","active","_innerSub","ish","innerSubscriber","innerSubscription","innerSubscribe","hasCompleted","mergeAll","DistinctUntilChangedOperator","compare","keySelector","DistinctUntilChangedSubscriber","hasKey","y","ObjectUnsubscribedErrorImpl","SubjectSubscription","subject","observers","subscriberIndex","SubjectSubscriber","Subject","hasError","AnonymousSubject","ObjectUnsubscribedError","copy","thrownError","asObservable","MapToOperator","MapToSubscriber","StickyFormats","BehaviorSubject","defineProperty","getValue","configurable","_value","query","ns","ref","chunks","className","trim","element","createElementNS","setAttribute","unmount","child","parentEl","getEl","childEl","__redom_view","parentNode","doUnmount","removeChild","hooks","__redom_lifecycle","hooksAreEmpty","traverse","__redom_mounted","trigger","parentHooks","hook","hookNames","shadowRootAvailable","mount","before","wasMounted","oldParent","beforeEl","el","replaceChild","insertBefore","remount","hooksFound","hookName","triggered","nodeType","Node","DOCUMENT_NODE","ShadowRoot","doMount","eventName","view","hookCount","firstChild","nextSibling","setStyleValue","xlinkns","setAttrInternal","arg1","arg2","initial","isSVG","SVGElement","isFunc","setStyle","setData","setXlink","removeAttribute","setAttributeNS","removeAttributeNS","dataset","parseArgumentsInternal","arg","str","createTextNode","isNode","html","Query","setChildren","children","current","_current","childEls","i$1","__redom_index","extend","StickyButtonsEvents","Visibility","getClassname","customClassName","customClassList","StickyBaseElement","hide","show","DEFAULT_CLASSNAME","StickyPlaceholder","settings","customClass","node","__extends","fromEvent","setupSubscription","sourceObj","handler","addEventListener","removeEventListener","isEventTarget","source_1","on","off","isJQueryStyleEventEmitter","source_2","addListener","removeListener","isNodeStyleEventEmitter","source_3","DEFAULT_CLASSLIST","StickyButton","icon","text","iconEl","textEl","getChildren","clicked$","StickyButtonsBar","switchVisibility$","goBackButton","closeButton","events$","last","observables","pop","fromArray","merge","mapTo","GO_TO_PLAYER","doSwitchVisibilty","state","HIDDEN","VISIBLE","btn","VP_TOP","VP_BOTTOM","CONTAINER_POSITION","DEFAULT_SETTINGS","StickyBaseLayout","playerContainerId","stickedClasses","toggleableElements","sticked$","toggleElements","sticked","toggleStickedClass","playerWrapper","_getPlayer","_getPlayerWrapper","_getParentNode","playerElement","distinctUntilChanged","funcs","mergeFunctions","defaultCloseBtnVisibility","closeBtnSwitchFeatureEnabled","closeBtnVisibility$","FlyingStickyLayout","background","buttonsBar","BannerStickyLayout","displayVideosInfos","stickyBannerVideosInfos$","contentWrapper","videoInfosElement","_videoTitleElement","_videoDurationElement","setPosition","toggleVideosInfo","onmount","videoInfo","textContent","title","onunmount","force","toggle","addedClass","removedClass","disabledStickySessionVarName","isStickySessionDisabled","sessionStorage","getWindowPosition","w","documentElement","width","innerWidth","clientWidth","height","innerHeight","clientHeight","left","pageXOffset","scrollLeft","top","pageYOffset","scrollTop","right","bottom","isInViewport","percent","topOffset","rect","getBoundingClientRect","wSize","visibleHeight","visibleWidth","totalSize","percentInViewport","StickyPlugin","stickMainViewablePlayer","_disabledForPage","_closedByUser","_isSticked","_stickyReady","_disabledByElementOnScreen","_xPos","_yPos","_xPosExtra","_yPosExtra","_waitForAdLoaded","_adLoaded","_stickBothSide","screenOrientationChanged$","screen","orientation","ADD_INSTANCE","instanceData","_id","stickTo","_instance","_initLayout","_stickyFormat","_stickyFormatOptions","STICKY_READY","readyData","_onPlayerReady","_layout","VIDEO_START","STICKY_CONTENT_START","_cancelDisablingTimeout","ONCOMPLETE_TIMEOUT","_onCompleteTimeout","_player","playlist","_disable","SEEKING","PAUSE","xPos","yPos","_moveStickyToCollisionPosition","onPopupShow","_resetStickyPosition","CRITICAL_PATH_READY","STICK","stick","UNSTICK","unstick","layout","defaultSettings","defaultStickyClass","BANNER","formatOptions","displayDetails","_stickTo","getLayout","handlers","_scrollToPlayer","notYetImplemented","subject$","videoInfos$","videoInfos","minutes","seconds","sec","durationSeconds","_init","_updatePlayerBoundingRect","UNSTICKED","shouldDisable","topBelowMiddle","isViewportPositionned","IS_BELOW_CONTAINER_MIDDLE","bottomAboveMiddle","IS_ABOVE_CONTAINER_MIDDLE","_scrollUp","IS_PARTIALLY_WITHIN_VP","condition","res","containerSize","o","offsetWidth","offsetHeight","offsetParent","offsetLeft","offsetTop","getElementPosition","windowSize","IS_BELOW_CONTAINER_TOP","IS_ABOVE_CONTAINER_BOTTOM","IS_WITHIN_VP","stickUnstickHandler","selector","stickyRect","targetEl","querySelector","targetRect","stickyIsOnTarget","stickyIsOnElement","_stickyRect","contentStarted","getContainer","_container","stickyOptions","waitForAdLoaded","scrollUp","stickBothSide","FLYING","getDefaultFormatOptions","topPosition","SCROLL_OFFSET","scrollTo","behavior","disabledForSession","disabledForPage","reason","_movePlayer","elt","requestAnimationFrame","Sticky","Store","viewableTreshold","instances","__awaiter","_c","_d","isActive","addInstance","thisInstance","currentPlayableInstanceId","AufVideoUtils","addClickListener","containerId","classNames","callback","getElementsByClassName","stopPropagation","getCookieValue","cname","ca","cookie","c","charAt","getDFPFormattedKeywords","keywords","formattedKeywords","keyValue","keyValueArr","keyQS","keyQSPos","keyValues","throttle","previous","later","remaining","isPreview","search","injectScript","src","cb","params","script","async","onload","getElementsByTagName","Utils","Manager","plugins","labels","ANALYTICS","STICKY","AUTOPLAY","host","DEBUG","_initPlugins","_initScrollListener","_initInstance","_pausePreviousPlayingInstance","gdprAppliesGlobally","_initPlayers","didomiOnReady","didomi","Didomi","consentShouldBeCollected","shouldConsentBeCollected","didomiEventListeners","listener","__generator","initPlayerWithoutPegasus","_playerInitCb","initAdPlayer","getAdParams","playerInitWithPegasus","responseBids","_onPlayerInit","disablePreroll","replaceVariable","isPrerollDisabled","isAdDisabled","pegasus","getData","setHbResponses","pegasusAccount","pegasusAdUnit","adUnit","cancelAdvertising","_disablePreroll","adParams","adPlayerInstance","ui","getAdTagCustomParameters","custom","onApiLoaded","npaActivated","_getNpaFromCmp","usePegasus","needPegasus","lazyLoadDailymotion","pushToPegasus","pegasusHandler","cbName","_hbVideoActive","disabledPreroll","createLazyPlayer","VERSION","previousInstance","pluginsWithScrollHandlers","plugin","passive","toLocaleLowerCase","initRelatedContents","RelatedContents","revolver","_getInstancesAdsInfo","infos","placement","SETTINGS","DEFAULTplayer_WIDTH","DEFAULTplayer_HEIGHT","HB_VIDEO_TIMEOUT","DEFAULT_AD_TAG_URL","CMP_AD_SERVER_KEY","DEBUG_AD_TAG_URL","AdPlayer","started","pods","eventsLists","_debug","_allowMultipleTinyAds","_ready","hbResponses","_hbResponses","isPaused","_logConsole","_userHasAdBlock","afAdblock","status","_getAdRule","_adRule","siteId","_adTargeting","adTargeting","allowMultipleTinyAds","_adScheduleId","adScheduleId","hbVideoActive","_jwpAdvertisingParameters","jwpAdvertisingParameters","_isCM","isCM","_playPreroll","playPreroll","adRule","_viewableVideo","getUserConsentStatusForVendor","AD_TAG_READY","_playAdInstant","adTagUrl","_postInit","getAdTagUrl","typeAd","_adTagUrl","customParameters","nonPersonalizedAds","iu","customParams","npa","vpos","description_url","cust_params","correlator","ad_rule","keys","k","_postPlayAdInstant","publishApiEvent","ad","_getAdData","_getVideoBreak","URL","_initApiListeners","_initErrorsListeners","muted","mute","_getAdTargetingFormated","playerWidth","ready","getWidth","playerHeight","getHeight","getUserConsentStatusForPurpose","_getPegasusBids","hbResponse","amazon","prebid","getBids","prebidItem","amazonItem","isPrebid","bids","isAmazon","targeting","targetings","startsWith","unify_dataSlayer","pageItem","find","elem","lockVerz","_hasHbResponses","pegasusBids","debugPrerollAdTargeting","sas_target","pegasusConfKeywords","pegasusConf","pegasusDotConfKeywords","_e","conf","pegasusReady","pegasusReadyInterval","setInterval","googletag","getGlobalTargeting","pubads","clearInterval","_f","error_1","globalTargeting","pegasusTargetting","_setAdsState","AD_PAUSE","AD_RESUME","_pushToEventsList","hasPrebidProps","getOwnPropertyNames","hasAmazonProps","DailymotionEmbedAdPlayer","dailymotion","_apiListenersActions","events","_emitEventHandler","AD_TIMECHANGE","AD_TIMEUPDATE","AD_COMPANIONSREADY","AD_COMPANIONS","AD_DURATIONCHANGE","PLAYER_HEAVYADSINTERVENTION","report","api","adData","getRollPosition","getPlayer","evt","BROWSER_ALIASES_MAP","Bada","BlackBerry","Chrome","Chromium","Electron","Epiphany","Firefox","Focus","Generic","Googlebot","Maxthon","Opera","PhantomJS","Puffin","QupZilla","QQ","QQLite","Safari","Sailfish","SeaMonkey","Sleipnir","Swing","Tizen","Vivaldi","WeChat","Roku","BROWSER_MAP","amazon_silk","android","bada","blackberry","chrome","chromium","electron","epiphany","firefox","focus","generic","googlebot","google_search","ie","k_meleon","maxthon","edge","mz","naver","opera","opera_coast","phantomjs","puffin","qupzilla","qq","qqlite","safari","sailfish","samsung_internet","seamonkey","sleipnir","swing","tizen","uc","vivaldi","webos","wechat","yandex","PLATFORMS_MAP","tablet","mobile","desktop","tv","OS_MAP","WindowsPhone","Windows","MacOS","iOS","Android","WebOS","Linux","ChromeOS","PlayStation4","ENGINE_MAP","EdgeHTML","Blink","Trident","Presto","Gecko","WebKit","static","regexp","ua","match","_const","v","versionA","versionB","isLoose","versionAPrecision","getVersionPrecision","versionBPrecision","precision","lastPrecision","delta","_version","chunk","arr","predicate","assigners","assign","assigner","browserName","browserAlias","commonVersionIdentifier","browsersList","describe","getFirstMatch","getSecondMatch","parser","notLikeAndroid","butAndroid","osParsersList","versionName","getWindowsVersionName","getMacOSVersionName","getAndroidVersionName","platformParsersList","vendor","model","iDevice","likeIDevice","getBrowserName","osMajorVersion","getOSVersion","getOSName","enginesParsersList","engine","isGecko","likeGecko","Parser","UA","skipParsing","_ua","parsedResult","getUA","regex","parseBrowser","browserDescriptor","browserParsersList","_browser","some","getBrowser","getBrowserVersion","getOS","parseOS","_os","getPlatform","parsePlatform","getPlatformType","_platform","getEngine","parseEngine","getEngineName","_engine","getResult","satisfies","checkTree","platformsAndOSes","platformsAndOSCounter","browsers","browsersCounter","currentDefinition","platformsAndOSNames","OSMatchingDefinition","isOS","osResult","platformMatchingDefinition","isPlatform","platformResult","browserNames","matchingDefinition","isBrowser","compareVersion","includingAlias","defaultBrowserName","browserNameLower","alias","getBrowserTypeByAlias","expectedResults","comparableVersion","currentBrowserVersion","compareVersions","platformType","isEngine","engineName","is","anything","anythings","GaVideoTracker","_extraDailymotionData","_trackEventOnceByVideo","_trackEvent","dataToSend","opt_label","opt_value","opt_noninteraction","sampling","customData","isNaN","eventBase","eventCategory","eventAction","eventLabel","eventValue","eventNonInt","m_dataLayer","uaEventCategory","uaEventAction","uaEventLibelle","uaEventValue","uaEventNonInt","_gaq","trackAnalyticsEvent","_initEventListeners","_getDataToSend","videoFileUrl","getFile","extraDailymotionData","getExtraAnalyticsData","dailymotionId","routePath","internalDomains","routeUrl","origin","fetch","json","videoType","datePublication","videoTitle","videosPlayed","GA","buildVideoPlayer","playerConstructor","isJwPlayer","techno","JWPLAYER","isDailymotion","DAILYMOTION","isDailymotionEmbed","sources","image","poster","dailymotionPlaylistID","playerSettings","aspectRatio","fluid","isLazyLoadedPlayer","pmad","pmxd","initAll","adConstructor","isComScoreTrackingEnabled","videoLoggerSettings","adTechno","videoPlayerVersionNumber","buildVideoLogger","adPlayerConstructor","adsSettings","adLabel","language","adPlayerLanguage","midrollActive","minTimeMidroll","buildAdPlayer","adTarget","_getAdTargetingString","nextVideo","nextVideoLabel","instanceProps","addStoreInstance","userAgent","start","ensureVideoVarsAreSet","waitForVars","videoPhpVars","videoPlayerUnifyInitDone","queryParamsArr","PermutiveService","permutive","_percentagePlayedMarkers","_eventsToListen","_allowedPermutiveEventProperties","_videoPercentagePlayed","playedPositionPercent","videoTime","videoDuration","lastKnownPlayedPositionPercent","_lastKnownPlayedPositionPercent","played_depth","permutiveEventContent_1","played","property","_permutive","track","_dailymotion","attachPermutiveGoogleAdManagerTargeting","_checkPermutive","_pdfps","viewId","workspaceId","attachPermutiveEventsToDailyEmbed","permutiveEventContent","videoCreatedTime","toISOString","errMsg","afUserAgent","_isMobile","_isTablet","_regexMobile","_regexTabletSmall","_regexTablet","_initialized","isTablet","afAddEvent","capture","attachEvent","oldListener","Player","_userUnmuted","_aufIsMobile","_aufAddEvent","AD_CANCEL","onPause","_readyCb","disableAds","adsParams","readyCb","initListeners","initApi","initApiListeners","initErrorsListeners","successHandler","errorHandler","onReady","END","postReady","onPlay","prePlay","postPlay","initCommonListeners","DailymotionEmbedPlayer","contentEnded","_lazyContentLoaded","_refreshAdsConfig","createPlayer","_playerBasicOptions","getState","playerIsPlaying","isPreroll","isMidroll","isPostRoll","isMuted","playerIsMuted","isFullscreen","playerPresentationMode","load","startTime","loadContent","setMute","unmute","getPosition","getDuration","_getDailymotionIframe","getQuality","videoQuality","getVolume","playerVolume","getLastError","playerError","hasControls","getSettings","enableControls","adsRules","_isLazyLoaded","customConfig","adsDailyParams","maxValues","matchPermutive","permutiveValues","truncatedPermutiveValues","getCustomParamsWithTruncatedPermutive","adRulesStr","setup","attachPermutive","_lazyLoadContent","setCustomConfig","updateParams","PLAYER_CRITICALPATHREADY","PLAYER_CONTROLSCHANGE","CONTROLS_CHANGE","PLAYER_START","PLAYER_END","FULLSCREEN_CHANGE","VIDEO_SEEKSTART","VIDEO_SEEKEND","SEEKED","PLAYER_VIDEOCHANGE","VIDEO_CHANGE","PLAYER_VOLUMECHANGE","VOLUME_CHANGE","_refreshAdsForNextVideo","onContentStart","onContentEnd","VIDEO_PAUSE","VIDEO_PLAY","VIDEO_PLAYING","PLAYING","VIDEO_DURATIONCHANGE","DURATION_CHANGE","VIDEO_SUBTITLESCHANGE","SUBTITLE_CHANGE","VIDEO_SUBTITLESREADY","SUBTITLES_AVAILABLE","VIDEO_QUALITIESREADY","QUALITIES_AVAILABLE","VIDEO_QUALITYCHANGE","QUALITIES_CHANGED","VIDEO_TIMECHANGE","TIME_UPDATE","VIDEO_PROGRESS","PROGRESS","PLAYER_ERROR","code","userVolume","_currentVolume","shouldRefresh","reloadAdsConfigListener","timeLeft","iframeSrc","getAttribute","interval"],"mappings":"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"}