{"version":3,"sources":["jsdelivr-header.js","/npm/bcp-47-match@2.0.3/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACuDA,SAAS,QAAQ,EAAO,GAStB,OAAO,SAAU,EAAM,GACrB,IAAI,EAAO,KAAK,EAAM,OACtB,MAAM,EAAQ,KACZ,QAA0C,IAAM,EAChD,SAGI,EAAU,GAChB,IAAI,GAAc,EAElB,OAAS,EAAa,EAAM,QAAQ,CAClC,MAAM,EAAQ,EAAM,GAAY,cAGhC,IAAK,GAAoB,MAAV,EAAe,SAE9B,IAAI,GAAa,EAEjB,MAAM,EAAO,GAEb,OAAS,EAAY,EAAK,QACxB,GAAI,EAAM,EAAK,GAAW,cAAe,GAAQ,CAE/C,IAAK,EACH,OACE,EAAK,GAIT,EAAQ,KAAK,EAAK,GACpB,MACE,EAAK,KAAK,EAAK,IAInB,EAAO,CACT,CAIA,OACE,EAAS,OAAU,CAEvB,CACF,QAaO,MAAM,YAAc,SAAQ,SAAU,EAAK,GAChD,MAAiB,MAAV,GAAiB,IAAQ,GAAS,EAAI,SAAS,EAAQ,IAChE,IAAG,UAcI,MAAM,eAAiB,SAAQ,SAAU,EAAK,GAEnD,MAAM,EAAO,EAAI,MAAM,KACjB,EAAQ,EAAM,MAAM,KAC1B,IAAI,EAAY,EACZ,EAAa,EAGjB,GAA0B,MAAtB,EAAM,IAAuB,EAAK,KAAe,EAAM,GACzD,OAAO,EAOT,IAJA,IACA,IAGO,EAAa,EAAM,QAExB,GAA0B,MAAtB,EAAM,GAAV,CAMA,IAAK,EAAK,GAAY,OAAO,EAG7B,GAAI,EAAK,KAAe,EAAM,GAA9B,CAOA,GAA+B,IAA3B,EAAK,GAAW,OAAc,OAAO,EAGzC,GANA,MAHE,IACA,GARF,MAFE,IAsBJ,OAAO,CACT,IAAG,UAcI,MAAM,OAAS,SAAQ,SAAU,EAAK,GAC3C,IAAI,EAAQ,EAGZ,OAAa,CACX,GAAc,MAAV,GAAiB,IAAQ,EAAO,OAAO,EAE3C,IAAI,EAAQ,EAAM,YAAY,KAE9B,GAAI,EAAQ,EAAG,OAAO,EAEU,MAA5B,EAAM,OAAO,EAAQ,KAAY,GAAS,GAE9C,EAAQ,EAAM,MAAM,EAAG,EACzB,CACF,IAAG,GASH,SAAS,KAAK,EAAQ,GACpB,MAAM,EAAQ,GAA4B,iBAAX,EAAsB,CAAC,GAAU,EAEhE,IAAK,GAA0B,iBAAV,KAAwB,WAAY,GACvD,MAAM,IAAI,MACR,WAAa,EAAO,KAAO,EAAQ,gCAIvC,OAAO,CACT","file":"/npm/bcp-47-match@2.0.3/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/bcp-47-match@2.0.3/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * See <https://tools.ietf.org/html/rfc4647#section-3.1>\n * for more info on the algorithms.\n */\n\n/**\n * @typedef {string} Tag\n *   BCP-47 tag.\n * @typedef {Array<Tag>} Tags\n *   List of BCP-47 tags.\n * @typedef {string} Range\n *   RFC 4647 range.\n * @typedef {Array<Range>} Ranges\n *   List of RFC 4647 range.\n *\n * @callback Check\n *   An internal check.\n * @param {Tag} tag\n *   BCP-47 tag.\n * @param {Range} range\n *   RFC 4647 range.\n * @returns {boolean}\n *   Whether the range matches the tag.\n *\n * @typedef {FilterOrLookup<true>} Filter\n *   Filter: yields all tags that match a range.\n * @typedef {FilterOrLookup<false>} Lookup\n *   Lookup: yields the best tag that matches a range.\n */\n\n/**\n * @template {boolean} IsFilter\n *   Whether to filter or perform a lookup.\n * @callback FilterOrLookup\n *   A check.\n * @param {Tag|Tags} tags\n *   One or more BCP-47 tags.\n * @param {Range|Ranges|undefined} [ranges='*']\n *   One or more RFC 4647 ranges.\n * @returns {IsFilter extends true ? Tags : Tag|undefined}\n *   Result.\n */\n\n/**\n * Factory to perform a filter or a lookup.\n *\n * This factory creates a function that accepts a list of tags and a list of\n * ranges, and contains logic to exit early for lookups.\n * `check` just has to deal with one tag and one range.\n * This match function iterates over ranges, and for each range,\n * iterates over tags.\n * That way, earlier ranges matching any tag have precedence over later ranges.\n *\n * @template {boolean} IsFilter\n * @param {Check} check\n *   A check.\n * @param {IsFilter} filter\n *   Whether to filter or perform a lookup.\n * @returns {FilterOrLookup<IsFilter>}\n *   Filter or lookup.\n */\nfunction factory(check, filter) {\n  /**\n   * @param {Tag|Tags} tags\n   *   One or more BCP-47 tags.\n   * @param {Range|Ranges|undefined} [ranges='*']\n   *   One or more RFC 4647 ranges.\n   * @returns {IsFilter extends true ? Tags : Tag|undefined}\n   *   Result.\n   */\n  return function (tags, ranges) {\n    let left = cast(tags, 'tag')\n    const right = cast(\n      ranges === null || ranges === undefined ? '*' : ranges,\n      'range'\n    )\n    /** @type {Tags} */\n    const matches = []\n    let rightIndex = -1\n\n    while (++rightIndex < right.length) {\n      const range = right[rightIndex].toLowerCase()\n\n      // Ignore wildcards in lookup mode.\n      if (!filter && range === '*') continue\n\n      let leftIndex = -1\n      /** @type {Tags} */\n      const next = []\n\n      while (++leftIndex < left.length) {\n        if (check(left[leftIndex].toLowerCase(), range)) {\n          // Exit if this is a lookup and we have a match.\n          if (!filter) {\n            return /** @type {IsFilter extends true ? Tags : Tag|undefined} */ (\n              left[leftIndex]\n            )\n          }\n\n          matches.push(left[leftIndex])\n        } else {\n          next.push(left[leftIndex])\n        }\n      }\n\n      left = next\n    }\n\n    // If this is a filter, return the list.  If it’s a lookup, we didn’t find\n    // a match, so return `undefined`.\n    return /** @type {IsFilter extends true ? Tags : Tag|undefined} */ (\n      filter ? matches : undefined\n    )\n  }\n}\n\n/**\n * Basic Filtering (Section 3.3.1) matches a language priority list consisting\n * of basic language ranges (Section 2.1) to sets of language tags.\n *\n * @param {Tag|Tags} tags\n *   One or more BCP-47 tags.\n * @param {Range|Ranges|undefined} [ranges='*']\n *   One or more RFC 4647 ranges.\n * @returns {Tags}\n *   List of BCP-47 tags.\n */\nexport const basicFilter = factory(function (tag, range) {\n  return range === '*' || tag === range || tag.includes(range + '-')\n}, true)\n\n/**\n * Extended Filtering (Section 3.3.2) matches a language priority list\n * consisting of extended language ranges (Section 2.2) to sets of language\n * tags.\n *\n * @param {Tag|Tags} tags\n *   One or more BCP-47 tags.\n * @param {Range|Ranges|undefined} [ranges='*']\n *   One or more RFC 4647 ranges.\n * @returns {Tags}\n *   List of BCP-47 tags.\n */\nexport const extendedFilter = factory(function (tag, range) {\n  // 3.3.2.1\n  const left = tag.split('-')\n  const right = range.split('-')\n  let leftIndex = 0\n  let rightIndex = 0\n\n  // 3.3.2.2\n  if (right[rightIndex] !== '*' && left[leftIndex] !== right[rightIndex]) {\n    return false\n  }\n\n  leftIndex++\n  rightIndex++\n\n  // 3.3.2.3\n  while (rightIndex < right.length) {\n    // 3.3.2.3.A\n    if (right[rightIndex] === '*') {\n      rightIndex++\n      continue\n    }\n\n    // 3.3.2.3.B\n    if (!left[leftIndex]) return false\n\n    // 3.3.2.3.C\n    if (left[leftIndex] === right[rightIndex]) {\n      leftIndex++\n      rightIndex++\n      continue\n    }\n\n    // 3.3.2.3.D\n    if (left[leftIndex].length === 1) return false\n\n    // 3.3.2.3.E\n    leftIndex++\n  }\n\n  // 3.3.2.4\n  return true\n}, true)\n\n/**\n * Lookup (Section 3.4) matches a language priority list consisting of basic\n * language ranges to sets of language tags to find the one exact language tag\n * that best matches the range.\n *\n * @param {Tag|Tags} tags\n *   One or more BCP-47 tags.\n * @param {Range|Ranges|undefined} [ranges='*']\n *   One or more RFC 4647 ranges.\n * @returns {Tag|undefined}\n *   BCP-47 tag.\n */\nexport const lookup = factory(function (tag, range) {\n  let right = range\n\n  /* eslint-disable-next-line no-constant-condition */\n  while (true) {\n    if (right === '*' || tag === right) return true\n\n    let index = right.lastIndexOf('-')\n\n    if (index < 0) return false\n\n    if (right.charAt(index - 2) === '-') index -= 2\n\n    right = right.slice(0, index)\n  }\n}, false)\n\n/**\n * Validate tags or ranges, and cast them to arrays.\n *\n * @param {string|Array<string>} values\n * @param {string} name\n * @returns {Array<string>}\n */\nfunction cast(values, name) {\n  const value = values && typeof values === 'string' ? [values] : values\n\n  if (!value || typeof value !== 'object' || !('length' in value)) {\n    throw new Error(\n      'Invalid ' + name + ' `' + value + '`, expected non-empty string'\n    )\n  }\n\n  return value\n}\n"]}