{"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/src/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/getPathsInfo.js","../node_modules/ensure-string/lib-esm/index.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/hose/getHoseCodesAndDiastereotopicIDs.js","../src/path/getShortestPaths.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.keys(diaIDsObject).map((key) => diaIDsObject[key]);\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\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","import isArray from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(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 default max;\n","import isArray from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isArray(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 default min;\n","import isArray 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 (!isArray(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 (!isArray(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","/**\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 checkIndices(matrix, rowIndices, columnIndices) {\n  return {\n    row: checkRowIndices(matrix, rowIndices),\n    column: checkColumnIndices(matrix, columnIndices),\n  };\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (typeof rowIndices !== 'object') {\n    throw new TypeError('unexpected type for row indices');\n  }\n\n  let rowOut = rowIndices.some((r) => {\n    return r < 0 || r >= matrix.rows;\n  });\n\n  if (rowOut) {\n    throw new RangeError('row indices are out of range');\n  }\n\n  if (!Array.isArray(rowIndices)) rowIndices = Array.from(rowIndices);\n\n  return rowIndices;\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (typeof columnIndices !== 'object') {\n    throw new TypeError('unexpected type for column indices');\n  }\n\n  let columnOut = columnIndices.some((c) => {\n    return c < 0 || c >= matrix.columns;\n  });\n\n  if (columnOut) {\n    throw new RangeError('column indices are out of range');\n  }\n  if (!Array.isArray(columnIndices)) columnIndices = Array.from(columnIndices);\n\n  return columnIndices;\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 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  checkIndices,\n  checkNonEmpty,\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    let indices = checkIndices(this, rowIndices, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < indices.row.length; i++) {\n      let rowIndex = indices.row[i];\n      for (let j = 0; j < indices.column.length; j++) {\n        let columnIndex = indices.column[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 (!Array.isArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!Array.isArray(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 (!Array.isArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!Array.isArray(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 (!Array.isArray(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 (!Array.isArray(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 (Array.isArray(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) {\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","import { getHoseCodesForPath } from '../hose/getHoseCodesForPath';\nimport { getAtomsInfo } from '../util/getAtomsInfo';\nimport { getConnectivityMatrix } from '../util/getConnectivityMatrix';\n\nlet fragment;\n\n/**\n *\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.minLength=1]\n * @param {string} [opions.maxLength=4]\n\n */\nexport function getPathsInfo(molecule, options = {}) {\n  const {\n    fromLabel = 'H',\n    toLabel = 'H',\n    minLength = 1,\n    maxLength = 4,\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              atomsInfo[from].paths.push(\n                getHoseCodesForPath(\n                  molecule,\n                  from,\n                  to,\n                  pathLength,\n                  atomsInfo[to].oclID,\n                ),\n              );\n            }\n          }\n        }\n      }\n    }\n  }\n\n  return atomsInfo;\n}\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    return 'utf-8';\n}\n//# sourceMappingURL=index.js.map","/* @license\nPapa Parse\nv5.3.1\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&&(o=t.escapeFormulae)}();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),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);!0===o&&\"string\"==typeof e&&null!==e.match(/^[=+\\-@].*$/)&&(e=\"'\"+e);var i=e.toString().replace(h,a),r=\"boolean\"==typeof n&&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}(i,b.BAD_DELIMITERS)||-1<i.indexOf(m)||\" \"===i.charAt(0)||\" \"===i.charAt(i.length-1);return r?s+i+s:i}}};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(){if(c&&h&&(k(\"Delimiter\",\"UndetectableDelimiter\",\"Unable to auto-detect delimiting character; defaulted to '\"+b.DefaultDelimiter+\"'\"),h=!1),m.skipEmptyLines)for(var e=0;e<c.data.length;e++)y(c.data[e])&&c.data.splice(e--,1);return _()&&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?'\"':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[m+1+y]===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 { getEntriesBoundaries } from './getEntriesBoundaries';\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  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 {text|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 {text|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 {text|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 netry 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 { 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","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","keys","map","key","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","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","object","call","input","arguments","undefined","isArray","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","checkRowIndices","rowIndices","some","r","checkColumnIndices","columnIndices","c","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","value","array","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newData","newMatrix","Matrix","row","column","set","random","interval","round","this","zeros","data","l","matrix1","matrix2","checkMatrix","isMatrix","klass","size","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","k","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","m","n","maxRow","p","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","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","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","checkIndices","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","arrayData","removeRow","splice","addRow","removeColumn","newRow","addColumn","floydWarshall","adjMatrix","numVertices","distMatrix","val","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","ensureString","blob","ArrayBuffer","isView","encoding","guessEncoding","TextDecoder","decode","uint8","Uint8Array","buffer","byteOffset","byteLength","module","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","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","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","values","datum","flat","definedValues","links","bonds","getAllBonds","order","atom1","atom2","getBondType","isRingBond","selected","brokenMolecule","markBondForDeletion","deleteMarkedAtomsAndBonds","fragmentMap","nbFragments","getFragmentNumbers","includeAtom","addBond","addAtom","hose","fromLabel","toLabel","minLength","fromAtomicNumber","toAtomicNumber","atomsInfo","pathLengthMatrix","paths","allShortestPaths","path","reverse","width","height","prefix","heavyAtomHydrogen","svg","hydrogenInfo","toSVG","diastereotopic","highlight","extendedIDs","_highlight","_atoms"],"mappings":"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"}