UNPKG

36.1 kBSource Map (JSON)View Raw
1{"version":3,"file":"index.module.js","sources":["../src/mediaEvents.ts","../src/constants.ts","../src/eventGroups.ts","../src/helperFunctions.ts","../src/findMediaElement.ts","../src/buildMediaEvent.ts","../src/index.ts"],"sourcesContent":["// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#events\n\nexport const MediaEvent = {\n ABORT: 'abort',\n CANPLAY: 'canplay',\n CANPLAYTHROUGH: 'canplaythrough',\n DURATIONCHANGE: 'durationchange',\n EMPTIED: 'emptied',\n ENDED: 'ended',\n ERROR: 'error',\n LOADEDMETADATA: 'loadedmetadata',\n LOADSTART: 'loadstart',\n PAUSE: 'pause',\n PLAY: 'play',\n PLAYING: 'playing',\n PROGRESS: 'progress',\n RATECHANGE: 'ratechange',\n RESIZE: 'resize',\n SEEKED: 'seeked',\n SEEKING: 'seeking',\n STALLED: 'stalled',\n SUSPEND: 'suspend',\n TIMEUPDATE: 'timeupdate',\n VOLUMECHANGE: 'volumechange',\n WAITING: 'waiting',\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement#events\n\nexport const VideoEvent = {\n ENTERPICTUREINPICTURE: 'enterpictureinpicture',\n LEAVEPICTUREINPICTURE: 'leavepictureinpicture',\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/TextTrack#events\nexport const TextTrackEvent = {\n CHANGE: 'change',\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Document/fullscreenchange_event\nexport const DocumentEvent = {\n FULLSCREENCHANGE: 'fullscreenchange',\n};\n\nexport const SnowplowEvent = {\n PERCENTPROGRESS: 'percentprogress',\n};\n","import { TextTrackEvent } from './mediaEvents';\nimport { SearchError } from './types';\n\nexport const READY_STATE: Record<number, string> = {\n 0: 'HAVE_NOTHING',\n 1: 'HAVE_METADATA',\n 2: 'HAVE_CURRENT_DATA',\n 3: 'HAVE_FUTURE_DATA',\n 4: 'HAVE_ENOUGH_DATA',\n};\n\nexport const NETWORK_STATE: Record<number, string> = {\n 0: 'NETWORK_EMPTY',\n 1: 'NETWORK_IDLE',\n 2: 'NETWORK_LOADING',\n 3: 'NETWORK_NO_SOURCE',\n};\n\nexport const TAG: Record<string, string> = {\n VIDEO: 'VIDEO',\n AUDIO: 'AUDIO',\n};\n\nexport const SEARCH_ERROR: SearchError = {\n NOT_FOUND: 'Media element not found',\n MULTIPLE_ELEMENTS: 'More than one media element in the provided node',\n PLYR_CURRENTSRC: 'Plyr currentSrc not updated',\n};\n\nexport const eventNames: Record<string, string> = {\n [TextTrackEvent.CHANGE]: 'texttrackchange',\n};\nObject.keys(eventNames).forEach((k) => (eventNames[eventNames[k]] = k));\n","import { EventGroup } from './types';\nimport { DocumentEvent, MediaEvent, SnowplowEvent, TextTrackEvent, VideoEvent } from './mediaEvents';\n\nconst enumValues = (enumType: any) => Object.keys(enumType).map((key) => enumType[key]);\n\nexport const AllEvents: EventGroup = [\n ...enumValues(MediaEvent),\n ...enumValues(SnowplowEvent),\n ...enumValues(VideoEvent),\n ...enumValues(TextTrackEvent),\n ...enumValues(DocumentEvent),\n];\n\nexport const DefaultEvents: EventGroup = [\n MediaEvent.PAUSE,\n MediaEvent.PLAY,\n MediaEvent.SEEKED,\n MediaEvent.RATECHANGE,\n MediaEvent.VOLUMECHANGE,\n MediaEvent.ENDED,\n DocumentEvent.FULLSCREENCHANGE,\n SnowplowEvent.PERCENTPROGRESS,\n];\n\nexport const EventGroups: Record<string, EventGroup> = {\n AllEvents: AllEvents,\n DefaultEvents: DefaultEvents,\n};\n","import { eventNames } from './constants';\nimport { AllEvents, DefaultEvents, EventGroups } from './eventGroups';\nimport { MediaEvent, SnowplowEvent } from './mediaEvents';\nimport { EventGroup, MediaTrackingOptions, TextTrack, TrackingOptions } from './types';\n\nexport function timeRangesToObjectArray(t: TimeRanges): { start: number; end: number }[] {\n const out = [];\n for (let i = 0; i < t.length; i++) {\n out.push({ start: t.start(i), end: t.end(i) });\n }\n return out;\n}\n\nexport function textTrackListToJson(textTrackList: TextTrackList): TextTrack[] {\n return Object.keys(textTrackList).map((_, i) => {\n return {\n label: textTrackList[i].label,\n language: textTrackList[i].language,\n kind: textTrackList[i].kind,\n mode: textTrackList[i].mode,\n };\n });\n}\n\nexport function isType(e: string, _type: Record<string, string>): boolean {\n return (\n Object.keys(_type)\n .map((k: string) => _type[k])\n .indexOf(e) !== -1\n );\n}\n\nexport function isElementFullScreen(id: string): boolean {\n return document.fullscreenElement?.id === id || false;\n}\n\nexport function boundaryErrorHandling(boundaries: number[]): number[] {\n // Remove any elements that are out of bounds\n if (boundaries.some((b) => b < 1 || 100 < b)) {\n boundaries = boundaries.filter((b) => 0 < b && b < 100);\n }\n // Remove any duplicate elements\n if (boundaries.some((b, _, self) => self.filter((f) => f == b).length > 1)) {\n boundaries = boundaries.filter((item, pos, self) => self.indexOf(item) == pos);\n }\n return boundaries;\n}\n\nexport function trackingOptionsParser(id: string, trackingOptions?: MediaTrackingOptions): TrackingOptions {\n const defaults: TrackingOptions = {\n id: id,\n captureEvents: DefaultEvents,\n progress: {\n boundaries: [10, 25, 50, 75],\n boundaryTimeoutIds: [],\n },\n volume: {\n trackingInterval: 250,\n },\n };\n\n if (!trackingOptions) return defaults;\n\n if (trackingOptions?.captureEvents) {\n let parsedEvents: string[] | EventGroup = [];\n trackingOptions.captureEvents.forEach((ev) => {\n // If an event is an EventGroup, get the events from that group\n if (EventGroups.hasOwnProperty(ev)) {\n parsedEvents = parsedEvents.concat(EventGroups[ev]);\n } else if (!Object.keys(AllEvents).filter((k) => k === ev)) {\n console.warn(`'${ev}' is not a valid event.`);\n } else {\n parsedEvents.push(ev in eventNames ? eventNames[ev] : ev);\n }\n });\n\n trackingOptions.captureEvents = parsedEvents;\n if (trackingOptions.captureEvents.indexOf(SnowplowEvent.PERCENTPROGRESS) !== -1) {\n defaults.progress = {\n boundaries: trackingOptions?.boundaries || defaults.progress!.boundaries,\n boundaryTimeoutIds: [],\n };\n }\n\n if (trackingOptions.captureEvents.indexOf(MediaEvent.VOLUMECHANGE) !== -1) {\n defaults.volume = {\n trackingInterval: trackingOptions?.volumeChangeTrackingInterval || defaults.volume!.trackingInterval,\n };\n }\n }\n return { ...defaults, ...trackingOptions };\n}\n\n// Checks if a url is a data_url, so we don't send a (potentially large) payload\nexport function dataUrlHandler(url: string): string {\n if (url.indexOf('data:') !== -1) {\n return 'DATA_URL';\n }\n return url;\n}\n","import { SEARCH_ERROR, TAG } from './constants';\nimport { SearchResult } from './types';\n\nexport function findMediaElem(id: string): SearchResult {\n let el: HTMLVideoElement | HTMLAudioElement | HTMLElement | null = document.getElementById(id);\n\n if (!el) return { err: SEARCH_ERROR.NOT_FOUND };\n if (isAudioElement(el)) return { el: el };\n\n if (isVideoElement(el)) {\n // Plyr loads in an initial blank video with currentSrc as https://cdn.plyr.io/static/blank.mp4\n // so we need to check until currentSrc updates\n if (el.currentSrc === 'https://cdn.plyr.io/static/blank.mp4' && el.readyState === 0) {\n return { err: SEARCH_ERROR.PLYR_CURRENTSRC };\n }\n return { el: el };\n }\n\n return findMediaElementChild(el);\n}\n\nfunction findMediaElementChild(el: Element): SearchResult {\n for (let tag of Object.keys(TAG)) {\n let elem = el.getElementsByTagName(tag);\n if (elem.length === 1) {\n if (isAudioElement(elem[0])) return { el: elem[0] };\n if (isVideoElement(elem[0])) return { el: elem[0] };\n } else if (elem.length > 1) {\n return { err: SEARCH_ERROR.MULTIPLE_ELEMENTS };\n }\n }\n return { err: SEARCH_ERROR.NOT_FOUND };\n}\n\nfunction isAudioElement(el: Element): el is HTMLAudioElement {\n return el.tagName === TAG.AUDIO;\n}\n\nfunction isVideoElement(el: Element): el is HTMLVideoElement {\n return el.tagName === TAG.VIDEO;\n}\n","import { eventNames, NETWORK_STATE, READY_STATE } from './constants';\nimport { MediaElement, MediaPlayer, MediaPlayerEvent, VideoElement } from './contexts';\nimport { dataUrlHandler, isElementFullScreen, textTrackListToJson, timeRangesToObjectArray } from './helperFunctions';\nimport { EventDetail, MediaEntities, MediaEventData, TrackingOptions } from './types';\n\nexport function buildMediaEvent(\n e: string,\n el: HTMLAudioElement | HTMLVideoElement,\n conf: TrackingOptions,\n detail?: EventDetail\n): MediaEventData {\n const context = [getHTMLMediaElementEntities(el), getMediaPlayerEntities(el, detail)];\n if (el instanceof HTMLVideoElement) context.push(getHTMLVideoElementEntities(el as HTMLVideoElement));\n const data: MediaPlayerEvent = { type: e in eventNames ? eventNames[e] : e };\n if (conf.label) data.label = conf.label;\n return {\n schema: 'iglu:com.snowplowanalytics.snowplow/media_player_event/jsonschema/1-0-0',\n data: data,\n context: context,\n };\n}\n\nfunction getMediaPlayerEntities(el: HTMLAudioElement | HTMLVideoElement, detail?: EventDetail): MediaEntities {\n const data: MediaPlayer = {\n currentTime: el.currentTime || 0,\n duration: el.duration || 0,\n ended: el.ended,\n loop: el.loop,\n muted: el.muted,\n paused: el.paused,\n playbackRate: el.playbackRate,\n volume: parseInt(String(el.volume * 100)),\n };\n if (detail?.boundary) {\n data.percentProgress = detail.boundary;\n }\n return {\n schema: 'iglu:com.snowplowanalytics.snowplow/media_player/jsonschema/1-0-0',\n data: data,\n };\n}\n\nfunction getHTMLMediaElementEntities(el: HTMLAudioElement | HTMLVideoElement): MediaEntities {\n const data: MediaElement = {\n htmlId: el.id,\n mediaType: el.tagName as MediaElement['mediaType'],\n autoPlay: el.autoplay,\n buffered: timeRangesToObjectArray(el.buffered),\n controls: el.controls,\n currentSrc: el.currentSrc,\n defaultMuted: el.defaultMuted || false,\n defaultPlaybackRate: el.defaultPlaybackRate,\n error: el.error ? { code: el.error?.code, message: el.error?.message } : null,\n networkState: NETWORK_STATE[el.networkState] as MediaElement['networkState'],\n preload: el.preload,\n readyState: READY_STATE[el.readyState] as MediaElement['readyState'],\n seekable: timeRangesToObjectArray(el.seekable),\n seeking: el.seeking,\n src: dataUrlHandler(el.src),\n textTracks: textTrackListToJson(el.textTracks),\n fileExtension: el.currentSrc.split('.').pop() as string,\n fullscreen: isElementFullScreen(el.id),\n pictureInPicture: document.pictureInPictureElement?.id === el.id,\n };\n if (el.disableRemotePlayback) data.disableRemotePlayback = el.disableRemotePlayback;\n if (el.crossOrigin) data.crossOrigin = el.crossOrigin;\n return {\n schema: 'iglu:org.whatwg/media_element/jsonschema/1-0-0',\n data: data,\n };\n}\n\nfunction getHTMLVideoElementEntities(el: HTMLVideoElement): MediaEntities {\n const data: VideoElement = {\n poster: el.poster,\n videoHeight: el.videoHeight,\n videoWidth: el.videoWidth,\n };\n if (el.autoPictureInPicture) data.autoPictureInPicture = el.autoPictureInPicture;\n if (el.disablePictureInPicture) data.disablePictureInPicture = el.disablePictureInPicture;\n return {\n schema: 'iglu:org.whatwg/video_element/jsonschema/1-0-0',\n data: data,\n };\n}\n","/*\n * Copyright (c) 2022 Snowplow Analytics Ltd\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { isType, boundaryErrorHandling, trackingOptionsParser } from './helperFunctions';\nimport { DocumentEvent, MediaEvent, SnowplowEvent, TextTrackEvent } from './mediaEvents';\nimport { TrackingOptions, MediaTrackingOptions, TrackedElement, EventDetail } from './types';\nimport { BrowserPlugin, BrowserTracker, dispatchToTrackersInCollection } from '@snowplow/browser-tracker-core';\nimport { buildSelfDescribingEvent, CommonEventProperties, Logger, SelfDescribingJson } from '@snowplow/tracker-core';\nimport { MediaPlayerEvent } from './contexts';\nimport { findMediaElem } from './findMediaElement';\nimport { buildMediaEvent } from './buildMediaEvent';\nimport { SEARCH_ERROR } from './constants';\n\ndeclare global {\n interface HTMLVideoElement {\n autoPictureInPicture: boolean;\n disableRemotePlayback: boolean;\n disablePictureInPicture: boolean;\n }\n interface HTMLAudioElement {\n disableRemotePlayback: boolean;\n }\n interface Document {\n pictureInPictureElement: Element;\n msFullscreenElement: Element;\n }\n}\n\nlet LOG: Logger;\nconst _trackers: Record<string, BrowserTracker> = {};\n\nexport function MediaTrackingPlugin(): BrowserPlugin {\n return {\n activateBrowserPlugin: (tracker: BrowserTracker) => {\n _trackers[tracker.id] = tracker;\n },\n logger: (logger) => {\n LOG = logger;\n },\n };\n}\n\nconst trackedIds: Record<string, TrackedElement> = {};\n\n// IE doesn't assign the 'target' property to the element a fullscreen event was called from,\n// so need to track the element that is fullscreen, so when leaving fullscreen, we can\n// check which id to track the event for (as document.fullscreenElement is null at that point)\nlet fullscreenElementId: string = '';\n\nexport function enableMediaTracking(args: { id: string; options?: MediaTrackingOptions }) {\n const conf: TrackingOptions = trackingOptionsParser(args.id, args.options);\n\n // Some events have additional effects/need to perform checks before running mediaPlayerEvent\n const eventsWithOtherFunctions: Record<string, Function> = {\n [DocumentEvent.FULLSCREENCHANGE]: (e: string, el: HTMLAudioElement | HTMLVideoElement, conf: TrackingOptions) => {\n // If there is no fullscreen element, it means we are entering fullscreen\n if (document.fullscreenElement || document.msFullscreenElement) {\n fullscreenElementId = document.fullscreenElement?.id || document.msFullscreenElement?.id;\n }\n if (fullscreenElementId === el.id) {\n mediaPlayerEvent(e, el, conf);\n }\n },\n [MediaEvent.SEEKED]: (eventName: string, el: HTMLAudioElement | HTMLVideoElement, conf: TrackingOptions) => {\n if (conf.captureEvents.indexOf(SnowplowEvent.PERCENTPROGRESS) !== 0) {\n while (conf.progress!.boundaryTimeoutIds.length) {\n clearTimeout(conf.progress!.boundaryTimeoutIds.pop() as ReturnType<typeof setTimeout>);\n }\n mediaPlayerEvent(eventName, el, conf);\n setPercentageBoundTimeouts(el, conf);\n }\n },\n };\n\n const eventHandlers: Record<string, Function> = {};\n conf.captureEvents.forEach((ev) => {\n if (eventsWithOtherFunctions.hasOwnProperty(ev)) {\n eventHandlers[ev] = (e: string, el: HTMLAudioElement | HTMLVideoElement, conf: TrackingOptions, event: Event) =>\n eventsWithOtherFunctions[ev](e, el, conf, event);\n } else {\n eventHandlers[ev] = (e: string, el: HTMLAudioElement | HTMLVideoElement, conf: TrackingOptions) =>\n mediaPlayerEvent(e, el, conf);\n }\n });\n\n trackedIds[args.id] = { waitTime: 250, retryCount: 5, tracking: false };\n setUpListeners(args.id, conf, eventHandlers);\n}\n\nfunction setUpListeners(id: string, conf: TrackingOptions, eventHandlers: Record<string, Function>) {\n // The element may not be loaded in time for this function to run, so we have a few goes at finding the element\n const result = findMediaElem(id);\n\n if (!trackedIds[id].retryCount) {\n LOG.error(result.err || SEARCH_ERROR.NOT_FOUND);\n return;\n }\n\n if (!result.el) {\n trackedIds[id].retryCount--;\n trackedIds[id].timeoutId = setTimeout(() => setUpListeners(id, conf, eventHandlers), trackedIds[id].waitTime);\n trackedIds[id].waitTime *= 2;\n return;\n }\n\n clearTimeout(trackedIds[id].timeoutId as ReturnType<typeof setTimeout>);\n\n if (!trackedIds[id].tracking) {\n if (conf.captureEvents.indexOf(SnowplowEvent.PERCENTPROGRESS) !== 0) {\n boundaryErrorHandling(conf.progress!.boundaries);\n setPercentageBoundTimeouts(result.el, conf);\n }\n addCaptureEventListeners(result.el, conf, eventHandlers);\n trackedIds[id].tracking = true;\n }\n}\n\nfunction addCaptureEventListeners(\n el: HTMLAudioElement | HTMLVideoElement,\n conf: TrackingOptions,\n eventHandlers: Record<string, Function>\n): void {\n conf.captureEvents.forEach((e) => {\n if (isType(e, TextTrackEvent)) {\n // IE10 doesn't support addEventListener for TextTrack objects\n if (el.textTracks.hasOwnProperty('addEventListener')) {\n el.textTracks.addEventListener(e, () => eventHandlers[e](e, el, conf));\n }\n } else if (isType(e, DocumentEvent)) {\n // The event emitted by the listener is needed for fullscreen tracking, as on exiting fullscreen\n // document.fullscreenElement is null. The id is needed to check if the event should be tracked\n ['MSFullscreenChange', 'fullscreenchange'].forEach((p: string) => {\n document.addEventListener(p, () => eventHandlers[e](e, el, conf));\n });\n } else {\n el.addEventListener(e, () => eventHandlers[e](e, el, conf));\n }\n });\n}\n\nfunction mediaPlayerEvent(\n e: string,\n el: HTMLAudioElement | HTMLVideoElement,\n conf: TrackingOptions,\n detail?: EventDetail\n): void {\n const event = buildMediaEvent(e, el, conf, detail);\n if (conf.captureEvents.indexOf(SnowplowEvent.PERCENTPROGRESS) !== -1) {\n progressHandler(e, el, conf);\n }\n\n // Dragging the volume scrubber will generate a lot of events, this limits the rate at which\n // volume events can be sent at\n if (e === MediaEvent.VOLUMECHANGE) {\n clearTimeout(conf.volume!.eventTimeoutId as ReturnType<typeof setTimeout>);\n conf.volume!.eventTimeoutId = setTimeout(() => trackMediaEvent(event), conf.volume!.trackingInterval);\n } else {\n trackMediaEvent(event);\n }\n}\n\nfunction trackMediaEvent(\n event: SelfDescribingJson<MediaPlayerEvent> & CommonEventProperties,\n trackers: Array<string> = Object.keys(_trackers)\n): void {\n dispatchToTrackersInCollection(trackers, _trackers, (t) => {\n t.core.track(buildSelfDescribingEvent({ event }), event.context, event.timestamp);\n });\n}\n\n// Progress Tracking\n\nfunction progressHandler(e: string, el: HTMLAudioElement | HTMLVideoElement, conf: TrackingOptions) {\n // If the event is a pause event, we need to clear any existing progress timeouts, and set them again on play\n if (e === MediaEvent.PAUSE) {\n while (conf.progress!.boundaryTimeoutIds.length) {\n clearTimeout(conf.progress!.boundaryTimeoutIds.pop() as ReturnType<typeof setTimeout>);\n }\n }\n if (e === MediaEvent.PLAY && (el as HTMLAudioElement | HTMLVideoElement).readyState > 0) {\n setPercentageBoundTimeouts(el as HTMLAudioElement | HTMLVideoElement, conf);\n }\n}\n\nfunction setPercentageBoundTimeouts(el: HTMLAudioElement | HTMLVideoElement, conf: TrackingOptions) {\n conf.progress!.boundaries.forEach((boundary) => {\n const absoluteBoundaryTimeMs = el.duration * (boundary / 100) * 1000;\n const timeUntilBoundaryEvent = absoluteBoundaryTimeMs - el.currentTime * 1000;\n // If the boundary is less than the current time, we don't need to bother setting it\n if (0 < timeUntilBoundaryEvent) {\n conf.progress!.boundaryTimeoutIds.push(\n setTimeout(\n () => waitAnyRemainingTimeAfterTimeout(el, absoluteBoundaryTimeMs, boundary, conf),\n timeUntilBoundaryEvent\n )\n );\n }\n });\n}\n\n// The timeout in setPercentageBoundTimeouts fires ~100 - 300ms early\n// waitAnyRemainingTimeAfterTimeout ensures the event is fired accurately\n\nfunction waitAnyRemainingTimeAfterTimeout(\n el: HTMLAudioElement | HTMLVideoElement,\n absoluteBoundaryTimeMs: number,\n boundary: number,\n conf: TrackingOptions\n) {\n if (el.currentTime * 1000 < absoluteBoundaryTimeMs) {\n setTimeout(() => {\n waitAnyRemainingTimeAfterTimeout(el, absoluteBoundaryTimeMs, boundary, conf);\n }, 10);\n } else {\n mediaPlayerEvent(SnowplowEvent.PERCENTPROGRESS, el, conf, { boundary: boundary });\n }\n}\n"],"names":[],"mappings":"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"}
\No newline at end of file