{"version":3,"file":"openchemlib-utils.min.js","sources":["../src/util/tagAtom.js","../src/diastereotopic/addDiastereotopicMissingChirality.js","../src/util/makeRacemic.js","../src/diastereotopic/getDiastereotopicAtomIDs.js","../src/diastereotopic/getDiastereotopicAtomIDsAndH.js","../src/diastereotopic/groupDiastereotopicAtomIDs.js","../src/diastereotopic/getGroupedDiastereotopicAtomIDs.js","../src/util/isCsp3.js","../src/hose/getHoseCodesForAtoms.js","../src/hose/getHoseCodesForAtom.js","../src/hose/getHoseCodesFromDiastereotopicID.js","../src/hose/getHoseCodesForPath.js","../src/util/combineSmiles.js","../src/util/getAtomsInfo.js","../node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-matrix/src/inspect.js","../node_modules/ml-matrix/src/util.js","../node_modules/ml-matrix/src/matrix.js","../node_modules/ml-matrix/src/stat.js","../src/util/getConnectivityMatrix.js","../node_modules/ml-floyd-warshall/src/index.js","../node_modules/atom-sorter/src/index.js","../src/util/getMF.js","../src/path/getPathAndTorsion.js","../src/path/getPathsInfo.js","../node_modules/ensure-string/lib-esm/index.js","../node_modules/isutf8/dist/index.esm.js","../node_modules/ml-matrix/src/mathOperations.js","../node_modules/papaparse/papaparse.min.js","../src/db/utils/getMoleculeCreators.js","../src/db/utils/appendCSV.js","../node_modules/sdf-parser/src/util/getMolecule.js","../src/db/utils/appendSDF.js","../node_modules/sdf-parser/src/parse.js","../node_modules/sdf-parser/src/getEntriesBoundaries.js","../src/util/noWait.js","../src/db/utils/search.js","../src/misc/dwar/utils/parseColumnbProperties.js","../src/misc/dwar/utils/parseData.js","../src/misc/dwar/parseDwar.js","../src/reaction/utils/getReactantInfo.js","../src/reaction/utils/applyOneReactantReaction.js","../src/db/MoleculesDB.js","../src/db/utils/appendSmilesList.js","../src/db/utils/pushEntry.js","../src/db/utils/pushMoleculeInfo.js","../src/db/utils/appendColor.js","../src/reaction/applyReactions.js","../src/fragment/fragmentAcyclicSingleBonds.js","../src/features/getAtomFeatures.js","../src/diastereotopic/getDiastereotopicAtomIDsFromMolfile.js","../src/hose/getHoseCodesAndDiastereotopicIDs.js","../src/path/getShortestPaths.js","../src/util/nbCHO.js","../src/util/nbCN.js","../src/util/nbCOOH.js","../src/util/nbNH2.js","../src/util/nbOH.js","../src/misc/dwar/utils/getParts.js","../src/diastereotopic/toDiastereotopicSVG.js","../src/misc/toVisualizerMolfile.js"],"sourcesContent":["let xAtomicNumber = 0;\n\n/**\n * Tag an atom to be able to visualize it\n * @param {import('openchemlib').Molecule} molecule\n * @param {number} iAtom\n */\nexport function tagAtom(molecule, iAtom) {\n  let customLabel = `${molecule.getAtomLabel(iAtom)}*`;\n  molecule.setAtomCustomLabel(iAtom, customLabel);\n  if (molecule.getAtomicNo(iAtom) === 1) {\n    molecule.setAtomicNo(iAtom, getXAtomicNumber(molecule));\n  } else {\n    // we can not use X because we would have problems with valencies if it is\n    // expanded hydrogens or not\n    // we can not only use a custom label because it does not count for the canonisation\n    molecule.setAtomMass(iAtom, molecule.getAtomMass(iAtom) + 5);\n  }\n  return customLabel;\n}\n\nfunction getXAtomicNumber(molecule) {\n  if (!xAtomicNumber) {\n    const OCL = molecule.getOCL();\n    xAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(\n      'X',\n      OCL.Molecule.cPseudoAtomX,\n    );\n  }\n  return xAtomicNumber;\n}\n","import { tagAtom } from '../util/tagAtom';\n\n/**\n * Add either missing chirality of diastereotopic missing chirality\n * The problem is that sometimes we need to add chiral bond that was not planned because it is the same group\n * This is the case for example for the valine where the 2 C of the methyl groups are diastereotopic\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {number} [options.esrType=cESRTypeAnd]\n */\nexport function addDiastereotopicMissingChirality(molecule, options = {}) {\n  const { Molecule } = molecule.getOCL();\n  const { esrType = Molecule.cESRTypeAnd } = options;\n\n  for (let iAtom = 0; iAtom < molecule.getAllAtoms(); iAtom++) {\n    let tempMolecule = molecule.getCompactCopy();\n    tagAtom(tempMolecule, iAtom);\n    // After copy, helpers must be recalculated\n    tempMolecule.ensureHelperArrays(Molecule.cHelperBitsStereo);\n    // We need to have >0 and not >1 because there could be unspecified chirality in racemate\n\n    for (let i = 0; i < tempMolecule.getAtoms(); i++) {\n      // changed from from handling below; TLS 9.Nov.2015\n      if (\n        tempMolecule.isAtomStereoCenter(i) &&\n        tempMolecule.getStereoBond(i) === -1\n      ) {\n        let stereoBond = tempMolecule.getAtomPreferredStereoBond(i);\n        if (stereoBond !== -1) {\n          molecule.setBondType(stereoBond, Molecule.cBondTypeUp);\n          if (molecule.getBondAtom(1, stereoBond) === i) {\n            let connAtom = molecule.getBondAtom(0, stereoBond);\n            molecule.setBondAtom(0, stereoBond, i);\n            molecule.setBondAtom(1, stereoBond, connAtom);\n          }\n          // To me it seems that we have to add all stereo centers into AND group 0. TLS 9.Nov.2015\n          molecule.setAtomESR(i, esrType, 0);\n        }\n      }\n    }\n  }\n}\n","/**\n *\n * @param {import('openchemlib').Molecule} [molecule] An instance of a molecule\n * @param {object} [options={}]\n * @param {object} [options.OCL] openchemlib library\n */\nexport function makeRacemic(molecule) {\n  const { Molecule } = molecule.getOCL();\n\n  // if we don't calculate this we have 2 epimers\n  molecule.ensureHelperArrays(Molecule.cHelperCIP);\n\n  // we need to make one group \"AND\" for chiral (to force to racemic, this means diastereotopic and not enantiotopic)\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    if (molecule.getAtomParity(i) !== Molecule.cAtomParityNone) {\n      molecule.setAtomESR(i, Molecule.cESRTypeAnd, 0); // changed to group 0; TLS 9.Nov.2015\n    }\n  }\n}\n","import { makeRacemic } from '../util/makeRacemic';\nimport { tagAtom } from '../util/tagAtom';\n\nimport { addDiastereotopicMissingChirality } from './addDiastereotopicMissingChirality';\n\n/**\n * Returns an array of diastereotopic ID (as oclCode)\n * @param {import('openchemlib').Molecule} molecule\n */\nexport function getDiastereotopicAtomIDs(molecule) {\n  const OCL = molecule.getOCL();\n  addDiastereotopicMissingChirality(molecule);\n\n  let numberAtoms = molecule.getAllAtoms();\n  let ids = [];\n  for (let iAtom = 0; iAtom < numberAtoms; iAtom++) {\n    let tempMolecule = molecule.getCompactCopy();\n    tagAtom(tempMolecule, iAtom);\n    makeRacemic(tempMolecule);\n    // We need to ensure the helper array in order to get correctly the result of racemisation\n    ids[iAtom] = tempMolecule.getCanonizedIDCode(\n      OCL.Molecule.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS,\n    );\n  }\n  return ids;\n}\n","import { getDiastereotopicAtomIDs } from './getDiastereotopicAtomIDs';\n\n/**\n *\n * @param {import('openchemlib').Molecule} molecule\n */\nexport function getDiastereotopicAtomIDsAndH(molecule) {\n  const OCL = molecule.getOCL();\n  molecule = molecule.getCompactCopy();\n  molecule.addImplicitHydrogens();\n  // TODO Temporary code ???\n  molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n\n  const diaIDs = getDiastereotopicAtomIDs(molecule);\n  const newDiaIDs = [];\n\n  for (let i = 0; i < diaIDs.length; i++) {\n    const diaID = diaIDs[i];\n    const newDiaID = {\n      oclID: diaID,\n      hydrogenOCLIDs: [],\n      nbHydrogens: 0,\n    };\n    if (molecule.getAtomicNo(i) === 1) {\n      const atom = molecule.getConnAtom(i, 0);\n      newDiaID.heavyAtom = diaIDs[atom];\n    }\n    for (let j = 0; j < molecule.getAllConnAtoms(i); j++) {\n      const atom = molecule.getConnAtom(i, j);\n      if (molecule.getAtomicNo(atom) === 1) {\n        newDiaID.nbHydrogens++;\n        if (newDiaID.hydrogenOCLIDs.indexOf(diaIDs[atom]) === -1) {\n          newDiaID.hydrogenOCLIDs.push(diaIDs[atom]);\n        }\n      }\n    }\n\n    newDiaIDs.push(newDiaID);\n  }\n\n  return newDiaIDs;\n}\n","export function groupDiastereotopicAtomIDs(diaIDs, molecule, options = {}) {\n  const { atomLabel } = options;\n  const diaIDsObject = {};\n  for (let i = 0; i < diaIDs.length; i++) {\n    if (!atomLabel || molecule.getAtomLabel(i) === atomLabel) {\n      let diaID = diaIDs[i];\n      if (!diaIDsObject[diaID]) {\n        diaIDsObject[diaID] = {\n          counter: 0,\n          atoms: [],\n          oclID: diaID,\n          atomLabel: molecule.getAtomLabel(i),\n        };\n      }\n      diaIDsObject[diaID].counter++;\n      diaIDsObject[diaID].atoms.push(i);\n    }\n  }\n\n  return Object.keys(diaIDsObject).map((key) => diaIDsObject[key]);\n}\n","import { getDiastereotopicAtomIDs } from './getDiastereotopicAtomIDs';\nimport { groupDiastereotopicAtomIDs } from './groupDiastereotopicAtomIDs';\n/**\n * This function groups the diasterotopic atomIds of the molecule based on equivalence of atoms. The output object contains\n * a set of chemically equivalent atoms(element.atoms) and the groups of magnetically equivalent atoms (element.magneticGroups)\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {string} [options.atomLabel] Select atoms of the given atomLabel. By default it returns all the explicit atoms in the molecule\n * @returns {Array}\n */\n\nexport function getGroupedDiastereotopicAtomIDs(molecule, options = {}) {\n  let diaIDs = getDiastereotopicAtomIDs(molecule);\n  return groupDiastereotopicAtomIDs(diaIDs, molecule, options);\n}\n","/**\n * Check if a specific atom is a sp3 carbon\n * @param {import('openchemlib').Molecule} molecule\n * @param {number} atomID\n */\n\nexport function isCsp3(molecule, atomID) {\n  if (molecule.getAtomicNo(atomID) !== 6) return false;\n  if (molecule.getAtomCharge(atomID) !== 0) return false;\n  if (\n    molecule.getImplicitHydrogens(atomID) + molecule.getConnAtoms(atomID) !==\n    4\n  ) {\n    return false;\n  }\n  return true;\n}\n","import { isCsp3 } from '../util/isCsp3';\nimport { makeRacemic } from '../util/makeRacemic';\nimport { tagAtom } from '../util/tagAtom';\n\nexport const FULL_HOSE_CODE = 1;\nexport const HOSE_CODE_CUT_C_SP3_SP3 = 2;\n\n/**\n * Returns the hose code for a specific atom number\n * @param {import('openchemlib').Molecule} originalMolecule - The OCL molecule to be fragmented\n * @param {number[]} rootAtoms\n * @param {object} [options={}]\n * @param {boolean} [options.isTagged] Specify is the atoms are already tagged\n * @param {number} [options.minSphereSize=0] Smallest hose code sphere\n * @param {number} [options.maxSphereSize=4] Largest hose code sphere\n * @param {number} [options.kind=FULL_HOSE_CODE] Kind of hose code, default usual sphere\n */\nexport function getHoseCodesForAtoms(\n  originalMolecule,\n  rootAtoms = [],\n  options = {},\n) {\n  const OCL = originalMolecule.getOCL();\n  const {\n    minSphereSize = 0,\n    maxSphereSize = 4,\n    kind = FULL_HOSE_CODE,\n    isTagged = false,\n  } = options;\n\n  const molecule = originalMolecule.getCompactCopy();\n\n  if (!isTagged) {\n    const tags = [];\n    for (let i = 0; i < rootAtoms.length; i++) {\n      let rootAtom = rootAtoms[i];\n      tags.push(tagAtom(molecule, rootAtom));\n      molecule.addImplicitHydrogens();\n      molecule.addMissingChirality();\n      molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n      // because ensuring helper reorder atoms we need to look again for it\n    }\n    rootAtoms.length = 0;\n    for (let j = 0; j < molecule.getAllAtoms(); j++) {\n      if (tags.includes(molecule.getAtomCustomLabel(j))) {\n        rootAtoms.push(j);\n      }\n    }\n  }\n\n  let fragment = new OCL.Molecule(0, 0);\n  let results = [];\n  let min = 0;\n  let max = 0;\n  let atomMask = new Array(molecule.getAllAtoms());\n  let atomList = new Array(molecule.getAllAtoms());\n\n  for (let sphere = 0; sphere <= maxSphereSize; sphere++) {\n    if (max === 0) {\n      for (let rootAtom of rootAtoms) {\n        atomList[max] = rootAtom;\n        atomMask[rootAtom] = true;\n        max++;\n      }\n    } else {\n      let newMax = max;\n      for (let i = min; i < max; i++) {\n        let atom = atomList[i];\n        for (let j = 0; j < molecule.getAllConnAtoms(atom); j++) {\n          let connAtom = molecule.getConnAtom(atom, j);\n          if (!atomMask[connAtom]) {\n            switch (kind) {\n              case FULL_HOSE_CODE:\n                atomMask[connAtom] = true;\n                atomList[newMax++] = connAtom;\n                break;\n              case HOSE_CODE_CUT_C_SP3_SP3:\n                if (!(isCsp3(molecule, atom) && isCsp3(molecule, connAtom))) {\n                  atomMask[connAtom] = true;\n                  atomList[newMax++] = connAtom;\n                }\n                break;\n              default:\n                throw new Error('getHoseCoesForAtom unknown kind');\n            }\n          }\n        }\n      }\n      min = max;\n      max = newMax;\n    }\n    molecule.copyMoleculeByAtoms(fragment, atomMask, true, null);\n    if (sphere >= minSphereSize) {\n      makeRacemic(fragment);\n      results.push(\n        fragment.getCanonizedIDCode(\n          OCL.Molecule.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS,\n        ),\n      );\n    }\n  }\n  return results;\n}\n","import { getHoseCodesForAtoms } from './getHoseCodesForAtoms.js';\n\n/**\n * Returns the hose code for a specific atom number\n * @param {import('openchemlib').Molecule} originalMolecule\n * @param {number} rootAtom\n * @param {object} [options={}]\n * @param {boolean} [options.isTagged] Specify is the atom is already tagged\n * @param {number} [options.minSphereSize=0] Smallest hose code sphere\n * @param {number} [options.maxSphereSize=4] Largest hose code sphere\n * @param {number} [options.kind=FULL_HOSE_CODE] Kind of hose code, default usual sphere\n */\nexport function getHoseCodesForAtom(originalMolecule, rootAtom, options = {}) {\n  return getHoseCodesForAtoms(originalMolecule, [rootAtom], options);\n}\n","import { getHoseCodesForAtom } from './getHoseCodesForAtom';\n/**\n * Returns the hose code for a specific marked atom\n * @param {import('openchemlib').Molecule} diastereotopicID\n * @param {object} options\n */\n\nexport function getHoseCodesFromDiastereotopicID(molecule, options = {}) {\n  molecule.addImplicitHydrogens();\n  molecule.addMissingChirality();\n\n  // One of the atom has to be marked !\n  let atomID = -1;\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    // we need to find the marked atom\n    const atomCustomLabel = molecule.getAtomCustomLabel(i);\n    if (atomCustomLabel != null && atomCustomLabel.endsWith('*')) {\n      atomID = i;\n      break;\n    }\n  }\n  if (atomID >= 0) {\n    options.isTagged = true;\n    return getHoseCodesForAtom(molecule, atomID, options);\n  }\n  return undefined;\n}\n","import { makeRacemic } from '../util/makeRacemic';\nimport { tagAtom } from '../util/tagAtom';\n\nlet fragment;\n\n/**\n * Returns the hose code for a specific atom number\n * @param {import('openchemlib').Molecule} molecule\n */\nexport function getHoseCodesForPath(molecule, from, to, maxLength) {\n  const OCL = molecule.getOCL();\n  const originalFrom = from;\n  const originalTo = to;\n  molecule = molecule.getCompactCopy();\n\n  let originalAtoms = []; // path before renumbering\n  molecule.getPath(originalAtoms, from, to, maxLength + 1);\n  let torsion;\n  if (originalAtoms.length === 4) {\n    torsion = molecule.calculateTorsion(originalAtoms);\n  }\n\n  const tag1 = tagAtom(molecule, from);\n  const tag2 = tagAtom(molecule, to);\n\n  molecule.addImplicitHydrogens();\n  molecule.addMissingChirality();\n\n  molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n\n  from = -1;\n  to = -1;\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    if (tag1 === tag2) {\n      if (molecule.getAtomCustomLabel(i) === tag1) {\n        if (from === -1) {\n          from = i;\n        } else {\n          to = i;\n        }\n      }\n    } else {\n      if (tag1 === molecule.getAtomCustomLabel(i)) {\n        from = i;\n      }\n      if (tag2 === molecule.getAtomCustomLabel(i)) {\n        to = i;\n      }\n    }\n  }\n\n  if (!fragment) fragment = new OCL.Molecule(0, 0);\n\n  let atoms = [];\n  molecule.getPath(atoms, from, to, maxLength + 1);\n\n  let min = 0;\n  let max = 0;\n  let atomMask = new Array(molecule.getAllAtoms()).fill(false);\n  let atomList = new Array(molecule.getAllAtoms()).fill(-1);\n  let hoses = [];\n\n  for (let sphere = 0; sphere <= 2; sphere++) {\n    if (max === 0) {\n      for (let atom of atoms) {\n        atomMask[atom] = true;\n        atomList[max++] = atom;\n      }\n    } else {\n      let newMax = max;\n      for (let i = min; i < max; i++) {\n        let atom = atomList[i];\n        for (let j = 0; j < molecule.getAllConnAtoms(atom); j++) {\n          let connAtom = molecule.getConnAtom(atom, j);\n          if (!atomMask[connAtom]) {\n            atomMask[connAtom] = true;\n            atomList[newMax++] = connAtom;\n          }\n        }\n      }\n      min = max;\n      max = newMax;\n    }\n    let atomMap = [];\n\n    molecule.copyMoleculeByAtoms(fragment, atomMask, true, atomMap);\n    makeRacemic(fragment);\n    let oclID = fragment.getCanonizedIDCode(\n      OCL.Molecule.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS,\n    );\n\n    hoses.push({\n      sphere,\n      oclID,\n    });\n  }\n\n  return {\n    atoms: originalAtoms,\n    from: originalFrom,\n    to: originalTo,\n    torsion,\n    hoses,\n    length: originalAtoms.length - 1,\n  };\n}\n","const MAX_R = 10;\n\n/**\n * Generate molecules and calcule predicted properties form a list of smiles and fragments\n * @param {string} [coreSmiles]\n * @param {array} [fragments] Array of {smiles,R1,R2,...}\n * @param {import('openchemlib')} OCL - openchemlib library\n * @param {object} [options={}]\n * @param {function} [options.onStep] method to execute each new molecules\n * @param {boolean} [options.complexity] returns only the number of molecules to evaluate\n * @return {Promise} promise that resolves to molecules or complexity as a number\n */\nexport async function combineSmiles(coreSmiles, fragments, OCL, options = {}) {\n  const { complexity = false } = options;\n  const core = getCore(coreSmiles);\n  const rGroups = getRGroups(core, fragments);\n  if (complexity) {\n    return getComplexity(rGroups);\n  }\n  return generate(core, rGroups, OCL, options);\n}\n\nfunction getComplexity(rGroups) {\n  let complexity = 1;\n  for (let rGroup of rGroups) {\n    complexity *= rGroup.smiles.length;\n  }\n  return complexity;\n}\n\nasync function generate(core, rGroups, OCL, options = {}) {\n  const { onStep } = options;\n  const molecules = {};\n  const sizes = new Array(rGroups.length);\n  const currents = new Array(rGroups.length);\n  for (let i = 0; i < rGroups.length; i++) {\n    sizes[i] = rGroups[i].smiles.length - 1;\n    currents[i] = 0;\n  }\n  let position = 0;\n  let counter = 0;\n\n  while (true) {\n    counter++;\n    while (position < currents.length) {\n      if (currents[position] < sizes[position]) {\n        if (onStep) {\n          await onStep(counter);\n        }\n        appendMolecule(molecules, core, rGroups, currents, OCL);\n        currents[position]++;\n        for (let i = 0; i < position; i++) {\n          currents[i] = 0;\n        }\n        position = 0;\n      } else {\n        position++;\n      }\n    }\n    if ((position = currents.length)) {\n      if (onStep) {\n        await onStep(counter);\n      }\n      appendMolecule(molecules, core, rGroups, currents, OCL);\n      break;\n    }\n  }\n  return Object.keys(molecules)\n    .map((key) => molecules[key])\n    .sort((m1, m2) => m1.mw - m2.mw);\n}\n\nfunction appendMolecule(molecules, core, rGroups, currents, OCL) {\n  let newSmiles = core.smiles;\n  for (let i = 0; i < currents.length; i++) {\n    newSmiles += `.${rGroups[i].smiles[currents[i]]}`;\n  }\n\n  const currentMol = OCL.Molecule.fromSmiles(newSmiles);\n  const idCode = currentMol.getIDCode();\n\n  if (!molecules[idCode]) {\n    let molecule = {};\n    molecules[idCode] = molecule;\n    molecule.smiles = currentMol.toSmiles();\n    molecule.combinedSmiles = newSmiles;\n    molecule.idCode = idCode;\n    molecule.molfile = currentMol.toMolfile();\n\n    const props = new OCL.MoleculeProperties(currentMol);\n    molecule.nbHAcceptor = props.acceptorCount;\n    molecule.nbHDonor = props.donorCount;\n    molecule.logP = props.logP;\n    molecule.logS = props.logS;\n    molecule.PSA = props.polarSurfaceArea;\n    molecule.nbRottable = props.rotatableBondCount;\n    molecule.nbStereoCenter = props.stereoCenterCount;\n    let mf = currentMol.getMolecularFormula();\n    molecule.mf = mf.formula;\n    molecule.mw = mf.relativeWeight;\n  }\n}\n\nfunction getCore(coreSmiles) {\n  let core = {\n    originalSmiles: coreSmiles,\n    smiles: coreSmiles.replace(/\\[R(?<group>[1-4])\\]/g, '%5$<group>'),\n  };\n\n  for (let i = 0; i < MAX_R; i++) {\n    if (core.originalSmiles.indexOf(`[R${i}]`) > -1) core[`R${i}`] = true;\n  }\n  return core;\n}\n\nfunction getRGroups(core, fragments) {\n  let rGroups = {};\n  for (const fragment of fragments) {\n    if (fragment.smiles) {\n      const smiles = updateRPosition(fragment.smiles);\n      for (let i = 0; i < MAX_R; i++) {\n        if (core[`R${i}`]) {\n          // we only consider the R that are in the core\n          if (fragment[`R${i}`]) {\n            if (!rGroups[`R${i}`]) {\n              rGroups[`R${i}`] = {\n                group: `R${i}`,\n                smiles: [],\n              };\n            }\n            rGroups[`R${i}`].smiles.push(smiles.replace(/\\[R\\]/, `(%5${i})`));\n          }\n        }\n      }\n    }\n  }\n  return Object.keys(rGroups).map((key) => rGroups[key]);\n}\n\nfunction updateRPosition(smiles) {\n  // R group should not be at the beginning\n  if (smiles.indexOf('[R]') !== 0) return smiles;\n  if (smiles.length === 3) return '[H][R]';\n  // we are in trouble ... we need to move the R\n  let newSmiles = smiles.replace('[R]', '');\n  // we need to check where we should put the R group\n  let level = 0;\n  for (let j = 0; j < newSmiles.length; j++) {\n    let currentChar = newSmiles.charAt(j);\n    let currentSubstring = newSmiles.substr(j);\n    if (currentChar === '(') {\n      level++;\n    } else if (currentChar === ')') {\n      level--;\n    } else if (level === 0) {\n      if (currentSubstring.match(/^[a-z]/)) {\n        return `${newSmiles.substr(0, j + 1)}([R])${newSmiles.substr(j + 1)}`;\n      } else if (currentSubstring.match(/^[A-Z][a-z]/)) {\n        return `${newSmiles.substr(0, j + 2)}([R])${newSmiles.substr(j + 2)}`;\n      } else if (currentSubstring.match(/^[A-Z]/)) {\n        return `${newSmiles.substr(0, j + 1)}([R])${newSmiles.substr(j + 1)}`;\n      }\n    }\n  }\n  return smiles;\n}\n","import { getDiastereotopicAtomIDs } from '../diastereotopic/getDiastereotopicAtomIDs';\n\n/**\n * Returns various information about atoms in the molecule\n * @param {import('openchemlib').Molecule} [molecule]\n */\nexport function getAtomsInfo(molecule) {\n  const OCL = molecule.getOCL();\n  molecule.ensureHelperArrays(OCL.Molecule.cHelperRings);\n\n  let diaIDs = getDiastereotopicAtomIDs(molecule);\n\n  let results = [];\n  for (let i = 0; i < diaIDs.length; i++) {\n    let result = {\n      oclID: diaIDs[i],\n      extra: {\n        singleBonds: 0,\n        doubleBonds: 0,\n        tripleBonds: 0,\n        aromaticBonds: 0,\n        cnoHybridation: 0, // should be 1 (sp), 2 (sp2) or 3 (sp3)\n      },\n    };\n    let extra = result.extra;\n    results.push(result);\n    result.abnormalValence = molecule.getAtomAbnormalValence(i); // -1 is normal otherwise specified\n    result.charge = molecule.getAtomCharge(i);\n    result.cipParity = molecule.getAtomCIPParity(i);\n    result.color = molecule.getAtomColor(i);\n    result.customLabel = molecule.getAtomCustomLabel(i);\n    //        result.esrGroup=molecule.getAtomESRGroup(i);\n    //        result.esrType=molecule.getAtomESRType(i);\n    result.atomicNo = molecule.getAtomicNo(i);\n    result.label = molecule.getAtomLabel(i);\n    //        result.list=molecule.getAtomList(i);\n    //        result.listString=molecule.getAtomListString(i);\n    //        result.mapNo=molecule.getAtomMapNo(i);\n    result.mass = molecule.getAtomMass(i);\n    //        result.parity=molecule.getAtomParity(i);\n    //        result.pi=molecule.getAtomPi(i);\n    //        result.preferredStereoBond=molecule.getAtomPreferredStereoBond(i);\n    //        result.queryFeatures=molecule.getAtomQueryFeatures(i);\n    result.radical = molecule.getAtomRadical(i);\n    result.ringBondCount = molecule.getAtomRingBondCount(i);\n    //        result.ringCount=molecule.getAtomRingCount(i);\n    result.ringSize = molecule.getAtomRingSize(i);\n    result.x = molecule.getAtomX(i);\n    result.y = molecule.getAtomY(i);\n    result.z = molecule.getAtomZ(i);\n    result.allHydrogens = molecule.getAllHydrogens(i);\n    result.connAtoms = molecule.getConnAtoms(i);\n    result.allConnAtoms = molecule.getAllConnAtoms(i);\n\n    result.implicitHydrogens =\n      result.allHydrogens + result.connAtoms - result.allConnAtoms;\n\n    result.isAromatic = molecule.isAromaticAtom(i);\n    result.isAllylic = molecule.isAllylicAtom(i);\n    result.isStereoCenter = molecule.isAtomStereoCenter(i);\n    result.isRing = molecule.isRingAtom(i);\n    result.isSmallRing = molecule.isSmallRingAtom(i);\n    result.isStabilized = molecule.isStabilizedAtom(i);\n\n    // todo HACK to circumvent bug in OCL that consider than an hydrogen is connected to itself\n    result.extra.singleBonds =\n      result.atomicNo === 1 ? 0 : result.implicitHydrogens;\n    for (let j = 0; j < molecule.getAllConnAtoms(i); j++) {\n      let bond = molecule.getConnBond(i, j);\n      let bondOrder = molecule.getBondOrder(bond);\n      if (molecule.isAromaticBond(bond)) {\n        extra.aromaticBonds++;\n      } else if (bondOrder === 1) {\n        // not an hydrogen\n        extra.singleBonds++;\n      } else if (bondOrder === 2) {\n        extra.doubleBonds++;\n      } else if (bondOrder === 3) {\n        extra.tripleBonds++;\n      }\n    }\n    result.extra.totalBonds =\n      result.extra.singleBonds +\n      result.extra.doubleBonds +\n      result.extra.tripleBonds +\n      result.extra.aromaticBonds;\n\n    if (result.atomicNo === 6) {\n      result.extra.cnoHybridation = result.extra.totalBonds - 1;\n    } else if (result.atomicNo === 7) {\n      result.extra.cnoHybridation = result.extra.totalBonds;\n    } else if (result.atomicNo === 8) {\n      result.extra.cnoHybridation = result.extra.totalBonds + 1;\n    } else if (result.atomicNo === 1) {\n      let connectedAtom =\n        molecule.getAllConnAtoms(i) === 0\n          ? 0\n          : molecule.getAtomicNo(molecule.getConnAtom(i, 0));\n      result.extra.hydrogenOnAtomicNo = connectedAtom;\n      if (connectedAtom === 7 || connectedAtom === 8) {\n        result.extra.labileHydrogen = true;\n      }\n    }\n  }\n  return results;\n}\n","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n    return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isAnyArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport { rescale as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport { max as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const {\n    maxRows = 15,\n    maxColumns = 10,\n    maxNumSize = 8,\n    padMinus = 'auto',\n  } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n\n  if (padMinus === 'auto') {\n    padMinus = false;\n    loop: for (let i = 0; i < maxI; i++) {\n      for (let j = 0; j < maxJ; j++) {\n        if (matrix.get(i, j) < 0) {\n          padMinus = true;\n          break loop;\n        }\n      }\n    }\n  }\n\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n  return (\n    num >= 0 && padMinus\n      ? ` ${formatNumber2(num, maxNumSize - 1)}`\n      : formatNumber2(num, maxNumSize)\n  ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n  // small.length numbers should be as is\n  let str = num.toString();\n  if (str.length <= len) return str;\n\n  // (7)'0.00123' is better then (7)'1.23e-2'\n  // (8)'0.000123' is worse then (7)'1.23e-3',\n  let fix = num.toFixed(len);\n  if (fix.length > len) {\n    fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n  }\n  if (\n    fix.length <= len &&\n    !fix.startsWith('0.000') &&\n    !fix.startsWith('-0.000')\n  ) {\n    return fix;\n  }\n\n  // well, if it's still too long the user should've used longer numbers\n  let exp = num.toExponential(len);\n  if (exp.length > len) {\n    exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n  }\n  return exp.slice(0);\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (!isAnyArray(rowIndices)) {\n    throw new TypeError('row indices must be an array');\n  }\n\n  for (let i = 0; i < rowIndices.length; i++) {\n    if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n      throw new RangeError('row indices are out of range');\n    }\n  }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (!isAnyArray(columnIndices)) {\n    throw new TypeError('column indices must be an array');\n  }\n\n  for (let i = 0; i < columnIndices.length; i++) {\n    if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n      throw new RangeError('column indices are out of range');\n    }\n  }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkNonEmpty,\n  checkRowIndices,\n  checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    switch (by) {\n      case 'row': {\n        const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[row]) {\n              max[row] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case 'column': {\n        const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[column]) {\n              max[column] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case undefined: {\n        let max = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max) {\n              max = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n\n    switch (by) {\n      case 'row': {\n        const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[row]) {\n              min[row] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case 'column': {\n        const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[column]) {\n              min[column] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case undefined: {\n        let min = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min) {\n              min = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      if (row.length > 0) {\n        rescale(row, { min, max, output: row });\n      }\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      if (column.length) {\n        rescale(column, {\n          min: min,\n          max: max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    checkRowIndices(this, rowIndices);\n    checkColumnIndices(this, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < rowIndices.length; i++) {\n      let rowIndex = rowIndices[i];\n      for (let j = 0; j < columnIndices.length; j++) {\n        let columnIndex = columnIndices[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n    inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n  return array.every((element) => {\n    return typeof element === 'number';\n  });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (isAnyArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        if (!isArrayOfNumbers(arrayData[i])) {\n          throw new TypeError('Input data contains non-numeric values');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","import { floydWarshall } from 'ml-floyd-warshall';\nimport { Matrix } from 'ml-matrix';\n\n/**\n * Returns a connectivity matrix\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {boolean} [options.pathLength=false] get the path length between atoms\n * @param {boolean} [options.mass=false] set the nominal mass of the atoms on diagonal\n * @param {boolean} [options.atomicNo=false] set the atomic number of the atom on diagonal\n * @param {boolean} [options.negativeAtomicNo=false] set the atomic number * -1 of the atom on diagonal\n * @param {boolean} [options.sdt=false] set 1, 2 or 3 depending if single, double or triple bond\n * @param {boolean} [options.sdta=false] set 1, 2, 3 or 4 depending if single, double, triple or aromatic  bond\n */\nexport function getConnectivityMatrix(molecule, options = {}) {\n  const OCL = molecule.getOCL();\n  molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n  let nbAtoms = molecule.getAllAtoms();\n\n  let result = new Array(nbAtoms).fill();\n  result = result.map(() => new Array(nbAtoms).fill(0));\n\n  if (!options.pathLength) {\n    if (options.atomicNo) {\n      for (let i = 0; i < nbAtoms; i++) {\n        result[i][i] = molecule.getAtomicNo(i);\n      }\n    } else if (options.negativeAtomicNo) {\n      for (let i = 0; i < nbAtoms; i++) {\n        result[i][i] = -molecule.getAtomicNo(i);\n      }\n    } else if (options.mass) {\n      for (let i = 0; i < nbAtoms; i++) {\n        result[i][i] = OCL.Molecule.cRoundedMass[molecule.getAtomicNo(i)];\n      }\n    } else {\n      for (let i = 0; i < nbAtoms; i++) {\n        result[i][i] = 1;\n      }\n    }\n  }\n\n  if (options.sdt) {\n    for (let i = 0; i < nbAtoms; i++) {\n      let l = molecule.getAllConnAtoms(i);\n      for (let j = 0; j < l; j++) {\n        result[i][molecule.getConnAtom(i, j)] = molecule.getConnBondOrder(i, j);\n      }\n    }\n  } else if (options.sdta) {\n    for (let i = 0; i < nbAtoms; i++) {\n      let l = molecule.getAllConnAtoms(i);\n      for (let j = 0; j < l; j++) {\n        let bondNumber = molecule.getConnBond(i, j);\n        if (molecule.isAromaticBond(bondNumber)) {\n          result[i][molecule.getConnAtom(i, j)] = 4;\n        } else {\n          result[i][molecule.getConnAtom(i, j)] = molecule.getConnBondOrder(\n            i,\n            j,\n          );\n        }\n      }\n    }\n  } else {\n    for (let i = 0; i < nbAtoms; i++) {\n      let l = molecule.getAllConnAtoms(i);\n      for (let j = 0; j < l; j++) {\n        result[i][molecule.getConnAtom(i, j)] = 1;\n      }\n    }\n  }\n\n  if (options.pathLength) {\n    result = floydWarshall(new Matrix(result)).to2DArray();\n  }\n  return result;\n}\n","import { Matrix } from 'ml-matrix';\n\n/**\n * Algorithm that finds the shortest distance from one node to the other\n * @param {Matrix} adjMatrix - A squared adjacency matrix\n * @return {Matrix} - Distance from a node to the other, -1 if the node is unreachable\n */\nexport function floydWarshall(adjMatrix) {\n  if (Matrix.isMatrix(adjMatrix) && adjMatrix.columns !== adjMatrix.rows) {\n    throw new TypeError('The adjacency matrix should be squared');\n  }\n  const numVertices = adjMatrix.columns;\n  let distMatrix = new Matrix(numVertices, numVertices);\n  distMatrix.apply((row, column) => {\n    // principal diagonal is 0\n    if (row === column) {\n      distMatrix.set(row, column, 0);\n    } else {\n      let val = adjMatrix.get(row, column);\n\n      if (val || Object.is(val, -0)) {\n        // edges values remain the same\n        distMatrix.set(row, column, val);\n      } else {\n        // 0 values become infinity\n        distMatrix.set(row, column, Number.POSITIVE_INFINITY);\n      }\n    }\n  });\n\n  for (let k = 0; k < numVertices; ++k) {\n    for (let i = 0; i < numVertices; ++i) {\n      for (let j = 0; j < numVertices; ++j) {\n        let dist = distMatrix.get(i, k) + distMatrix.get(k, j);\n        if (distMatrix.get(i, j) > dist) {\n          distMatrix.set(i, j, dist);\n        }\n      }\n    }\n  }\n\n  // When there's no connection the value is -1\n  distMatrix.apply((row, column) => {\n    if (distMatrix.get(row, column) === Number.POSITIVE_INFINITY) {\n      distMatrix.set(row, column, -1);\n    }\n  });\n  return distMatrix;\n}\n","/**\n * Implementation of the Hill system for sorting atoms\n * https://en.wikipedia.org/wiki/Chemical_formula#Hill_system\n * @param {string} a - first atom to compare\n * @param {string} b - second atom to compare\n * @returns\n */\n\nexport function atomSorter(a, b) {\n  if (a === b) return 0;\n  if (a === 'C') return -1;\n  if (b === 'C') return 1;\n  if (a === 'H') return -1;\n  if (b === 'H') return 1;\n  if (a < b) return -1;\n  return 1;\n}\n","import { atomSorter } from 'atom-sorter';\n\n/**\n * Calculate the molecular formula in 'chemcalc' notation taking into account fragments, isotopes and charges\n * {OCL.Molecule} [molecule] an instance of OCL.Molecule\n * @returns {object}\n */\n\nexport function getMF(molecule) {\n  let entries = molecule.getFragments();\n  let result = {};\n  let parts = [];\n  let allAtoms = [];\n\n  entries.forEach((entry) => {\n    let mf = getFragmentMF(entry, allAtoms);\n    parts.push(mf);\n  });\n\n  let counts = {};\n  for (let part of parts) {\n    if (!counts[part]) counts[part] = 0;\n    counts[part]++;\n  }\n  parts = [];\n  for (let key of Object.keys(counts).sort()) {\n    if (counts[key] > 1) {\n      parts.push(counts[key] + key);\n    } else {\n      parts.push(key);\n    }\n  }\n\n  result.parts = parts;\n  result.mf = toMFString(allAtoms);\n  return result;\n}\n\nfunction getFragmentMF(molecule, allAtoms) {\n  let atoms = [];\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    let atom = {};\n    atom.charge = molecule.getAtomCharge(i);\n    atom.label = molecule.getAtomLabel(i);\n    atom.mass = molecule.getAtomMass(i);\n    atom.implicitHydrogens = molecule.getImplicitHydrogens(i);\n    atoms.push(atom);\n    allAtoms.push(atom);\n  }\n  return toMFString(atoms);\n}\n\nfunction toMFString(atoms) {\n  let charge = 0;\n  let mfs = {};\n  for (let atom of atoms) {\n    let label = atom.label;\n    charge += atom.charge;\n    if (atom.mass) {\n      label = `[${atom.mass}${label}]`;\n    }\n    let mfAtom = mfs[label];\n    if (!mfAtom) {\n      mfs[label] = 0;\n    }\n    mfs[label] += 1;\n    if (atom.implicitHydrogens) {\n      if (!mfs.H) mfs.H = 0;\n      mfs.H += atom.implicitHydrogens;\n    }\n  }\n\n  let mf = '';\n  let keys = Object.keys(mfs).sort(atomSorter);\n  for (let key of keys) {\n    mf += key;\n    if (mfs[key] > 1) mf += mfs[key];\n  }\n\n  if (charge > 0) {\n    mf += `(+${charge > 1 ? charge : ''})`;\n  } else if (charge < 0) {\n    mf += `(${charge < -1 ? charge : '-'})`;\n  }\n  return mf;\n}\n","/**\n * Calculates the path between 2 atoms\n * @param {import('openchemlib').Molecule} molecule\n * @param {number} from - index of the first atom\n * @param {number} to - index of the end atom\n * @param {number} maxLength - maximal length of the path\n */\nexport function getPathAndTorsion(molecule, from, to, maxLength) {\n  let originalAtoms = []; // path before renumbering\n  molecule.getPath(originalAtoms, from, to, maxLength + 1);\n  let torsion;\n  if (originalAtoms.length === 4) {\n    torsion = molecule.calculateTorsion(originalAtoms);\n  }\n\n  return {\n    atoms: originalAtoms,\n    from,\n    to,\n    torsion,\n    length: originalAtoms.length - 1,\n  };\n}\n","import { getHoseCodesForPath } from '../hose/getHoseCodesForPath';\nimport { getAtomsInfo } from '../util/getAtomsInfo';\nimport { getConnectivityMatrix } from '../util/getConnectivityMatrix';\n\nimport { getPathAndTorsion } from './getPathAndTorsion.js';\n\nlet fragment;\n\n/**\n *\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {string} [options.fromLabel='H']\n * @param {string} [options.toLabel='H']\n * @param {number} [options.minLength=1]\n * @param {number} [options.maxLength=4]\n * @param {boolean} [options.withHOSES=false]\n\n */\nexport function getPathsInfo(molecule, options = {}) {\n  const {\n    fromLabel = 'H',\n    toLabel = 'H',\n    minLength = 1,\n    maxLength = 4,\n    withHOSES = false,\n  } = options;\n\n  const OCL = molecule.getOCL();\n\n  if (!fragment) {\n    fragment = new OCL.Molecule(0, 0);\n  }\n\n  let fromAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(fromLabel);\n  let toAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(toLabel);\n\n  // we need to find all the atoms 'fromLabel' and 'toLabel'\n  let atomsInfo = getAtomsInfo(molecule);\n\n  let pathLengthMatrix = getConnectivityMatrix(molecule, {\n    pathLength: true,\n  });\n\n  for (let from = 0; from < molecule.getAllAtoms(); from++) {\n    atomsInfo[from].paths = [];\n    for (let to = 0; to < molecule.getAllAtoms(); to++) {\n      if (from !== to) {\n        if (molecule.getAtomicNo(from) === fromAtomicNumber) {\n          if (molecule.getAtomicNo(to) === toAtomicNumber) {\n            let pathLength = pathLengthMatrix[from][to];\n            if (pathLength >= minLength && pathLength <= maxLength) {\n              if (withHOSES) {\n                atomsInfo[from].paths.push(\n                  getHoseCodesForPath(molecule, from, to, pathLength),\n                );\n              } else {\n                atomsInfo[from].paths.push(\n                  getPathAndTorsion(molecule, from, to, pathLength),\n                );\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  return atomsInfo;\n}\n","import isutf8 from 'isutf8';\n/**\n * Ensure that the data is string. If it is an ArrayBuffer it will be converted to string using TextDecoder.\n * @param blob\n * @param options\n * @returns\n */\nexport function ensureString(blob, options = {}) {\n    if (typeof blob === 'string') {\n        return blob;\n    }\n    if (ArrayBuffer.isView(blob) || blob instanceof ArrayBuffer) {\n        const { encoding = guessEncoding(blob) } = options;\n        const decoder = new TextDecoder(encoding);\n        return decoder.decode(blob);\n    }\n    throw new TypeError(`blob must be a string, ArrayBuffer or ArrayBufferView`);\n}\nfunction guessEncoding(blob) {\n    const uint8 = ArrayBuffer.isView(blob)\n        ? new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength)\n        : new Uint8Array(blob);\n    if (uint8.length >= 2) {\n        if (uint8[0] === 0xfe && uint8[1] === 0xff) {\n            return 'utf-16be';\n        }\n        if (uint8[0] === 0xff && uint8[1] === 0xfe) {\n            return 'utf-16le';\n        }\n    }\n    //@ts-expect-error an ArrayBuffer is also ok\n    if (!isutf8(blob))\n        return 'latin1';\n    return 'utf-8';\n}\n//# sourceMappingURL=index.js.map","/*\n    https://tools.ietf.org/html/rfc3629\n\n    UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4\n\n    UTF8-1    = %x00-7F\n\n    UTF8-2    = %xC2-DF UTF8-tail\n\n    UTF8-3    = %xE0 %xA0-BF UTF8-tail\n                %xE1-EC 2( UTF8-tail )\n                %xED %x80-9F UTF8-tail\n                %xEE-EF 2( UTF8-tail )\n\n    UTF8-4    = %xF0 %x90-BF 2( UTF8-tail )\n                %xF1-F3 3( UTF8-tail )\n                %xF4 %x80-8F 2( UTF8-tail )\n\n    UTF8-tail = %x80-BF\n*/\n/**\n * Check if a Node.js Buffer or Uint8Array is UTF-8.\n */\nfunction isUtf8(buf) {\n    if (!buf) {\n        return false;\n    }\n    var i = 0;\n    var len = buf.length;\n    while (i < len) {\n        // UTF8-1 = %x00-7F\n        if (buf[i] <= 0x7F) {\n            i++;\n            continue;\n        }\n        // UTF8-2 = %xC2-DF UTF8-tail\n        if (buf[i] >= 0xC2 && buf[i] <= 0xDF) {\n            // if(buf[i + 1] >= 0x80 && buf[i + 1] <= 0xBF) {\n            if (buf[i + 1] >> 6 === 2) {\n                i += 2;\n                continue;\n            }\n            else {\n                return false;\n            }\n        }\n        // UTF8-3 = %xE0 %xA0-BF UTF8-tail\n        // UTF8-3 = %xED %x80-9F UTF8-tail\n        if (((buf[i] === 0xE0 && buf[i + 1] >= 0xA0 && buf[i + 1] <= 0xBF) ||\n            (buf[i] === 0xED && buf[i + 1] >= 0x80 && buf[i + 1] <= 0x9F)) && buf[i + 2] >> 6 === 2) {\n            i += 3;\n            continue;\n        }\n        // UTF8-3 = %xE1-EC 2( UTF8-tail )\n        // UTF8-3 = %xEE-EF 2( UTF8-tail )\n        if (((buf[i] >= 0xE1 && buf[i] <= 0xEC) ||\n            (buf[i] >= 0xEE && buf[i] <= 0xEF)) &&\n            buf[i + 1] >> 6 === 2 &&\n            buf[i + 2] >> 6 === 2) {\n            i += 3;\n            continue;\n        }\n        // UTF8-4 = %xF0 %x90-BF 2( UTF8-tail )\n        //          %xF1-F3 3( UTF8-tail )\n        //          %xF4 %x80-8F 2( UTF8-tail )\n        if (((buf[i] === 0xF0 && buf[i + 1] >= 0x90 && buf[i + 1] <= 0xBF) ||\n            (buf[i] >= 0xF1 && buf[i] <= 0xF3 && buf[i + 1] >> 6 === 2) ||\n            (buf[i] === 0xF4 && buf[i + 1] >= 0x80 && buf[i + 1] <= 0x8F)) &&\n            buf[i + 2] >> 6 === 2 &&\n            buf[i + 3] >> 6 === 2) {\n            i += 4;\n            continue;\n        }\n        return false;\n    }\n    return true;\n}\n\nexport { isUtf8 as default };\n","export function installMathOperations(AbstractMatrix, Matrix) {\n  AbstractMatrix.prototype.add = function add(value) {\n    if (typeof value === 'number') return this.addS(value);\n    return this.addM(value);\n  };\n\n  AbstractMatrix.prototype.addS = function addS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.addM = function addM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.add = function add(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.add(value);\n  };\n\n  AbstractMatrix.prototype.sub = function sub(value) {\n    if (typeof value === 'number') return this.subS(value);\n    return this.subM(value);\n  };\n\n  AbstractMatrix.prototype.subS = function subS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.subM = function subM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sub = function sub(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sub(value);\n  };\n  AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n  AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n  AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n  AbstractMatrix.subtract = AbstractMatrix.sub;\n\n  AbstractMatrix.prototype.mul = function mul(value) {\n    if (typeof value === 'number') return this.mulS(value);\n    return this.mulM(value);\n  };\n\n  AbstractMatrix.prototype.mulS = function mulS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.mulM = function mulM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mul = function mul(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mul(value);\n  };\n  AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n  AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n  AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n  AbstractMatrix.multiply = AbstractMatrix.mul;\n\n  AbstractMatrix.prototype.div = function div(value) {\n    if (typeof value === 'number') return this.divS(value);\n    return this.divM(value);\n  };\n\n  AbstractMatrix.prototype.divS = function divS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.divM = function divM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.div = function div(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.div(value);\n  };\n  AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n  AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n  AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n  AbstractMatrix.divide = AbstractMatrix.div;\n\n  AbstractMatrix.prototype.mod = function mod(value) {\n    if (typeof value === 'number') return this.modS(value);\n    return this.modM(value);\n  };\n\n  AbstractMatrix.prototype.modS = function modS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.modM = function modM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mod = function mod(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mod(value);\n  };\n  AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n  AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n  AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n  AbstractMatrix.modulus = AbstractMatrix.mod;\n\n  AbstractMatrix.prototype.and = function and(value) {\n    if (typeof value === 'number') return this.andS(value);\n    return this.andM(value);\n  };\n\n  AbstractMatrix.prototype.andS = function andS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.andM = function andM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.and = function and(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.and(value);\n  };\n\n  AbstractMatrix.prototype.or = function or(value) {\n    if (typeof value === 'number') return this.orS(value);\n    return this.orM(value);\n  };\n\n  AbstractMatrix.prototype.orS = function orS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.orM = function orM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.or = function or(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.or(value);\n  };\n\n  AbstractMatrix.prototype.xor = function xor(value) {\n    if (typeof value === 'number') return this.xorS(value);\n    return this.xorM(value);\n  };\n\n  AbstractMatrix.prototype.xorS = function xorS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.xorM = function xorM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.xor = function xor(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.xor(value);\n  };\n\n  AbstractMatrix.prototype.leftShift = function leftShift(value) {\n    if (typeof value === 'number') return this.leftShiftS(value);\n    return this.leftShiftM(value);\n  };\n\n  AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.leftShift = function leftShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.leftShift(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n    if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n    return this.signPropagatingRightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.signPropagatingRightShift(value);\n  };\n\n  AbstractMatrix.prototype.rightShift = function rightShift(value) {\n    if (typeof value === 'number') return this.rightShiftS(value);\n    return this.rightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.rightShift = function rightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.rightShift(value);\n  };\n  AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n  AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n  AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n  AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n  AbstractMatrix.prototype.not = function not() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, ~(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.not = function not(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.not();\n  };\n\n  AbstractMatrix.prototype.abs = function abs() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.abs(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.abs = function abs(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.abs();\n  };\n\n  AbstractMatrix.prototype.acos = function acos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acos = function acos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acos();\n  };\n\n  AbstractMatrix.prototype.acosh = function acosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acosh = function acosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acosh();\n  };\n\n  AbstractMatrix.prototype.asin = function asin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asin = function asin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asin();\n  };\n\n  AbstractMatrix.prototype.asinh = function asinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asinh = function asinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asinh();\n  };\n\n  AbstractMatrix.prototype.atan = function atan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atan = function atan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atan();\n  };\n\n  AbstractMatrix.prototype.atanh = function atanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atanh = function atanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atanh();\n  };\n\n  AbstractMatrix.prototype.cbrt = function cbrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cbrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cbrt = function cbrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cbrt();\n  };\n\n  AbstractMatrix.prototype.ceil = function ceil() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.ceil(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.ceil = function ceil(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.ceil();\n  };\n\n  AbstractMatrix.prototype.clz32 = function clz32() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.clz32(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.clz32 = function clz32(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.clz32();\n  };\n\n  AbstractMatrix.prototype.cos = function cos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cos = function cos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cos();\n  };\n\n  AbstractMatrix.prototype.cosh = function cosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cosh = function cosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cosh();\n  };\n\n  AbstractMatrix.prototype.exp = function exp() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.exp(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.exp = function exp(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.exp();\n  };\n\n  AbstractMatrix.prototype.expm1 = function expm1() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.expm1(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.expm1 = function expm1(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.expm1();\n  };\n\n  AbstractMatrix.prototype.floor = function floor() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.floor(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.floor = function floor(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.floor();\n  };\n\n  AbstractMatrix.prototype.fround = function fround() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.fround(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.fround = function fround(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.fround();\n  };\n\n  AbstractMatrix.prototype.log = function log() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log = function log(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log();\n  };\n\n  AbstractMatrix.prototype.log1p = function log1p() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log1p(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log1p = function log1p(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log1p();\n  };\n\n  AbstractMatrix.prototype.log10 = function log10() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log10(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log10 = function log10(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log10();\n  };\n\n  AbstractMatrix.prototype.log2 = function log2() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log2(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log2 = function log2(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log2();\n  };\n\n  AbstractMatrix.prototype.round = function round() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.round(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.round = function round(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.round();\n  };\n\n  AbstractMatrix.prototype.sign = function sign() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sign(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sign = function sign(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sign();\n  };\n\n  AbstractMatrix.prototype.sin = function sin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sin = function sin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sin();\n  };\n\n  AbstractMatrix.prototype.sinh = function sinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sinh = function sinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sinh();\n  };\n\n  AbstractMatrix.prototype.sqrt = function sqrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sqrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sqrt = function sqrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sqrt();\n  };\n\n  AbstractMatrix.prototype.tan = function tan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tan = function tan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tan();\n  };\n\n  AbstractMatrix.prototype.tanh = function tanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tanh = function tanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tanh();\n  };\n\n  AbstractMatrix.prototype.trunc = function trunc() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.trunc(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.trunc = function trunc(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.trunc();\n  };\n\n  AbstractMatrix.pow = function pow(matrix, arg0) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.pow(arg0);\n  };\n\n  AbstractMatrix.prototype.pow = function pow(value) {\n    if (typeof value === 'number') return this.powS(value);\n    return this.powM(value);\n  };\n\n  AbstractMatrix.prototype.powS = function powS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), value));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.powM = function powM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n      }\n    }\n    return this;\n  };\n}\n","/* @license\nPapa Parse\nv5.3.2\nhttps://github.com/mholt/PapaParse\nLicense: MIT\n*/\n!function(e,t){\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof module&&\"undefined\"!=typeof exports?module.exports=t():e.Papa=t()}(this,function s(){\"use strict\";var f=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==f?f:{};var n=!f.document&&!!f.postMessage,o=n&&/blob:/i.test((f.location||{}).protocol),a={},h=0,b={parse:function(e,t){var i=(t=t||{}).dynamicTyping||!1;M(i)&&(t.dynamicTypingFunction=i,i={});if(t.dynamicTyping=i,t.transform=!!M(t.transform)&&t.transform,t.worker&&b.WORKERS_SUPPORTED){var r=function(){if(!b.WORKERS_SUPPORTED)return!1;var e=(i=f.URL||f.webkitURL||null,r=s.toString(),b.BLOB_URL||(b.BLOB_URL=i.createObjectURL(new Blob([\"(\",r,\")();\"],{type:\"text/javascript\"})))),t=new f.Worker(e);var i,r;return t.onmessage=_,t.id=h++,a[t.id]=t}();return r.userStep=t.step,r.userChunk=t.chunk,r.userComplete=t.complete,r.userError=t.error,t.step=M(t.step),t.chunk=M(t.chunk),t.complete=M(t.complete),t.error=M(t.error),delete t.worker,void r.postMessage({input:e,config:t,workerId:r.id})}var n=null;b.NODE_STREAM_INPUT,\"string\"==typeof e?n=t.download?new l(t):new p(t):!0===e.readable&&M(e.read)&&M(e.on)?n=new g(t):(f.File&&e instanceof File||e instanceof Object)&&(n=new c(t));return n.stream(e)},unparse:function(e,t){var n=!1,_=!0,m=\",\",y=\"\\r\\n\",s='\"',a=s+s,i=!1,r=null,o=!1;!function(){if(\"object\"!=typeof t)return;\"string\"!=typeof t.delimiter||b.BAD_DELIMITERS.filter(function(e){return-1!==t.delimiter.indexOf(e)}).length||(m=t.delimiter);(\"boolean\"==typeof t.quotes||\"function\"==typeof t.quotes||Array.isArray(t.quotes))&&(n=t.quotes);\"boolean\"!=typeof t.skipEmptyLines&&\"string\"!=typeof t.skipEmptyLines||(i=t.skipEmptyLines);\"string\"==typeof t.newline&&(y=t.newline);\"string\"==typeof t.quoteChar&&(s=t.quoteChar);\"boolean\"==typeof t.header&&(_=t.header);if(Array.isArray(t.columns)){if(0===t.columns.length)throw new Error(\"Option columns is empty\");r=t.columns}void 0!==t.escapeChar&&(a=t.escapeChar+s);(\"boolean\"==typeof t.escapeFormulae||t.escapeFormulae instanceof RegExp)&&(o=t.escapeFormulae instanceof RegExp?t.escapeFormulae:/^[=+\\-@\\t\\r].*$/)}();var h=new RegExp(j(s),\"g\");\"string\"==typeof e&&(e=JSON.parse(e));if(Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return u(null,e,i);if(\"object\"==typeof e[0])return u(r||Object.keys(e[0]),e,i)}else if(\"object\"==typeof e)return\"string\"==typeof e.data&&(e.data=JSON.parse(e.data)),Array.isArray(e.data)&&(e.fields||(e.fields=e.meta&&e.meta.fields||r),e.fields||(e.fields=Array.isArray(e.data[0])?e.fields:\"object\"==typeof e.data[0]?Object.keys(e.data[0]):[]),Array.isArray(e.data[0])||\"object\"==typeof e.data[0]||(e.data=[e.data])),u(e.fields||[],e.data||[],i);throw new Error(\"Unable to serialize unrecognized input\");function u(e,t,i){var r=\"\";\"string\"==typeof e&&(e=JSON.parse(e)),\"string\"==typeof t&&(t=JSON.parse(t));var n=Array.isArray(e)&&0<e.length,s=!Array.isArray(t[0]);if(n&&_){for(var a=0;a<e.length;a++)0<a&&(r+=m),r+=v(e[a],a);0<t.length&&(r+=y)}for(var o=0;o<t.length;o++){var h=n?e.length:t[o].length,u=!1,f=n?0===Object.keys(t[o]).length:0===t[o].length;if(i&&!n&&(u=\"greedy\"===i?\"\"===t[o].join(\"\").trim():1===t[o].length&&0===t[o][0].length),\"greedy\"===i&&n){for(var d=[],l=0;l<h;l++){var c=s?e[l]:l;d.push(t[o][c])}u=\"\"===d.join(\"\").trim()}if(!u){for(var p=0;p<h;p++){0<p&&!f&&(r+=m);var g=n&&s?e[p]:p;r+=v(t[o][g],p)}o<t.length-1&&(!i||0<h&&!f)&&(r+=y)}}return r}function v(e,t){if(null==e)return\"\";if(e.constructor===Date)return JSON.stringify(e).slice(1,25);var i=!1;o&&\"string\"==typeof e&&o.test(e)&&(e=\"'\"+e,i=!0);var r=e.toString().replace(h,a);return(i=i||!0===n||\"function\"==typeof n&&n(e,t)||Array.isArray(n)&&n[t]||function(e,t){for(var i=0;i<t.length;i++)if(-1<e.indexOf(t[i]))return!0;return!1}(r,b.BAD_DELIMITERS)||-1<r.indexOf(m)||\" \"===r.charAt(0)||\" \"===r.charAt(r.length-1))?s+r+s:r}}};if(b.RECORD_SEP=String.fromCharCode(30),b.UNIT_SEP=String.fromCharCode(31),b.BYTE_ORDER_MARK=\"\\ufeff\",b.BAD_DELIMITERS=[\"\\r\",\"\\n\",'\"',b.BYTE_ORDER_MARK],b.WORKERS_SUPPORTED=!n&&!!f.Worker,b.NODE_STREAM_INPUT=1,b.LocalChunkSize=10485760,b.RemoteChunkSize=5242880,b.DefaultDelimiter=\",\",b.Parser=E,b.ParserHandle=i,b.NetworkStreamer=l,b.FileStreamer=c,b.StringStreamer=p,b.ReadableStreamStreamer=g,f.jQuery){var d=f.jQuery;d.fn.parse=function(o){var i=o.config||{},h=[];return this.each(function(e){if(!(\"INPUT\"===d(this).prop(\"tagName\").toUpperCase()&&\"file\"===d(this).attr(\"type\").toLowerCase()&&f.FileReader)||!this.files||0===this.files.length)return!0;for(var t=0;t<this.files.length;t++)h.push({file:this.files[t],inputElem:this,instanceConfig:d.extend({},i)})}),e(),this;function e(){if(0!==h.length){var e,t,i,r,n=h[0];if(M(o.before)){var s=o.before(n.file,n.inputElem);if(\"object\"==typeof s){if(\"abort\"===s.action)return e=\"AbortError\",t=n.file,i=n.inputElem,r=s.reason,void(M(o.error)&&o.error({name:e},t,i,r));if(\"skip\"===s.action)return void u();\"object\"==typeof s.config&&(n.instanceConfig=d.extend(n.instanceConfig,s.config))}else if(\"skip\"===s)return void u()}var a=n.instanceConfig.complete;n.instanceConfig.complete=function(e){M(a)&&a(e,n.file,n.inputElem),u()},b.parse(n.file,n.instanceConfig)}else M(o.complete)&&o.complete()}function u(){h.splice(0,1),e()}}}function u(e){this._handle=null,this._finished=!1,this._completed=!1,this._halted=!1,this._input=null,this._baseIndex=0,this._partialLine=\"\",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},function(e){var t=w(e);t.chunkSize=parseInt(t.chunkSize),e.step||e.chunk||(t.chunkSize=null);this._handle=new i(t),(this._handle.streamer=this)._config=t}.call(this,e),this.parseChunk=function(e,t){if(this.isFirstChunk&&M(this._config.beforeFirstChunk)){var i=this._config.beforeFirstChunk(e);void 0!==i&&(e=i)}this.isFirstChunk=!1,this._halted=!1;var r=this._partialLine+e;this._partialLine=\"\";var n=this._handle.parse(r,this._baseIndex,!this._finished);if(!this._handle.paused()&&!this._handle.aborted()){var s=n.meta.cursor;this._finished||(this._partialLine=r.substring(s-this._baseIndex),this._baseIndex=s),n&&n.data&&(this._rowCount+=n.data.length);var a=this._finished||this._config.preview&&this._rowCount>=this._config.preview;if(o)f.postMessage({results:n,workerId:b.WORKER_ID,finished:a});else if(M(this._config.chunk)&&!t){if(this._config.chunk(n,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);n=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(n.data),this._completeResults.errors=this._completeResults.errors.concat(n.errors),this._completeResults.meta=n.meta),this._completed||!a||!M(this._config.complete)||n&&n.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),a||n&&n.meta.paused||this._nextChunk(),n}this._halted=!0},this._sendError=function(e){M(this._config.error)?this._config.error(e):o&&this._config.error&&f.postMessage({workerId:b.WORKER_ID,error:e,finished:!1})}}function l(e){var r;(e=e||{}).chunkSize||(e.chunkSize=b.RemoteChunkSize),u.call(this,e),this._nextChunk=n?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(r=new XMLHttpRequest,this._config.withCredentials&&(r.withCredentials=this._config.withCredentials),n||(r.onload=v(this._chunkLoaded,this),r.onerror=v(this._chunkError,this)),r.open(this._config.downloadRequestBody?\"POST\":\"GET\",this._input,!n),this._config.downloadRequestHeaders){var e=this._config.downloadRequestHeaders;for(var t in e)r.setRequestHeader(t,e[t])}if(this._config.chunkSize){var i=this._start+this._config.chunkSize-1;r.setRequestHeader(\"Range\",\"bytes=\"+this._start+\"-\"+i)}try{r.send(this._config.downloadRequestBody)}catch(e){this._chunkError(e.message)}n&&0===r.status&&this._chunkError()}},this._chunkLoaded=function(){4===r.readyState&&(r.status<200||400<=r.status?this._chunkError():(this._start+=this._config.chunkSize?this._config.chunkSize:r.responseText.length,this._finished=!this._config.chunkSize||this._start>=function(e){var t=e.getResponseHeader(\"Content-Range\");if(null===t)return-1;return parseInt(t.substring(t.lastIndexOf(\"/\")+1))}(r),this.parseChunk(r.responseText)))},this._chunkError=function(e){var t=r.statusText||e;this._sendError(new Error(t))}}function c(e){var r,n;(e=e||{}).chunkSize||(e.chunkSize=b.LocalChunkSize),u.call(this,e);var s=\"undefined\"!=typeof FileReader;this.stream=function(e){this._input=e,n=e.slice||e.webkitSlice||e.mozSlice,s?((r=new FileReader).onload=v(this._chunkLoaded,this),r.onerror=v(this._chunkError,this)):r=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount<this._config.preview)||this._readChunk()},this._readChunk=function(){var e=this._input;if(this._config.chunkSize){var t=Math.min(this._start+this._config.chunkSize,this._input.size);e=n.call(e,this._start,t)}var i=r.readAsText(e,this._config.encoding);s||this._chunkLoaded({target:{result:i}})},this._chunkLoaded=function(e){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(r.error)}}function p(e){var i;u.call(this,e=e||{}),this.stream=function(e){return i=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e,t=this._config.chunkSize;return t?(e=i.substring(0,t),i=i.substring(t)):(e=i,i=\"\"),this._finished=!i,this.parseChunk(e)}}}function g(e){u.call(this,e=e||{});var t=[],i=!0,r=!1;this.pause=function(){u.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){u.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(e){this._input=e,this._input.on(\"data\",this._streamData),this._input.on(\"end\",this._streamEnd),this._input.on(\"error\",this._streamError)},this._checkIsFinished=function(){r&&1===t.length&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):i=!0},this._streamData=v(function(e){try{t.push(\"string\"==typeof e?e:e.toString(this._config.encoding)),i&&(i=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(e){this._streamError(e)}},this),this._streamError=v(function(e){this._streamCleanUp(),this._sendError(e)},this),this._streamEnd=v(function(){this._streamCleanUp(),r=!0,this._streamData(\"\")},this),this._streamCleanUp=v(function(){this._input.removeListener(\"data\",this._streamData),this._input.removeListener(\"end\",this._streamEnd),this._input.removeListener(\"error\",this._streamError)},this)}function i(m){var a,o,h,r=Math.pow(2,53),n=-r,s=/^\\s*-?(\\d+\\.?|\\.\\d+|\\d+\\.\\d+)([eE][-+]?\\d+)?\\s*$/,u=/^(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))$/,t=this,i=0,f=0,d=!1,e=!1,l=[],c={data:[],errors:[],meta:{}};if(M(m.step)){var p=m.step;m.step=function(e){if(c=e,_())g();else{if(g(),0===c.data.length)return;i+=e.data.length,m.preview&&i>m.preview?o.abort():(c.data=c.data[0],p(c,t))}}}function y(e){return\"greedy\"===m.skipEmptyLines?\"\"===e.join(\"\").trim():1===e.length&&0===e[0].length}function g(){return c&&h&&(k(\"Delimiter\",\"UndetectableDelimiter\",\"Unable to auto-detect delimiting character; defaulted to '\"+b.DefaultDelimiter+\"'\"),h=!1),m.skipEmptyLines&&(c.data=c.data.filter(function(e){return!y(e)})),_()&&function(){if(!c)return;function e(e,t){M(m.transformHeader)&&(e=m.transformHeader(e,t)),l.push(e)}if(Array.isArray(c.data[0])){for(var t=0;_()&&t<c.data.length;t++)c.data[t].forEach(e);c.data.splice(0,1)}else c.data.forEach(e)}(),function(){if(!c||!m.header&&!m.dynamicTyping&&!m.transform)return c;function e(e,t){var i,r=m.header?{}:[];for(i=0;i<e.length;i++){var n=i,s=e[i];m.header&&(n=i>=l.length?\"__parsed_extra\":l[i]),m.transform&&(s=m.transform(s,n)),s=v(n,s),\"__parsed_extra\"===n?(r[n]=r[n]||[],r[n].push(s)):r[n]=s}return m.header&&(i>l.length?k(\"FieldMismatch\",\"TooManyFields\",\"Too many fields: expected \"+l.length+\" fields but parsed \"+i,f+t):i<l.length&&k(\"FieldMismatch\",\"TooFewFields\",\"Too few fields: expected \"+l.length+\" fields but parsed \"+i,f+t)),r}var t=1;!c.data.length||Array.isArray(c.data[0])?(c.data=c.data.map(e),t=c.data.length):c.data=e(c.data,0);m.header&&c.meta&&(c.meta.fields=l);return f+=t,c}()}function _(){return m.header&&0===l.length}function v(e,t){return i=e,m.dynamicTypingFunction&&void 0===m.dynamicTyping[i]&&(m.dynamicTyping[i]=m.dynamicTypingFunction(i)),!0===(m.dynamicTyping[i]||m.dynamicTyping)?\"true\"===t||\"TRUE\"===t||\"false\"!==t&&\"FALSE\"!==t&&(function(e){if(s.test(e)){var t=parseFloat(e);if(n<t&&t<r)return!0}return!1}(t)?parseFloat(t):u.test(t)?new Date(t):\"\"===t?null:t):t;var i}function k(e,t,i,r){var n={type:e,code:t,message:i};void 0!==r&&(n.row=r),c.errors.push(n)}this.parse=function(e,t,i){var r=m.quoteChar||'\"';if(m.newline||(m.newline=function(e,t){e=e.substring(0,1048576);var i=new RegExp(j(t)+\"([^]*?)\"+j(t),\"gm\"),r=(e=e.replace(i,\"\")).split(\"\\r\"),n=e.split(\"\\n\"),s=1<n.length&&n[0].length<r[0].length;if(1===r.length||s)return\"\\n\";for(var a=0,o=0;o<r.length;o++)\"\\n\"===r[o][0]&&a++;return a>=r.length/2?\"\\r\\n\":\"\\r\"}(e,r)),h=!1,m.delimiter)M(m.delimiter)&&(m.delimiter=m.delimiter(e),c.meta.delimiter=m.delimiter);else{var n=function(e,t,i,r,n){var s,a,o,h;n=n||[\",\",\"\\t\",\"|\",\";\",b.RECORD_SEP,b.UNIT_SEP];for(var u=0;u<n.length;u++){var f=n[u],d=0,l=0,c=0;o=void 0;for(var p=new E({comments:r,delimiter:f,newline:t,preview:10}).parse(e),g=0;g<p.data.length;g++)if(i&&y(p.data[g]))c++;else{var _=p.data[g].length;l+=_,void 0!==o?0<_&&(d+=Math.abs(_-o),o=_):o=_}0<p.data.length&&(l/=p.data.length-c),(void 0===a||d<=a)&&(void 0===h||h<l)&&1.99<l&&(a=d,s=f,h=l)}return{successful:!!(m.delimiter=s),bestDelimiter:s}}(e,m.newline,m.skipEmptyLines,m.comments,m.delimitersToGuess);n.successful?m.delimiter=n.bestDelimiter:(h=!0,m.delimiter=b.DefaultDelimiter),c.meta.delimiter=m.delimiter}var s=w(m);return m.preview&&m.header&&s.preview++,a=e,o=new E(s),c=o.parse(a,t,i),g(),d?{meta:{paused:!0}}:c||{meta:{paused:!1}}},this.paused=function(){return d},this.pause=function(){d=!0,o.abort(),a=M(m.chunk)?\"\":a.substring(o.getCharIndex())},this.resume=function(){t.streamer._halted?(d=!1,t.streamer.parseChunk(a,!0)):setTimeout(t.resume,3)},this.aborted=function(){return e},this.abort=function(){e=!0,o.abort(),c.meta.aborted=!0,M(m.complete)&&m.complete(c),a=\"\"}}function j(e){return e.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function E(e){var S,O=(e=e||{}).delimiter,x=e.newline,I=e.comments,T=e.step,D=e.preview,A=e.fastMode,L=S=void 0===e.quoteChar||null===e.quoteChar?'\"':e.quoteChar;if(void 0!==e.escapeChar&&(L=e.escapeChar),(\"string\"!=typeof O||-1<b.BAD_DELIMITERS.indexOf(O))&&(O=\",\"),I===O)throw new Error(\"Comment character same as delimiter\");!0===I?I=\"#\":(\"string\"!=typeof I||-1<b.BAD_DELIMITERS.indexOf(I))&&(I=!1),\"\\n\"!==x&&\"\\r\"!==x&&\"\\r\\n\"!==x&&(x=\"\\n\");var F=0,z=!1;this.parse=function(r,t,i){if(\"string\"!=typeof r)throw new Error(\"Input must be a string\");var n=r.length,e=O.length,s=x.length,a=I.length,o=M(T),h=[],u=[],f=[],d=F=0;if(!r)return C();if(A||!1!==A&&-1===r.indexOf(S)){for(var l=r.split(x),c=0;c<l.length;c++){if(f=l[c],F+=f.length,c!==l.length-1)F+=x.length;else if(i)return C();if(!I||f.substring(0,a)!==I){if(o){if(h=[],k(f.split(O)),R(),z)return C()}else k(f.split(O));if(D&&D<=c)return h=h.slice(0,D),C(!0)}}return C()}for(var p=r.indexOf(O,F),g=r.indexOf(x,F),_=new RegExp(j(L)+j(S),\"g\"),m=r.indexOf(S,F);;)if(r[F]!==S)if(I&&0===f.length&&r.substring(F,F+a)===I){if(-1===g)return C();F=g+s,g=r.indexOf(x,F),p=r.indexOf(O,F)}else if(-1!==p&&(p<g||-1===g))f.push(r.substring(F,p)),F=p+e,p=r.indexOf(O,F);else{if(-1===g)break;if(f.push(r.substring(F,g)),w(g+s),o&&(R(),z))return C();if(D&&h.length>=D)return C(!0)}else for(m=F,F++;;){if(-1===(m=r.indexOf(S,m+1)))return i||u.push({type:\"Quotes\",code:\"MissingQuotes\",message:\"Quoted field unterminated\",row:h.length,index:F}),E();if(m===n-1)return E(r.substring(F,m).replace(_,S));if(S!==L||r[m+1]!==L){if(S===L||0===m||r[m-1]!==L){-1!==p&&p<m+1&&(p=r.indexOf(O,m+1)),-1!==g&&g<m+1&&(g=r.indexOf(x,m+1));var y=b(-1===g?p:Math.min(p,g));if(r.substr(m+1+y,e)===O){f.push(r.substring(F,m).replace(_,S)),r[F=m+1+y+e]!==S&&(m=r.indexOf(S,F)),p=r.indexOf(O,F),g=r.indexOf(x,F);break}var v=b(g);if(r.substring(m+1+v,m+1+v+s)===x){if(f.push(r.substring(F,m).replace(_,S)),w(m+1+v+s),p=r.indexOf(O,F),m=r.indexOf(S,F),o&&(R(),z))return C();if(D&&h.length>=D)return C(!0);break}u.push({type:\"Quotes\",code:\"InvalidQuotes\",message:\"Trailing quote on quoted field is malformed\",row:h.length,index:F}),m++}}else m++}return E();function k(e){h.push(e),d=F}function b(e){var t=0;if(-1!==e){var i=r.substring(m+1,e);i&&\"\"===i.trim()&&(t=i.length)}return t}function E(e){return i||(void 0===e&&(e=r.substring(F)),f.push(e),F=n,k(f),o&&R()),C()}function w(e){F=e,k(f),f=[],g=r.indexOf(x,F)}function C(e){return{data:h,errors:u,meta:{delimiter:O,linebreak:x,aborted:z,truncated:!!e,cursor:d+(t||0)}}}function R(){T(C()),h=[],u=[]}},this.abort=function(){z=!0},this.getCharIndex=function(){return F}}function _(e){var t=e.data,i=a[t.workerId],r=!1;if(t.error)i.userError(t.error,t.file);else if(t.results&&t.results.data){var n={abort:function(){r=!0,m(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},pause:y,resume:y};if(M(i.userStep)){for(var s=0;s<t.results.data.length&&(i.userStep({data:t.results.data[s],errors:t.results.errors,meta:t.results.meta},n),!r);s++);delete t.results}else M(i.userChunk)&&(i.userChunk(t.results,n,t.file),delete t.results)}t.finished&&!r&&m(t.workerId,t.results)}function m(e,t){var i=a[e];M(i.userComplete)&&i.userComplete(t),i.terminate(),delete a[e]}function y(){throw new Error(\"Not implemented.\")}function w(e){if(\"object\"!=typeof e||null===e)return e;var t=Array.isArray(e)?[]:{};for(var i in e)t[i]=w(e[i]);return t}function v(e,t){return function(){e.apply(t,arguments)}}function M(e){return\"function\"==typeof e}return o&&(f.onmessage=function(e){var t=e.data;void 0===b.WORKER_ID&&t&&(b.WORKER_ID=t.workerId);if(\"string\"==typeof t.input)f.postMessage({workerId:b.WORKER_ID,results:b.parse(t.input,t.config),finished:!0});else if(f.File&&t.input instanceof File||t.input instanceof Object){var i=b.parse(t.input,t.config);i&&f.postMessage({workerId:b.WORKER_ID,results:i,finished:!0})}}),(l.prototype=Object.create(u.prototype)).constructor=l,(c.prototype=Object.create(u.prototype)).constructor=c,(p.prototype=Object.create(p.prototype)).constructor=p,(g.prototype=Object.create(u.prototype)).constructor=g,b});","export default function getMoleculeCreators(Molecule) {\n  const fields = new Map();\n\n  fields.set('oclid', Molecule.fromIDCode);\n  fields.set('idcode', Molecule.fromIDCode);\n  fields.set('smiles', Molecule.fromSmiles);\n  fields.set('molfile', Molecule.fromMolfile);\n\n  return fields;\n}\n","import { ensureString } from 'ensure-string';\nimport Papa from 'papaparse';\n\nimport getMoleculeCreators from './getMoleculeCreators';\n\nconst defaultCSVOptions = {\n  header: true,\n  dynamicTyping: true,\n  skipEmptyLines: true,\n};\n\nexport default async function appendCSV(moleculesDB, csv, options = {}) {\n  const { onStep } = options;\n  csv = ensureString(csv);\n  const moleculeCreators = getMoleculeCreators(moleculesDB.OCL.Molecule);\n\n  if (typeof csv !== 'string') {\n    throw new TypeError('csv must be a string');\n  }\n  options = { ...defaultCSVOptions, ...options };\n\n  const parsed = Papa.parse(csv, options);\n  const fields = parsed.meta.fields;\n  const stats = new Array(fields.length);\n  const firstElement = parsed.data[0];\n  let moleculeCreator, moleculeField;\n  for (let i = 0; i < fields.length; i++) {\n    stats[i] = {\n      label: fields[i],\n      isNumeric: typeof firstElement[fields[i]] === 'number',\n    };\n    const lowerField = fields[i].toLowerCase();\n    if (moleculeCreators.has(lowerField)) {\n      moleculeCreator = moleculeCreators.get(lowerField);\n      moleculeField = fields[i];\n    }\n  }\n  if (!moleculeCreator) {\n    throw new Error('this document does not contain any molecule field');\n  }\n  moleculesDB.statistics = stats;\n\n  for (let i = 0; i < parsed.data.length; i++) {\n    moleculesDB.pushEntry(\n      moleculeCreator(parsed.data[i][moleculeField]),\n      parsed.data[i],\n    );\n    if (onStep) {\n      await onStep(i + 1, parsed.data.length);\n    }\n  }\n}\n","export function getMolecule(sdfPart, labels, currentLabels, options) {\n  let parts = sdfPart.split(`${options.eol}>`);\n  if (parts.length === 0 || parts[0].length <= 5) return;\n  let molecule = {};\n  molecule.molfile = parts[0] + options.eol;\n  for (let j = 1; j < parts.length; j++) {\n    let lines = parts[j].split(options.eol);\n    let from = lines[0].indexOf('<');\n    let to = lines[0].indexOf('>');\n    let label = lines[0].substring(from + 1, to);\n    currentLabels.push(label);\n    if (!labels[label]) {\n      labels[label] = {\n        counter: 0,\n        isNumeric: options.dynamicTyping,\n        keep: false,\n      };\n      if (\n        (!options.exclude || options.exclude.indexOf(label) === -1) &&\n        (!options.include || options.include.indexOf(label) > -1)\n      ) {\n        labels[label].keep = true;\n        if (options.modifiers[label]) {\n          labels[label].modifier = options.modifiers[label];\n        }\n        if (options.forEach[label]) {\n          labels[label].forEach = options.forEach[label];\n        }\n      }\n    }\n    if (labels[label].keep) {\n      for (let k = 1; k < lines.length - 1; k++) {\n        if (molecule[label]) {\n          molecule[label] += options.eol + lines[k];\n        } else {\n          molecule[label] = lines[k];\n        }\n      }\n      if (labels[label].modifier) {\n        let modifiedValue = labels[label].modifier(molecule[label]);\n        if (modifiedValue === undefined || modifiedValue === null) {\n          delete molecule[label];\n        } else {\n          molecule[label] = modifiedValue;\n        }\n      }\n      if (labels[label].isNumeric) {\n        if (!isFinite(molecule[label]) || molecule[label].match(/^0[0-9]/)) {\n          labels[label].isNumeric = false;\n        }\n      }\n    }\n  }\n  return molecule;\n}\n","import { ensureString } from 'ensure-string';\nimport { parse } from 'sdf-parser';\n\nexport default async function appendSDF(moleculesDB, sdf, options = {}) {\n  const { onStep } = options;\n  sdf = ensureString(sdf);\n  if (typeof sdf !== 'string') {\n    throw new TypeError('sdf must be a string');\n  }\n  const parsed = parse(sdf);\n  moleculesDB.statistics = parsed.statistics;\n  for (let i = 0; i < parsed.molecules.length; i++) {\n    const molecule = parsed.molecules[i];\n    moleculesDB.pushEntry(\n      moleculesDB.OCL.Molecule.fromMolfile(molecule.molfile),\n      molecule,\n    );\n    if (onStep) {\n      await onStep(i + 1, parsed.molecules.length);\n    }\n  }\n}\n","import { ensureString } from 'ensure-string';\n\nimport { getEntriesBoundaries } from './getEntriesBoundaries';\nimport { getMolecule } from './util/getMolecule';\n/**\n *  Parse a SDF file\n * @param {string|ArrayBuffer|Uint8Array} sdf SDF file to parse\n * @param {object} [options={}]\n * @param {string[]} [options.include] List of fields to include\n * @param {string[]} [options.exclude] List of fields to exclude\n * @param {Function} [options.filter] Callback allowing to filter the molecules\n * @param {boolean} [options.dynamicTyping] Dynamically type the data\n * @param {object} [options.modifiers] Object containing callbacks to apply on some specific fields\n * @param {boolean} [options.mixedEOL=false] Set to true if you know there is a mixture between \\r\\n and \\n\n * @param {string} [options.eol] Specify the end of line character. Default will be the one found in the file\n */\nexport function parse(sdf, options = {}) {\n  options = { ...options };\n  if (options.modifiers === undefined) options.modifiers = {};\n  if (options.forEach === undefined) options.forEach = {};\n  if (options.dynamicTyping === undefined) options.dynamicTyping = true;\n\n  sdf = ensureString(sdf);\n  if (typeof sdf !== 'string') {\n    throw new TypeError('Parameter \"sdf\" must be a string');\n  }\n\n  if (options.eol === undefined) {\n    options.eol = '\\n';\n    if (options.mixedEOL) {\n      sdf = sdf.replace(/\\r\\n/g, '\\n');\n      sdf = sdf.replace(/\\r/g, '\\n');\n    } else {\n      // we will find the delimiter in order to be much faster and not use regular expression\n      let header = sdf.substr(0, 1000);\n      if (header.indexOf('\\r\\n') > -1) {\n        options.eol = '\\r\\n';\n      } else if (header.indexOf('\\r') > -1) {\n        options.eol = '\\r';\n      }\n    }\n  }\n\n  let entriesBoundaries = getEntriesBoundaries(\n    sdf,\n    `${options.eol}$$$$`,\n    options.eol,\n  );\n  let molecules = [];\n  let labels = {};\n\n  let start = Date.now();\n\n  for (let i = 0; i < entriesBoundaries.length; i++) {\n    let sdfPart = sdf.substring(...entriesBoundaries[i]);\n\n    let currentLabels = [];\n    const molecule = getMolecule(sdfPart, labels, currentLabels, options);\n    if (!molecule) continue;\n    if (!options.filter || options.filter(molecule)) {\n      molecules.push(molecule);\n      // only now we can increase the counter\n      for (let j = 0; j < currentLabels.length; j++) {\n        labels[currentLabels[j]].counter++;\n      }\n    }\n  }\n  // all numeric fields should be converted to numbers\n  for (let label in labels) {\n    let currentLabel = labels[label];\n    if (currentLabel.isNumeric) {\n      currentLabel.minValue = Infinity;\n      currentLabel.maxValue = -Infinity;\n      for (let j = 0; j < molecules.length; j++) {\n        if (molecules[j][label]) {\n          let value = parseFloat(molecules[j][label]);\n          molecules[j][label] = value;\n          if (value > currentLabel.maxValue) {\n            currentLabel.maxValue = value;\n          }\n          if (value < currentLabel.minValue) {\n            currentLabel.minValue = value;\n          }\n        }\n      }\n    }\n  }\n\n  // we check that a label is in all the records\n  for (let key in labels) {\n    if (labels[key].counter === molecules.length) {\n      labels[key].always = true;\n    } else {\n      labels[key].always = false;\n    }\n  }\n\n  let statistics = [];\n  for (let key in labels) {\n    let statistic = labels[key];\n    statistic.label = key;\n    statistics.push(statistic);\n  }\n\n  return {\n    time: Date.now() - start,\n    molecules,\n    labels: Object.keys(labels),\n    statistics,\n  };\n}\n","export function getEntriesBoundaries(string, substring, eol) {\n  const res = [];\n  let previous = 0;\n  let next = 0;\n  while (next !== -1) {\n    next = string.indexOf(substring, previous);\n    if (next !== -1) {\n      res.push([previous, next]);\n      const nextMatch = string.indexOf(eol, next + substring.length);\n      if (nextMatch === -1) {\n        next = -1;\n      } else {\n        previous = nextMatch + eol.length;\n        next = previous;\n      }\n    } else {\n      res.push([previous, string.length]);\n    }\n  }\n  return res;\n}\n","export async function noWait() {\n  return new Promise((resolve) => {\n    if (typeof setImmediate === 'function') {\n      setImmediate(() => resolve());\n    } else {\n      // didn't find a better way to do it in the browser\n      setTimeout(() => resolve(), 0);\n    }\n  });\n}\n","import { noWait } from '../../util/noWait.js';\n\nimport getMoleculeCreators from './getMoleculeCreators';\n\nclass AbortError extends Error {\n  name = 'AbortError';\n  code = 20;\n}\n\nfunction getQuery(moleculesDB, query, options) {\n  const { format = 'idCode' } = options;\n\n  if (typeof query === 'string') {\n    const moleculeCreators = getMoleculeCreators(moleculesDB.OCL.Molecule);\n    query = moleculeCreators.get(format.toLowerCase())(query);\n  } else if (!(query instanceof moleculesDB.OCL.Molecule)) {\n    throw new TypeError('toSearch must be a Molecule or string');\n  }\n  return query;\n}\n\nexport function search(moleculesDB, query = '', options = {}) {\n  const { mode = 'substructure' } = options;\n\n  query = getQuery(moleculesDB, query, options);\n\n  let result;\n  switch (mode.toLowerCase()) {\n    case 'exact':\n      result = exactSearch(moleculesDB, query);\n      break;\n    case 'substructure':\n      result = subStructureSearch(moleculesDB, query);\n      break;\n    case 'similarity':\n      result = similaritySearch(moleculesDB, query);\n      break;\n    default:\n      throw new Error(`unknown search mode: ${options.mode}`);\n  }\n  return processResult(result, options);\n}\n\nexport async function searchAsync(moleculesDB, query = '', options = {}) {\n  const { mode = 'substructure' } = options;\n\n  query = getQuery(moleculesDB, query, options);\n\n  let result;\n  switch (mode.toLowerCase()) {\n    case 'exact':\n      result = exactSearch(moleculesDB, query);\n      break;\n    case 'substructure':\n      result = await subStructureSearchAsync(moleculesDB, query, options);\n      break;\n    case 'similarity':\n      result = similaritySearch(moleculesDB, query);\n      break;\n    default:\n      throw new Error(`unknown search mode: ${options.mode}`);\n  }\n  return processResult(result, options);\n}\n\nfunction exactSearch(moleculesDB, query) {\n  const queryIDCode = query.getIDCode();\n  let searchResult = moleculesDB.db[queryIDCode]\n    ? [moleculesDB.db[queryIDCode]]\n    : [];\n  return searchResult;\n}\n\nfunction substructureSearchBegin(moleculesDB, query) {\n  let resetFragment = false;\n  if (!query.isFragment()) {\n    resetFragment = true;\n    query.setFragment(true);\n  }\n\n  const queryMW = getMW(query);\n  const searchResult = [];\n  if (query.getAllAtoms() === 0) {\n    for (let idCode in moleculesDB.db) {\n      searchResult.push(moleculesDB.db[idCode]);\n    }\n  }\n  return { resetFragment, queryMW, searchResult };\n}\n\nfunction substructureSearchEnd(searchResult, queryMW, resetFragment, query) {\n  searchResult.sort((a, b) => {\n    return (\n      Math.abs(queryMW - a.properties.mw) - Math.abs(queryMW - b.properties.mw)\n    );\n  });\n\n  if (resetFragment) {\n    query.setFragment(false);\n  }\n\n  return searchResult;\n}\n\nfunction subStructureSearch(moleculesDB, query) {\n  const { resetFragment, queryMW, searchResult } = substructureSearchBegin(\n    moleculesDB,\n    query,\n  );\n\n  if (searchResult.length === 0) {\n    const queryIndex = query.getIndex();\n    const searcher = moleculesDB.searcher;\n    searcher.setFragment(query, queryIndex);\n    for (let idCode in moleculesDB.db) {\n      let entry = moleculesDB.db[idCode];\n      searcher.setMolecule(entry.molecule, entry.index);\n      if (searcher.isFragmentInMolecule()) {\n        searchResult.push(entry);\n      }\n    }\n  }\n\n  return substructureSearchEnd(searchResult, queryMW, resetFragment, query);\n}\n\nasync function subStructureSearchAsync(moleculesDB, query, options = {}) {\n  const { interval = 100, onStep, controller } = options;\n  let shouldAbort = false;\n\n  if (controller) {\n    const abortEventListener = () => {\n      shouldAbort = true;\n    };\n    controller.signal.addEventListener('abort', abortEventListener);\n  }\n\n  const { resetFragment, queryMW, searchResult } = substructureSearchBegin(\n    moleculesDB,\n    query,\n  );\n\n  let begin = performance.now();\n\n  if (searchResult.length === 0) {\n    const queryIndex = query.getIndex();\n    const searcher = moleculesDB.searcher;\n    searcher.setFragment(query, queryIndex);\n    let index = 0;\n    let length = Object.keys(moleculesDB.db).length;\n    for (let idCode in moleculesDB.db) {\n      if (shouldAbort) {\n        throw new AbortError('Query aborted');\n      }\n      let entry = moleculesDB.db[idCode];\n      searcher.setMolecule(entry.molecule, entry.index);\n      if (searcher.isFragmentInMolecule()) {\n        searchResult.push(entry);\n      }\n      if ((onStep || controller) && performance.now() - begin >= interval) {\n        begin = performance.now();\n        if (onStep) {\n          onStep(index, length);\n        }\n        if (controller && !onStep) {\n          await noWait();\n        }\n      }\n      index++;\n    }\n  }\n  return substructureSearchEnd(searchResult, queryMW, resetFragment, query);\n}\n\nfunction similaritySearch(moleculesDB, query) {\n  const queryIndex = query.getIndex();\n  const queryMW = getMW(query);\n  const queryIdCode = query.getIDCode();\n\n  const searchResult = [];\n  let similarity;\n  for (let idCode in moleculesDB.db) {\n    let entry = moleculesDB.db[idCode];\n    if (entry.idCode === queryIdCode) {\n      similarity = Number.MAX_SAFE_INTEGER;\n    } else {\n      similarity =\n        moleculesDB.OCL.SSSearcherWithIndex.getSimilarityTanimoto(\n          queryIndex,\n          entry.index,\n        ) *\n          1000000 -\n        Math.abs(queryMW - entry.properties.mw) / 10000;\n    }\n    searchResult.push({ similarity, entry });\n  }\n  searchResult.sort((a, b) => {\n    return b.similarity - a.similarity;\n  });\n  return searchResult.map((entry) => entry.entry);\n}\n\nfunction getMW(query) {\n  let copy = query.getCompactCopy();\n  copy.setFragment(false);\n  return copy.getMolecularFormula().relativeWeight;\n}\n\nfunction processResult(entries, options = {}) {\n  const {\n    flattenResult = true,\n    keepMolecule = false,\n    limit = Number.MAX_SAFE_INTEGER,\n  } = options;\n  let results = [];\n\n  if (flattenResult) {\n    for (let entry of entries) {\n      for (let data of entry.data) {\n        results.push({\n          data,\n          idCode: entry.idCode,\n          properties: entry.properties,\n          molecule: keepMolecule ? entry.molecule : undefined,\n        });\n      }\n    }\n  } else {\n    for (let entry of entries) {\n      results.push({\n        data: entry.data,\n        idCode: entry.idCode,\n        properties: entry.properties,\n        molecule: keepMolecule ? entry.molecule : undefined,\n      });\n    }\n  }\n  if (limit < results.length) results.length = limit;\n  return results;\n}\n","export function parseColumnbProperties(lines) {\n  lines = lines.map((line) => {\n    const [key, value] = line.slice(1, -1).split('=');\n    return { key, value: value.slice(1, -1) };\n  });\n  const columnProperties = {};\n  let currentColumnName = '';\n  for (let line of lines) {\n    switch (line.key) {\n      case 'columnName':\n        currentColumnName = line.value;\n        columnProperties[currentColumnName] = {};\n        break;\n      case 'columnProperty':\n        {\n          if (!currentColumnName) {\n            throw new Error('This should not happen');\n          }\n          const [key, value] = line.value.split('\\t');\n          columnProperties[currentColumnName][key] = value;\n        }\n        break;\n      default:\n        throw new Error('This should not happen');\n    }\n  }\n  for (let key in columnProperties) {\n    const columnPropery = columnProperties[key];\n    if (columnProperties[key].parent) {\n      const target = columnProperties[columnPropery.parent];\n      if (!target) {\n        throw new Error('Parent column not found');\n      }\n      if (!target.related) {\n        target.related = {};\n      }\n      target.related[columnPropery.specialType] = key;\n    }\n  }\n\n  return columnProperties;\n}\n","export function parseData(lines, options = {}) {\n  lines = lines.filter((line) => !line.match(/^\\s*$/));\n  const { columnProperties = {} } = options;\n  const headers = lines\n    .shift()\n    .split('\\t')\n    .map((header) => {\n      if (columnProperties[header]) {\n        return { label: header, ...columnProperties[header] };\n      }\n      return { label: header };\n    });\n  const entries = [];\n  const rawEntries = [];\n\n  for (let line of lines) {\n    const fields = line.split('\\t');\n    const rawEntry = {};\n    headers.forEach((header, index) => {\n      rawEntry[header.label] = fields[index];\n    });\n    rawEntries.push(rawEntry);\n    const entry = {};\n    headers.forEach((header) => {\n      if (header.parent) return;\n      entry[header.label] = valueEhnhancer(header, rawEntry);\n    });\n    entries.push(entry);\n  }\n\n  return { entries, rawEntries };\n}\n\nfunction valueEhnhancer(header, rawEntry) {\n  if (header?.specialType === 'rxncode') {\n    return `${rawEntry[header.label]}#${rawEntry[header.related.atomMapping]}#${\n      rawEntry[header.related.idcoordinates2D]\n    }`;\n  }\n\n  return rawEntry[header.label];\n}\n\n/*\nentry.rxnCode =\n*/\n","import { ensureString } from 'ensure-string';\n\nimport { getParts } from './utils/getParts';\nimport { parseColumnbProperties } from './utils/parseColumnbProperties';\nimport { parseData } from './utils/parseData';\n\n/**\n * Convert a DataWarrior database into a JSON object\n * @param {string} text\n * @returns\n */\nexport function parseDwar(text) {\n  text = ensureString(text);\n  const parts = getParts(text);\n  improveParts(parts);\n  return parts;\n}\n\nexport function getCamelCase(name) {\n  return name.replace(/[ -][a-z]/g, (string) => string[1].toUpperCase());\n}\n\nfunction improveParts(parts) {\n  for (let key in parts) {\n    switch (key) {\n      case 'columnProperties':\n        parts[key] = parseColumnbProperties(parts[key]);\n        break;\n      case 'data':\n        break;\n      default:\n        parts[key] = parseDefault(parts[key]);\n    }\n  }\n  const data = parseData(parts.data, {\n    columnProperties: parts.columnProperties,\n  });\n  parts.data = data.entries;\n  parts.rawData = data.rawEntries;\n}\n\nfunction parseDefault(lines) {\n  const result = {};\n  for (let line of lines) {\n    const [key, value] = line.slice(1, -1).split('=');\n    result[key] = value.slice(1, -1);\n  }\n  return result;\n}\n","import { getMF } from '../../util/getMF.js';\n\n/**\n *\n * @param {import('openchemlib').Molecule} molecule\n * @param {Map} moleculesInfo\n * @returns\n */\nexport function getInfo(molecule, moleculesInfo) {\n  if (moleculesInfo.has(molecule)) {\n    return moleculesInfo.get(molecule);\n  }\n  const reactantInfo = {\n    molfile: molecule.toMolfile(),\n    idCode: molecule.getIDCode(),\n    mf: getMF(molecule).mf,\n  };\n  moleculesInfo.set(molecule, reactantInfo);\n  return reactantInfo;\n}\n","import { getInfo } from './getReactantInfo.js';\n\nexport function applyOneReactantReaction(reactants, reactions, options) {\n  const { currentDepth, maxDepth, moleculesInfo, processedMolecules, results } =\n    options;\n  const todoNextDepth = [];\n  if (currentDepth >= maxDepth) return [];\n  if (!Array.isArray(reactants)) {\n    reactants = [reactants];\n  }\n  const { OCL } = options;\n  for (const reactant of reactants) {\n    const idCode = reactant.getIDCode();\n    if (processedMolecules.has(idCode)) {\n      continue;\n    } else {\n      processedMolecules.add(idCode);\n    }\n    for (const reaction of reactions) {\n      const reactor = new OCL.Reactor(reaction.oclReaction);\n      const isMatching = Boolean(reactor.setReactant(0, reactant));\n      if (isMatching) {\n        const oneReactionProducts = reactor.getProducts();\n        for (let i = 0; i < oneReactionProducts.length; i++) {\n          const products = [];\n          for (let j = 0; j < oneReactionProducts[i].length; j++) {\n            const moleculeInfo = getInfo(\n              oneReactionProducts[i][j],\n              moleculesInfo,\n            );\n            if (!processedMolecules.has(moleculeInfo.idCode)) {\n              const product = {\n                ...moleculeInfo,\n                children: [],\n              };\n              products.push(product);\n\n              todoNextDepth.push(() => {\n                return applyOneReactantReaction(\n                  oneReactionProducts[i][j],\n                  reactions,\n                  {\n                    ...options,\n                    currentDepth: options.currentDepth + 1,\n                    results: product.children,\n                  },\n                );\n              });\n            }\n          }\n          if (products.length > 0) {\n            // eslint-disable-next-line no-unused-vars\n            const { oclReaction, ...reactionWithoutOCL } = reaction;\n            const oneReaction = {\n              reaction: reactionWithoutOCL,\n              reactant: getInfo(reactant, moleculesInfo),\n              products,\n            };\n            results.push(oneReaction);\n          }\n        }\n      }\n    }\n  }\n  return todoNextDepth;\n}\n","import appendCSV from './utils/appendCSV';\nimport appendColor from './utils/appendColor';\nimport appendSDF from './utils/appendSDF';\nimport appendSmilesList from './utils/appendSmilesList';\nimport pushEntry from './utils/pushEntry';\nimport pushMoleculeInfo from './utils/pushMoleculeInfo';\nimport { search, searchAsync } from './utils/search';\n/*\n    this.db is an object with properties 'oclID' that has as value\n    an object that contains the following properties:\n    * molecule: an OCL molecule instance\n    * index: OCL index used for substructure searching\n    * properties: all the calculates properties\n    * data: array containing free data associated with this molecule\n  */\n\nexport class MoleculesDB {\n  /**\n   *\n   * @param {import('openchemlib')} OCL - openchemlib library\n   * @param {object} [options={}]\n   * @param {boolean} [options.computeProperties=false]\n   */\n  constructor(OCL, options = {}) {\n    const { computeProperties = false } = options;\n    this.OCL = OCL;\n    this.db = {};\n    this.statistics = null;\n    this.computeProperties = computeProperties;\n    this.searcher = new OCL.SSSearcherWithIndex();\n  }\n\n  /**\n   * append to the current database a CSV file\n   * @param {string|ArrayBuffer} csv - text file containing the comma separated value file\n   * @param {object} [options={}]\n   * @param {boolean} [options.header=true]\n   * @param {boolean} [options.dynamicTyping=true]\n   * @param {boolean} [options.skipEmptyLines=true]\n   * @param {function} [options.onStep] call back to execute after each molecule\n   */\n\n  appendCSV(csv, options) {\n    return appendCSV(this, csv, {\n      computeProperties: this.computeProperties,\n      ...options,\n    });\n  }\n\n  /**\n   * Append a SDF to the current database\n   * @param {string|ArrayBuffer} sdf - text file containing the sdf\n   * @param {object} [options={}]\n   * @param {function} [options.onStep] call back to execute after each molecule\n   * @returns {DB}\n   */\n\n  appendSDF(sdf, options) {\n    return appendSDF(this, sdf, {\n      computeProperties: this.computeProperties,\n      ...options,\n    });\n  }\n\n  /**\n   * Append a SDF to the current database\n   * @param {string|ArrayBuffer} smiles - text file containing a list of smiles\n   * @param {object} [options={}]\n   * @param {function} [options.onStep] call back to execute after each molecule\n   * @returns {DB}\n   */\n\n  appendSmilesList(text, options) {\n    return appendSmilesList(this, text, {\n      computeProperties: this.computeProperties,\n      ...options,\n    });\n  }\n\n  /**\n   * Add a molecule to the current database\n   * @param {import('openchemlib').Molecule} molecule\n   * @param {object} [data={}]\n   * @param {object} [moleculeInfo={}] may contain precalculated index and mw\n   */\n\n  pushEntry(molecule, data, moleculeInfo) {\n    pushEntry(this, molecule, data, moleculeInfo);\n  }\n\n  /**\n   * Add an entry in the database\n   * @param {object} moleculeInfo - a molecule as a JSON that may contain the following properties: molfile, smiles, idCode, mf, index\n   * @param {object} [data={}]\n   */\n\n  pushMoleculeInfo(moleculeInfo, data) {\n    return pushMoleculeInfo(this, moleculeInfo, data);\n  }\n\n  /**\n   * Search in a MoleculesDB\n   * Inside the database all the same molecules are group together\n   * @param {string|OCL.Molecule} [query] smiles, molfile, oclCode or instance of Molecule to look for\n   * @param {object} [options={}]\n   * @param {string} [options.format='idCode'] - query is in the format 'smiles', 'oclid' or 'molfile'\n   * @param {string} [options.mode='substructure'] - search by 'substructure', 'exact' or 'similarity'\n   * @param {boolean} [options.flattenResult=true] - The database group the data for the same product. This allows to flatten the result\n   * @param {boolean} [options.keepMolecule=false] - keep the OCL.Molecule object in the result\n   * @param {number} [options.limit=Number.MAX_SAFE_INTEGER] - maximal number of result\n   * @return {Array} array of object of the type {(molecule), idCode, data, properties}\n   */\n  search(query, options) {\n    return search(this, query, options);\n  }\n\n  /**\n   * Search in a MoleculesDB\n   * Inside the database all the same molecules are group together\n   * @param {string|OCL.Molecule} [query] smiles, molfile, oclCode or instance of Molecule to look for\n   * @param {object} [options={}]\n   * @param {string} [options.format='idCode'] - query is in the format 'smiles', 'oclid' or 'molfile'\n   * @param {string} [options.mode='substructure'] - search by 'substructure', 'exact' or 'similarity'\n   * @param {boolean} [options.flattenResult=true] - The database group the data for the same product. This allows to flatten the result\n   * @param {boolean} [options.keepMolecule=false] - keep the OCL.Molecule object in the result\n   * @param {number} [options.limit=Number.MAX_SAFE_INTEGER] - maximal number of result\n   * @param {number} [options.interval=100] - interval in ms to call the onStep callback\n   * @param {function} [options.onStep] - callback to execute after each interval\n   * @param {AbortController} [options.controler] - callback to execute to check if the search should be aborted\n   * @return {Promise<Array>} array of object of the type {(molecule), idCode, data, properties}\n   */\n  searchAsync(query, options) {\n    return searchAsync(this, query, options);\n  }\n\n  /**\n   * Returns an array with the current database\n   * @returns\n   */\n  getDB() {\n    return Object.keys(this.db).map((key) => this.db[key]);\n  }\n\n  /**\n   * Append the property `data.color` to each entry based on a data or property label\n   * {object} [options={}]\n   * {string} [options.dataLabel] name of the property from `data` to use\n   * {string} [options.propertyLabel] name of the property from `properties` to use\n   * {number} [options.colorLabel='color'] name of the property to add in data that will contain the color\n   * {number} [options.minValue]\n   * {number} [options.maxValue]\n   * {number} [options.minHue=0]\n   * {number} [options.maxHue=360]\n   * {number} [options.saturation=65] percent of color saturation\n   * {number} [options.lightness=65] percent of color lightness\n   */\n  appendColor(options) {\n    appendColor(this, options);\n  }\n}\n","import { ensureString } from 'ensure-string';\n\nexport default async function appendSmilesList(\n  moleculesDB,\n  text,\n  options = {},\n) {\n  const { onStep } = options;\n  text = ensureString(text);\n  if (typeof text !== 'string') {\n    throw new TypeError('text must be a string');\n  }\n  const smilesArray = text\n    .split(/\\r?\\n/)\n    .map((line) => line.trim())\n    .filter((line) => line);\n  for (let i = 0; i < smilesArray.length; i++) {\n    const oneSmiles = smilesArray[i];\n    moleculesDB.pushEntry(moleculesDB.OCL.Molecule.fromSmiles(oneSmiles));\n    if (onStep) {\n      await onStep(i + 1, smilesArray.length);\n    }\n  }\n}\n","/**\n *\n * @param {MoleculesDB} moleculesDB\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} data\n * @param {object} [moleculeInfo]\n * @param {string} [moleculeInfo.idCode]\n * @param {number[]} [moleculeInfo.index]\n */\n\nexport default function pushEntry(\n  moleculesDB,\n  molecule,\n  data = {},\n  moleculeInfo = {},\n) {\n  // the following line could be the source of problems if the idCode version\n  // changes\n\n  let moleculeIDCode = moleculeInfo.idCode\n    ? moleculeInfo.idCode\n    : molecule.getIDCode();\n  let entry = moleculesDB.db[moleculeIDCode];\n  if (!entry) {\n    // a new molecule\n    entry = { molecule, properties: {}, data: [], idCode: moleculeIDCode };\n    moleculesDB.db[moleculeIDCode] = entry;\n\n    // ensure helper arrays needed for substructure search\n    molecule.ensureHelperArrays(moleculesDB.OCL.Molecule.cHelperRings);\n    if (!moleculeInfo.index) {\n      entry.index = molecule.getIndex();\n    } else {\n      entry.index = moleculeInfo.index;\n    }\n\n    let molecularFormula;\n    if (!moleculeInfo.mw) {\n      molecularFormula = molecule.getMolecularFormula();\n      entry.properties.mw = molecularFormula.relativeWeight;\n    } else {\n      entry.properties.mw = moleculeInfo.mw;\n    }\n\n    if (moleculesDB.computeProperties) {\n      if (!molecularFormula) {\n        molecularFormula = molecule.getMolecularFormula();\n      }\n      const properties = new moleculesDB.OCL.MoleculeProperties(molecule);\n      entry.properties.em = molecularFormula.absoluteWeight;\n      entry.properties.mf = molecularFormula.formula;\n      entry.properties.acceptorCount = properties.acceptorCount;\n      entry.properties.donorCount = properties.donorCount;\n      entry.properties.logP = properties.logP;\n      entry.properties.logS = properties.logS;\n      entry.properties.polarSurfaceArea = properties.polarSurfaceArea;\n      entry.properties.rotatableBondCount = properties.rotatableBondCount;\n      entry.properties.stereoCenterCount = properties.stereoCenterCount;\n    }\n  }\n  entry.data.push(data);\n}\n","export default function pushMoleculeInfo(moleculesDB, moleculeInfo, data = {}) {\n  if (typeof moleculeInfo !== 'object') {\n    throw new Error('pushMoleculeInfo requires an object as first parameter');\n  }\n  const Molecule = moleculesDB.OCL.Molecule;\n  let molecule;\n  if (moleculeInfo.molfile) {\n    molecule = Molecule.fromMolfile(moleculeInfo.molfile);\n  }\n  if (moleculeInfo.smiles) molecule = Molecule.fromSmiles(moleculeInfo.smiles);\n  if (moleculeInfo.idCode) {\n    if (moleculesDB.db[moleculeInfo.idCode]) {\n      molecule = moleculesDB.db[moleculeInfo.idCode].molecule;\n    } else {\n      molecule = Molecule.fromIDCode(\n        moleculeInfo.idCode,\n        moleculeInfo.coordinates || false,\n      );\n    }\n  }\n\n  if (molecule) {\n    moleculesDB.pushEntry(molecule, data, moleculeInfo);\n  }\n}\n","export default function appendColor(moleculesDB, options = {}) {\n  const {\n    dataLabel,\n    propertyLabel,\n    minValue,\n    maxValue,\n    minHue = 0,\n    maxHue = 360,\n    saturation = 65,\n    lightness = 65,\n    colorLabel = 'color',\n  } = options;\n\n  const db = moleculesDB.getDB();\n  let values;\n  if (dataLabel) {\n    values = db\n      .map((result) =>\n        result.data.map((datum) => ({ value: datum[dataLabel], data: datum })),\n      )\n      .flat();\n  } else if (propertyLabel) {\n    values = db\n      .map((result) =>\n        result.data.map((datum) => ({\n          value: result.properties[propertyLabel],\n          data: datum,\n        })),\n      )\n      .flat();\n  } else {\n    values = db\n      .map((result) =>\n        result.data.map((datum) => ({ value: undefined, data: datum })),\n      )\n      .flat();\n  }\n\n  if (minValue !== undefined) {\n    values = values.forEach((value) => {\n      if (value.value !== undefined && value.value < minValue) {\n        value.value = minValue;\n      }\n    });\n  }\n\n  if (maxValue !== undefined) {\n    values = values.forEach((value) => {\n      if (value.value !== undefined && value.value > maxValue) {\n        value.value = maxValue;\n      }\n    });\n  }\n\n  const definedValues = values.filter((value) => value.value !== undefined);\n  const min = Math.min(...definedValues.map((value) => value.value));\n  const max = Math.max(...definedValues.map((value) => value.value));\n\n  for (let value of values) {\n    if (value.value !== undefined) {\n      value.data[colorLabel] = `hsl(${Math.floor(\n        ((value.value - min) / (max - min)) * (maxHue - minHue) + minHue,\n      )},${saturation}%,${lightness}%)`;\n    } else {\n      value.data.color = 'black';\n    }\n  }\n}\n","import { applyOneReactantReaction } from './utils/applyOneReactantReaction.js';\n\n/**\n * Create a tree of products based on reactions and reactants\n * @param {import('openchemlib').Molecule[]} reactants\n * @param {Array} reactions\n * @param {object} options\n * @param {number} [options.maxDepth=10]\n * @returns\n */\nexport function applyReactions(reactants, reactions, options = {}) {\n  const { maxDepth = 10 } = options;\n  const moleculesInfo = new Map();\n  const processedMolecules = new Set();\n  if (!reactants.length) {\n    throw new Error('Can not extract OCL because there is no reactants');\n  }\n  const OCL = reactants[0].getOCL();\n\n  reactions = appendOCLReaction(reactions, OCL);\n\n  const results = [];\n\n  let todoCurrentLevel = applyOneReactantReaction(reactants, reactions, {\n    OCL,\n    currentDepth: 0,\n    moleculesInfo,\n    processedMolecules,\n    maxDepth,\n    results,\n  });\n\n  do {\n    const nexts = [];\n    for (const todo of todoCurrentLevel) {\n      nexts.push(todo());\n    }\n    todoCurrentLevel = nexts.flat();\n  } while (todoCurrentLevel.length > 0);\n\n  return results;\n}\n\nfunction appendOCLReaction(reactions, OCL) {\n  reactions = JSON.parse(JSON.stringify(reactions)).filter(\n    (reaction) => reaction.rxnCode,\n  );\n  for (const reaction of reactions) {\n    reaction.oclReaction = OCL.ReactionEncoder.decode(reaction.rxnCode);\n  }\n  return reactions;\n}\n","import { getMF } from '../util/getMF';\n\nexport function fragmentAcyclicSingleBonds(molecule) {\n  const OCL = molecule.getOCL();\n  let atoms = [];\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    let atom = {};\n    atoms.push(atom);\n    atom.i = i;\n    atom.links = []; // we will store connected atoms of broken bonds\n  }\n\n  let bonds = [];\n  for (let i = 0; i < molecule.getAllBonds(); i++) {\n    let bond = {};\n    bonds.push(bond);\n    bond.i = i;\n    bond.order = molecule.getBondOrder(i);\n    bond.atom1 = molecule.getBondAtom(0, i);\n    bond.atom2 = molecule.getBondAtom(1, i);\n    bond.type = molecule.getBondType(i);\n    bond.isAromatic = molecule.isAromaticBond(i);\n    bond.isRingBond = molecule.isRingBond(i);\n    if (!bond.isAromatic && (bond.type & 0b11) === 1 && !bond.isRingBond) {\n      bond.selected = true;\n      atoms[bond.atom1].links.push(bond.atom2);\n      atoms[bond.atom2].links.push(bond.atom1);\n    }\n  }\n\n  //  console.log(bonds);\n\n  let brokenMolecule = molecule.getCompactCopy();\n  for (let bond of bonds) {\n    if (bond.selected) {\n      brokenMolecule.markBondForDeletion(bond.i);\n    }\n  }\n\n  brokenMolecule.deleteMarkedAtomsAndBonds();\n  let fragmentMap = [];\n  let nbFragments = brokenMolecule.getFragmentNumbers(fragmentMap);\n  let results = [];\n  for (let i = 0; i < nbFragments; i++) {\n    let result = {};\n    result.atomMap = [];\n    let includeAtom = fragmentMap.map((id) => {\n      return id === i;\n    });\n    let fragment = new OCL.Molecule(0, 0);\n    let atomMap = [];\n    brokenMolecule.copyMoleculeByAtoms(fragment, includeAtom, false, atomMap);\n    // we will add some R groups at the level of the broken bonds\n    for (let j = 0; j < atomMap.length; j++) {\n      if (atomMap[j] > -1) {\n        result.atomMap.push(j);\n        if (atoms[j].links.length > 0) {\n          for (let k = 0; k < atoms[j].links.length; k++) {\n            fragment.addBond(atomMap[j], fragment.addAtom(154), 1);\n          }\n        }\n      }\n    }\n    fragment.setFragment(false);\n    result.idCode = fragment.getIDCode();\n    result.mf = getMF(fragment).mf.replace(/R[1-9]?/, '');\n    results.push(result);\n  }\n\n  return results;\n}\n","import { makeRacemic } from '../util/makeRacemic';\n\nexport function getAtomFeatures(originalMolecule, options = {}) {\n  const OCL = originalMolecule.getOCL();\n\n  const { sphere = 1 } = options;\n  const fragment = new OCL.Molecule(0, 0);\n  const results = [];\n\n  for (\n    let rootAtom = 0;\n    rootAtom < originalMolecule.getAllAtoms();\n    rootAtom++\n  ) {\n    let min = 0;\n    let max = 0;\n    let atomMask = new Array(originalMolecule.getAtoms());\n    let atomList = new Array(originalMolecule.getAtoms());\n\n    const molecule = originalMolecule.getCompactCopy();\n    for (let currentSphere = 0; currentSphere <= sphere; currentSphere++) {\n      if (max === 0) {\n        atomList[max] = rootAtom;\n        atomMask[rootAtom] = true;\n        max++;\n      } else {\n        let newMax = max;\n        for (let i = min; i < max; i++) {\n          let atom = atomList[i];\n          for (let j = 0; j < molecule.getAllConnAtoms(atom); j++) {\n            let connAtom = molecule.getConnAtom(atom, j);\n            if (!atomMask[connAtom]) {\n              atomMask[connAtom] = true;\n              atomList[newMax++] = connAtom;\n            }\n          }\n        }\n        min = max;\n        max = newMax;\n      }\n      molecule.copyMoleculeByAtoms(fragment, atomMask, true, null);\n      if (currentSphere === sphere) {\n        makeRacemic(fragment);\n        results.push(fragment.getCanonizedIDCode());\n      }\n    }\n  }\n\n  const atoms = {};\n  for (let result of results) {\n    if (!atoms[result]) {\n      atoms[result] = 1;\n    } else {\n      atoms[result]++;\n    }\n  }\n\n  return atoms;\n}\n","import { getDiastereotopicAtomIDsAndH } from './getDiastereotopicAtomIDsAndH.js';\n\n/**\n * Parse a molfile and returns an object containing the molecule, the map and the diaIDs\n * The map allows to reload properties assigned to the atom molfile\n * Pelase take care than numbering of atoms starts at 0 !\n * @param {import('openchemlib')} OCL - openchemlib library\n * @param {string} molfile\n * @returns\n */\nexport function getDiastereotopicAtomIDsFromMolfile(OCL, molfile) {\n  const { map, molecule } = OCL.Molecule.fromMolfileWithAtomMap(molfile);\n\n  const diaIDsArray = getDiastereotopicAtomIDsAndH(molecule);\n  const diaIDs = {};\n\n  for (let i = 0; i < map.length; i++) {\n    diaIDs[map[i]] = { source: map[i], destination: i, ...diaIDsArray[i] };\n  }\n\n  return { map: diaIDs, molecule, diaIDs: diaIDsArray };\n}\n","import { getDiastereotopicAtomIDs } from '../diastereotopic/getDiastereotopicAtomIDs';\n\nimport { getHoseCodesFromDiastereotopicID } from './getHoseCodesFromDiastereotopicID';\n/**\n * Returns an array containing one entry per atom containing\n * diaID and hose code\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} options\n */\n\nexport function getHoseCodesAndDiastereotopicIDs(molecule, options) {\n  const diaIDs = getDiastereotopicAtomIDs(molecule).map((oclID) => ({\n    oclID,\n  }));\n  const OCL = molecule.getOCL();\n  // TODO: seems like a very slow approach\n  diaIDs.forEach((diaID) => {\n    const hoses = getHoseCodesFromDiastereotopicID(\n      OCL.Molecule.fromIDCode(diaID.oclID),\n      options,\n    );\n    diaID.hoses = [];\n    let sphere = 0;\n    for (const hose of hoses) {\n      diaID.hoses.push({\n        sphere: sphere++,\n        oclID: hose,\n      });\n    }\n  });\n  return diaIDs;\n}\n","/**\n * Get the shortest path between each pair of atoms in the molecule\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {string} [opions.fromLabel='H']\n * @param {string} [opions.toLabel='H']\n * @param {string} [opions.maxLength=4]\n * @returns {Array<Array>} A matrix containing on each cell (i,j) the shortest path from atom i to atom j\n */\nexport function getShortestPaths(molecule, options = {}) {\n  const OCL = molecule.getOCL();\n  const { fromLabel = '', toLabel = '', maxLength = 3 } = options;\n\n  let fromAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(fromLabel);\n  let toAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(toLabel);\n\n  const nbAtoms = molecule.getAllAtoms();\n  let allShortestPaths = new Array(nbAtoms);\n  for (let i = 0; i < nbAtoms; i++) {\n    allShortestPaths[i] = new Array(nbAtoms);\n  }\n\n  for (let from = 0; from < nbAtoms; from++) {\n    allShortestPaths[from][from] = [from];\n    for (let to = from + 1; to < nbAtoms; to++) {\n      if (\n        (fromAtomicNumber === 0 ||\n          molecule.getAtomicNo(from) === fromAtomicNumber) &&\n        (toAtomicNumber === 0 || molecule.getAtomicNo(to) === toAtomicNumber)\n      ) {\n        let path = [];\n        molecule.getPath(path, from, to, maxLength);\n        if (path.length) {\n          allShortestPaths[from][to] = path.slice();\n          allShortestPaths[to][from] = path.reverse();\n        } else {\n          allShortestPaths[from][to] = null;\n          allShortestPaths[to][from] = null;\n        }\n      } else {\n        allShortestPaths[from][to] = null;\n        allShortestPaths[to][from] = null;\n      }\n    }\n  }\n\n  return allShortestPaths;\n}\n","/**\n * Return the number of Carbonyl groups in a molecule or fragment\n * @param {import('openchemlib').Molecule} molecule\n * @returns {number} 'Number of Carbonyl groups'\n */\n\nexport function nbCHO(molecule) {\n  let counter = 0;\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    // if there is not at least one hydrogen in the carbon atom there can not be a carbonyl group\n    if (molecule.getAtomicNo(i) === 6 && molecule.getAllHydrogens(i) > 0) {\n      let carbonyl = false;\n      let carbonOrHydrogen = true;\n      for (\n        let neighbour = 0;\n        neighbour < molecule.getConnAtoms(i);\n        neighbour++\n      ) {\n        const neighbourAtom = molecule.getConnAtom(i, neighbour);\n\n        const neighbourBond = molecule.getConnBond(i, neighbour);\n        if (molecule.getAtomicNo(neighbourAtom) === 8) {\n          if (molecule.getBondOrder(neighbourBond) === 2) {\n            // If there is more than one carbonyl group on the same carbon atom they are not counted as carbonyl groups\n            if (carbonyl) {\n              carbonyl = false;\n              break;\n            }\n            carbonyl = true;\n          }\n        } else if (\n          // If there is not at least one carbon or hydrogen as neighbour atom it is not counted as Carbonyl group\n          molecule.getAtomicNo(neighbourAtom) !== 6 &&\n          molecule.getAtomicNo(neighbourAtom) !== 1\n        ) {\n          carbonOrHydrogen = false;\n        }\n      }\n      if (carbonyl && carbonOrHydrogen) counter++;\n    }\n  }\n\n  return counter;\n}\n","/**\n * Return the number of Nitrile groups in a molecule or fragment\n * @param {import('openchemlib').Molecule} molecule\n * @returns {number} 'Number of Nitrile groups'\n */\n\nexport function nbCN(molecule) {\n  let counter = 0;\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    if (molecule.getAtomicNo(i) === 6) {\n      let cn = false;\n      let carbonOrHydrogen = true;\n      for (\n        let neighbour = 0;\n        neighbour < molecule.getConnAtoms(i);\n        neighbour++\n      ) {\n        const neighbourAtom = molecule.getConnAtom(i, neighbour);\n\n        const neighbourBond = molecule.getConnBond(i, neighbour);\n\n        if (\n          molecule.getAtomicNo(neighbourAtom) === 7 &&\n          molecule.getBondOrder(neighbourBond) === 3\n        ) {\n          // If there is more than one Nitrile group in the same carbon atome they are not counted as Nitrile groups\n          if (cn) {\n            cn = false;\n            break;\n          }\n          cn = true;\n        } else if (\n          // If there is not at least one carbon or hydrogen as neighbour atom it is not counted as Nitrile group\n          molecule.getAtomicNo(neighbourAtom) !== 6 &&\n          molecule.getAtomicNo(neighbourAtom) !== 1\n        ) {\n          carbonOrHydrogen = false;\n        }\n      }\n\n      if (cn && carbonOrHydrogen) counter++;\n    }\n  }\n\n  return counter;\n}\n","/**\n * Return the number of Carboxyl groups in a molecule or fragment\n * @param {import('openchemlib').Molecule} molecule\n * @returns {number} 'Number of Carboxyl groups'\n */\n\nexport function nbCOOH(molecule) {\n  let counter = 0;\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    if (molecule.getAtomicNo(i) === 6) {\n      let carbonyl = false;\n      let hydroxyl = false;\n      let carbonOrHydrogen = true;\n      for (\n        let neighbour = 0;\n        neighbour < molecule.getConnAtoms(i);\n        neighbour++\n      ) {\n        const neighbourAtom = molecule.getConnAtom(i, neighbour);\n\n        const neighbourBond = molecule.getConnBond(i, neighbour);\n        if (molecule.getAtomicNo(neighbourAtom) === 8) {\n          if (\n            molecule.getBondOrder(neighbourBond) === 1 &&\n            molecule.getAllHydrogens(neighbourAtom) > 0\n          ) {\n            // If there is more than a Hydroxyl in the same carbon atom it is not couted as Carboxyl group\n            if (hydroxyl) {\n              hydroxyl = false;\n              break;\n            }\n            hydroxyl = true;\n          } else if (molecule.getBondOrder(neighbourBond) === 2) {\n            // If there is more than one carbonyl in the same carbon atom it is not count as Carboxyl group\n            if (carbonyl) {\n              carbonyl = false;\n              break;\n            }\n            carbonyl = true;\n          }\n        } else if (\n          // If there is not at least one carbon or hydrogen as neighbour atom it is not counted as Carboxyl group\n          molecule.getAtomicNo(neighbourAtom) !== 6 &&\n          molecule.getAtomicNo(neighbourAtom) !== 1\n        ) {\n          carbonOrHydrogen = false;\n        }\n      }\n      if (carbonyl && hydroxyl && carbonOrHydrogen) counter++;\n    }\n  }\n  return counter;\n}\n","/**\n * Return the number of Primary amine groups in a molecule or fragment\n * @param {import('openchemlib').Molecule} molecule\n * @returns {number} 'Number of Primary amine groups'\n */\n\nexport function nbNH2(molecule) {\n  let counter = 0;\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    if (molecule.getAtomicNo(i) === 6) {\n      let amine = false;\n      let carbonOrHydrogen = true;\n      for (\n        let neighbour = 0;\n        neighbour < molecule.getConnAtoms(i);\n        neighbour++\n      ) {\n        const neighbourAtom = molecule.getConnAtom(i, neighbour);\n\n        const neighbourBond = molecule.getConnBond(i, neighbour);\n\n        if (\n          molecule.getAtomicNo(neighbourAtom) === 7 &&\n          molecule.getBondOrder(neighbourBond) === 1 &&\n          molecule.getAllHydrogens(neighbourAtom) > 1\n        ) {\n          // If there is more than a Primary amine in the same carbon atom they are not couted as Primary amines groups\n          if (amine) {\n            amine = false;\n            break;\n          }\n          amine = true;\n        } else if (\n          // If there is not at least one carbon or hydrogen as neighbour atom it is not counted as Primary amine group\n          molecule.getAtomicNo(neighbourAtom) !== 6 &&\n          molecule.getAtomicNo(neighbourAtom) !== 1\n        ) {\n          carbonOrHydrogen = false;\n        }\n      }\n      if (amine && carbonOrHydrogen) counter++;\n    }\n  }\n\n  return counter;\n}\n","/**\n * Return the number of Hydroxyl groups in a molecule or fragment\n * @param {import('openchemlib').Molecule} molecule\n * @returns {number} 'Number of Hydroxyl groups'\n */\n\nexport function nbOH(molecule) {\n  let counter = 0;\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    if (molecule.getAtomicNo(i) === 6) {\n      let carbonyl = false;\n      let hydroxyl = false;\n      let carbonOrHydrogen = true;\n      for (\n        let neighbour = 0;\n        neighbour < molecule.getConnAtoms(i);\n        neighbour++\n      ) {\n        const neighbourAtom = molecule.getConnAtom(i, neighbour);\n\n        const neighbourBond = molecule.getConnBond(i, neighbour);\n        if (molecule.getAtomicNo(neighbourAtom) === 8) {\n          if (\n            molecule.getBondOrder(neighbourBond) === 1 &&\n            molecule.getAllHydrogens(neighbourAtom) > 0\n          ) {\n            // If there is more than a Hydroxyl in the same carbon atome they are not couted as Hydroxyl groups\n            if (hydroxyl) {\n              hydroxyl = false;\n              break;\n            }\n            hydroxyl = true;\n          } else if (molecule.getBondOrder(neighbourBond) === 2) {\n            // If there is Carbonyl group on the same carbon atom it is not couted as Hydroxyl group\n            carbonyl = true;\n          }\n        } else if (\n          // If there is not at least one carbon or hydrogen as neighbour atom it is not counted as Hydroxyl group\n          molecule.getAtomicNo(neighbourAtom) !== 6 &&\n          molecule.getAtomicNo(neighbourAtom) !== 1\n        ) {\n          carbonOrHydrogen = false;\n        }\n      }\n      if (carbonyl === false && hydroxyl && carbonOrHydrogen) counter++;\n    }\n  }\n\n  return counter;\n}\n","import { getCamelCase } from '../parseDwar';\n\nexport function getParts(text) {\n  const lines = text.split(/\\r?\\n/);\n  let parts = { data: [] };\n  let currentPart = parts.data;\n  let currentLabel = '';\n  for (let line of lines) {\n    if (line.startsWith('</')) {\n      // close existing part\n      if (!currentLabel === line.slice(2, -1)) {\n        throw new Error('This should not happen');\n      }\n      currentLabel = '';\n      currentPart = parts.data;\n    } else if (line.startsWith('<') && !line.includes('=')) {\n      // open new part\n      if (currentLabel) {\n        throw new Error('This should not happen');\n      }\n      currentLabel = line.slice(1, -1);\n      const target = getCamelCase(currentLabel);\n      parts[target] = [];\n      currentPart = parts[target];\n    } else if (currentLabel) {\n      // add line to current part\n      currentPart.push(line);\n    } else {\n      //data lines\n      currentPart.push(line);\n    }\n  }\n  return parts;\n}\n","import { getDiastereotopicAtomIDsAndH } from './getDiastereotopicAtomIDsAndH';\n\n/**\n * Returns a SVG\n * @param {*} molecule\n * @param {*} [options={}]\n */\nexport function toDiastereotopicSVG(molecule, options = {}) {\n  let {\n    width = 300,\n    height = 200,\n    prefix = 'ocl',\n    heavyAtomHydrogen = false,\n  } = options;\n  let svg = options.svg;\n  let diaIDs = [];\n\n  let hydrogenInfo = {};\n  getDiastereotopicAtomIDsAndH(molecule).forEach((line) => {\n    hydrogenInfo[line.oclID] = line;\n  });\n\n  if (heavyAtomHydrogen) {\n    for (let i = 0; i < molecule.getAtoms(); i++) {\n      diaIDs.push([]);\n    }\n    let groupedDiaIDs = molecule.getGroupedDiastereotopicAtomIDs();\n    groupedDiaIDs.forEach((diaID) => {\n      if (\n        hydrogenInfo[diaID.oclID] &&\n        hydrogenInfo[diaID.oclID].nbHydrogens > 0\n      ) {\n        diaID.atoms.forEach((atom) => {\n          hydrogenInfo[diaID.oclID].hydrogenOCLIDs.forEach((id) => {\n            if (!diaIDs[atom * 1].includes(id)) diaIDs[atom].push(id);\n          });\n        });\n      }\n    });\n  } else {\n    diaIDs = molecule.getDiastereotopicAtomIDs().map((a) => [a]);\n  }\n\n  if (!svg) svg = molecule.toSVG(width, height, prefix);\n\n  svg = svg.replace(/Atom:[0-9]+\"/g, (value) => {\n    let atom = value.replace(/[^0-9]/g, '');\n    return `${value} data-diaid=\"${diaIDs[atom].join(',')}\"`;\n  });\n\n  return svg;\n}\n","import { getDiastereotopicAtomIDsAndH } from '../diastereotopic/getDiastereotopicAtomIDsAndH';\nimport { getGroupedDiastereotopicAtomIDs } from '../diastereotopic/getGroupedDiastereotopicAtomIDs';\n\nexport function toVisualizerMolfile(molecule, options = {}) {\n  const { diastereotopic, heavyAtomHydrogen } = options;\n\n  let highlight = [];\n  let atoms = {};\n  if (diastereotopic) {\n    let hydrogenInfo = {};\n    let extendedIDs = getDiastereotopicAtomIDsAndH(molecule);\n    for (let line of extendedIDs) {\n      hydrogenInfo[line.oclID] = line;\n    }\n\n    let diaIDs = getGroupedDiastereotopicAtomIDs(molecule);\n    for (const diaID of diaIDs) {\n      atoms[diaID.oclID] = diaID.atoms;\n      highlight.push(diaID.oclID);\n      if (heavyAtomHydrogen) {\n        if (\n          hydrogenInfo[diaID.oclID] &&\n          hydrogenInfo[diaID.oclID].nbHydrogens > 0\n        ) {\n          for (let id of hydrogenInfo[diaID.oclID].hydrogenOCLIDs) {\n            highlight.push(id);\n            atoms[id] = diaID.atoms;\n          }\n        }\n      }\n    }\n  } else {\n    let size = molecule.getAllAtoms();\n    highlight = new Array(size).fill(0).map((a, index) => index);\n    atoms = highlight.map((a) => [a]);\n  }\n\n  let molfile = {\n    type: 'mol2d',\n    value: molecule.toMolfile(),\n    _highlight: highlight,\n    _atoms: atoms,\n  };\n\n  return molfile;\n}\n"],"names":["xAtomicNumber","tagAtom","molecule","iAtom","customLabel","getAtomLabel","setAtomCustomLabel","getAtomicNo","setAtomicNo","OCL","getOCL","Molecule","getAtomicNoFromLabel","cPseudoAtomX","getXAtomicNumber","setAtomMass","getAtomMass","addDiastereotopicMissingChirality","options","arguments","length","undefined","esrType","cESRTypeAnd","getAllAtoms","tempMolecule","getCompactCopy","ensureHelperArrays","cHelperBitsStereo","i","getAtoms","isAtomStereoCenter","getStereoBond","stereoBond","getAtomPreferredStereoBond","setBondType","cBondTypeUp","getBondAtom","connAtom","setBondAtom","setAtomESR","makeRacemic","cHelperCIP","getAtomParity","cAtomParityNone","getDiastereotopicAtomIDs","numberAtoms","ids","getCanonizedIDCode","CANONIZER_ENCODE_ATOM_CUSTOM_LABELS","getDiastereotopicAtomIDsAndH","addImplicitHydrogens","cHelperNeighbours","diaIDs","newDiaIDs","newDiaID","oclID","hydrogenOCLIDs","nbHydrogens","atom","getConnAtom","heavyAtom","j","getAllConnAtoms","indexOf","push","groupDiastereotopicAtomIDs","atomLabel","diaIDsObject","diaID","counter","atoms","Object","keys","map","key","getGroupedDiastereotopicAtomIDs","isCsp3","atomID","getAtomCharge","getImplicitHydrogens","getConnAtoms","FULL_HOSE_CODE","HOSE_CODE_CUT_C_SP3_SP3","getHoseCodesForAtoms","originalMolecule","rootAtoms","minSphereSize","maxSphereSize","kind","isTagged","tags","rootAtom","addMissingChirality","includes","getAtomCustomLabel","fragment","results","min","max","atomMask","Array","atomList","sphere","newMax","Error","copyMoleculeByAtoms","getHoseCodesForAtom","getHoseCodesFromDiastereotopicID","atomCustomLabel","endsWith","getHoseCodesForPath","from","to","maxLength","originalFrom","originalTo","torsion","originalAtoms","getPath","calculateTorsion","tag1","tag2","fill","hoses","atomMap","MAX_R","appendMolecule","molecules","core","rGroups","currents","newSmiles","smiles","currentMol","fromSmiles","idCode","getIDCode","toSmiles","combinedSmiles","molfile","toMolfile","props","MoleculeProperties","nbHAcceptor","acceptorCount","nbHDonor","donorCount","logP","logS","PSA","polarSurfaceArea","nbRottable","rotatableBondCount","nbStereoCenter","stereoCenterCount","mf","getMolecularFormula","formula","mw","relativeWeight","updateRPosition","replace","level","currentChar","charAt","currentSubstring","substr","match","getAtomsInfo","cHelperRings","result","extra","singleBonds","doubleBonds","tripleBonds","aromaticBonds","cnoHybridation","abnormalValence","getAtomAbnormalValence","charge","cipParity","getAtomCIPParity","color","getAtomColor","atomicNo","label","mass","radical","getAtomRadical","ringBondCount","getAtomRingBondCount","ringSize","getAtomRingSize","x","getAtomX","y","getAtomY","z","getAtomZ","allHydrogens","getAllHydrogens","connAtoms","allConnAtoms","implicitHydrogens","isAromatic","isAromaticAtom","isAllylic","isAllylicAtom","isStereoCenter","isRing","isRingAtom","isSmallRing","isSmallRingAtom","isStabilized","isStabilizedAtom","bond","getConnBond","bondOrder","getBondOrder","isAromaticBond","totalBonds","connectedAtom","hydrogenOnAtomicNo","labileHydrogen","toString","prototype","isAnyArray","value","call","rescale","input","output","TypeError","currentMin","_options$fromIndex","fromIndex","_options$toIndex","toIndex","Number","isInteger","minValue","currentMax","maxValue","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","padMinus","constructor","name","rows","columns","maxI","Math","maxJ","loop","get","line","formatNumber","join","inspectData","num","formatNumber2","padEnd","len","str","fix","toFixed","startsWith","exp","toExponential","slice","checkRowIndex","index","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","array","checkNonEmpty","isEmpty","AbstractMatrix","static","newRows","newColumns","newData","newMatrix","Matrix","row","column","set","random","interval","round","this","zeros","data","l","matrix1","matrix2","checkMatrix","isMatrix","klass","size","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","k","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","m","n","maxRow","p","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","NEGATIVE_INFINITY","maxIndex","v","idx","POSITIVE_INFINITY","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","sqrt","cumulativeSum","sum","dot","vector2","vector1","mmul","other","Bcolj","Float64Array","s","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","r1","c1","r2","c2","embed","mat","cols","r","c","resultat","console","warn","blockMult","a","b","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","last","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","scale","pow","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","super","arrayData","every","element","removeRow","splice","addRow","removeColumn","newRow","addColumn","getConnectivityMatrix","nbAtoms","pathLength","negativeAtomicNo","cRoundedMass","sdt","getConnBondOrder","sdta","bondNumber","adjMatrix","numVertices","distMatrix","val","is","dist","floydWarshall","atomSorter","getMF","entries","getFragments","parts","allAtoms","forEach","entry","toMFString","getFragmentMF","counts","part","mfs","H","getPathAndTorsion","ensureString","blob","ArrayBuffer","isView","encoding","guessEncoding","TextDecoder","decode","uint8","Uint8Array","buffer","byteOffset","byteLength","buf","isutf8","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","abs","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","floor","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","module","exports","f","self","window","document","postMessage","o","test","location","protocol","parse","e","t","dynamicTyping","M","dynamicTypingFunction","transform","worker","WORKERS_SUPPORTED","URL","webkitURL","BLOB_URL","createObjectURL","Blob","Worker","onmessage","_","id","userStep","step","userChunk","chunk","userComplete","complete","userError","error","config","workerId","NODE_STREAM_INPUT","download","readable","read","on","g","File","stream","unparse","delimiter","BAD_DELIMITERS","filter","quotes","isArray","skipEmptyLines","newline","quoteChar","header","escapeChar","escapeFormulae","RegExp","JSON","u","fields","meta","trim","d","Date","stringify","RECORD_SEP","String","fromCharCode","UNIT_SEP","BYTE_ORDER_MARK","LocalChunkSize","RemoteChunkSize","DefaultDelimiter","Parser","E","ParserHandle","NetworkStreamer","FileStreamer","StringStreamer","ReadableStreamStreamer","jQuery","fn","each","prop","toUpperCase","attr","toLowerCase","FileReader","files","file","inputElem","instanceConfig","extend","before","action","reason","_handle","_finished","_completed","_halted","_input","_baseIndex","_partialLine","_rowCount","_start","_nextChunk","isFirstChunk","_completeResults","errors","w","chunkSize","streamer","_config","parseChunk","beforeFirstChunk","paused","aborted","cursor","substring","preview","WORKER_ID","finished","concat","_sendError","_readChunk","_chunkLoaded","XMLHttpRequest","withCredentials","onload","onerror","_chunkError","open","downloadRequestBody","downloadRequestHeaders","setRequestHeader","send","message","status","readyState","responseText","getResponseHeader","lastIndexOf","statusText","webkitSlice","mozSlice","FileReaderSync","readAsText","target","pause","resume","_streamData","_streamEnd","_streamError","_checkIsFinished","shift","_streamCleanUp","removeListener","abort","transformHeader","parseFloat","code","split","comments","successful","bestDelimiter","delimitersToGuess","getCharIndex","setTimeout","S","O","I","T","D","A","fastMode","L","F","C","R","linebreak","truncated","terminate","create","getMoleculeCreators","Map","fromIDCode","fromMolfile","defaultCSVOptions","getMolecule","sdfPart","labels","currentLabels","eol","lines","isNumeric","keep","exclude","include","modifiers","modifier","modifiedValue","async","appendSDF","moleculesDB","sdf","onStep","parsed","mixedEOL","entriesBoundaries","string","res","previous","next","nextMatch","getEntriesBoundaries","start","now","currentLabel","Infinity","always","statistics","statistic","time","pushEntry","noWait","Promise","resolve","setImmediate","AbortError","getQuery","query","format","moleculeCreators","search","mode","exactSearch","resetFragment","queryMW","searchResult","substructureSearchBegin","queryIndex","getIndex","searcher","setFragment","db","setMolecule","isFragmentInMolecule","substructureSearchEnd","subStructureSearch","similaritySearch","processResult","searchAsync","controller","shouldAbort","abortEventListener","signal","addEventListener","begin","performance","subStructureSearchAsync","queryIDCode","isFragment","getMW","properties","queryIdCode","similarity","MAX_SAFE_INTEGER","SSSearcherWithIndex","getSimilarityTanimoto","flattenResult","keepMolecule","limit","parseColumnbProperties","columnProperties","currentColumnName","columnPropery","parent","related","specialType","valueEhnhancer","rawEntry","atomMapping","idcoordinates2D","getCamelCase","parseDefault","getInfo","moleculesInfo","has","reactantInfo","applyOneReactantReaction","reactants","reactions","currentDepth","maxDepth","processedMolecules","todoNextDepth","reactant","reaction","reactor","Reactor","oclReaction","Boolean","setReactant","oneReactionProducts","getProducts","products","moleculeInfo","children","reactionWithoutOCL","oneReaction","computeProperties","appendCSV","csv","Papa","stats","firstElement","moleculeCreator","moleculeField","lowerField","appendSmilesList","text","smilesArray","oneSmiles","moleculeIDCode","molecularFormula","em","absoluteWeight","pushMoleculeInfo","coordinates","getDB","appendColor","dataLabel","propertyLabel","minHue","maxHue","saturation","lightness","colorLabel","values","datum","flat","definedValues","Set","rxnCode","ReactionEncoder","appendOCLReaction","todoCurrentLevel","nexts","todo","coreSmiles","fragments","complexity","originalSmiles","getCore","group","getRGroups","rGroup","getComplexity","sizes","position","generate","links","bonds","getAllBonds","order","atom1","atom2","getBondType","isRingBond","selected","brokenMolecule","markBondForDeletion","deleteMarkedAtomsAndBonds","fragmentMap","nbFragments","getFragmentNumbers","includeAtom","addBond","addAtom","currentSphere","fromMolfileWithAtomMap","diaIDsArray","source","destination","hose","fromLabel","toLabel","minLength","withHOSES","fromAtomicNumber","toAtomicNumber","atomsInfo","pathLengthMatrix","paths","allShortestPaths","path","reverse","carbonyl","carbonOrHydrogen","neighbour","neighbourAtom","neighbourBond","cn","hydroxyl","amine","currentPart","getParts","headers","rawEntries","parseData","rawData","improveParts","width","height","prefix","heavyAtomHydrogen","svg","hydrogenInfo","toSVG","diastereotopic","highlight","extendedIDs","_highlight","_atoms"],"mappings":"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"}