OwlCyberSecurity - MANAGER
Edit File: p-afee75a6.js.map
{"version":3,"names":["timePassed","current","duration","showAfter","percent","lightOrDark","color","r","g","b","hsp","match","rgb","hex","slice","replace","length","Math","sqrt","timeToSeconds","time","pieces","split","seconds","parseInt","getMobileOperatingSystem","userAgent","navigator","vendor","test","platform","maxTouchPoints","isIOS","isMobile","isWebView","standalone","window","toLowerCase","safari","ios","includes","isAndroidWebView","parseColor","m","exitFullScreen","player","_b","_a","config","blockAttributes","playsInline","_c","media","webkitExitFullScreen","_d","embed","exitFullscreen","_e","provider","lastTime","currentTime","once","getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","isObject","Object","isString","String","isArray","Array","isNodeList","NodeList","isElement","nodeType","style","ownerDocument","isEmpty","keys","is","nullOrUndefined","object","string","nodeList","element","empty","array","value","getTag","INFINITY","baseToString","result","toString","isNumber","isBoolean","isObjectLike","isDefined","undefined","isBlank","trim","prototype","call","EXTENDED_SEARCH_UNAVAILABLE","INCORRECT_INDEX_TYPE","LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY","key","PATTERN_LENGTH_TOO_LARGE","max","MISSING_KEY_PROPERTY","name","INVALID_KEY_WEIGHT_VALUE","hasOwn","hasOwnProperty","KeyStore","this","_keys","_keyMap","totalWeight","forEach","obj","createKey","weight","push","id","get","keyId","toJSON","JSON","stringify","path","src","getFn","createKeyPath","createKeyId","Error","join","list","arr","deepGet","index","i","len","MatchOptions","includeMatches","findAllMatches","minMatchCharLength","BasicOptions","isCaseSensitive","includeScore","shouldSort","sortFn","a","score","idx","FuzzyOptions","location","threshold","distance","AdvancedOptions","useExtendedSearch","ignoreLocation","ignoreFieldNorm","fieldNormWeight","Config","SPACE","norm","mantissa","cache","Map","pow","numTokens","has","n","parseFloat","round","set","clear","FuseIndex","isCreated","setIndexRecords","setSources","docs","records","setKeys","_keysMap","create","doc","docIndex","_addString","_addObject","add","size","removeAt","splice","getValueForItemAtKeyId","item","record","v","$","keyIndex","subRecords","stack","nestedArrIndex","pop","subRecord","k","createIndex","myIndex","map","parseIndex","data","computeScore$1","pattern","errors","currentLocation","expectedLocation","accuracy","proximity","abs","convertMaskToIndices","matchmask","indices","start","end","MAX_BITS","search","text","patternAlphabet","patternLen","textLen","min","currentThreshold","bestLocation","computeMatches","matchMask","indexOf","lastBitArr","finalScore","binMax","mask","binMin","binMid","floor","finish","bitArr","j","charMatch","charAt","isMatch","createPatternAlphabet","char","BitapSearch","options","chunks","addChunk","startIndex","alphabet","remainder","substr","searchIn","allIndices","totalScore","hasMatches","BaseMatch","isMultiMatch","getMatch","multiRegex","isSingleMatch","singleRegex","exp","matches","ExactMatch","super","type","InverseExactMatch","PrefixExactMatch","startsWith","InversePrefixExactMatch","SuffixExactMatch","endsWith","InverseSuffixExactMatch","FuzzyMatch","_bitapSearch","IncludeMatch","searchers","searchersLen","SPACE_RE","OR_TOKEN","parseQuery","query","filter","results","queryItem","found","searcher","token","MultiMatchSet","Set","ExtendedSearch","condition","_","numMatches","qLen","pLen","registeredSearchers","register","args","createSearcher","searcherClass","LogicalOperator","AND","OR","KeyType","PATH","PATTERN","isExpression","isPath","isLeaf","convertToExplicit","parse","auto","next","isQueryPath","node","children","operator","computeScore","Number","EPSILON","transformMatches","refIndex","transformScore","format","transformers","transformer","Fuse","_keyStore","setCollection","_docs","_myIndex","remove","predicate","getIndex","limit","_searchStringList","_searchObjectList","_searchLogical","sort","expression","evaluate","_findMatches","res","child","resultMap","expResults","version","isHLS","url","getParents","elem","parents","parentNode","nodeName","setAttributes","attributes","entries","setAttribute","createElement","document","innerText","vttToJson","track","ret","reduce","acc","prop","cues","cue","startTime","endTime","fuzzySearch","searchKeyword","preset","assign","fuseObject","searchInJson","searchString","searchResult","ceil","label","searchVtt","textTracks","captions","currentTrack","getCues","jsonTrack","removeOldMarkers","elements","progress","oldMarkers","querySelectorAll","setMarkers","points","containerFragment","createDocumentFragment","pointsFragment","point","markerElement","class","left","addEventListener","appendChild","markers","tip","cacheCues","enabled","_f","toggleCaptions","interval","setInterval","generatedCues","setCues","clearInterval","locallyStoredCues","localStorage","getItem","setItem"],"sources":["src/util.ts","src/components/core/player/functions/is.ts","../../node_modules/fuse.js/dist/fuse.esm.js","src/components/core/player/functions/util.ts","src/components/core/player/functions/search-vtt.ts","src/components/core/player/functions/cache-cues.ts"],"sourcesContent":["/**\n * Find out if time is passed.\n * @returns boolean\n */\nexport function timePassed({ current, duration, showAfter = null }: { current: number; duration: number; showAfter: number }) {\n if (showAfter === 0) {\n return true;\n }\n\n if (showAfter === null || !duration) {\n return false;\n }\n\n if (current === showAfter) {\n return true;\n }\n\n let percent = (current / duration) * 100;\n if (99.9 < percent) {\n percent = 100;\n }\n return percent >= showAfter;\n}\n\nexport function lightOrDark(color: string) {\n if (!color) return;\n // Variables for red, green, blue values\n let r, g, b, hsp;\n\n // Check the format of the color, HEX or RGB?\n if (color.match(/^rgb/)) {\n // If RGB --> store the red, green, blue values in separate variables\n const rgb = color.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)$/);\n\n r = rgb[1];\n g = rgb[2];\n b = rgb[3];\n } else {\n // If hex --> Convert it to RGB: http://gist.github.com/983661\n const hex = +('0x' + color.slice(1).replace(color.length < 5 && /./g, '$&$&'));\n\n r = hex >> 16;\n g = (hex >> 8) & 255;\n b = hex & 255;\n }\n\n // HSP (Highly Sensitive Poo) equation from http://alienryderflex.com/hsp.html\n hsp = Math.sqrt(0.299 * (r * r) + 0.587 * (g * g) + 0.114 * (b * b));\n\n // Using the HSP value, determine whether the color is light or dark\n if (hsp > 127.5) {\n return 'light';\n } else {\n return 'dark';\n }\n}\n\nexport function timeToSeconds(time) {\n let pieces = time.split(':');\n let seconds;\n if (pieces.length > 1) {\n seconds = parseInt(pieces[0]) * 60;\n }\n return parseInt(pieces[1]) + parseInt(seconds);\n}\n\nexport function getMobileOperatingSystem() {\n var userAgent = navigator.userAgent || navigator.vendor;\n\n // Windows Phone must come first because its UA also contains \"Android\"\n if (/windows phone/i.test(userAgent)) {\n return 'Windows Phone';\n }\n\n if (/android/i.test(userAgent)) {\n return 'Android';\n }\n\n // iOS detection from: http://stackoverflow.com/a/9039885/177710\n if ((navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) || /(iPad|iPhone|iPod)/gi.test(navigator.platform)) {\n return 'iOS';\n }\n\n return 'unknown';\n}\n\nexport function isIOS() {\n return getMobileOperatingSystem() === 'iOS';\n}\n\nexport function isMobile() {\n return getMobileOperatingSystem() !== 'unknown';\n}\n\n/**\n * Is iOS Youtube Fullscreen.\n */\nexport function isiOSYoutubeFullscreen(player) {\n return isIOS() && player.provider === 'youtube' && !player?.config?.blockAttributes?.playsinline;\n}\n\nexport function isWebView() {\n var standalone = window.navigator['standalone'],\n userAgent = window.navigator.userAgent.toLowerCase(),\n safari = /safari/.test(userAgent),\n ios = /iphone|ipod|ipad/.test(userAgent);\n\n if (ios) {\n if (!standalone && safari) {\n // Safari\n return false;\n } else if (!standalone && !safari) {\n // iOS webview\n return true;\n }\n } else {\n if (userAgent.includes('wv')) {\n // Android webview\n return true;\n } else {\n // Chrome\n return false;\n }\n }\n}\n\nexport function isAndroidWebView() {\n if (getMobileOperatingSystem() === 'Android' && isWebView()) {\n return true;\n } else {\n return false;\n }\n}\n\nexport function parseColor(color) {\n var m = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i);\n if (m) {\n return [m[1], m[2], m[3], '1'];\n }\n\n m = color.match(/^rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*((0.)?\\d+)\\s*\\)$/i);\n if (m) {\n return [m[1], m[2], m[3], m[4]];\n }\n}\n\nexport function exitFullScreen(player: any) {\n if (!isMobile()) return;\n if (!player?.config?.blockAttributes?.playsInline) {\n // html5\n typeof player?.media?.webkitExitFullScreen === 'function' && player?.media.webkitExitFullScreen();\n\n // vimeo\n typeof player?.embed?.exitFullscreen === 'function' && player?.embed?.exitFullscreen();\n\n // youtube hack\n if (player.provider === 'youtube') {\n const lastTime = player.currentTime;\n player.currentTime = player.duration;\n player.once('playing', () => {\n player.currentTime = lastTime;\n });\n }\n }\n}\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isString = input => getConstructor(input) === String;\nconst isArray = input => Array.isArray(input);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => input !== null && typeof input === 'object' && input.nodeType === 1 && typeof input.style === 'object' && typeof input.ownerDocument === 'object';\nconst isEmpty = input => isNullOrUndefined(input) || ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) || (isObject(input) && !Object.keys(input).length);\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n string: isString,\n nodeList: isNodeList,\n element: isElement,\n empty: isEmpty,\n array: isArray,\n};\n","/**\n * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2022 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray\n ? getTag(value) === '[object Array]'\n : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value\n }\n let result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return (\n value === true ||\n value === false ||\n (isObjectLike(value) && getTag(value) == '[object Boolean]')\n )\n}\n\nfunction isObject(value) {\n return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null\n ? value === undefined\n ? '[object Undefined]'\n : '[object Null]'\n : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n\n let totalWeight = 0;\n\n keys.forEach((key) => {\n let obj = createKey(key);\n\n totalWeight += obj.weight;\n\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach((key) => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId]\n }\n keys() {\n return this._keys\n }\n toJSON() {\n return JSON.stringify(this._keys)\n }\n}\n\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'))\n }\n\n const name = key.name;\n src = name;\n\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n }\n }\n\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n\n return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n let list = [];\n let arr = false;\n\n const deepGet = (obj, path, index) => {\n if (!isDefined(obj)) {\n return\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(obj);\n } else {\n let key = path[index];\n\n const value = obj[key];\n\n if (!isDefined(value)) {\n return\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (\n index === path.length - 1 &&\n (isString(value) || isNumber(value) || isBoolean(value))\n ) {\n list.push(toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n // Whether the matches should be included in the result set. When `true`, each record in the result\n // set will include the indices of the matched characters.\n // These can consequently be used for highlighting purposes.\n includeMatches: false,\n // When `true`, the matching function will continue to the end of a search pattern even if\n // a perfect match has already been located in the string.\n findAllMatches: false,\n // Minimum number of characters that must be matched before a result is considered a match\n minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n // When `true`, the algorithm continues searching to the end of the input even if a perfect\n // match is found before the end of the same input.\n isCaseSensitive: false,\n // When true, the matching function will continue to the end of a search pattern even if\n includeScore: false,\n // List of properties that will be searched. This also supports nested properties.\n keys: [],\n // Whether to sort the result list, by score\n shouldSort: true,\n // Default sort function: sort by ascending score, ascending index\n sortFn: (a, b) =>\n a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n // Approximately where in the text is the pattern expected to be found?\n location: 0,\n // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n // (of both letters and location), a threshold of '1.0' would match anything.\n threshold: 0.6,\n // Determines how close the match must be to the fuzzy location (specified above).\n // An exact letter match which is 'distance' characters away from the fuzzy location\n // would score as a complete mismatch. A distance of '0' requires the match be at\n // the exact location specified, a threshold of '1000' would require a perfect match\n // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n distance: 100\n};\n\nconst AdvancedOptions = {\n // When `true`, it enables the use of unix-like search commands\n useExtendedSearch: false,\n // The get function to use when fetching an object's properties.\n // The default will search nested paths *ie foo.bar.baz*\n getFn: get,\n // When `true`, search will ignore `location` and `distance`, so it won't matter\n // where in the string the pattern appears.\n // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n ignoreLocation: false,\n // When `true`, the calculation for the relevance score (used for sorting) will\n // ignore the field-length norm.\n // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n ignoreFieldNorm: false,\n // The weight to determine how much field length norm effects scoring.\n fieldNormWeight: 1\n};\n\nvar Config = {\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n\n if (cache.has(numTokens)) {\n return cache.get(numTokens)\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n\n cache.set(numTokens, n);\n\n return n\n },\n clear() {\n cache.clear();\n }\n }\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return\n }\n\n this.isCreated = true;\n\n // List is Array<String>\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array<Object>\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]]\n }\n size() {\n return this.records.length\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return\n }\n\n let record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n let record = { i: docIndex, $: {} };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n if (!isDefined(value)) {\n return\n }\n\n if (isArray(value)) {\n let subRecords = [];\n const stack = [{ nestedArrIndex: -1, value }];\n\n while (stack.length) {\n const { nestedArrIndex, value } = stack.pop();\n\n if (!isDefined(value)) {\n continue\n }\n\n if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n i: nestedArrIndex,\n n: this.norm.get(value)\n };\n\n subRecords.push(subRecord);\n } else if (isArray(value)) {\n value.forEach((item, k) => {\n stack.push({\n nestedArrIndex: k,\n value: item\n });\n });\n } else ;\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n\n record.$[keyIndex] = subRecord;\n }\n });\n\n this.records.push(record);\n }\n toJSON() {\n return {\n keys: this.keys,\n records: this.records\n }\n }\n}\n\nfunction createIndex(\n keys,\n docs,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex\n}\n\nfunction parseIndex(\n data,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const { keys, records } = data;\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex\n}\n\nfunction computeScore$1(\n pattern,\n {\n errors = 0,\n currentLocation = 0,\n expectedLocation = 0,\n distance = Config.distance,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n const accuracy = errors / pattern.length;\n\n if (ignoreLocation) {\n return accuracy\n }\n\n const proximity = Math.abs(expectedLocation - currentLocation);\n\n if (!distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy\n }\n\n return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n matchmask = [],\n minMatchCharLength = Config.minMatchCharLength\n) {\n let indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (let len = matchmask.length; i < len; i += 1) {\n let match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n\n return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n text,\n pattern,\n patternAlphabet,\n {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n }\n\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n let score = computeScore$1(pattern, {\n currentLocation: index,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n\n const mask = 1 << (patternLen - 1);\n\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n\n while (binMin < binMid) {\n const score = computeScore$1(pattern, {\n errors: i,\n currentLocation: expectedLocation + binMid,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n\n let start = Math.max(1, expectedLocation - binMid + 1);\n let finish = findAllMatches\n ? textLen\n : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n let bitArr = Array(finish + 2);\n\n bitArr[finish + 1] = (1 << i) - 1;\n\n for (let j = finish; j >= start; j -= 1) {\n let currentLocation = j - 1;\n let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |=\n ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n }\n\n if (bitArr[j] & mask) {\n finalScore = computeScore$1(pattern, {\n errors: i,\n currentLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = computeScore$1(pattern, {\n errors: i + 1,\n currentLocation: expectedLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score > currentThreshold) {\n break\n }\n\n lastBitArr = bitArr;\n }\n\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n\n return result\n}\n\nfunction createPatternAlphabet(pattern) {\n let mask = {};\n\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n }\n\n return mask\n}\n\nclass BitapSearch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreLocation\n };\n\n this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\n this.chunks = [];\n\n if (!this.pattern.length) {\n return\n }\n\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n\n const len = this.pattern.length;\n\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n\n searchIn(text) {\n const { isCaseSensitive, includeMatches } = this.options;\n\n if (!isCaseSensitive) {\n text = text.toLowerCase();\n }\n\n // Exact match\n if (this.pattern === text) {\n let result = {\n isMatch: true,\n score: 0\n };\n\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n\n return result\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n\n let allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n\n this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n const { isMatch, score, indices } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n\n if (isMatch) {\n hasMatches = true;\n }\n\n totalScore += score;\n\n if (isMatch && indices) {\n allIndices = [...allIndices, ...indices];\n }\n });\n\n let result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n\n if (hasMatches && includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex)\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex)\n }\n search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact'\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/\n }\n static get singleRegex() {\n return /^=(.*)$/\n }\n search(text) {\n const isMatch = text === this.pattern;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!(.*)$/\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact'\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^\\^(.*)$/\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact'\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!\\^(.*)$/\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact'\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^(.*)\\$$/\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n }\n }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^!(.*)\\$$/\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy'\n }\n static get multiRegex() {\n return /^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^(.*)$/\n }\n search(text) {\n return this._bitapSearch.searchIn(text)\n }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include'\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/\n }\n static get singleRegex() {\n return /^'(.*)$/\n }\n search(text) {\n let location = 0;\n let index;\n\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n\n const isMatch = !!indices.length;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n }\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n ExactMatch,\n IncludeMatch,\n PrefixExactMatch,\n InversePrefixExactMatch,\n InverseSuffixExactMatch,\n SuffixExactMatch,\n InverseExactMatch,\n FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n return pattern.split(OR_TOKEN).map((item) => {\n let query = item\n .trim()\n .split(SPACE_RE)\n .filter((item) => item && !!item.trim());\n\n let results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n\n if (found) {\n continue\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break\n }\n }\n }\n\n return results\n })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token | Match type | Description |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` |\n * | `=scheme` | exact-match | Items that are `scheme` |\n * | `'python` | include-match | Items that include `python` |\n * | `!ruby` | inverse-exact-match | Items that do not include `ruby` |\n * | `^java` | prefix-exact-match | Items that start with `java` |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$` | suffix-exact-match | Items that end with `.js` |\n * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n constructor(\n pattern,\n {\n isCaseSensitive = Config.isCaseSensitive,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}\n ) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n\n this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n this.query = parseQuery(this.pattern, this.options);\n }\n\n static condition(_, options) {\n return options.useExtendedSearch\n }\n\n searchIn(text) {\n const query = this.query;\n\n if (!query) {\n return {\n isMatch: false,\n score: 1\n }\n }\n\n const { includeMatches, isCaseSensitive } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n\n let numMatches = 0;\n let allIndices = [];\n let totalScore = 0;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const { isMatch, indices, score } = searcher.search(text);\n\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n if (includeMatches) {\n const type = searcher.constructor.type;\n if (MultiMatchSet.has(type)) {\n allIndices = [...allIndices, ...indices];\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n break\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n let result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n\n if (includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n }\n }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n let searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options)\n }\n }\n\n return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\n\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n const next = (query) => {\n let keys = Object.keys(query);\n\n const isQueryPath = isPath(query);\n\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query))\n }\n\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n }\n\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n\n return obj\n }\n\n let node = {\n children: [],\n operator: keys[0]\n };\n\n keys.forEach((key) => {\n const value = query[key];\n\n if (isArray(value)) {\n value.forEach((item) => {\n node.children.push(next(item));\n });\n }\n });\n\n return node\n };\n\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n\n return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n results,\n { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n results.forEach((result) => {\n let totalScore = 1;\n\n result.matches.forEach(({ key, norm, score }) => {\n const weight = key ? key.weight : null;\n\n totalScore *= Math.pow(\n score === 0 && weight ? Number.EPSILON : score,\n (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n );\n });\n\n result.score = totalScore;\n });\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n\n if (!isDefined(matches)) {\n return\n }\n\n matches.forEach((match) => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return\n }\n\n const { indices, value } = match;\n\n let obj = {\n indices,\n value\n };\n\n if (match.key) {\n obj.key = match.key.src;\n }\n\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(\n results,\n docs,\n {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n } = {}\n) {\n const transformers = [];\n\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n\n return results.map((result) => {\n const { idx } = result;\n\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n\n if (transformers.length) {\n transformers.forEach((transformer) => {\n transformer(result, data);\n });\n }\n\n return data\n })\n}\n\nclass Fuse {\n constructor(docs, options = {}, index) {\n this.options = { ...Config, ...options };\n\n if (\n this.options.useExtendedSearch &&\n !true\n ) {\n throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n }\n\n this._keyStore = new KeyStore(this.options.keys);\n\n this.setCollection(docs, index);\n }\n\n setCollection(docs, index) {\n this._docs = docs;\n\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE)\n }\n\n this._myIndex =\n index ||\n createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n }\n\n add(doc) {\n if (!isDefined(doc)) {\n return\n }\n\n this._docs.push(doc);\n this._myIndex.add(doc);\n }\n\n remove(predicate = (/* doc, idx */) => false) {\n const results = [];\n\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n const doc = this._docs[i];\n if (predicate(doc, i)) {\n this.removeAt(i);\n i -= 1;\n len -= 1;\n\n results.push(doc);\n }\n }\n\n return results\n }\n\n removeAt(idx) {\n this._docs.splice(idx, 1);\n this._myIndex.removeAt(idx);\n }\n\n getIndex() {\n return this._myIndex\n }\n\n search(query, { limit = -1 } = {}) {\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n let results = isString(query)\n ? isString(this._docs[0])\n ? this._searchStringList(query)\n : this._searchObjectList(query)\n : this._searchLogical(query);\n\n computeScore(results, { ignoreFieldNorm });\n\n if (shouldSort) {\n results.sort(sortFn);\n }\n\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n\n return format(results, this._docs, {\n includeMatches,\n includeScore\n })\n }\n\n _searchStringList(query) {\n const searcher = createSearcher(query, this.options);\n const { records } = this._myIndex;\n const results = [];\n\n // Iterate over every string in the index\n records.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n results.push({\n item: text,\n idx,\n matches: [{ score, value: text, norm, indices }]\n });\n }\n });\n\n return results\n }\n\n _searchLogical(query) {\n\n const expression = parse(query, this.options);\n\n const evaluate = (node, item, idx) => {\n if (!node.children) {\n const { keyId, searcher } = node;\n\n const matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher\n });\n\n if (matches && matches.length) {\n return [\n {\n idx,\n item,\n matches\n }\n ]\n }\n\n return []\n }\n\n const res = [];\n for (let i = 0, len = node.children.length; i < len; i += 1) {\n const child = node.children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (node.operator === LogicalOperator.AND) {\n return []\n }\n }\n return res\n };\n\n const records = this._myIndex.records;\n const resultMap = {};\n const results = [];\n\n records.forEach(({ $: item, i: idx }) => {\n if (isDefined(item)) {\n let expResults = evaluate(expression, item, idx);\n\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap[idx]) {\n resultMap[idx] = { idx, item, matches: [] };\n results.push(resultMap[idx]);\n }\n expResults.forEach(({ matches }) => {\n resultMap[idx].matches.push(...matches);\n });\n }\n }\n });\n\n return results\n }\n\n _searchObjectList(query) {\n const searcher = createSearcher(query, this.options);\n const { keys, records } = this._myIndex;\n const results = [];\n\n // List is Array<Object>\n records.forEach(({ $: item, i: idx }) => {\n if (!isDefined(item)) {\n return\n }\n\n let matches = [];\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n matches.push(\n ...this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n })\n );\n });\n\n if (matches.length) {\n results.push({\n idx,\n item,\n matches\n });\n }\n });\n\n return results\n }\n _findMatches({ key, value, searcher }) {\n if (!isDefined(value)) {\n return []\n }\n\n let matches = [];\n\n if (isArray(value)) {\n value.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices\n });\n }\n });\n } else {\n const { v: text, n: norm } = value;\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({ score, key, value: text, norm, indices });\n }\n }\n\n return matches\n }\n}\n\nFuse.version = '6.6.2';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n Fuse.parseQuery = parse;\n}\n\n{\n register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n","import is from './is';\n\nexport function getYoutubeId(url) {\n const regExp = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n const match = (url || '').match(regExp);\n return match && match?.[2]?.length === 11 ? match[2] : null;\n}\n\nexport function getVimeoId(url) {\n const regExp = /^.*(vimeo\\.com\\/)((channels\\/[A-z]+\\/)|(groups\\/[A-z]+\\/videos\\/))?([0-9]+)/;\n const parseUrl = regExp.exec(url || '');\n return parseUrl?.[5] || '';\n}\n\nexport function determineVideoUrlType(url) {\n const youtube_id = getVimeoId(url);\n if (youtube_id) {\n return {\n video_id: youtube_id,\n type: 'vimeo',\n };\n }\n\n const vimeo_id = getYoutubeId(url);\n if (vimeo_id) {\n return {\n video_id: vimeo_id,\n type: 'youtube',\n };\n }\n\n return {\n $video_id: 0,\n $type: 'none',\n };\n}\n\n// is the source hls?\nexport function isHLS(url) {\n return typeof url === 'string' && url.includes('.m3u8');\n}\n\nexport function isNotEmptyObject(item: any) {\n return typeof item === 'object' && Object.keys(item).length;\n}\nexport function isNotEmptyArray(item: any) {\n return Array.isArray(item) && item.length > 0;\n}\nexport function timePassed({ current, duration, showAfter }: { current: number; duration: number; showAfter: number }) {\n if (current === showAfter) {\n return true;\n }\n\n let percent = (current / duration) * 100;\n if (99.9 < percent) {\n percent = 100;\n }\n return percent >= showAfter;\n}\n\nexport function getParents(elem) {\n var parents = [];\n while (elem.parentNode && elem.parentNode.nodeName.toLowerCase() != 'body') {\n elem = elem.parentNode;\n parents.push(elem);\n }\n return parents;\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n","import Fuse from 'fuse.js';\nimport { createElement } from './util';\nimport { getCues } from './cache-cues';\nimport is from './is';\n\n/**\n *\n * @param {TextTrack} track\n * @returns Cues fron the track\n */\nexport const vttToJson = track => {\n if (!track) return null;\n\n const ret = ['kind', 'label', 'language', 'id', 'inBandMetadataTrackDispatchType', 'mode', 'src'].reduce(\n (acc, prop) => {\n if (track[prop]) {\n acc[prop] = track[prop];\n }\n return acc;\n },\n {\n cues:\n track.cues &&\n Array.prototype.map.call(track.cues, function (cue) {\n return {\n startTime: cue.startTime,\n endTime: cue.endTime,\n text: cue.text,\n id: cue.id,\n };\n }),\n },\n );\n\n return ret;\n};\n\n/**\n *\n * @param {String} searchKeyword\n * @param {JSON} list\n * @returns Object of search results\n */\nconst fuzzySearch = (searchKeyword, list, preset) => {\n if (is.empty(list)) return [];\n if (is.empty(preset)) return [];\n if (!is.string(searchKeyword)) return [];\n\n /**\n * Default settings for the Fusejs library.\n * Reference - https://fusejs.io/api/options.html\n *\n * isCaseSensitive: false\n * includeScore: true\n * shouldSort: true\n * includeMatches: true\n * findAllMatches: false\n * minMatchCharLength: 1\n * location: 0\n * threshold: 0.3\n * distance: 100\n * useExtendedSearch: false\n * ignoreLocation: false\n * ignoreFieldNorm: false\n * fieldNormWeight: 1\n *\n */\n const options = {\n ...preset?.minMatchCharLength,\n ...preset?.threshold,\n shouldSort: false,\n includeMatches: true,\n threshold: 0.3,\n keys: ['text'],\n };\n\n if (null === list || !list || 0 === list.length) {\n return [];\n }\n\n const fuseObject = new Fuse(list, options);\n return fuseObject.search(searchKeyword);\n};\n\n/**\n *\n * @param {String} searchString\n * @param {JSON} list\n * @returns Array of time in seconds where the search string is found.\n */\nconst searchInJson = (searchString, list, preset) => {\n if (!is.string(searchString)) return [];\n if (is.empty(list)) return [];\n if (is.empty(preset)) return [];\n\n const searchResult = fuzzySearch(searchString, list, preset);\n\n return (\n searchResult &&\n Array.prototype.map.call(searchResult, function (result) {\n return {\n time: Math.ceil(result.item.startTime),\n label: ''\n };\n })\n );\n};\n\n/**\n *\n * @param {any} player\n * @param {string} searchString\n * @returns Array of time in seconds where the search string is found.\n */\nexport function searchVtt(player, searchString) {\n if (!player) return;\n if (!player?.media?.textTracks || player?.media?.textTracks?.length === 0) return;\n\n const track = player.media.textTracks;\n const preset = player.config.preset?.search || '';\n\n let cues = '';\n if (player.captions.currentTrack === -1) {\n // When no track is selected, grab the cues from cache localstorage.\n cues = getCues(player);\n } else {\n cues = track[player.captions.currentTrack];\n }\n\n if (is.empty(cues)) return [];\n\n const jsonTrack = vttToJson(cues);\n\n if (is.empty(jsonTrack)) return [];\n\n return searchInJson(searchString, jsonTrack?.cues, preset);\n}\n\nexport function removeOldMarkers(player) {\n if (!player) return;\n if (!player?.elements || !player?.elements?.progress) return;\n\n // Remove old markers.\n let oldMarkers = player.elements.progress.querySelectorAll('.plyr__progress__marker');\n if (is.empty(oldMarkers)) return;\n for (var i = 0; i < oldMarkers.length; i++) {\n oldMarkers[i].remove();\n }\n}\n\nexport function setMarkers(player, points) {\n if (!player) return;\n\n removeOldMarkers(player);\n\n if (!points?.length) return;\n\n const containerFragment = document.createDocumentFragment();\n const pointsFragment = document.createDocumentFragment();\n\n // Inject markers to progress container\n points.forEach(point => {\n const markerElement = createElement(\n 'span',\n {\n class: 'plyr__progress__marker',\n },\n '',\n );\n\n const left = `${(point.time / player.duration) * 100}%`;\n\n markerElement.addEventListener('click', () => {\n player.currentTime = point.time;\n });\n\n markerElement.style.left = left;\n pointsFragment.appendChild(markerElement);\n });\n\n containerFragment.appendChild(pointsFragment);\n\n player.elements.markers = {\n points: pointsFragment,\n tip: null,\n };\n\n player.elements.progress.appendChild(containerFragment);\n}\n","import is from './is';\nimport { vttToJson } from './search-vtt';\nexport default function cacheCues(player) {\n // Bail is search is not enabled.\n if (!player?.config.preset?.search?.enabled) return;\n // Bail if no language tracks are added.\n if (!player?.media?.textTracks?.length || player?.media?.textTracks?.length === 0) return;\n // Bail if already a track is selected by the user.\n if (player?.currentTrack !== -1) return;\n\n // Cache the default 1st available track.\n player.toggleCaptions(true);\n\n let interval = setInterval(() => {\n const generatedCues = player.media.textTracks[0]?.cues;\n\n if (generatedCues?.length > 0) {\n // Cache it into localstorage.\n setCues(player);\n // Reset to original track.\n player.toggleCaptions(false);\n\n clearInterval(interval);\n }\n }, 200);\n}\n\nexport function getCues(player) {\n if (!player) return;\n const locallyStoredCues = localStorage.getItem('presto-player-' + player.id + '-cues');\n\n if (is.empty(locallyStoredCues)) return '';\n\n return JSON.parse(locallyStoredCues);\n}\n\nexport function setCues(player) {\n if (\n !player ||\n !player?.media?.textTracks ||\n player?.media?.textTracks?.length === 0\n ) return;\n \n const cues = (player?.media?.textTracks?.[0]) ? vttToJson(player.media.textTracks[0]) : {};\n if ( !is.empty(cues) ) {\n localStorage.setItem('presto-player-' + player.id + '-cues', JSON.stringify(cues));\n }\n \n}\n"],"mappings":"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"}