{"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/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-max/lib-es6/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-rescale/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","../node_modules/ml-floyd-warshall/src/index.js","../src/util/getConnectivityMatrix.js","../node_modules/ml-matrix/src/mathOperations.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/papaparse/papaparse.min.js","../src/db/utils/getMoleculeCreators.js","../src/db/utils/appendCSV.js","../node_modules/sdf-parser/src/getEntriesBoundaries.js","../node_modules/sdf-parser/src/parse.js","../src/db/utils/search.js","../src/db/MoleculesDB.js","../src/db/utils/appendSDF.js","../src/db/utils/appendSmilesList.js","../src/db/utils/pushEntry.js","../src/db/utils/pushMoleculeInfo.js","../src/db/utils/appendColor.js","../src/fragment/fragmentAcyclicSingleBonds.js","../src/features/getAtomFeatures.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/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 {OCL.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('X');\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 {OCL.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 {OCL.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 {OCL.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// Previously getExtendedDiastereotopicAtomIDs\n\n/**\n *\n * @param {OCL.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","import { getDiastereotopicAtomIDs } from './getDiastereotopicAtomIDs';\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 {OCL.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  const { atomLabel } = options;\n  let diaIDs = getDiastereotopicAtomIDs(molecule, options);\n  let 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.values(diaIDsObject);\n}\n","/**\n * Check if a specific atom is a sp3 carbon\n * @param {OCL.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 {OCL.Molecule} originalMolecule\n * @param {array<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 {OCL.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 {OCL.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 {OCL.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 {OCL} [OCL] The 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 {OCL.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';\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","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';\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","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 { maxRows = 15, maxColumns = 10, maxNumSize = 8 } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\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));\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) {\n  const numStr = String(num);\n  if (numStr.length <= maxNumSize) {\n    return numStr.padEnd(maxNumSize, ' ');\n  }\n  const precise = num.toPrecision(maxNumSize - 2);\n  if (precise.length <= maxNumSize) {\n    return precise;\n  }\n  const exponential = num.toExponential(maxNumSize - 2);\n  const eIndex = exponential.indexOf('e');\n  const e = exponential.slice(eIndex);\n  return exponential.slice(0, maxNumSize - e.length) + e;\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() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(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        }\n      }\n    }\n    return v;\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() {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(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        }\n      }\n    }\n    return v;\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\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        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 { 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 default 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","import floydWarshall from 'ml-floyd-warshall';\nimport { Matrix } from 'ml-matrix';\n\n/**\n * Returns a connectivity matrix\n * @param {OCL.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","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","'use strict';\n\nfunction 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\nmodule.exports = atomSorter;\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 {OCL.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 {OCL.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","/* @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 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      previous = next =\n        string.indexOf(eol, next + substring.length) + eol.length;\n    } else {\n      res.push([previous, string.length]);\n    }\n  }\n  return res;\n}\n","import { ensureString } from 'ensure-string';\n\nimport { getEntriesBoundaries } from './getEntriesBoundaries';\n/**\n *  Parse a SDF file\n * @param {string|ArrayBuffer|Uint8Array} sdf SDF file to parse\n * @param {any} [options={}]\n * @param {array<string>} [options.include] List of fields to include\n * @param {array<string>} [options.exclude] List of fields to exclude\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 */\nexport function parse(sdf, options = {}) {\n  const {\n    include,\n    exclude,\n    filter,\n    modifiers = {},\n    forEach = {},\n    dynamicTyping = true,\n  } = options;\n\n  sdf = ensureString(sdf);\n  if (typeof sdf !== 'string') {\n    throw new TypeError('Parameter \"sdf\" must be a string');\n  }\n\n  let 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      eol = '\\r\\n';\n    } else if (header.indexOf('\\r') > -1) {\n      eol = '\\r';\n    }\n  }\n\n  let entriesBoundaries = getEntriesBoundaries(sdf, `${eol}$$$$`, eol);\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    let parts = sdfPart.split(`${eol}>`);\n    if (parts.length > 0 && parts[0].length > 5) {\n      let molecule = {};\n      let currentLabels = [];\n      molecule.molfile = parts[0] + eol;\n      for (let j = 1; j < parts.length; j++) {\n        let lines = parts[j].split(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: dynamicTyping,\n            keep: false,\n          };\n          if (\n            (!exclude || exclude.indexOf(label) === -1) &&\n            (!include || include.indexOf(label) > -1)\n          ) {\n            labels[label].keep = true;\n            if (modifiers[label]) {\n              labels[label].modifier = modifiers[label];\n            }\n            if (forEach[label]) {\n              labels[label].forEach = 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] += 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 (\n              !isFinite(molecule[label]) ||\n              molecule[label].match(/^0[0-9]/)\n            ) {\n              labels[label].isNumeric = false;\n            }\n          }\n        }\n      }\n      if (!filter || 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  }\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: molecules,\n    labels: Object.keys(labels),\n    statistics: statistics,\n  };\n}\n","import getMoleculeCreators from './getMoleculeCreators';\n\nexport default function search(moleculesDB, query, options = {}) {\n  const {\n    format = 'idCode',\n    mode = 'substructure',\n    flattenResult = true,\n    keepMolecule = false,\n    limit = Number.MAX_SAFE_INTEGER,\n  } = 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\n  let result;\n  switch (mode.toLowerCase()) {\n    case 'exact':\n      result = exactSearch(moleculesDB, query, limit);\n      break;\n    case 'substructure':\n      result = subStructureSearch(moleculesDB, query, limit);\n      break;\n    case 'similarity':\n      result = similaritySearch(moleculesDB, query, limit);\n      break;\n    default:\n      throw new Error(`unknown search mode: ${options.mode}`);\n  }\n  return processResult(result, { flattenResult, keepMolecule, limit });\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 subStructureSearch(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  } else {\n    const queryIndex = query.getIndex();\n    const searcher = moleculesDB.searcher;\n\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  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 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","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 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 {OCL} [OCL] The 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 {OCL.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   * 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';\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\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","export 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] =\n        `hsl(${\n        Math.floor(\n          ((value.value - min) / (max - min)) * (maxHue - minHue) + minHue,\n        )\n        },${\n        saturation\n        }%,${\n        lightness\n        }%)`;\n    } else {\n      value.data.color = 'black';\n    }\n  }\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) {\n  const OCL = originalMolecule.getOCL();\n\n  let sphere = 1;\n  let fragment = new OCL.Molecule(0, 0);\n  let 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 { 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 {OCL.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 {OCL.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 {OCL.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 {OCL.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 {OCL.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 {OCL.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 {OCL.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 { 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","getXAtomicNumber","setAtomMass","getAtomMass","addDiastereotopicMissingChirality","options","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","length","newDiaID","oclID","hydrogenOCLIDs","nbHydrogens","atom","getConnAtom","heavyAtom","j","getAllConnAtoms","indexOf","push","getGroupedDiastereotopicAtomIDs","atomLabel","diaIDsObject","diaID","counter","atoms","Object","values","isCsp3","atomID","getAtomCharge","getImplicitHydrogens","getConnAtoms","FULL_HOSE_CODE","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","getComplexity","rGroups","complexity","rGroup","smiles","async","generate","core","onStep","molecules","sizes","currents","position","appendMolecule","keys","map","key","sort","m1","m2","mw","newSmiles","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","relativeWeight","getCore","coreSmiles","originalSmiles","replace","getRGroups","fragments","updateRPosition","group","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","input","arguments","undefined","TypeError","_options$fromIndex","fromIndex","_options$toIndex","toIndex","Number","isInteger","maxValue","minValue","rescale","output","currentMin","currentMax","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","matrix","maxRows","maxColumns","maxNumSize","constructor","name","inspectData","rows","columns","maxI","Math","maxJ","line","formatNumber","get","join","num","numStr","String","padEnd","precise","toPrecision","exponential","toExponential","eIndex","e","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","rowVector","columnVector","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","setRow","row1","row2","temp","getColumn","getColumnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","NaN","v","maxIndex","idx","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","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","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","by","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","removeRow","splice","addRow","removeColumn","newRow","addColumn","floydWarshall","adjMatrix","numVertices","distMatrix","val","is","POSITIVE_INFINITY","dist","getConnectivityMatrix","nbAtoms","pathLength","negativeAtomicNo","cRoundedMass","sdt","getConnBondOrder","sdta","bondNumber","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","exp","expm1","floor","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","getMF","entries","getFragments","parts","allAtoms","forEach","entry","toMFString","getFragmentMF","counts","part","mfs","H","atomSorter","getPathAndTorsion","ensureString","blob","ArrayBuffer","isView","encoding","guessEncoding","TextDecoder","decode","uint8","Uint8Array","buffer","byteOffset","byteLength","buf","len","isutf8","module","exports","f","self","window","document","postMessage","o","test","location","protocol","parse","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","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","getEntriesBoundaries","string","eol","res","previous","next","sdf","include","exclude","modifiers","mixedEOL","entriesBoundaries","labels","start","now","sdfPart","currentLabels","lines","isNumeric","keep","modifier","modifiedValue","currentLabel","Infinity","always","statistics","statistic","time","exactSearch","moleculesDB","query","queryIDCode","db","subStructureSearch","resetFragment","isFragment","setFragment","queryMW","getMW","searchResult","queryIndex","getIndex","searcher","setMolecule","isFragmentInMolecule","properties","similaritySearch","queryIdCode","similarity","MAX_SAFE_INTEGER","SSSearcherWithIndex","getSimilarityTanimoto","processResult","flattenResult","keepMolecule","limit","computeProperties","appendCSV","csv","moleculeCreators","parsed","Papa","stats","firstElement","moleculeCreator","moleculeField","lowerField","has","pushEntry","appendSDF","appendSmilesList","text","smilesArray","oneSmiles","moleculeInfo","moleculeIDCode","molecularFormula","em","absoluteWeight","pushMoleculeInfo","coordinates","search","format","mode","getDB","appendColor","dataLabel","propertyLabel","minHue","maxHue","saturation","lightness","colorLabel","datum","flat","definedValues","links","bonds","getAllBonds","order","atom1","atom2","getBondType","isRingBond","selected","brokenMolecule","markBondForDeletion","deleteMarkedAtomsAndBonds","fragmentMap","nbFragments","getFragmentNumbers","includeAtom","addBond","addAtom","currentSphere","hose","fromLabel","toLabel","minLength","withHOSES","fromAtomicNumber","toAtomicNumber","atomsInfo","pathLengthMatrix","paths","allShortestPaths","path","reverse","carbonyl","carbonOrHydrogen","neighbour","neighbourAtom","neighbourBond","cn","hydroxyl","amine","width","height","prefix","heavyAtomHydrogen","svg","hydrogenInfo","toSVG","diastereotopic","highlight","extendedIDs","_highlight","_atoms"],"mappings":"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"}