{"version":3,"file":"jskos-tools.umd.cjs","sources":["../src/concept-scheme.js","../src/link-template.js","../src/utils.js","../src/language-preference.js","../src/sha1.js","../src/identifiers.js","../src/mapping-types.js","../src/object-types.js","../src/tools.js","../src/index.js"],"sourcesContent":["const regexChars = /[\\\\^$.*+?()[\\]{}|]/g\nconst regexEscape = string => string.replace(regexChars, \"\\\\$&\")\n\n// Special characters that uriPattern can be build with\n// Some other special characters such as [ and ] will not work!\nconst notationEscapeChars = /[%ÄÖÜäöü ]/g\n\n/**\n * A [JSKOS Concept Scheme](http://gbv.github.io/jskos/jskos.html#concept-schemes).\n * @memberof module:jskos-tools\n * @example\n * const { ConceptScheme } = require('jskos-tools')\n * let scheme = new ConceptScheme({\n *   namespace: \"http://example.org/\",\n *   notationPattern: \"[0-9]+\"\n * })\n */\nclass ConceptScheme {\n\n  /**\n   * @param {object} [jskos] - object that's copied as scheme (shallow copy)\n   */\n  constructor (scheme={}) {\n    Object.assign(this, scheme)\n\n    if (!this.notationPattern) {\n      this.notationPattern = \".+\"\n    }\n\n    if (!this.uriPattern && this.namespace) {\n      this.uriPattern = \"^\" + regexEscape(this.namespace)\n      const escaped = this.notationPattern.replace(notationEscapeChars, encodeURI)\n      this.uriPattern += \"(\" + escaped  + \")$\"\n    }\n\n    this.NOTATION_REGEX = RegExp(\"^(\" + this.notationPattern + \")$\")\n\n    if (this.uriPattern) {\n      this.URI_REGEX = RegExp(this.uriPattern)\n    }\n  }\n\n  /**\n   * Check whether a string is a valid notation as defined by `notationPattern`.\n   * @param {string} notation\n   * @returns {array|null}\n   */\n  isValidNotation(notation) {\n    return this.NOTATION_REGEX.exec(notation)\n  }\n\n  /**\n   * Check whether URI belongs to the scheme, return local notation on success.\n   * Requires scheme to have `uriPattern` or `namespace`.\n   * @param {string} uri\n   * @returns {string|undefined}\n   */\n  notationFromUri(uri) {\n    if (this.URI_REGEX) {\n      const match = this.URI_REGEX.exec(uri)\n      if (match) {\n        return decodeURI(match[1])\n      }\n    }\n  }\n\n  /**\n   * Map local notation to URI. Does not check whether notation is valid!\n   * Requires scheme to have `uriPattern` or `namespace`.\n   * @param {string} notation\n   * @example scheme.uriFromNotation(\"123\") // http://example.org/123\n   */\n  uriFromNotation (notation) {\n    if (this.uriPattern) {\n      notation = encodeURIComponent(notation)\n      return this.uriPattern\n        .replace(/^\\^|\\$$/g, \"\").replace(/\\\\/g, \"\").replace(/\\(.*\\)/, notation)\n    }\n  }\n\n  /**\n   * Check whether URI belongs to the scheme, return concept on success.\n   * Requires scheme to have `uriPattern` or `namespace`.\n   * @param {string} uri\n   * @param {object} [options] boolean flags `inScheme` and `toConcept`\n   */\n  conceptFromUri (uri, options={}) {\n    const notation = this.notationFromUri(uri)\n    if (notation === undefined) {\n      return\n    }\n    const concept = { uri, notation: [notation] }\n    if (options.inScheme) {\n      concept.inScheme = [{uri: this.uri }]\n    }\n    if (options.topConcept) {\n      concept.topConceptOf = [{uri: this.uri }]\n    }\n    return concept\n  }\n\n  /**\n   * Map local notation to concept, if notation is valid. Requires scheme to\n   * have `uriPattern` or `namespace`.\n   * @param {string} notation\n   * @param {object} [options] same as conceptFromUri options\n   */\n  conceptFromNotation (notation, options) {\n    if (this.isValidNotation(notation)) {\n      return this.conceptFromUri(this.uriFromNotation(notation), options)\n    }\n  }\n}\n\nexport default ConceptScheme\n","// <https://gbv.github.io/jskos/#expansion-of-link-templates>\nexport function templateVariables(concepts, { separator, languageTags }={}) {\n  if (separator === null || separator === undefined) {\n    concepts = concepts.slice(0,1)\n  }\n\n  const uri = concepts.filter(c => \"uri\" in c).map(c => c.uri).join(separator)\n  const notation = concepts.filter(c => c.notation?.length).map(c => c.notation[0]).join(separator)\n  const prefLabel = concepts.map(c => {\n    const labels = c.prefLabel || {}\n    const tag = (languageTags || []).find(tag => tag in labels) // TODO: matching of subtags?\n    return labels[tag] || \"\"\n  }).filter(l => l).join(separator)\n  const language = languageTags[0]  \n\n  return { uri, notation, prefLabel, language }\n}\n","export function isEqualWith(a, b, compare) {\n  const pSlice = Array.prototype.slice\n  const Object_keys = typeof Object.keys === \"function\"\n    ? Object.keys\n    : function (obj) {\n      const keys = []\n      for (const key in obj) {\n        keys.push(key)\n      }\n      return keys\n    }\n  const deepEqual = function (actual, expected) {\n    if (actual === expected) {\n      return true\n    } else if (actual instanceof Date && expected instanceof Date) {\n      return actual.getTime() === expected.getTime()\n    } else if (typeof actual != \"object\" && typeof expected != \"object\") {\n      return actual == expected\n    } else {\n      return objEquiv(actual, expected)\n    }\n  }\n  function isUndefinedOrNull(value) {\n    return value === null || value === undefined\n  }\n  function isArguments(object) {\n    return Object.prototype.toString.call(object) == \"[object Arguments]\"\n  }\n  function objEquiv(a, b) {\n    if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) {\n      return false\n    }\n    if (a.prototype !== b.prototype) {\n      return false\n    }\n    if (isArguments(a)) {\n      if (!isArguments(b)) {\n        return false\n      }\n      a = pSlice.call(a)\n      b = pSlice.call(b)\n      return deepEqual(a, b)\n    }\n    let ka, kb, key, i\n    try {\n      ka = Object_keys(a)\n      kb = Object_keys(b)\n    } catch (e) {\n      return false\n    }\n    if (ka.length != kb.length) {\n      return false\n    }\n    ka.sort()\n    kb.sort()\n    for (i = ka.length - 1; i >= 0; i--) {\n      if (ka[i] != kb[i]) {\n        return false\n      }\n    }\n    for (i = ka.length - 1; i >= 0; i--) {\n      key = ka[i]\n      if (compare) {\n        let result = compare(a[key], b[key], key)\n        if (result === undefined) {\n          // fallback to method without comparison\n          result = isEqualWith(a[key], b[key])\n        }\n        if (!result) {\n          return false\n        }\n      } else {\n        if (!deepEqual(a[key], b[key])) {\n          return false\n        }\n      }\n    }\n    return true\n  }\n  return deepEqual(a, b)\n}\n\nexport function get(obj, path, defaultValue = undefined) {\n  const travel = regexp =>\n    String.prototype.split\n      .call(path, regexp)\n      .filter(Boolean)\n      .reduce((res, key) => (res !== null && res !== undefined ? res[key] : res), obj)\n  const result = travel(/[,[\\]]+?/) || travel(/[,[\\].]+?/)\n  return result === undefined || result === obj ? defaultValue : result\n}\n\nexport function pick(object, keys) {\n  return keys.reduce((obj, key) => {\n    // eslint-disable-next-line no-prototype-builtins\n    if (object && object.hasOwnProperty(key)) {\n      obj[key] = object[key]\n    }\n    return obj\n  }, {})\n}\n\nexport function forOwn(object, cb) {\n  for(let key in object){\n    // eslint-disable-next-line no-prototype-builtins\n    if (object.hasOwnProperty(key)){\n      cb(object[key], key)\n    }\n  }\n}\n\nexport function isObject(object) {\n  return typeof object === \"object\" && object !== null\n}\n\nexport function isString(str) {\n  return (str && typeof str.valueOf() === \"string\") ? true : false\n}\n\nexport function union(a, b) {\n  return [...new Set([...a, ...b])]\n}\n\nexport function unionWith(a, b, compare) {\n  return [...a, ...b].reduce((p, c) => {\n    if (p.findIndex(v => compare(v, c)) !== -1) {\n      return p\n    }\n    p.push(c)\n    return p\n  }, [])\n}\n\nexport function omitMod(obj, paths) {\n  for (let path of paths) {\n    if (typeof path === \"string\") {\n      path = path.split(\".\")\n    }\n    for (let i = 0; i < path.length - 1; i++) {\n      obj = obj[path[i]]\n      if (typeof obj === \"undefined\") {\n        continue\n      }\n    }\n    delete obj[path.pop()]\n  }\n}\n\n/**\n * Sources:\n * - https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore\n * - https://dustinpfister.github.io/2017/09/24/lodash_forown/\n * - https://stackoverflow.com/a/48666737/11050851\n * - https://github.com/stutrek/node-deep-equal/blob/master/index.js (heavily adapted to integrate isEqualWith)\n * - Own Implementation\n */\n","import * as _ from \"./utils.js\"\nconst languagePreference = {\n  store: null,\n  path: \"\",\n  defaults: [\"en\"],\n  getLanguages,\n  selectLanguage,\n}\n\n/**\n * Get the preference list either from store or from defaults (fallback)\n */\nfunction getLanguages() {\n  return _.get(languagePreference.store, languagePreference.path) || languagePreference.defaults\n}\n\n/**\n * Selects a language tag from a language map or null if no language was found.\n *\n * @param {object} languageMap map to select language tag from\n */\nfunction selectLanguage(languageMap) {\n\n  if (!languageMap) {\n    return null\n  }\n\n  for (let language of getLanguages()) {\n    if (languageMap[language]) {\n      return language\n    }\n  }\n\n  // fallback: iterate through languages and choose the first one\n  for (let language of Object.keys(languageMap)) {\n    if (language != \"-\") {\n      return language\n    }\n  }\n\n  return null\n}\n\nexport default languagePreference\n","// adapted from from https://locutus.io/php/strings/sha1/\nexport default function sha1 (str) {\n  //  discuss at: https://locutus.io/php/sha1/\n  // original by: Webtoolkit.info (https://www.webtoolkit.info/)\n  // improved by: Michael White (https://getsprink.com)\n  // improved by: Kevin van Zonneveld (https://kvz.io)\n  //    input by: Brett Zamir (https://brett-zamir.me)\n  //      note 1: Keep in mind that in accordance with PHP, the whole string is buffered and then\n  //      note 1: hashed. If available, we'd recommend using Node's native crypto modules directly\n  //      note 1: in a steaming fashion for faster and more efficient hashing\n  //   example 1: sha1('Kevin van Zonneveld')\n  //   returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897'\n\n  var _rotLeft = function (n, s) {\n    var t4 = (n << s) | (n >>> (32 - s))\n    return t4\n  }\n\n  var _cvtHex = function (val) {\n    var str = \"\"\n    var i\n    var v\n\n    for (i = 7; i >= 0; i--) {\n      v = (val >>> (i * 4)) & 0x0f\n      str += v.toString(16)\n    }\n    return str\n  }\n\n  var blockstart\n  var i, j\n  var W = new Array(80)\n  var H0 = 0x67452301\n  var H1 = 0xEFCDAB89\n  var H2 = 0x98BADCFE\n  var H3 = 0x10325476\n  var H4 = 0xC3D2E1F0\n  var A, B, C, D, E\n  var temp\n\n  // utf8_encode\n  str = unescape(encodeURIComponent(str))\n  var strLen = str.length\n\n  var wordArray = []\n  for (i = 0; i < strLen - 3; i += 4) {\n    j = str.charCodeAt(i) << 24 |\n      str.charCodeAt(i + 1) << 16 |\n      str.charCodeAt(i + 2) << 8 |\n      str.charCodeAt(i + 3)\n    wordArray.push(j)\n  }\n\n  switch (strLen % 4) {\n    case 0:\n      i = 0x080000000\n      break\n    case 1:\n      i = str.charCodeAt(strLen - 1) << 24 | 0x0800000\n      break\n    case 2:\n      i = str.charCodeAt(strLen - 2) << 24 | str.charCodeAt(strLen - 1) << 16 | 0x08000\n      break\n    case 3:\n      i = str.charCodeAt(strLen - 3) << 24 |\n        str.charCodeAt(strLen - 2) << 16 |\n        str.charCodeAt(strLen - 1) <<\n      8 | 0x80\n      break\n  }\n\n  wordArray.push(i)\n\n  while ((wordArray.length % 16) !== 14) {\n    wordArray.push(0)\n  }\n\n  wordArray.push(strLen >>> 29)\n  wordArray.push((strLen << 3) & 0x0ffffffff)\n\n  for (blockstart = 0; blockstart < wordArray.length; blockstart += 16) {\n    for (i = 0; i < 16; i++) {\n      W[i] = wordArray[blockstart + i]\n    }\n    for (i = 16; i <= 79; i++) {\n      W[i] = _rotLeft(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1)\n    }\n\n    A = H0\n    B = H1\n    C = H2\n    D = H3\n    E = H4\n\n    for (i = 0; i <= 19; i++) {\n      temp = (_rotLeft(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff\n      E = D\n      D = C\n      C = _rotLeft(B, 30)\n      B = A\n      A = temp\n    }\n\n    for (i = 20; i <= 39; i++) {\n      temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff\n      E = D\n      D = C\n      C = _rotLeft(B, 30)\n      B = A\n      A = temp\n    }\n\n    for (i = 40; i <= 59; i++) {\n      temp = (_rotLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff\n      E = D\n      D = C\n      C = _rotLeft(B, 30)\n      B = A\n      A = temp\n    }\n\n    for (i = 60; i <= 79; i++) {\n      temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff\n      E = D\n      D = C\n      C = _rotLeft(B, 30)\n      B = A\n      A = temp\n    }\n\n    H0 = (H0 + A) & 0x0ffffffff\n    H1 = (H1 + B) & 0x0ffffffff\n    H2 = (H2 + C) & 0x0ffffffff\n    H3 = (H3 + D) & 0x0ffffffff\n    H4 = (H4 + E) & 0x0ffffffff\n  }\n\n  temp = _cvtHex(H0) + _cvtHex(H1) + _cvtHex(H2) + _cvtHex(H3) + _cvtHex(H4)\n  return temp.toLowerCase()\n}\n","/**\n * Module to calculate JSKOS mapping identifiers.\n */\n\nimport sha1 from \"./sha1.js\"\n\n// Reduce JSKOS set to members with URI.\nfunction reduceSet(set) {\n  return set.map(member => member && member.uri).filter(Boolean)\n}\n\n// Tell which concept bundle field is used.\nfunction memberField(bundle) {\n  return [\"memberSet\", \"memberList\", \"memberChoice\"].find(f => bundle[f])\n}\n\n// Reduce JSKOS concept bundle to memberSet/List/Choice with member URIs only.\nfunction reduceBundle(bundle) {\n  const field = memberField(bundle)\n  const set = bundle[field] ? reduceSet(bundle[field]) : []\n  return {\n    [set.length > 1 ? field : \"memberSet\"]: set.map(uri => ({uri})),\n  }\n}\n\n// Reduce mapping to reduced fields from, to, and type.\nexport function mappingContent(mapping) {\n  const { from, to, type } = mapping\n  let result = {\n    from: reduceBundle(from || {}),\n    to: reduceBundle(to || {}),\n    type: [\n      type && type[0] || \"http://www.w3.org/2004/02/skos/core#mappingRelation\",\n    ],\n  }\n  for (let side of [\"from\", \"to\"]) {\n    if ((result[side][memberField(result[side])] || []).length == 0) {\n      let scheme = mapping[side + \"Scheme\"]\n      if (scheme && scheme.uri) {\n        // Create new object to remove all unnecessary properties.\n        result[side + \"Scheme\"] = { uri: scheme.uri }\n      }\n    }\n  }\n  return result\n}\n\n// Get a sorted list of member URIs.\nexport function mappingMembers(mapping) {\n  const { from, to } = mapping\n  const memberUris = [ from, to ].filter(Boolean)\n    .map(bundle => reduceSet(bundle[memberField(bundle)] || []))\n  return [].concat(...memberUris).sort()\n}\n\n/**\n * Returns a mapping content identifier. The identifier starts with `urn:jskos:mapping:content:`\n * and takes concepts and type into consideration. It uses the `mappingContent` function to get\n * relevant properties from the mapping.\n * @memberof module:jskos-tools\n */\nexport function mappingContentIdentifier(mapping) {\n  const json = JSON.stringify(mappingContent(mapping), [\"from\",\"fromScheme\",\"to\",\"toScheme\",\"type\",\"memberSet\",\"memberList\",\"memberChoice\",\"uri\"])\n  return \"urn:jskos:mapping:content:\" + sha1(json+\"\\n\")\n}\n\n/**\n * @memberof module:jskos-tools\n */\nexport function mappingMembersIdentifier(mapping) {\n  const json = JSON.stringify(mappingMembers(mapping))\n  return \"urn:jskos:mapping:members:\" + sha1(json+\"\\n\")\n}\n\n/**\n * Returns a hex SHA-256 digest of a UTF-8 input string.\n *\n * Uses `globalThis.crypto.subtle` (browsers, Node >= 19). Falls back to\n * `webcrypto.subtle` for Node 18.\n *\n * @param {string} input\n * @returns {Promise<string>}\n */\nconst getSHA256Hash = async (input) => {\n  let subtle\n  if (globalThis.crypto?.subtle) {\n    subtle = globalThis.crypto.subtle\n  } else {\n    const { webcrypto } = await import(\"node:crypto\")\n    subtle = webcrypto.subtle\n  }\n  const textAsBuffer = new TextEncoder().encode(input)\n  const hashBuffer = await subtle.digest(\"SHA-256\", textAsBuffer)\n  const hashArray = Array.from(new Uint8Array(hashBuffer))\n  const hash = hashArray\n    .map(b => b.toString(16).padStart(2, \"0\"))\n    .join(\"\")\n  return hash\n}\n\n/**\n * Compares two strings by Unicode code point order\n * @param {string} left\n * @param {string} right\n * @returns {number} Negative, zero, or positive.\n */\nfunction codePointCompare (left, right) {\n  const leftIter = left[Symbol.iterator]()\n  const rightIter = right[Symbol.iterator]()\n  for (;;) {\n    const { value: leftChar } = leftIter.next()\n    const { value: rightChar } = rightIter.next()\n    if (leftChar === undefined && rightChar === undefined) {\n      return 0\n    } else if (leftChar === undefined) {\n      // left is a prefix of right.\n      return -1\n    } else if (rightChar === undefined) {\n      // right is a prefix of left.\n      return 1\n    }\n    const leftCodepoint = leftChar.codePointAt(0)\n    const rightCodepoint = rightChar.codePointAt(0)\n    if (leftCodepoint < rightCodepoint) {\n      return -1\n    }\n    if (leftCodepoint > rightCodepoint) {\n      return 1\n    }\n  }\n}\n\n/**\n * Returns a mapping sameness identifier\n * The identifier starts with `mapping:` followed by a SHA-256 hex digest,\n * and ends with `~` when `negativity` is true.\n * @memberof module:jskos-tools\n * @param {{ subjects: string[], objects: string[], predicate: string, negativity: boolean }} mapping\n * @returns {Promise<string>}\n */\nexport async function mappingSamenessIdentifier(mapping) {\n  const { subjects, objects, predicate, negativity } = mapping\n\n  subjects.sort(codePointCompare)\n  objects.sort(codePointCompare)\n\n  const str = [subjects.join(\"|\"), predicate, objects.join(\"|\")].join(\" \")\n  const digest = await getSHA256Hash(str)\n\n  return `mapping:${digest}${negativity ? \"~\" : \"\"}`\n}\n\n/**\n * @memberof module:jskos-tools\n */\nexport async function addMappingIdentifiers(mapping) {\n  const fromField = memberField(mapping.from || {})\n  const toField = memberField(mapping.to || {})\n  const subjects = fromField ? reduceSet(mapping.from[fromField]) : []\n  const objects = toField ? reduceSet(mapping.to[toField]) : []\n  const predicate = mapping.type?.[0]\n    ?? \"http://www.w3.org/2004/02/skos/core#mappingRelation\"\n\n  const identifier = (mapping.identifier || []).filter(\n    id => id && !id.startsWith(\"urn:jskos:mapping:\") && !id.startsWith(\"mapping:\"),\n  ).concat([\n    mappingMembersIdentifier(mapping),\n    mappingContentIdentifier(mapping),\n    await mappingSamenessIdentifier({ subjects, objects, predicate, negativity: false }),\n  ]).sort()\n  return Object.assign({}, mapping, {identifier})\n}\n\nfunction compare(mapping1, mapping2, prefix) {\n  let id1 = mapping1 ? (prefix === \"urn:jskos:mapping:content:\" ? mappingContentIdentifier(mapping1) : mappingMembersIdentifier(mapping1)) : null\n  let id2 = mapping2 ? (prefix === \"urn:jskos:mapping:content:\" ? mappingContentIdentifier(mapping2) : mappingMembersIdentifier(mapping2)) : null\n  return id1 == id2\n}\n\n/**\n * @memberof module:jskos-tools\n */\nexport function compareMappings(mapping1, mapping2) {\n  return compare(mapping1, mapping2, \"urn:jskos:mapping:content:\")\n}\nexport const compareMappingContent = compareMappings\n\n/**\n * @memberof module:jskos-tools\n */\nexport function compareMappingMembers(mapping1, mapping2) {\n  return compare(mapping1, mapping2, \"urn:jskos:mapping:members:\")\n}\n","export default [\n  {\n    \"RELEVANCE\": \"very high\",\n    \"broader\": [\n      {\n        \"uri\": \"http://www.w3.org/2004/02/skos/core#closeMatch\"\n      }\n    ],\n    \"definition\": {\n      \"de\": [\n        \"gleiche Bedeutung\"\n      ],\n      \"en\": [\n        \"same meaning\"\n      ]\n    },\n    \"notation\": [\n      \"=\"\n    ],\n    \"prefLabel\": {\n      \"ar\": \"تطابق تام\",\n      \"be\": \"дакладная адпаведнасць\",\n      \"be-tarask\": \"дакладная адпаведнасьць\",\n      \"bn\": \"হুবুহু মিল\",\n      \"bs\": \"tačno podudaranje\",\n      \"ca\": \"equivalència exacta\",\n      \"cs\": \"přesná shoda\",\n      \"da\": \"exact match\",\n      \"de\": \"exakte Übereinstimmung\",\n      \"el\": \"ακριβής αντιστοιχία\",\n      \"en\": \"exact match\",\n      \"eo\": \"ekzakta ekvivalento\",\n      \"es\": \"equivalencia exacta\",\n      \"et\": \"täpne vaste\",\n      \"fi\": \"vastaava käsite\",\n      \"fr\": \"équivalence exacte\",\n      \"ga\": \"meaitseáil chruinn\",\n      \"gl\": \"correspondencia exacta\",\n      \"he\": \"התאמה מדויקת\",\n      \"hu\": \"pontos egyezés\",\n      \"id\": \"sama persis\",\n      \"it\": \"corrispondenza esatta\",\n      \"ja\": \"完全一致\",\n      \"lv\": \"tieša sakritība\",\n      \"mk\": \"точно совпаѓање\",\n      \"ms\": \"padanan tepat\",\n      \"ms-arab\": \"ڤادنن تڤت\",\n      \"nb\": \"eksakt samsvar\",\n      \"nl\": \"exacte match\",\n      \"nn\": \"eksakt samsvar\",\n      \"pl\": \"dokładne dopasowanie\",\n      \"pt\": \"correspondência exata\",\n      \"ro\": \"echivalentul exact\",\n      \"ru\": \"точное соответствие\",\n      \"sl\": \"natančno ujemanje\",\n      \"sq\": \"përputhje e përpiktë\",\n      \"sr\": \"тачно подударање\",\n      \"sv\": \"exakt träff\",\n      \"tr\": \"tam eşleşme\",\n      \"uk\": \"точна відповідність\",\n      \"ur\": \"بالکل درست جوڑ\",\n      \"zh\": \"精確匹配\",\n      \"zh-cn\": \"精确匹配\",\n      \"zh-hans\": \"精确匹配\",\n      \"zh-hant\": \"精確匹配\"\n    },\n    \"SHORT\": \"exact\",\n    \"uri\": \"http://www.w3.org/2004/02/skos/core#exactMatch\"\n  },\n  {\n    \"RELEVANCE\": \"high\",\n    \"broader\": [\n      {\n        \"uri\": \"http://www.w3.org/2004/02/skos/core#mappingRelation\"\n      }\n    ],\n    \"definition\": {\n      \"de\": [\n        \"in etwa gleiche Bedeutung\"\n      ],\n      \"en\": [\n        \"same general idea but not fully identical meaning\"\n      ]\n    },\n    \"notation\": [\n      \"≈\"\n    ],\n    \"prefLabel\": {\n      \"ar\": \"تطابق قريب\",\n      \"be-tarask\": \"блізкая адпаведнасьць\",\n      \"ca\": \"equivalència inexacta\",\n      \"de\": \"hohe Übereinstimmung\",\n      \"el\": \"στενή αντιστοιχία\",\n      \"en\": \"close match\",\n      \"eo\": \"proksima kongruaĵo\",\n      \"es\": \"equivalencia inexacta\",\n      \"fi\": \"lähes vastaava käsite\",\n      \"fr\": \"quasi-équivalence\",\n      \"he\": \"התאמה קרובה\",\n      \"hu\": \"kvázi-egyenértékűség\",\n      \"it\": \"corrispondenza parziale\",\n      \"ja\": \"類似一致\",\n      \"mk\": \"блиско совпаѓање\",\n      \"ms\": \"padanan dekat\",\n      \"ms-arab\": \"ڤادنن دکت\",\n      \"nb\": \"nært samsvar\",\n      \"nl\": \"nabije match\",\n      \"nn\": \"nært samsvar\",\n      \"pl\": \"częściowe dopasowanie\",\n      \"pt\": \"correspondência próxima\",\n      \"ru\": \"близкое соответствие\",\n      \"sl\": \"visoko ujemanje\",\n      \"sr\": \"блиско поклапање\",\n      \"sv\": \"nära matchning\",\n      \"tr\": \"yakın eşleşme\",\n      \"zh-hans\": \"高度匹配\"\n    },\n    \"SHORT\": \"close\",\n    \"uri\": \"http://www.w3.org/2004/02/skos/core#closeMatch\"\n  },\n  {\n    \"RELEVANCE\": \"medium\",\n    \"broader\": [\n      {\n        \"uri\": \"http://www.w3.org/2004/02/skos/core#mappingRelation\"\n      }\n    ],\n    \"definition\": {\n      \"de\": [\n        \"umfassendere Bedeutung\"\n      ],\n      \"en\": [\n        \"broader meaning\"\n      ]\n    },\n    \"notation\": [\n      \">\"\n    ],\n    \"prefLabel\": {\n      \"be-tarask\": \"шырокая адпаведнасьць\",\n      \"ca\": \"relació llunyana\",\n      \"cs\": \"širší koncept\",\n      \"de\": \"allgemeinere Bedeutung\",\n      \"en\": \"broad match\",\n      \"eo\": \"malstrikta kongruo\",\n      \"et\": \"laiem vaste\",\n      \"fi\": \"vastaava laajempi käsite\",\n      \"he\": \"התאמה רחבה\",\n      \"hu\": \"tágabb jelentés\",\n      \"it\": \"corrispondenza con termine più generico\",\n      \"ja\": \"広義一致\",\n      \"mk\": \"пошироко совпаѓање\",\n      \"nb\": \"bredere samsvar\",\n      \"nl\": \"brede match\",\n      \"nn\": \"breitt samsvar\",\n      \"pl\": \"dopasowanie pojęcia o szerszym znaczeniu\",\n      \"pt-br\": \"correspondência genérica\",\n      \"ru\": \"более широкое соответствие\",\n      \"sl\": \"splošni pomen\",\n      \"sr\": \"у ширем смислу\",\n      \"sv\": \"bred träff\",\n      \"uk\": \"ширша відповідність\",\n      \"vi\": \"đối sánh rộng\",\n      \"zh-hans\": \"广泛匹配\"\n    },\n    \"related\": [\n      {\n        \"uri\": \"http://www.w3.org/2004/02/skos/core#narrowMatch\"\n      }\n    ],\n    \"SHORT\": \"broad\",\n    \"uri\": \"http://www.w3.org/2004/02/skos/core#broadMatch\"\n  },\n  {\n    \"RELEVANCE\": \"medium\",\n    \"broader\": [\n      {\n        \"uri\": \"http://www.w3.org/2004/02/skos/core#mappingRelation\"\n      }\n    ],\n    \"definition\": {\n      \"en\": [\n        \"more specific meaning\"\n      ]\n    },\n    \"notation\": [\n      \"<\"\n    ],\n    \"prefLabel\": {\n      \"be-tarask\": \"вузкая адпаведнасьць\",\n      \"ca\": \"relació estreta\",\n      \"de\": \"spezifischere Bedeutung\",\n      \"en\": \"narrow match\",\n      \"eo\": \"strikta kongruo\",\n      \"et\": \"kitsam vaste\",\n      \"fi\": \"vastaava suppeampi käsite\",\n      \"he\": \"התאמה צרה\",\n      \"hu\": \"szűkebb jelentés\",\n      \"it\": \"corrispondenza con termine più specifico\",\n      \"ja\": \"狭義一致\",\n      \"mk\": \"потесно совпаѓање\",\n      \"nb\": \"smalere samsvar\",\n      \"nl\": \"nauwe match\",\n      \"nn\": \"snevert samsvar\",\n      \"pl\": \"dopasowanie pojęcia o węższym znaczeniu\",\n      \"pt-br\": \"correspondência aproximada\",\n      \"ru\": \"более узкое соответствие\",\n      \"sl\": \"ozki pomen\",\n      \"sr\": \"у ужем смислу\",\n      \"sv\": \"smal träff\",\n      \"ur\": \"نیرو میچ\",\n      \"vi\": \"đối sánh hẹp\",\n      \"zh-hans\": \"有限匹配\"\n    },\n    \"related\": [\n      {\n        \"uri\": \"http://www.w3.org/2004/02/skos/core#broadMatch\"\n      }\n    ],\n    \"SHORT\": \"narrow\",\n    \"uri\": \"http://www.w3.org/2004/02/skos/core#narrowMatch\"\n  },\n  {\n    \"RELEVANCE\": \"low\",\n    \"broader\": [\n      {\n        \"uri\": \"http://www.w3.org/2004/02/skos/core#mappingRelation\"\n      }\n    ],\n    \"definition\": {\n      \"de\": [\n        \"assoziative Verknüpfung unterschiedlicher Bedeutungen\"\n      ],\n      \"en\": [\n        \"associative link between meanings\"\n      ]\n    },\n    \"notation\": [\n      \"~\"\n    ],\n    \"prefLabel\": {\n      \"be-tarask\": \"зьвязаная адпаведнасьць\",\n      \"ca\": \"parella relacionada\",\n      \"de\": \"verwandte Bedeutung\",\n      \"en\": \"related match\",\n      \"eo\": \"rilata kongruo\",\n      \"fi\": \"liittyvä käsite\",\n      \"fr\": \"association\",\n      \"he\": \"התאמה קשורה\",\n      \"hu\": \"rokon jelentés\",\n      \"it\": \"corrispondenza correlata\",\n      \"ja\": \"関連一致\",\n      \"lv\": \"saistīta sakritība\",\n      \"mk\": \"поврзано совпаѓање\",\n      \"ms\": \"padanan berkaitan\",\n      \"ms-arab\": \"ڤادنن برکاءيتن\",\n      \"nb\": \"relatert samsvar\",\n      \"nl\": \"gerelateerde match\",\n      \"pl\": \"dopasowanie pojęcia o powiązanym znaczeniu\",\n      \"ru\": \"ассоциативное соответствие\",\n      \"sl\": \"povezano ujemanje\",\n      \"tr\": \"ilişkili benzeşme\",\n      \"uk\": \"пов’язь\",\n      \"ur\": \"متعلقہ میچ\",\n      \"vec\": \"parenteła rełasionada\",\n      \"zh-hans\": \"关联匹配\"\n    },\n    \"SHORT\": \"related\",\n    \"uri\": \"http://www.w3.org/2004/02/skos/core#relatedMatch\"\n  },\n  {\n    \"RELEVANCE\": \"generic\",\n    \"definition\": {\n      \"de\": [\n        \"unbekannter Bedeutungszusammenhang\"\n      ],\n      \"en\": [\n        \"unknown type of link between meanings\"\n      ]\n    },\n    \"notation\": [\n      \"→\"\n    ],\n    \"prefLabel\": {\n      \"ar\": \"نوع علاقة التطبيق\",\n      \"be\": \"характэрная адносіна адлюстравання\",\n      \"be-tarask\": \"характэрная адносіна адлюстраваньня\",\n      \"ca\": \"relació de mapatge\",\n      \"de\": \"allgemeine Mapping-Relation\",\n      \"en\": \"SKOS generic mapping relation\",\n      \"fi\": \"SKOS-kartoitussuhde\",\n      \"fr\": \"lien de correspondance SKOS\",\n      \"he\": \"יחס מיפוי כללי\",\n      \"id\": \"relasi pemetaan\",\n      \"ja\": \"SKOS一般マッピング関係\",\n      \"mk\": \"пресликувачки однос\",\n      \"nb\": \"SKOS generisk mappingrelasjon\",\n      \"pt-br\": \"relação genérica de mapeamento\",\n      \"sl\": \"splošna relacija kartiranja SKOS\",\n      \"sr\": \"релација мапирања\",\n      \"sv\": \"mappnings relation\",\n      \"zh\": \"映射關係\",\n      \"zh-hant\": \"映射關係\"\n    },\n    \"SHORT\": \"\",\n    \"uri\": \"http://www.w3.org/2004/02/skos/core#mappingRelation\"\n  }\n]","import mappingTypes from \"./mapping-types.js\"\n\n/**\n * JSKOS Concept Types indexed by primary name (CamelCase).\n * \n * For historical reasons name of Mapping is \"ConceptMapping\" and name of\n * Occurrence is \"ConceptOccurrence\".\n *\n * @memberof module:jskos-tools\n */\nexport const objectTypes = {\n  Concept: {\n    type: [\"http://www.w3.org/2004/02/skos/core#Concept\"],\n  },\n  ConceptScheme: {\n    type: [\"http://www.w3.org/2004/02/skos/core#ConceptScheme\"],\n  },\n  ConceptMapping: {\n    type: mappingTypes.map(type => type.uri),\n  },\n  ConceptOccurrence: {},\n  Registry: {\n    type: [\n      \"http://www.w3.org/ns/dcat#Catalog\",\n      \"http://purl.org/cld/cdtype/CatalogueOrIndex\",\n    ],\n  },\n  Distribution: {\n    type: [\n      \"http://www.w3.org/ns/dcat#Distribution\",\n    ],\n  },\n  Service: {\n    type: [\n      \"http://www.w3.org/ns/dcat#DataService\",\n    ],\n  },\n  Dataset: {\n    type: [\n      \"http://www.w3.org/ns/dcat#Dataset\",\n    ],\n  },\n  Concordance: {\n    type: [\n      \"http://rdf-vocabulary.ddialliance.org/xkos#Correspondence\",\n      \"http://rdfs.org/ns/void#Linkset\",\n      \"http://purl.org/spar/fabio/VocabularyMapping\",\n    ],\n  },\n  Resource: {},\n  Item: {},\n  ConceptBundle: {},\n  Annotation: {\n    type: [\n      \"Annotation\",\n      \"http://www.w3.org/ns/oa#Annotation\",\n    ],\n  },\n}\n\n// build lookup table\nconst objectTypeUris = Object.keys(objectTypes).reduce((map, name) => {\n  for (let uri of (objectTypes[name].type || [])) {\n    map[uri] = name\n  }\n  return map\n}, {})\n\n/**\n * Guess the JSKOS Concept Type name from an object or name.\n *\n * Short names are lowercase and object types `ConceptOccurrence`, `ConceptMapping`,\n * `ConceptBundle` have short name `occurrence`, `mapping` , and `bundle` respectively.\n *\n * @memberof module:jskos-tools\n * @param {object|string} jskos|name|uri object or string to guess from\n * @param {boolean} shortname return short name if enabled (false by default)\n */\nexport function guessObjectType(obj, shortname=false) {\n  let type\n  if (typeof obj === \"string\" && obj) {\n    if (obj in objectTypeUris) {\n      // given by URI\n      type = objectTypeUris[obj]\n    } else {\n      // given by name\n      obj = obj.toLowerCase().replace(/s$/,\"\")\n      type = Object.keys(objectTypes).find(name => {\n        const lowercase = name.toLowerCase()\n        if (lowercase === obj || lowercase === \"concept\" + obj) {\n          return true\n        }\n      })\n    }\n  } else if (typeof obj === \"object\") {\n    if (obj.type) {\n      let types = Array.isArray(obj.type) ? obj.type : [obj.type]\n      for (let uri of types) {\n        if (uri in objectTypeUris) {\n          type = objectTypeUris[uri]\n          break\n        }\n      }\n    }\n  }\n  return (shortname && type) ? type.toLowerCase().replace(/^concept(.+)/, \"$1\") : type\n}\n\n/**\n * Returns an array of main object type URIs used in a dataset.\n *\n * This checks whether and which of fields `concepts`, `types`, `mappings`,\n * `schemes`, `concordances`, `occurrences`, `registries`, `properties`, and\n * `annotations` are used with non-empty sets.\n *\n * Existence of property `properties` is indicated with URI <http://www.w3.org/1999/02/22-rdf-syntax-ns#Property>.\n * Existence of property `types` is indicated with URI <http://www.w3.org/2002/07/owl#Class>.\n *\n * @memberof module:jskos-tools\n */ \nexport function usedObjectTypes(obj) {\n  const types = []\n\n  const uris = {\n    concepts: \"http://www.w3.org/2004/02/skos/core#Concept\",\n    schemes: \"http://www.w3.org/2004/02/skos/core#ConceptScheme\",\n    mappings: \"http://www.w3.org/2004/02/skos/core#mappingRelation\",\n    concordances: \"http://rdf-vocabulary.ddialliance.org/xkos#Correspondence\",\n    // occurrences: \"\", # TODO\n    registries: \"http://www.w3.org/ns/dcat#Catalog\",\n    types: \"http://www.w3.org/2002/07/owl#Class\",\n    properties: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#Property\",\n    annotations: \"http://www.w3.org/ns/oa#Annotation\",\n  }\n\n  for (let field in uris) {\n    if (obj[field]?.find(x => x !== null)) {\n      types.push(uris[field])\n    }\n  }\n\n  return types.sort()\n}\n","import * as _ from \"./utils.js\"\nimport { objectTypes, guessObjectType, usedObjectTypes } from \"./object-types.js\"\nimport ConceptScheme from \"./concept-scheme.js\"\nimport languagePreference from \"./language-preference.js\"\nimport mappingTypes from \"./mapping-types.js\"\n\n/**\n * Tests if a string only contains uppercase letters.\n * @private\n * @param {string} str\n */\nconst isUpperCase = str => {\n  return (/^[A-Z]*$/).test(str)\n}\n\n/**\n * Safely get a nested property.\n * @private\n * @param {*} object the object to access\n * @param {*} path path expression\n */\nconst getNested = (object, path) => {\n  return path.split(\".\").reduce(\n    (xs, x) => (xs && xs[x]) ? xs[x] : null, object)\n}\n\n/**\n * Add @context URI to a JSKOS resource or to an array of JSKOS resources.\n * @memberof module:jskos-tools\n * @param {object} jskos object or array of objects\n */\nexport const addContext = jskos => {\n  let array = jskos instanceof Array ? jskos : [jskos]\n  array.forEach(resource => {\n    resource[\"@context\"] = \"https://gbv.github.io/jskos/context.json\"\n  })\n  return jskos\n}\n\n/**\n * Recursively cleans JSKOS object by removing properties starting with _ or containing only uppercase letters.\n * Warning: Works directly on the object without creating a copy!\n * @memberof module:jskos-tools\n * @param {object} jskos\n */\nexport const clean = jskos => {\n  Object.keys(jskos).forEach(key => {\n    if (isUpperCase(key) || key.startsWith(\"_\")) {\n      delete jskos[key]\n    } else {\n      if (jskos[key] != null && typeof jskos[key] === \"object\") {\n        jskos[key] = clean(jskos[key])\n      }\n    }\n  })\n  return jskos\n}\n\n// cleanJSKOS as alias for clean.\nexport const cleanJSKOS = clean\n\n/**\n * Creates a deep copy of a JSKOS object, replacing possibly circular structures with open world [null] statements.\n * All properties starting with an underscore (_) will be ignored.\n * @memberof module:jskos-tools\n * @param {object} object\n * @param {array} replaceCircular - additional property names that should be replace with open world [null] statements\n * @param {bool} skipUnderscore - whether to skip properties starting with `_` (default `true`)\n */\nexport const copyDeep = (object, replaceCircular = [], skipUnderscore = true) => {\n  replaceCircular = replaceCircular.concat([\n    \"ancestors\", \"narrower\", \"broader\", \"mappings\", \"memberList\", \"TOPCONCEPTS\", \"MAPPINGS\", \"PROVIDER\",\n  ])\n  let clone = Array.isArray(object) ? [] : {}\n  for(let i in object) {\n    // Ignore all properties starting with _\n    if (skipUnderscore && i[0] == \"_\") {\n      continue\n    }\n    if (replaceCircular.includes(i)) {\n      // Remove circular structures, replace with [null] if it has elements\n      if (object[i] && Array.isArray(object[i])) {\n        if (object[i].length > 0) {\n          clone[i] = [null]\n        } else {\n          clone[i] = []\n        }\n        continue\n      } else {\n        clone[i] = null\n        continue\n      }\n    }\n    if (i == \"inScheme\") {\n      // Remove circular structur for inScheme and replace with new object consisting only of URI, notation, and prefLabel\n      let inScheme = []\n      for (let scheme of object.inScheme) {\n        let newScheme = { uri: scheme.uri }\n        if (scheme.notation) {\n          newScheme.notation = scheme.notation\n        }\n        if (scheme.prefLabel) {\n          newScheme.prefLabel = scheme.prefLabel\n        }\n        inScheme.push(newScheme)\n      }\n      clone.inScheme = inScheme\n      continue\n    }\n    if (object[i] != null &&  typeof(object[i]) == \"object\") {\n      clone[i] = copyDeep(object[i])\n    } else {\n      clone[i] = object[i]\n    }\n  }\n  return clone\n}\n\n// deepCopy as alias for copyDeep.\nexport const deepCopy = copyDeep\n\n/**\n * Returns all possible URIs for a JSKOS object. Takes into consideration both the uri and identifier properties.\n *\n * @memberof module:jskos-tools\n * @param {object} object\n */\nexport const getAllUris = object => {\n  if (!object) {\n    return []\n  }\n  return (object.uri ? [object.uri] : []).concat(object.identifier || []).filter(Boolean)\n}\n\n/**\n * Compares two objects based on their URIs, using getAllUris.\n *\n * @memberof module:jskos-tools\n * @param {object} object1\n * @param {object} object2\n */\nexport const compare = (object1, object2) => {\n  // Return true if both objects are null.\n  if (object1 == null && object2 == null) {\n    return true\n  }\n  // Normalize all URIs to http:// for comparison\n  const replaceUri = uri => uri.replace(\"https://\", \"http://\")\n  const object1uris = getAllUris(object1).map(replaceUri)\n  // Check if any of object2's URIs is in object1's URIs.\n  for (let uri of getAllUris(object2).map(replaceUri)) {\n    if (object1uris.indexOf(uri) !== -1) {\n      return true\n    }\n  }\n  return false\n}\n\n// compareObjects, compareSchemes and compareConcepts as aliases for compare, for compatibility.\nexport const compareObjects = compare\nexport const compareSchemes = compare\nexport const compareConcepts = compare\n\n/**\n * Checks whether JSKOS object is a concept based on type property.\n * @memberof module:jskos-tools\n */\nexport const isConcept = object => {\n  return _.get(object, \"type\", [])?.includes(\"http://www.w3.org/2004/02/skos/core#Concept\") || _.get(object, \"inScheme\") != null || _.get(object, \"topConceptOf\") != null\n}\n\n/**\n * Checks whether JSKOS object is a concept scheme based on type property.\n * @memberof module:jskos-tools\n */\nexport const isScheme = object => {\n  return _.get(object, \"type\", [])?.includes(\"http://www.w3.org/2004/02/skos/core#ConceptScheme\")\n}\n\n/**\n * Checks whether an object is contained in a list of objects using compare.\n * @memberof module:jskos-tools\n */\nexport const isContainedIn = (object, objects) => {\n  if (!object || !objects) {\n    return false\n  }\n  for (let o of objects) {\n    if (compare(object, o)) {\n      return true\n    }\n  }\n  return false\n}\n\n// isSchemeInList as alias for isContainedIn.\nexport const isSchemeInList = isContainedIn\n\n/**\n * Sorts a list of concepts by their notation, then URI.\n *\n * @memberof module:jskos-tools\n * @param {*} concepts\n */\nexport const sortConcepts = (concepts, numerical = false) => {\n  return concepts.sort(\n    (a, b) => {\n      let _a = _.get(a, \"notation[0]\"), _b = _.get(b, \"notation[0]\")\n      if (_a && _b) {\n        _a = _a.toLowerCase()\n        _b = _b.toLowerCase()\n      }\n      if (numerical && _a && _b) {\n        let __a, __b\n        __a = parseFloat(_a)\n        __b = parseFloat(_b)\n        if (!__a && !__b) {\n          // Split notations into parts\n          const _a_split = `${_a}`.split(/[^\\w\\d]/)\n          const _b_split = `${_b}`.split(/[^\\w\\d]/)\n          for (let i = 0; i < Math.min(_a_split.length, _b_split.length); i += 1) {\n            if (_a_split[i] !== _b_split[i]) {\n              __a = parseFloat(_a_split[i]) || _a_split[i]\n              __b = parseFloat(_b_split[i]) || _b_split[i]\n              break\n            }\n          }\n          if (!__a && !__b) {\n            __a = _a\n            __b = _b\n          }\n        }\n        _a = __a\n        _b = __b\n      }\n      // Fallback to URI\n      if (!_a || !_b || _a == _b) {\n        _a = a.uri\n        _b = b.uri\n      }\n      if (_a && _b) {\n        if (_a > _b) {\n          return 1\n        } else if (_a < _b) {\n          return -1\n        }\n      }\n      return 0\n    },\n  )\n}\n\n/**\n * Sorts a list of schemes by their prefLabel (German or English), then notation, then URI.\n *\n * @memberof module:jskos-tools\n * @param {*} schemes\n */\nexport const sortSchemes = schemes => {\n  let order = [\"notation[0]\", [\"prefLabel.de\", \"prefLabel.en\"], \"uri\"]\n  return schemes.sort(\n    (a, b) => {\n      for (let path of order) {\n        let _a, _b\n        if (Array.isArray(path)) {\n          for (let path2 of path) {\n            _a = _a || _.get(a, path2)\n            _b = _b || _.get(b, path2)\n          }\n        } else {\n          _a = _.get(a, path)\n          _b = _.get(b, path)\n        }\n        if (_a != null && _b != null) {\n          _a = _a.toLowerCase()\n          _b = _b.toLowerCase()\n          if (_a > _b) {\n            return 1\n          } else if (_a < _b) {\n            return -1\n          }\n        }\n      }\n      return 0\n    },\n  )\n}\n\n/**\n * @memberof module:jskos-tools\n */\nexport const minifyMapping = mapping => {\n  let newMapping = _.pick(copyDeep(mapping), [\"from\", \"to\", \"fromScheme\", \"toScheme\", \"creator\", \"contributor\", \"type\", \"created\", \"modified\", \"note\", \"identifier\", \"uri\", \"partOf\", \"mappingRelevance\"])\n  for (let fromTo of [newMapping.from, newMapping.to]) {\n    _.forOwn(fromTo, (value, key) => {\n      let conceptBundle = []\n      for (let concept of value) {\n        conceptBundle.push(_.pick(concept, [\"uri\", \"notation\"]))\n      }\n      fromTo[key] = conceptBundle\n    })\n  }\n  if (newMapping.fromScheme) {\n    newMapping.fromScheme = _.pick(newMapping.fromScheme, [\"uri\", \"notation\"])\n  }\n  if (newMapping.toScheme) {\n    newMapping.toScheme = _.pick(newMapping.toScheme, [\"uri\", \"notation\"])\n  }\n  if (newMapping.partOf) {\n    newMapping.partOf = newMapping.partOf.map(c => _.pick(c, [\"uri\"]))\n  }\n  return newMapping\n}\n\n/**\n * @memberof module:jskos-tools\n *\n * Run `bin/localize-mapping-types` to update labels from Wikidata.\n * \n */\nexport { mappingTypes }\n\n/**\n * @memberof module:jskos-tools\n */\nexport const mappingTypeByUri = function(uri) {\n  for(let mappingType of mappingTypes) {\n    if (uri == mappingType.uri) {\n      return mappingType\n    }\n  }\n  return null\n}\n\n/**\n * @memberof module:jskos-tools\n */\nexport const defaultMappingType = mappingTypeByUri(\"http://www.w3.org/2004/02/skos/core#mappingRelation\")\n\n/**\n * @memberof module:jskos-tools\n */\nexport const mappingTypeByType = function(type, defaultType = defaultMappingType) {\n  let uri\n  if (Array.isArray(type) && type.length > 0) {\n    uri = type[0]\n  } else {\n    // This is a workaround for the type being a string instead of an array.\n    uri = type\n  }\n  return mappingTypeByUri(uri) || defaultType\n}\n\n/**\n * @memberof module:jskos-tools\n */\nexport const flattenMapping = (mapping, options = {}) => {\n  const { language } = options\n\n  let fromNotation = getNested(mapping, \"from.memberSet.0.notation.0\")\n  let toNotation = getNested(mapping, \"to.memberSet.0.notation.0\")\n  fromNotation = fromNotation !== null ? fromNotation : \"\"\n  toNotation = toNotation !== null ? toNotation : \"\"\n  let type = mappingTypeByUri(getNested(mapping, \"type.0\"))\n  type = type ? type.SHORT : \"\"\n\n  let fromLabel = prefLabel(getNested(mapping, \"from.memberSet.0\"), { language, fallbackToUri: false }) || \"\"\n  let toLabel = prefLabel(getNested(mapping, \"to.memberSet.0\"), { language, fallbackToUri: false }) || \"\"\n  let creator = prefLabel(getNested(mapping, \"creator.0\"), { language, fallbackToUri: false }) || \"\"\n\n  return {fromNotation, toNotation, fromLabel, toLabel, type, creator}\n}\n\n/**\n * Returns a function to serialize an array as CSV row as configured.\n * See CSV Dialect (<https://frictionlessdata.io/specs/csv-dialect/>).\n *\n * @memberof module:jskos-tools\n */\nconst csvSerializer = (options = {}) => {\n  const delimiter = options.delimiter || \",\"\n  const quoteChar = options.quoteChar || \"\\\"\"\n  const lineTerminator = options.lineTerminator || \"\\n\"\n  const doubleQuote = quoteChar + quoteChar\n  const quote = s => quoteChar + (s == null ? \"\" : s.split(quoteChar).join(doubleQuote)) + quoteChar\n\n  return row => row.map(quote).join(delimiter) + lineTerminator\n}\n\n/**\n * Returns a list of concepts for a mapping.\n *\n * @memberof module:jskos-tools\n * @param {*} mapping\n * @param {*} side - Either `from` or `to`. Default is both.\n */\nexport const conceptsOfMapping = (mapping, side) => {\n  let concepts = []\n  for (let s of [\"from\", \"to\"]) {\n    if (side == null || s === side) {\n      concepts = concepts.concat(\n        _.get(mapping, `${s}.memberSet`) ||\n        _.get(mapping, `${s}.memberChoice`) ||\n        _.get(mapping, `${s}.memberList`) ||\n        [],\n      )\n    }\n  }\n  return concepts.filter(c => c != null)\n}\n\n/**\n * Returns an object of preconfigured conversion functions to convert mappings into CSV.\n *\n * @memberof module:jskos-tools\n * @param {object} options\n *\n * Possible options:\n * - delimiter: delimiter character (default `,`)\n * - quoteChar: quote character (default `\"`)\n * - lineTerminator: line terminator (default `\\n`)\n * - type: whether to include mapping type in output (default true)\n * - schemes: whether to include scheme notations in output (default false)\n * - labels: whether to include concept labels in output (default false)\n * - creator: whether to include mapping creator in output (default false)\n *\n */\nexport const mappingCSV = (options = {}) => {\n  const toCSV = csvSerializer(options)\n  const language = options.language || \"en\"\n  if (options.type == null) {\n    options.type = true\n  }\n\n  const header = (mappings) => {\n    mappings = mappings || []\n    let fields = []\n    for (let side of [\"from\", \"to\"]) {\n      // Scheme\n      if (options.schemes) {\n        fields.push(`${side}Scheme`)\n      }\n      // Minimum count: 1 (for 1-to-1 mappings)\n      let conceptCount = Math.max(...mappings.map(mapping => conceptsOfMapping(mapping, side).length), 1)\n      for (let i = 0; i < conceptCount; i += 1) {\n        // Notation\n        fields.push(`${side}Notation${i ? i + 1 : \"\"}`)\n        // Label\n        if (options.labels) {\n          fields.push(`${side}Label${i ? i + 1 : \"\"}`)\n        }\n      }\n    }\n    // Type\n    if (options.type) {\n      fields.push(\"type\")\n    }\n    // Creator\n    if (options.creator) {\n      fields.push(\"creator\")\n    }\n    return toCSV(fields)\n  }\n\n  /**\n   * Converts a single mapping into a CSV line.\n   *\n   * @param {*} mapping a single mapping\n   * @param {*} options2 an options object with properties `fromCount` and `toCount`\n   */\n  const fromMapping = (mapping, options2 = {}) => {\n    let fields = []\n    for (let side of [\"from\", \"to\"]) {\n      // Scheme\n      if (options.schemes) {\n        fields.push(_.get(mapping, `${side}Scheme.notation[0]`, \"\"))\n      }\n      const concepts = conceptsOfMapping(mapping, side)\n      let conceptCount = options2[`${side}Count`]\n      if (conceptCount == null) {\n        conceptCount = concepts.length\n      }\n      // Minimum count: 1 (for 1-to-1 mappings)\n      conceptCount = Math.max(conceptCount, 1)\n      for (let i = 0; i < conceptCount; i += 1) {\n        // Notation\n        fields.push(_.get(concepts[i], \"notation[0]\", \"\"))\n        // Label\n        if (options.labels) {\n          fields.push(prefLabel(concepts[i], { language, fallbackToUri: false }))\n        }\n      }\n    }\n    // Type\n    if (options.type) {\n      fields.push(_.get(mappingTypeByUri(_.get(mapping, \"type[0]\")), \"SHORT\", \"\"))\n    }\n    // Creator\n    if (options.creator) {\n      fields.push(prefLabel(_.get(mapping, \"creator[0]\"), { language, fallbackToUri: false }))\n    }\n    return toCSV(fields)\n  }\n\n  /**\n   * Converts an array of mappings into CSV.\n   *\n   * @param {*} mapping an array of mappings\n   * @param {*} options2 an options object with optional property `header` (default true)\n   */\n  const fromMappings = (mappings, options2 = { header: true }) => {\n    let result = \"\"\n    if (options2.header) {\n      result += header(mappings)\n    }\n    const fromMappingOptions = {\n      fromCount: Math.max(...mappings.map(mapping => conceptsOfMapping(mapping, \"from\").length)),\n      toCount: Math.max(...mappings.map(mapping => conceptsOfMapping(mapping, \"to\").length)),\n    }\n    for (let mapping of mappings) {\n      result += fromMapping(mapping, fromMappingOptions)\n    }\n    return result\n  }\n\n  return {\n    header,\n    fromMapping,\n    fromMappings,\n  }\n}\n\n/**\n * Compare two mappings based on their properties. Concept sets and schemes are compared by URI.\n *\n * @memberof module:jskos-tools\n */\nexport function compareMappingsDeep(mapping1, mapping2) {\n  return _.isEqualWith(mapping1, mapping2, (object1, object2, prop) => {\n    let mapping1 = { [prop]: object1 }\n    let mapping2 = { [prop]: object2 }\n    if (prop == \"from\" || prop == \"to\") {\n      if (!_.isEqualWith(Object.getOwnPropertyNames(_.get(object1, prop, {})), Object.getOwnPropertyNames(_.get(object2, prop, {})))) {\n        return false\n      }\n      return _.isEqualWith(conceptsOfMapping(mapping1, prop), conceptsOfMapping(mapping2, prop), (concept1, concept2, index) => {\n        if (index != undefined) {\n          return compare(concept1, concept2)\n        }\n        return undefined\n      })\n    }\n    if (prop == \"fromScheme\" || prop == \"toScheme\") {\n      return compare(object1, object2)\n    }\n    // Let lodash's isEqual do the comparison\n    return undefined\n  })\n}\n\n\n/**\n * Checks if two objects have a matching object type. Returns false only if types for both objects could be guessed and they did not match.\n *\n * @memberof module:jskos-tools\n * @param {object} a\n * @param {object} b\n */\nexport const matchObjectTypes = (a, b) => {\n  // Guess object types of both objects\n  let aType = guessObjectType(a), bType = guessObjectType(b)\n  // If both object types could be guessed, throw an error if they don't match\n  if (aType && bType && aType != bType) {\n    return false\n  }\n  return true\n}\n\n/**\n * Sorts an array so that `null` values are at the end.\n *\n * @private\n * @param {*} array\n */\nconst _nullSort = (array) => {\n  if (Array.isArray(array)) {\n    array.sort((a, b) => {\n      if (a === null) {\n        return 1\n      }\n      if (b === null) {\n        return -1\n      }\n      return 0\n    })\n  }\n}\n\n/**\n * Merge URIs of two objects `a` and `b` into `a` by adding/removing URIs from identifier property.\n *\n * @memberof module:jskos-tools\n * @param {object} a\n * @param {object} b\n */\nexport const mergeUris = (a, b) => {\n  if (!a || !b) {\n    return a\n  }\n  // Merge identifier array\n  if (Array.isArray(a.identifier) || Array.isArray(b.identifier)) {\n    a.identifier = _.union(a.identifier || [], b.identifier || [])\n  }\n  // Add URI to a if necessary\n  if (!a.uri && b.uri) {\n    a.uri = b.uri\n  }\n  // Add b's URI to a's identifier if necessary\n  if (a.uri && b.uri && a.uri != b.uri && !(a.identifier || []).includes(b.uri)) {\n    a.identifier = (a.identifier || []).concat([b.uri])\n  }\n  // Remove a's URI from identifier if necessary\n  if (Array.isArray(a.identifier) && a.uri) {\n    a.identifier = a.identifier.filter(uri => uri !== a.uri)\n  }\n  // Remove identifier property if empty\n  if ((a.identifier || []).length == 0) {\n    delete a.identifier\n  }\n  // Sort null values to end\n  _nullSort(a.identifier)\n  return a\n}\n\n/**\n * Merges two JSKOS objects. Object properties will be merged deeply. Array properties will be combined (and URIs will be used for comparison if it's an array of objects).\n *\n * The `options` property allows for different options:\n * - `mergeUris` (boolean, default `false`) - appends b's URI to the result's `identifier` property if necessary, removes a's URI from the result's `identifier` property if necessary (useful for merging ConceptSchemes)\n * - `detectMismatch` (array of strings, default `[]`) - throws an error if the value at a certain path does not match between the two objects (allows for deep properties, e.g. `prefLabel.de`)\n * - `skipPaths` (array of strings, default `[]`) - provide paths to completely skip when merging\n *\n * @memberof module:jskos-tools\n * @param {object} a\n * @param {object} b\n * @param {object} options - optional, see above\n */\nexport const merge = (a, b, options) => {\n  if (!a || !b) {\n    return a ? a : b\n  }\n  options = options || {}\n  // Path is used for deep detectMismatch checks\n  let path = options._path || \"\"\n  // Throw an error if two simple properties do not match between the objects\n  let detectMismatch = options.detectMismatch || []\n  let skipPaths = options.skipPaths || []\n  let result = {}\n  // Merge properties that are in both objects\n  _.forOwn(a, (value, key) => {\n    // Skip path if necessary\n    if (skipPaths.includes(path + key)) {\n      return\n    }\n    if (Array.isArray(value) && Array.isArray(b[key])) {\n      // Merge array properties\n      result[key] = _.unionWith(value, b[key], (first, second) => {\n        if (_.isObject(first) && _.isObject(second)) {\n          return compare(first, second)\n        }\n        return first === second\n      })\n      // Sort null values to the end while keeping the rest of the order the same\n      _nullSort(result[key])\n    } else if (_.isObject(value) && _.isObject(b[key])) {\n      // Merge object properties\n      result[key] = merge(value, b[key], Object.assign({ _path: `${path}${key}.` }, options))\n    } else {\n      if (value && b[key] && detectMismatch.includes(path + key) && !_.isEqualWith(value, b[key])) {\n        throw new Error(\"Property mismatch in \" + path + key)\n      }\n      result[key] = value\n    }\n  })\n  // Add properties that are only in b\n  _.forOwn(b, (value, key) => {\n    if (!a[key]) {\n      result[key] = value\n    }\n  })\n  // Remove paths if necessary\n  if (path == \"\") {\n    _.omitMod(result, skipPaths)\n  }\n  // Merge URIs if necessary\n  if (options.mergeUris) {\n    mergeUris(result, b)\n  }\n  return result\n}\n\n/**\n * Applies recursive unicode normalization to data.\n *\n * - If data is an array, it will recursively normalize all elements of that array.\n * - If data is an object, it will recursively normalize all property values of that object.\n * - If data is a string, it will apply unicode normalization to that string.\n * - If data is of any other type, it will be returned as is.\n *\n * @param {*} data\n */\nexport const normalize = data => {\n  if (Array.isArray(data)) {\n    return data.map(element => normalize(element))\n  } else if (_.isObject(data)) {\n    _.forOwn(data, (value, key) => {\n      data[key] = normalize(value)\n    })\n    return data\n  } else {\n    if (_.isString(data)) {\n      return data.normalize()\n    } else {\n      return data\n    }\n  }\n}\n\n/**\n * Checks whether a string is a valid URI.\n *\n * @param {string} uri URI to be tested\n */\nexport const isValidUri = (uri) => {\n  // from: http://jmrware.com/articles/2009/uri_regexp/URI_regex.html\n  const re_js_rfc3986_URI = /^[A-Za-z][A-Za-z0-9+\\-.]*:(?:\\/\\/(?:(?:[A-Za-z0-9\\-._~!$&'()*+,;=:]|%[0-9A-Fa-f]{2})*@)?(?:\\[(?:(?:(?:(?:[0-9A-Fa-f]{1,4}:){6}|::(?:[0-9A-Fa-f]{1,4}:){5}|(?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}|(?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}|(?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:|(?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::)(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::)|[Vv][0-9A-Fa-f]+\\.[A-Za-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:[A-Za-z0-9\\-._~!$&'()*+,;=]|%[0-9A-Fa-f]{2})*)(?::[0-9]*)?(?:\\/(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*|\\/(?:(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:\\/(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)?|(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:\\/(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*|)(?:\\?(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})*)?(?:#(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})*)?$/\n  return uri.match(re_js_rfc3986_URI) !== null\n}\n\n/**\n * An object of compare functions (can be used by array.sort for example).\n *\n * TODO: Add more functions.\n */\nexport const compareFunctions = {\n  /**\n   * Compare mappings by their first concept.\n   *\n   * @param {*} mapping1 - first mapping\n   * @param {*} mapping2 - second mapping\n   * @param {*} fromTo - side, either `from` or `to`\n   */\n  mappingsByConcepts: (mapping1, mapping2, fromTo) => {\n    let bundleFields = [\"memberSet\", \"memberList\", \"memberChoice\"], notation1, notation2\n    for (let field of bundleFields) {\n      notation1 = notation1 || _.get(mapping1, fromTo + \".\" + field + \"[0].notation[0]\")\n      notation2 = notation2 || _.get(mapping2, fromTo + \".\" + field + \"[0].notation[0]\")\n    }\n    if (notation1 == null || notation1 < notation2) {\n      return -1\n    }\n    if (notation2 == null || notation1 > notation2) {\n      return 1\n    }\n    return 0\n  },\n}\n\n/**\n * Returns `true` if the user owns the mapping (i.e. is first creator), `false` if not.\n *\n * @param {*} user a login-server compatible user object\n * @param {*} mapping a JSKOS mapping\n */\nexport const userOwnsMapping = (user, mapping) => {\n  if (!user || !mapping) {\n    return false\n  }\n  return [user.uri].concat(Object.values(user.identities || {}).map(identity => identity.uri)).filter(uri => uri != null).includes(_.get(mapping, \"creator[0].uri\"))\n}\n\n\n/**\n * Returns the primary notation for a JSKOS Item. If there is no notation, it will return an empty string.\n * Scheme notations will be uppercased.\n *\n * @param {object} item a JSKOS Item\n * @param {string} type type of item (optional)\n */\nexport function notation(item, type) {\n  let notation\n  if (item && item.notation && item.notation.length) {\n    notation = item.notation[0]\n    if (isScheme(item) || type == \"scheme\") {\n      notation = notation.toUpperCase()\n    }\n  } else if (item && item.inScheme && item.inScheme[0] && item.uri) {\n    // Try to imply notation from scheme and concept URI\n    try {\n      const scheme = new ConceptScheme(item && item.inScheme && item.inScheme[0])\n      notation = scheme.notationFromUri(item.uri)\n    } catch (error) {\n      // Ignore error\n    }\n  }\n  return notation || \"\"\n}\n\n/**\n * Returns the content of a language map for a JSKOS Item.\n *\n * @param {*} item a JSKOS Item\n * @param {string} prop property of interest in the item\n * @param {object} options options object:\n * - `language`: preferred language\n */\nexport function languageMapContent(item, prop, { language } = {}) {\n  let languageMap = (item && prop) ? item[prop] : item\n  if (languageMap) {\n    if (languageMap[language]) {\n      return languageMap[language]\n    }\n    language = languagePreference.selectLanguage(languageMap)\n    if (language) {\n      return languageMap[language]\n    }\n  }\n  return null\n}\n\n/**\n * Returns the prefLabel of a JSKOS Item. If there is no label, it will return the URI. If there is no URI, it will return an empty string.\n *\n * @param {*} item\n * @param {object} options options object:\n * - `fallbackToUri`: return URI if no prefLabel can be found (default: true)\n * - `language`: preferred language\n */\nexport function prefLabel(item, options = {}) {\n  options = options || {}\n  const fallbackToUri = options.fallbackToUri == null ? true : options.fallbackToUri\n  return _.get(item, `prefLabel.${options.language}`)\n    || languageMapContent(item, \"prefLabel\", options)\n    || ((fallbackToUri && item && item.uri) ? item.uri : \"\")\n}\n\n/**\n * Returns the definition of a JSKOS Item as an array. If there is no definition, an empty array will be returned.\n *\n * @param {*} item\n * @param {object} options options object:\n * - `language`: preferred language\n */\nexport function definition(item, options = {}) {\n  options = options || {}\n  let content = _.get(item, `definition.${options.language}`)\n    || languageMapContent(item, \"definition\", options)\n    || []\n  // Make sure an array is returned\n  if (_.isString(content)) {\n    content = [content]\n  }\n  return content\n}\n\n/**\n * Returns whether a mapping registry has stored mappings (`true` = database) or not (`false` = recommendations).\n *\n * @param {object} registry JSKOS registry\n */\nexport function mappingRegistryIsStored(registry) {\n  return _.get(registry, \"stored\", _.get(registry, \"constructor.stored\", _.get(registry, \"provider.constructor.stored\", false)))\n}\n\n/**\n * Returns the creator URI for an annotation.\n *\n * @param {object} annotation a JSKOS annotation\n */\nexport function annotationCreatorUri(annotation) {\n  if (_.isString(annotation.creator)) {\n    return annotation.creator\n  }\n  return annotation.creator && annotation.creator.id\n}\n\n/**\n * Returns the craetor name for an annotation.\n *\n * @param {object} annotation a JSKOS annotation\n */\nexport function annotationCreatorName(annotation) {\n  return _.get(annotation, \"creator.name\") || \"\"\n}\n\n/**\n * Matches an annotation's creator URI against a list of URIs (e.g. from a user).\n *\n * @param {object} annotation a JSKOS annotation\n * @param {array} uris array of user URIs\n */\nexport function annotationCreatorMatches(annotation, uris) {\n  return !!(annotation && _.isString(annotation.creator) ? uris && uris.includes(annotation.creator) : uris && annotation.creator && uris.includes(annotation.creator.id))\n}\n\nexport function guessSchemeFromNotation(notation, schemes) {\n  return schemes.filter(({notationPattern}) => {\n    if ((notationPattern||\".+\") === \".+\") {\n      return false\n    } \n    return RegExp(\"^(\" + notationPattern + \")$\").test(notation)\n  })\n}\n\nexport { guessObjectType, objectTypes, usedObjectTypes }\n","/**\n * JSKOS Tools.\n * @module jskos-tools\n */\n\nimport ConceptScheme from \"./concept-scheme.js\"\nexport { ConceptScheme }\n\nimport { templateVariables } from \"./link-template.js\"\nexport { templateVariables }\n\nimport languagePreference from \"./language-preference.js\"\nexport { languagePreference}\n\nimport * as identifiers from \"./identifiers.js\"\nimport * as tools from \"./tools.js\"\n\nexport * from \"./identifiers.js\"\nexport * from \"./tools.js\"\n\nexport default {\n  ...identifiers,\n  ...tools,\n  ConceptScheme,\n  languagePreference,\n}\n"],"names":["regexChars","regexEscape","string","notationEscapeChars","ConceptScheme","scheme","escaped","notation","uri","match","options","concept","templateVariables","concepts","separator","languageTags","_a","prefLabel","labels","tag","l","language","isEqualWith","a","b","compare","pSlice","Object_keys","obj","keys","key","deepEqual","actual","expected","objEquiv","isUndefinedOrNull","value","isArguments","object","ka","kb","i","e","result","get","path","defaultValue","travel","regexp","res","pick","forOwn","cb","isObject","isString","str","union","unionWith","p","c","v","omitMod","paths","languagePreference","getLanguages","selectLanguage","_.get","languageMap","sha1","_rotLeft","n","s","t4","_cvtHex","val","blockstart","j","W","H0","H1","H2","H3","H4","A","B","C","D","E","temp","strLen","wordArray","reduceSet","set","member","memberField","bundle","f","reduceBundle","field","mappingContent","mapping","from","to","type","side","mappingMembers","memberUris","mappingContentIdentifier","json","mappingMembersIdentifier","getSHA256Hash","input","__async","subtle","webcrypto","__viteBrowserExternal","textAsBuffer","hashBuffer","codePointCompare","left","right","leftIter","rightIter","leftChar","rightChar","leftCodepoint","rightCodepoint","mappingSamenessIdentifier","subjects","objects","predicate","negativity","addMappingIdentifiers","fromField","toField","_b","identifier","id","mapping1","mapping2","prefix","id1","id2","compareMappings","compareMappingContent","compareMappingMembers","mappingTypes","objectTypes","objectTypeUris","map","name","guessObjectType","shortname","lowercase","types","usedObjectTypes","uris","x","isUpperCase","getNested","xs","addContext","jskos","resource","clean","cleanJSKOS","copyDeep","replaceCircular","skipUnderscore","clone","inScheme","newScheme","deepCopy","getAllUris","object1","object2","replaceUri","object1uris","compareObjects","compareSchemes","compareConcepts","isConcept","isScheme","isContainedIn","o","isSchemeInList","sortConcepts","numerical","__a","__b","_a_split","_b_split","sortSchemes","schemes","order","path2","minifyMapping","newMapping","_.pick","fromTo","_.forOwn","conceptBundle","mappingTypeByUri","mappingType","defaultMappingType","mappingTypeByType","defaultType","flattenMapping","fromNotation","toNotation","fromLabel","toLabel","creator","csvSerializer","delimiter","quoteChar","lineTerminator","doubleQuote","quote","row","conceptsOfMapping","mappingCSV","toCSV","header","mappings","fields","conceptCount","fromMapping","options2","fromMappingOptions","compareMappingsDeep","_.isEqualWith","prop","concept1","concept2","index","matchObjectTypes","aType","bType","_nullSort","array","mergeUris","_.union","merge","detectMismatch","skipPaths","_.unionWith","first","second","_.isObject","_.omitMod","normalize","data","element","_.isString","isValidUri","re_js_rfc3986_URI","compareFunctions","bundleFields","notation1","notation2","userOwnsMapping","user","identity","item","error","languageMapContent","fallbackToUri","definition","content","mappingRegistryIsStored","registry","annotationCreatorUri","annotation","annotationCreatorName","annotationCreatorMatches","guessSchemeFromNotation","notationPattern","__spreadProps","__spreadValues","identifiers","tools"],"mappings":"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ACI,UAAa,CACX,GAAM,YACN,GAAM,yBACN,YAAa,0BACb,GAAM,aACN,GAAM,oBACN,GAAM,sBACN,GAAM,eACN,GAAM,cACN,GAAM,yBACN,GAAM,sBACN,GAAM,cACN,GAAM,sBACN,GAAM,sBACN,GAAM,cACN,GAAM,kBACN,GAAM,qBACN,GAAM,qBACN,GAAM,yBACN,GAAM,eACN,GAAM,iBACN,GAAM,cACN,GAAM,wBACN,GAAM,OACN,GAAM,kBACN,GAAM,kBACN,GAAM,gBACN,UAAW,YACX,GAAM,iBACN,GAAM,eACN,GAAM,iBACN,GAAM,uBACN,GAAM,wBACN,GAAM,qBACN,GAAM,sBACN,GAAM,oBACN,GAAM,uBACN,GAAM,mBACN,GAAM,cACN,GAAM,cACN,GAAM,sBACN,GAAM,iBACN,GAAM,OACN,QAAS,OACT,UAAW,OACX,UAAW,MACjB,EACI,MAAS,QACT,IAAO,gDACX,EACE,CACE,UAAa,OACb,QAAW,CACT,CACE,IAAO,qDACf,CACA,EACI,WAAc,CACZ,GAAM,CACJ,2BACR,EACM,GAAM,CACJ,mDACR,CACA,EACI,SAAY,CACV,GACN,EACI,UAAa,CACX,GAAM,aACN,YAAa,wBACb,GAAM,wBACN,GAAM,uBACN,GAAM,oBACN,GAAM,cACN,GAAM,qBACN,GAAM,wBACN,GAAM,wBACN,GAAM,oBACN,GAAM,cACN,GAAM,uBACN,GAAM,0BACN,GAAM,OACN,GAAM,mBACN,GAAM,gBACN,UAAW,YACX,GAAM,eACN,GAAM,eACN,GAAM,eACN,GAAM,wBACN,GAAM,0BACN,GAAM,uBACN,GAAM,kBACN,GAAM,mBACN,GAAM,iBACN,GAAM,gBACN,UAAW,MACjB,EACI,MAAS,QACT,IAAO,gDACX,EACE,CACE,UAAa,SACb,QAAW,CACT,CACE,IAAO,qDACf,CACA,EACI,WAAc,CACZ,GAAM,CACJ,wBACR,EACM,GAAM,CACJ,iBACR,CACA,EACI,SAAY,CACV,GACN,EACI,UAAa,CACX,YAAa,wBACb,GAAM,mBACN,GAAM,gBACN,GAAM,yBACN,GAAM,cACN,GAAM,qBACN,GAAM,cACN,GAAM,2BACN,GAAM,aACN,GAAM,kBACN,GAAM,0CACN,GAAM,OACN,GAAM,qBACN,GAAM,kBACN,GAAM,cACN,GAAM,iBACN,GAAM,2CACN,QAAS,2BACT,GAAM,6BACN,GAAM,gBACN,GAAM,iBACN,GAAM,aACN,GAAM,sBACN,GAAM,gBACN,UAAW,MACjB,EACI,QAAW,CACT,CACE,IAAO,iDACf,CACA,EACI,MAAS,QACT,IAAO,gDACX,EACE,CACE,UAAa,SACb,QAAW,CACT,CACE,IAAO,qDACf,CACA,EACI,WAAc,CACZ,GAAM,CACJ,uBACR,CACA,EACI,SAAY,CACV,GACN,EACI,UAAa,CACX,YAAa,uBACb,GAAM,kBACN,GAAM,0BACN,GAAM,eACN,GAAM,kBACN,GAAM,eACN,GAAM,4BACN,GAAM,YACN,GAAM,mBACN,GAAM,2CACN,GAAM,OACN,GAAM,oBACN,GAAM,kBACN,GAAM,cACN,GAAM,kBACN,GAAM,0CACN,QAAS,6BACT,GAAM,2BACN,GAAM,aACN,GAAM,gBACN,GAAM,aACN,GAAM,WACN,GAAM,eACN,UAAW,MACjB,EACI,QAAW,CACT,CACE,IAAO,gDACf,CACA,EACI,MAAS,SACT,IAAO,iDACX,EACE,CACE,UAAa,MACb,QAAW,CACT,CACE,IAAO,qDACf,CACA,EACI,WAAc,CACZ,GAAM,CACJ,uDACR,EACM,GAAM,CACJ,mCACR,CACA,EACI,SAAY,CACV,GACN,EACI,UAAa,CACX,YAAa,0BACb,GAAM,sBACN,GAAM,sBACN,GAAM,gBACN,GAAM,iBACN,GAAM,kBACN,GAAM,cACN,GAAM,cACN,GAAM,iBACN,GAAM,2BACN,GAAM,OACN,GAAM,qBACN,GAAM,qBACN,GAAM,oBACN,UAAW,iBACX,GAAM,mBACN,GAAM,qBACN,GAAM,6CACN,GAAM,6BACN,GAAM,oBACN,GAAM,oBACN,GAAM,UACN,GAAM,aACN,IAAO,wBACP,UAAW,MACjB,EACI,MAAS,UACT,IAAO,kDACX,EACE,CACE,UAAa,UACb,WAAc,CACZ,GAAM,CACJ,oCACR,EACM,GAAM,CACJ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"}