{"version":3,"file":"openchemlib-utils.min.js","sources":["../lib/util/getXAtomicNumber.js","../lib/util/isCsp3.js","../lib/util/makeRacemic.js","../lib/util/tagAtom.js","../lib/hose/getHoseCodesForAtomsInternal.js","../node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-matrix/matrix.js","../node_modules/ml-matrix/matrix.mjs","../lib/util/getConnectivityMatrix.js","../node_modules/ml-floyd-warshall/lib-esm/index.js","../lib/diastereotopic/getChiralOrHeterotopicCarbons.js","../lib/diastereotopic/ensureHeterotopicChiralBonds.js","../lib/topic/TopicMolecule.js","../lib/path/getAllAtomsPaths.js","../lib/topic/getMoleculeWithH.js","../lib/topic/getXMolecule.js","../lib/topic/getCanonizedDiaIDs.js","../lib/topic/getCanonizedHoseCodes.js","../lib/topic/getDiaIDsAndInfo.js","../lib/topic/getHeterotopicSymmetryRanks.js","../lib/util/getSymmetryRanks.js","../lib/diastereotopic/getDiastereotopicAtomIDs.js","../lib/diastereotopic/getDiastereotopicAtomIDsAndH.js","../lib/diastereotopic/getGroupedDiastereotopicAtomIDs.js","../lib/diastereotopic/groupDiastereotopicAtomIDs.js","../lib/hose/getHoseCodesForAtoms.js","../lib/hose/getHoseCodesForPath.js","../lib/polymer/createPolymer.js","../lib/util/combineSmiles.js","../node_modules/ensure-string/lib-esm/index.js","../node_modules/isutf8/dist/index.esm.js","../lib/util/dwar/utils/parseColumnbProperties.js","../lib/util/dwar/utils/parseData.js","../lib/util/dwar/parseDwar.js","../lib/util/getAtomsInfo.js","../node_modules/atom-sorter/lib/src/index.js","../lib/util/getMF.js","../lib/util/getUnsaturation.js","../lib/util/getNMRHints.js","../lib/util/getProperties.js","../lib/path/getPathsInfo.js","../lib/util/getAtoms.js","../lib/path/getPathAndTorsion.js","../node_modules/papaparse/papaparse.min.js","../lib/db/utils/getMoleculeCreators.js","../lib/db/utils/appendCSV.js","../node_modules/get-value/dist/index.mjs","../node_modules/sdf-parser/src/util/getMolecule.js","../lib/db/utils/appendSDF.js","../node_modules/sdf-parser/src/parse.js","../node_modules/sdf-parser/src/getEntriesBoundaries.js","../node_modules/@lukeed/uuid/dist/index.mjs","../lib/db/utils/pushEntry.js","../lib/util/noWait.js","../lib/db/utils/search.js","../lib/util/getRAtomicNumber.js","../lib/reaction/utils/checkIfExistsOrAddInfo.js","../lib/reaction/utils/applyOneReactantReactions.js","../lib/reaction/utils/getFilteredTrees.js","../lib/reaction/utils/getLeaves.js","../lib/reaction/utils/getNodes.js","../lib/reaction/Reactions.js","../lib/reaction/utils/appendOCLReaction.js","../lib/db/MoleculesDB.js","../lib/db/utils/appendEntries.js","../lib/db/utils/appendSmilesList.js","../lib/db/utils/pushMoleculeInfo.js","../lib/db/utils/appendColor.js","../lib/fragment/fragmentAcyclicSingleBonds.js","../lib/features/getAtomFeatures.js","../lib/util/getCharge.js","../lib/diastereotopic/getDiastereotopicAtomIDsFromMolfile.js","../lib/hose/getHoseCodes.js","../lib/hose/getHoseCodesAndInfo.js","../lib/hose/getHoseCodesForAtom.js","../lib/hose/getHoseCodesFromDiastereotopicID.js","../lib/util/getImplicitHydrogensCount.js","../lib/util/getMolfilesMapping.js","../lib/util/getNextNMRHint.js","../lib/path/getShortestPaths.js","../lib/util/nbCHO.js","../lib/util/nbCN.js","../lib/util/nbCOOH.js","../lib/util/nbLabileH.js","../lib/util/nbNH2.js","../lib/util/nbOH.js","../lib/util/dwar/utils/getParts.js","../lib/util/dwar/utils/getCamelCase.js","../lib/diastereotopic/toDiastereotopicSVG.js","../lib/util/toVisualizerMolfile.js","../lib/util/toggleHydrogens.js"],"sourcesContent":["let xAtomicNumber = 0;\n/**\n * Returns the atomic number of the X atom\n * @param {import('openchemlib').Molecule} molecule - An instance of a molecule\n * @returns\n */\nexport function getXAtomicNumber(molecule) {\n    if (!xAtomicNumber) {\n        const OCL = molecule.getOCL();\n        xAtomicNumber = OCL.Molecule.getAtomicNoFromLabel('X', OCL.Molecule.cPseudoAtomX);\n    }\n    return xAtomicNumber;\n}\n//# sourceMappingURL=getXAtomicNumber.js.map","/**\n * Check if a specific atom is a sp3 carbon\n * @param {import('openchemlib').Molecule} molecule\n * @param {number} atomID\n */\nexport function isCsp3(molecule, atomID) {\n    if (molecule.getAtomicNo(atomID) !== 6)\n        return false;\n    if (molecule.getAtomCharge(atomID) !== 0)\n        return false;\n    if (molecule.getImplicitHydrogens(atomID) + molecule.getConnAtoms(atomID) !==\n        4) {\n        return false;\n    }\n    return true;\n}\n//# sourceMappingURL=isCsp3.js.map","/**\n * This method put all the chiral centers in the molecule in the same group and racemic\n * @param {import('openchemlib').Molecule} molecule - An instance of a molecule\n * @param {object} [options={}]\n * @param {object} [options.OCL] - openchemlib library\n */\nexport function makeRacemic(molecule) {\n    const { Molecule } = molecule.getOCL();\n    // if we don't calculate this we have 2 epimers\n    molecule.ensureHelperArrays(Molecule.cHelperCIP);\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    // after the change we need to recalculate the CIP\n    molecule.ensureHelperArrays(Molecule.cHelperCIP);\n}\n//# sourceMappingURL=makeRacemic.js.map","import { getXAtomicNumber } from './getXAtomicNumber.js';\n/**\n * Tag an atom to be able to visualize it\n * @param molecule\n * @param iAtom\n */\nexport function tagAtom(molecule, iAtom) {\n    const customLabel = `${molecule.getAtomLabel(iAtom)}*`;\n    molecule.setAtomCustomLabel(iAtom, customLabel);\n    if (molecule.getAtomicNo(iAtom) === 1) {\n        molecule.setAtomicNo(iAtom, getXAtomicNumber(molecule));\n    }\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//# sourceMappingURL=tagAtom.js.map","import { getXAtomicNumber } from '../util/getXAtomicNumber.js';\nimport { isCsp3 } from '../util/isCsp3.js';\nimport { makeRacemic } from '../util/makeRacemic.js';\nimport { tagAtom } from '../util/tagAtom.js';\nexport const FULL_HOSE_CODE = 1;\nexport const HOSE_CODE_CUT_C_SP3_SP3 = 2;\n/**\n * Returns the hose code for specific atom numbers\n * @param {import('openchemlib').Molecule} molecule - The OCL molecule with expandedImplicitHydrogens and ensureHeterotopicChiralBonds\n * @param {object} [options={}]\n * @param {string[]} [options.allowedCustomLabels] - Array of the custom labels that are considered as root atoms. By default all atoms having a customLabel\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 getHoseCodesForAtomsInternal(molecule, options = {}) {\n    const fragments = getHoseCodesForAtomsAsFragments(molecule, options);\n    const OCL = molecule.getOCL();\n    const hoses = [];\n    for (const fragment of fragments) {\n        hoses.push(fragment.getCanonizedIDCode(OCL.Molecule.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS));\n    }\n    return hoses;\n}\nexport function getHoseCodesForAtomsAsFragments(molecule, options = {}) {\n    const OCL = molecule.getOCL();\n    const { allowedCustomLabels, minSphereSize = 0, maxSphereSize = 4, kind = FULL_HOSE_CODE, tagAtoms = [], tagAtomFct = tagAtom, } = options;\n    const rootAtoms = options.rootAtoms ? options.rootAtoms.slice() : [];\n    molecule = molecule.getCompactCopy();\n    if (tagAtoms.length > 0) {\n        internalTagAtoms(molecule, tagAtoms, rootAtoms, tagAtomFct);\n    }\n    else {\n        // this force reordering of atoms in order to have hydrogens at the end\n        molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n    }\n    if (rootAtoms.length === 0) {\n        for (let j = 0; j < molecule.getAllAtoms(); j++) {\n            if (allowedCustomLabels?.includes(molecule.getAtomCustomLabel(j)) ||\n                molecule.getAtomCustomLabel(j)) {\n                rootAtoms.push(j);\n            }\n        }\n    }\n    const fragments = [];\n    const fragment = new OCL.Molecule(0, 0);\n    // keep track of the atoms when creating the fragment\n    const mappings = [];\n    let min = 0;\n    let max = 0;\n    const atomMask = new Uint8Array(molecule.getAllAtoms());\n    const atomList = new Uint8Array(molecule.getAllAtoms());\n    for (let sphere = 0; sphere <= maxSphereSize; sphere++) {\n        if (max === 0) {\n            for (const rootAtom of rootAtoms) {\n                atomList[max] = rootAtom;\n                atomMask[rootAtom] = true;\n                max++;\n            }\n        }\n        else {\n            let newMax = max;\n            for (let i = min; i < max; i++) {\n                const atom = atomList[i];\n                for (let j = 0; j < molecule.getAllConnAtoms(atom); j++) {\n                    const 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        if (sphere >= minSphereSize) {\n            molecule.copyMoleculeByAtoms(fragment, atomMask, true, mappings);\n            // we using atomMapNo field in order to keep track of the original atom number even if we remove hydrogens\n            for (let i = 0; i < fragment.getAllAtoms(); i++) {\n                fragment.setAtomMapNo(i, mappings.indexOf(i) + 1);\n            }\n            fragment.removeExplicitHydrogens();\n            makeRacemic(fragment);\n            // we encode atom characteristics in the query features\n            addQueryFeaturesAndRemoveMapNo(fragment, molecule);\n            fragments.push(fragment.getCompactCopy());\n        }\n    }\n    return fragments;\n}\n/**\n * If the atom is not an halogen, X or an hydrogen\n * we add query features to the atom\n * This includes aromaticity, ring size, number of hydrogens\n * @param {import('openchemlib').Molecule} fragment\n * @param {import('openchemlib').Molecule} molecule\n */\nfunction addQueryFeaturesAndRemoveMapNo(fragment, molecule) {\n    const Molecule = molecule.getOCL().Molecule;\n    for (let i = 0; i < fragment.getAllAtoms(); i++) {\n        const mapping = fragment.getAtomMapNo(i) - 1;\n        fragment.setAtomMapNo(i, 0);\n        if ([1, 9, 17, 35, 53, getXAtomicNumber(molecule)].includes(fragment.getAtomicNo(i))) {\n            continue;\n        }\n        // aromaticity\n        const isAromatic = molecule.isAromaticAtom(mapping);\n        if (isAromatic) {\n            fragment.setAtomQueryFeature(i, Molecule.cAtomQFAromatic, true);\n            fragment.setAtomQueryFeature(i, Molecule.cAtomQFNotAromatic, false);\n        }\n        else {\n            fragment.setAtomQueryFeature(i, Molecule.cAtomQFAromatic, false);\n            fragment.setAtomQueryFeature(i, Molecule.cAtomQFNotAromatic, true);\n        }\n        // cycles\n        const smallestRing = molecule.getAtomRingSize(mapping);\n        switch (smallestRing) {\n            case 0:\n                break;\n            case 3:\n                fragment.setAtomQueryFeature(i, Molecule.cAtomQFRingSize3, true);\n                break;\n            case 4:\n                fragment.setAtomQueryFeature(i, Molecule.cAtomQFRingSize4, true);\n                break;\n            case 5:\n                fragment.setAtomQueryFeature(i, Molecule.cAtomQFRingSize5, true);\n                break;\n            case 6:\n                fragment.setAtomQueryFeature(i, Molecule.cAtomQFRingSize6, true);\n                break;\n            case 7:\n                fragment.setAtomQueryFeature(i, Molecule.cAtomQFRingSize7, true);\n                break;\n            default:\n                fragment.setAtomQueryFeature(i, Molecule.cAtomQFRingSizeLarge, true);\n        }\n        const nbHydrogens = molecule.getAllHydrogens(mapping);\n        if (nbHydrogens === 0) {\n            fragment.setAtomQueryFeature(i, Molecule.cAtomQFNot0Hydrogen, false);\n        }\n        else {\n            fragment.setAtomQueryFeature(i, Molecule.cAtomQFNot0Hydrogen, true);\n        }\n        if (nbHydrogens === 1) {\n            fragment.setAtomQueryFeature(i, Molecule.cAtomQFNot1Hydrogen, false);\n        }\n        else {\n            fragment.setAtomQueryFeature(i, Molecule.cAtomQFNot1Hydrogen, true);\n        }\n        if (nbHydrogens === 2) {\n            fragment.setAtomQueryFeature(i, Molecule.cAtomQFNot2Hydrogen, false);\n        }\n        else {\n            fragment.setAtomQueryFeature(i, Molecule.cAtomQFNot2Hydrogen, true);\n        }\n        if (nbHydrogens === 3) {\n            fragment.setAtomQueryFeature(i, Molecule.cAtomQFNot3Hydrogen, false);\n        }\n        else {\n            fragment.setAtomQueryFeature(i, Molecule.cAtomQFNot3Hydrogen, true);\n        }\n    }\n}\n// tagging atoms may change the order of the atoms because hydrogens must be at the end of the file\n// in order to remember the rootAtoms we will tag before\nfunction internalTagAtoms(molecule, tagAtoms, rootAtoms, tagAtomFct) {\n    const OCL = molecule.getOCL();\n    if (tagAtoms) {\n        for (let i = 0; i < molecule.getAllAtoms(); i++) {\n            molecule.setAtomMapNo(i, i + 1);\n        }\n        if (tagAtoms.length > 0) {\n            for (const atom of tagAtoms) {\n                tagAtomFct(molecule, atom);\n            }\n        }\n    }\n    // this force reordering of atoms in order to have hydrogens at the end\n    molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n    if (rootAtoms.length > 0) {\n        const mapping = new Int32Array(molecule.getAllAtoms());\n        for (let i = 0; i < molecule.getAllAtoms(); i++) {\n            mapping[molecule.getAtomMapNo(i) - 1] = i;\n        }\n        for (let i = 0; i < rootAtoms.length; i++) {\n            rootAtoms[i] = mapping[rootAtoms[i]];\n        }\n    }\n}\n//# sourceMappingURL=getHoseCodesForAtomsInternal.js.map","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n *\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n    const tag = toString.call(value);\n    return tag.endsWith('Array]') && !tag.includes('Big');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isAnyArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport { rescale as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport { max as default };\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar isAnyArray = require('is-any-array');\nvar rescale = require('ml-array-rescale');\n\nconst indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\n/**\n * @this {Matrix}\n * @returns {string}\n */\nfunction inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nfunction inspectMatrixWithOptions(matrix, options = {}) {\n  const {\n    maxRows = 15,\n    maxColumns = 10,\n    maxNumSize = 8,\n    padMinus = 'auto',\n  } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n\n  if (padMinus === 'auto') {\n    padMinus = false;\n    loop: for (let i = 0; i < maxI; i++) {\n      for (let j = 0; j < maxJ; j++) {\n        if (matrix.get(i, j) < 0) {\n          padMinus = true;\n          break loop;\n        }\n      }\n    }\n  }\n\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n  return (\n    num >= 0 && padMinus\n      ? ` ${formatNumber2(num, maxNumSize - 1)}`\n      : formatNumber2(num, maxNumSize)\n  ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n  // small.length numbers should be as is\n  let str = num.toString();\n  if (str.length <= len) return str;\n\n  // (7)'0.00123' is better then (7)'1.23e-2'\n  // (8)'0.000123' is worse then (7)'1.23e-3',\n  let fix = num.toFixed(len);\n  if (fix.length > len) {\n    fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n  }\n  if (\n    fix.length <= len &&\n    !fix.startsWith('0.000') &&\n    !fix.startsWith('-0.000')\n  ) {\n    return fix;\n  }\n\n  // well, if it's still too long the user should've used longer numbers\n  let exp = num.toExponential(len);\n  if (exp.length > len) {\n    exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n  }\n  return exp.slice(0);\n}\n\nfunction 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, 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, this.get(i, j) ** matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n}\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 */\nfunction 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 */\nfunction 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 */\nfunction 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 */\nfunction 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\nfunction checkRowIndices(matrix, rowIndices) {\n  if (!isAnyArray.isAnyArray(rowIndices)) {\n    throw new TypeError('row indices must be an array');\n  }\n\n  for (let i = 0; i < rowIndices.length; i++) {\n    if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n      throw new RangeError('row indices are out of range');\n    }\n  }\n}\n\nfunction checkColumnIndices(matrix, columnIndices) {\n  if (!isAnyArray.isAnyArray(columnIndices)) {\n    throw new TypeError('column indices must be an array');\n  }\n\n  for (let i = 0; i < columnIndices.length; i++) {\n    if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n      throw new RangeError('column indices are out of range');\n    }\n  }\n}\n\nfunction 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\nfunction 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\nfunction checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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 += matrix.get(i, j) ** 2 / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nfunction 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\nfunction 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 += matrix.get(i, j) ** 2 / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nfunction 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\nfunction 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 += matrix.get(i, j) ** 2 / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nfunction 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\nclass 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  isDistance() {\n    if (!this.isSymmetric()) return false;\n\n    for (let i = 0; i < this.rows; i++) {\n      if (this.get(i, i) !== 0) return false;\n    }\n\n    return true;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    switch (by) {\n      case 'row': {\n        const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[row]) {\n              max[row] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case 'column': {\n        const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[column]) {\n              max[column] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case undefined: {\n        let max = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max) {\n              max = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n\n    switch (by) {\n      case 'row': {\n        const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[row]) {\n              min[row] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case 'column': {\n        const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[column]) {\n              min[column] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case undefined: {\n        let min = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min) {\n              min = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    switch (type) {\n      case 'max':\n        return this.max();\n      case 'frobenius':\n        return Math.sqrt(this.dot(this));\n      default:\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  mpow(scalar) {\n    if (!this.isSquare()) {\n      throw new RangeError('Matrix must be square');\n    }\n    if (!Number.isInteger(scalar) || scalar < 0) {\n      throw new RangeError('Exponent must be a non-negative integer');\n    }\n    // Russian Peasant exponentiation, i.e. exponentiation by squaring\n    let result = Matrix.eye(this.rows);\n    let bb = this;\n    // Note: Don't bit shift. In JS, that would truncate at 32 bits\n    for (let e = scalar; e >= 1; e /= 2) {\n      if ((e & 1) !== 0) {\n        result = result.mmul(bb);\n      }\n      bb = bb.mmul(bb);\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 result = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      result = result.setSubMatrix(c11, 0, 0);\n      result = result.setSubMatrix(c12, c11.rows, 0);\n      result = result.setSubMatrix(c21, 0, c11.columns);\n      result = result.setSubMatrix(c22, c11.rows, c11.columns);\n      return result.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,\n          max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    checkRowIndices(this, rowIndices);\n    checkColumnIndices(this, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < rowIndices.length; i++) {\n      let rowIndex = rowIndices[i];\n      for (let j = 0; j < columnIndices.length; j++) {\n        let columnIndex = columnIndices[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    return this.constructor.copy(this, new Matrix(this.rows, this.columns));\n  }\n\n  /**\n   * @template {AbstractMatrix} M\n   * @param {AbstractMatrix} from\n   * @param {M} to\n   * @return {M}\n   */\n  static copy(from, to) {\n    for (const [row, column, value] of from.entries()) {\n      to.set(row, column, value);\n    }\n\n    return to;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray.isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!isAnyArray.isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray.isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!isAnyArray.isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!isAnyArray.isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!isAnyArray.isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n\n  [Symbol.iterator]() {\n    return this.entries();\n  }\n\n  /**\n   * iterator from left to right, from top to bottom\n   * yield [row, column, value]\n   * @returns {Generator<[number, number, number], void, void>}\n   */\n  *entries() {\n    for (let row = 0; row < this.rows; row++) {\n      for (let col = 0; col < this.columns; col++) {\n        yield [row, col, this.get(row, col)];\n      }\n    }\n  }\n\n  /**\n   * iterator from left to right, from top to bottom\n   * yield value\n   * @returns {Generator<number, void, void>}\n   */\n  *values() {\n    for (let row = 0; row < this.rows; row++) {\n      for (let col = 0; col < this.columns; col++) {\n        yield this.get(row, col);\n      }\n    }\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n    inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n  return array.every((element) => {\n    return typeof element === 'number';\n  });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nclass Matrix extends AbstractMatrix {\n  /**\n   * @type {Float64Array[]}\n   */\n  data;\n\n  /**\n   * Init an empty matrix\n   * @param {number} nRows\n   * @param {number} nColumns\n   */\n  #initData(nRows, nColumns) {\n    this.data = [];\n\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\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      this.#initData(nRows.rows, nRows.columns);\n      Matrix.copy(nRows, this);\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      this.#initData(nRows, nColumns);\n    } else if (isAnyArray.isAnyArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        if (!isArrayOfNumbers(arrayData[i])) {\n          throw new TypeError('Input data contains non-numeric values');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n\n      this.rows = nRows;\n      this.columns = nColumns;\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\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\n/**\n * @typedef {0 | 1 | number | boolean} Mask\n */\n\nclass SymmetricMatrix extends AbstractMatrix {\n  /** @type {Matrix} */\n  #matrix;\n\n  get size() {\n    return this.#matrix.size;\n  }\n\n  get rows() {\n    return this.#matrix.rows;\n  }\n\n  get columns() {\n    return this.#matrix.columns;\n  }\n\n  get diagonalSize() {\n    return this.rows;\n  }\n\n  /**\n   * not the same as matrix.isSymmetric()\n   * Here is to check if it's instanceof SymmetricMatrix without bundling issues\n   *\n   * @param value\n   * @returns {boolean}\n   */\n  static isSymmetricMatrix(value) {\n    return Matrix.isMatrix(value) && value.klassType === 'SymmetricMatrix';\n  }\n\n  /**\n   * @param diagonalSize\n   * @return {SymmetricMatrix}\n   */\n  static zeros(diagonalSize) {\n    return new this(diagonalSize);\n  }\n\n  /**\n   * @param diagonalSize\n   * @return {SymmetricMatrix}\n   */\n  static ones(diagonalSize) {\n    return new this(diagonalSize).fill(1);\n  }\n\n  /**\n   * @param {number | AbstractMatrix | ArrayLike<ArrayLike<number>>} diagonalSize\n   * @return {this}\n   */\n  constructor(diagonalSize) {\n    super();\n\n    if (Matrix.isMatrix(diagonalSize)) {\n      if (!diagonalSize.isSymmetric()) {\n        throw new TypeError('not symmetric data');\n      }\n\n      this.#matrix = Matrix.copy(\n        diagonalSize,\n        new Matrix(diagonalSize.rows, diagonalSize.rows),\n      );\n    } else if (Number.isInteger(diagonalSize) && diagonalSize >= 0) {\n      this.#matrix = new Matrix(diagonalSize, diagonalSize);\n    } else {\n      this.#matrix = new Matrix(diagonalSize);\n\n      if (!this.isSymmetric()) {\n        throw new TypeError('not symmetric data');\n      }\n    }\n  }\n\n  clone() {\n    const matrix = new SymmetricMatrix(this.diagonalSize);\n\n    for (const [row, col, value] of this.upperRightEntries()) {\n      matrix.set(row, col, value);\n    }\n\n    return matrix;\n  }\n\n  toMatrix() {\n    return new Matrix(this);\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.#matrix.get(rowIndex, columnIndex);\n  }\n  set(rowIndex, columnIndex, value) {\n    // symmetric set\n    this.#matrix.set(rowIndex, columnIndex, value);\n    this.#matrix.set(columnIndex, rowIndex, value);\n\n    return this;\n  }\n\n  removeCross(index) {\n    // symmetric remove side\n    this.#matrix.removeRow(index);\n    this.#matrix.removeColumn(index);\n\n    return this;\n  }\n\n  addCross(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.diagonalSize;\n    }\n\n    const row = array.slice();\n    row.splice(index, 1);\n\n    this.#matrix.addRow(index, row);\n    this.#matrix.addColumn(index, array);\n\n    return this;\n  }\n\n  /**\n   * @param {Mask[]} mask\n   */\n  applyMask(mask) {\n    if (mask.length !== this.diagonalSize) {\n      throw new RangeError('Mask size do not match with matrix size');\n    }\n\n    // prepare sides to remove from matrix from mask\n    /** @type {number[]} */\n    const sidesToRemove = [];\n    for (const [index, passthroughs] of mask.entries()) {\n      if (passthroughs) continue;\n      sidesToRemove.push(index);\n    }\n    // to remove from highest to lowest for no mutation shifting\n    sidesToRemove.reverse();\n\n    // remove sides\n    for (const sideIndex of sidesToRemove) {\n      this.removeCross(sideIndex);\n    }\n\n    return this;\n  }\n\n  /**\n   * Compact format upper-right corner of matrix\n   * iterate from left to right, from top to bottom.\n   *\n   * ```\n   *   A B C D\n   * A 1 2 3 4\n   * B 2 5 6 7\n   * C 3 6 8 9\n   * D 4 7 9 10\n   * ```\n   *\n   * will return compact 1D array `[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]`\n   *\n   * length is S(i=0, n=sideSize) => 10 for a 4 sideSized matrix\n   *\n   * @returns {number[]}\n   */\n  toCompact() {\n    const { diagonalSize } = this;\n\n    /** @type {number[]} */\n    const compact = new Array((diagonalSize * (diagonalSize + 1)) / 2);\n    for (let col = 0, row = 0, index = 0; index < compact.length; index++) {\n      compact[index] = this.get(row, col);\n\n      if (++col >= diagonalSize) col = ++row;\n    }\n\n    return compact;\n  }\n\n  /**\n   * @param {number[]} compact\n   * @return {SymmetricMatrix}\n   */\n  static fromCompact(compact) {\n    const compactSize = compact.length;\n    // compactSize = (sideSize * (sideSize + 1)) / 2\n    // https://mathsolver.microsoft.com/fr/solve-problem/y%20%3D%20%20x%20%60cdot%20%20%20%60frac%7B%20%20%60left(%20x%2B1%20%20%60right)%20%20%20%20%7D%7B%202%20%20%7D\n    // sideSize = (Sqrt(8 × compactSize + 1) - 1) / 2\n    const diagonalSize = (Math.sqrt(8 * compactSize + 1) - 1) / 2;\n\n    if (!Number.isInteger(diagonalSize)) {\n      throw new TypeError(\n        `This array is not a compact representation of a Symmetric Matrix, ${JSON.stringify(\n          compact,\n        )}`,\n      );\n    }\n\n    const matrix = new SymmetricMatrix(diagonalSize);\n    for (let col = 0, row = 0, index = 0; index < compactSize; index++) {\n      matrix.set(col, row, compact[index]);\n      if (++col >= diagonalSize) col = ++row;\n    }\n\n    return matrix;\n  }\n\n  /**\n   * half iterator upper-right-corner from left to right, from top to bottom\n   * yield [row, column, value]\n   *\n   * @returns {Generator<[number, number, number], void, void>}\n   */\n  *upperRightEntries() {\n    for (let row = 0, col = 0; row < this.diagonalSize; void 0) {\n      const value = this.get(row, col);\n\n      yield [row, col, value];\n\n      // at the end of row, move cursor to next row at diagonal position\n      if (++col >= this.diagonalSize) col = ++row;\n    }\n  }\n\n  /**\n   * half iterator upper-right-corner from left to right, from top to bottom\n   * yield value\n   *\n   * @returns {Generator<[number, number, number], void, void>}\n   */\n  *upperRightValues() {\n    for (let row = 0, col = 0; row < this.diagonalSize; void 0) {\n      const value = this.get(row, col);\n\n      yield value;\n\n      // at the end of row, move cursor to next row at diagonal position\n      if (++col >= this.diagonalSize) col = ++row;\n    }\n  }\n}\nSymmetricMatrix.prototype.klassType = 'SymmetricMatrix';\n\nclass DistanceMatrix extends SymmetricMatrix {\n  /**\n   * not the same as matrix.isSymmetric()\n   * Here is to check if it's instanceof SymmetricMatrix without bundling issues\n   *\n   * @param value\n   * @returns {boolean}\n   */\n  static isDistanceMatrix(value) {\n    return (\n      SymmetricMatrix.isSymmetricMatrix(value) &&\n      value.klassSubType === 'DistanceMatrix'\n    );\n  }\n\n  constructor(sideSize) {\n    super(sideSize);\n\n    if (!this.isDistance()) {\n      throw new TypeError('Provided arguments do no produce a distance matrix');\n    }\n  }\n\n  set(rowIndex, columnIndex, value) {\n    // distance matrix diagonal is 0\n    if (rowIndex === columnIndex) value = 0;\n\n    return super.set(rowIndex, columnIndex, value);\n  }\n\n  addCross(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.diagonalSize;\n    }\n\n    // ensure distance\n    array = array.slice();\n    array[index] = 0;\n\n    return super.addCross(index, array);\n  }\n\n  toSymmetricMatrix() {\n    return new SymmetricMatrix(this);\n  }\n\n  clone() {\n    const matrix = new DistanceMatrix(this.diagonalSize);\n\n    for (const [row, col, value] of this.upperRightEntries()) {\n      if (row === col) continue;\n      matrix.set(row, col, value);\n    }\n\n    return matrix;\n  }\n\n  /**\n   * Compact format upper-right corner of matrix\n   * no diagonal (only zeros)\n   * iterable from left to right, from top to bottom.\n   *\n   * ```\n   *   A B C D\n   * A 0 1 2 3\n   * B 1 0 4 5\n   * C 2 4 0 6\n   * D 3 5 6 0\n   * ```\n   *\n   * will return compact 1D array `[1, 2, 3, 4, 5, 6]`\n   *\n   * length is S(i=0, n=sideSize-1) => 6 for a 4 side sized matrix\n   *\n   * @returns {number[]}\n   */\n  toCompact() {\n    const { diagonalSize } = this;\n    const compactLength = ((diagonalSize - 1) * diagonalSize) / 2;\n\n    /** @type {number[]} */\n    const compact = new Array(compactLength);\n    for (let col = 1, row = 0, index = 0; index < compact.length; index++) {\n      compact[index] = this.get(row, col);\n\n      if (++col >= diagonalSize) col = ++row + 1;\n    }\n\n    return compact;\n  }\n\n  /**\n   * @param {number[]} compact\n   */\n  static fromCompact(compact) {\n    const compactSize = compact.length;\n\n    if (compactSize === 0) {\n      return new this(0);\n    }\n\n    // compactSize in Natural integer range ]0;∞]\n    // compactSize = (sideSize * (sideSize - 1)) / 2\n    // sideSize = (Sqrt(8 × compactSize + 1) + 1) / 2\n    const diagonalSize = (Math.sqrt(8 * compactSize + 1) + 1) / 2;\n\n    if (!Number.isInteger(diagonalSize)) {\n      throw new TypeError(\n        `This array is not a compact representation of a DistanceMatrix, ${JSON.stringify(\n          compact,\n        )}`,\n      );\n    }\n\n    const matrix = new this(diagonalSize);\n    for (let col = 1, row = 0, index = 0; index < compactSize; index++) {\n      matrix.set(col, row, compact[index]);\n      if (++col >= diagonalSize) col = ++row + 1;\n    }\n\n    return matrix;\n  }\n}\nDistanceMatrix.prototype.klassSubType = 'DistanceMatrix';\n\nclass BaseView extends AbstractMatrix {\n  constructor(matrix, rows, columns) {\n    super();\n    this.matrix = matrix;\n    this.rows = rows;\n    this.columns = columns;\n  }\n}\n\nclass MatrixColumnView extends BaseView {\n  constructor(matrix, column) {\n    checkColumnIndex(matrix, column);\n    super(matrix, matrix.rows, 1);\n    this.column = column;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(rowIndex, this.column, value);\n    return this;\n  }\n\n  get(rowIndex) {\n    return this.matrix.get(rowIndex, this.column);\n  }\n}\n\nclass MatrixColumnSelectionView extends BaseView {\n  constructor(matrix, columnIndices) {\n    checkColumnIndices(matrix, columnIndices);\n    super(matrix, matrix.rows, columnIndices.length);\n    this.columnIndices = columnIndices;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(rowIndex, this.columnIndices[columnIndex], value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(rowIndex, this.columnIndices[columnIndex]);\n  }\n}\n\nclass MatrixFlipColumnView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.rows, matrix.columns);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(rowIndex, this.columns - columnIndex - 1, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(rowIndex, this.columns - columnIndex - 1);\n  }\n}\n\nclass MatrixFlipRowView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.rows, matrix.columns);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(this.rows - rowIndex - 1, columnIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(this.rows - rowIndex - 1, columnIndex);\n  }\n}\n\nclass MatrixRowView extends BaseView {\n  constructor(matrix, row) {\n    checkRowIndex(matrix, row);\n    super(matrix, 1, matrix.columns);\n    this.row = row;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(this.row, columnIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(this.row, columnIndex);\n  }\n}\n\nclass MatrixRowSelectionView extends BaseView {\n  constructor(matrix, rowIndices) {\n    checkRowIndices(matrix, rowIndices);\n    super(matrix, rowIndices.length, matrix.columns);\n    this.rowIndices = rowIndices;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(this.rowIndices[rowIndex], columnIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(this.rowIndices[rowIndex], columnIndex);\n  }\n}\n\nclass MatrixSelectionView extends BaseView {\n  constructor(matrix, rowIndices, columnIndices) {\n    checkRowIndices(matrix, rowIndices);\n    checkColumnIndices(matrix, columnIndices);\n    super(matrix, rowIndices.length, columnIndices.length);\n    this.rowIndices = rowIndices;\n    this.columnIndices = columnIndices;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(\n      this.rowIndices[rowIndex],\n      this.columnIndices[columnIndex],\n      value,\n    );\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(\n      this.rowIndices[rowIndex],\n      this.columnIndices[columnIndex],\n    );\n  }\n}\n\nclass MatrixSubView extends BaseView {\n  constructor(matrix, startRow, endRow, startColumn, endColumn) {\n    checkRange(matrix, startRow, endRow, startColumn, endColumn);\n    super(matrix, endRow - startRow + 1, endColumn - startColumn + 1);\n    this.startRow = startRow;\n    this.startColumn = startColumn;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(\n      this.startRow + rowIndex,\n      this.startColumn + columnIndex,\n      value,\n    );\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(\n      this.startRow + rowIndex,\n      this.startColumn + columnIndex,\n    );\n  }\n}\n\nclass MatrixTransposeView extends BaseView {\n  constructor(matrix) {\n    super(matrix, matrix.columns, matrix.rows);\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.matrix.set(columnIndex, rowIndex, value);\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.matrix.get(columnIndex, rowIndex);\n  }\n}\n\nclass WrapperMatrix1D extends AbstractMatrix {\n  constructor(data, options = {}) {\n    const { rows = 1 } = options;\n\n    if (data.length % rows !== 0) {\n      throw new Error('the data length is not divisible by the number of rows');\n    }\n    super();\n    this.rows = rows;\n    this.columns = data.length / rows;\n    this.data = data;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    let index = this._calculateIndex(rowIndex, columnIndex);\n    this.data[index] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    let index = this._calculateIndex(rowIndex, columnIndex);\n    return this.data[index];\n  }\n\n  _calculateIndex(row, column) {\n    return row * this.columns + column;\n  }\n}\n\nclass WrapperMatrix2D extends AbstractMatrix {\n  constructor(data) {\n    super();\n    this.data = data;\n    this.rows = data.length;\n    this.columns = data[0].length;\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\nfunction wrap(array, options) {\n  if (isAnyArray.isAnyArray(array)) {\n    if (array[0] && isAnyArray.isAnyArray(array[0])) {\n      return new WrapperMatrix2D(array);\n    } else {\n      return new WrapperMatrix1D(array, options);\n    }\n  } else {\n    throw new Error('the argument is not an array');\n  }\n}\n\nclass LuDecomposition {\n  constructor(matrix) {\n    matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n    let lu = matrix.clone();\n    let rows = lu.rows;\n    let columns = lu.columns;\n    let pivotVector = new Float64Array(rows);\n    let pivotSign = 1;\n    let i, j, k, p, s, t, v;\n    let LUcolj, kmax;\n\n    for (i = 0; i < rows; i++) {\n      pivotVector[i] = i;\n    }\n\n    LUcolj = new Float64Array(rows);\n\n    for (j = 0; j < columns; j++) {\n      for (i = 0; i < rows; i++) {\n        LUcolj[i] = lu.get(i, j);\n      }\n\n      for (i = 0; i < rows; i++) {\n        kmax = Math.min(i, j);\n        s = 0;\n        for (k = 0; k < kmax; k++) {\n          s += lu.get(i, k) * LUcolj[k];\n        }\n        LUcolj[i] -= s;\n        lu.set(i, j, LUcolj[i]);\n      }\n\n      p = j;\n      for (i = j + 1; i < rows; i++) {\n        if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n          p = i;\n        }\n      }\n\n      if (p !== j) {\n        for (k = 0; k < columns; k++) {\n          t = lu.get(p, k);\n          lu.set(p, k, lu.get(j, k));\n          lu.set(j, k, t);\n        }\n\n        v = pivotVector[p];\n        pivotVector[p] = pivotVector[j];\n        pivotVector[j] = v;\n\n        pivotSign = -pivotSign;\n      }\n\n      if (j < rows && lu.get(j, j) !== 0) {\n        for (i = j + 1; i < rows; i++) {\n          lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n        }\n      }\n    }\n\n    this.LU = lu;\n    this.pivotVector = pivotVector;\n    this.pivotSign = pivotSign;\n  }\n\n  isSingular() {\n    let data = this.LU;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      if (data.get(j, j) === 0) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let lu = this.LU;\n    let rows = lu.rows;\n\n    if (rows !== value.rows) {\n      throw new Error('Invalid matrix dimensions');\n    }\n    if (this.isSingular()) {\n      throw new Error('LU matrix is singular');\n    }\n\n    let count = value.columns;\n    let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n    let columns = lu.columns;\n    let i, j, k;\n\n    for (k = 0; k < columns; k++) {\n      for (i = k + 1; i < columns; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    for (k = columns - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / lu.get(k, k));\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n        }\n      }\n    }\n    return X;\n  }\n\n  get determinant() {\n    let data = this.LU;\n    if (!data.isSquare()) {\n      throw new Error('Matrix must be square');\n    }\n    let determinant = this.pivotSign;\n    let col = data.columns;\n    for (let j = 0; j < col; j++) {\n      determinant *= data.get(j, j);\n    }\n    return determinant;\n  }\n\n  get lowerTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i > j) {\n          X.set(i, j, data.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, 1);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get upperTriangularMatrix() {\n    let data = this.LU;\n    let rows = data.rows;\n    let columns = data.columns;\n    let X = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        if (i <= j) {\n          X.set(i, j, data.get(i, j));\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get pivotPermutationVector() {\n    return Array.from(this.pivotVector);\n  }\n}\n\nfunction hypotenuse(a, b) {\n  let r = 0;\n  if (Math.abs(a) > Math.abs(b)) {\n    r = b / a;\n    return Math.abs(a) * Math.sqrt(1 + r * r);\n  }\n  if (b !== 0) {\n    r = a / b;\n    return Math.abs(b) * Math.sqrt(1 + r * r);\n  }\n  return 0;\n}\n\nclass QrDecomposition {\n  constructor(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    let qr = value.clone();\n    let m = value.rows;\n    let n = value.columns;\n    let rdiag = new Float64Array(n);\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      let nrm = 0;\n      for (i = k; i < m; i++) {\n        nrm = hypotenuse(nrm, qr.get(i, k));\n      }\n      if (nrm !== 0) {\n        if (qr.get(k, k) < 0) {\n          nrm = -nrm;\n        }\n        for (i = k; i < m; i++) {\n          qr.set(i, k, qr.get(i, k) / nrm);\n        }\n        qr.set(k, k, qr.get(k, k) + 1);\n        for (j = k + 1; j < n; j++) {\n          s = 0;\n          for (i = k; i < m; i++) {\n            s += qr.get(i, k) * qr.get(i, j);\n          }\n          s = -s / qr.get(k, k);\n          for (i = k; i < m; i++) {\n            qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n      rdiag[k] = -nrm;\n    }\n\n    this.QR = qr;\n    this.Rdiag = rdiag;\n  }\n\n  solve(value) {\n    value = Matrix.checkMatrix(value);\n\n    let qr = this.QR;\n    let m = qr.rows;\n\n    if (value.rows !== m) {\n      throw new Error('Matrix row dimensions must agree');\n    }\n    if (!this.isFullRank()) {\n      throw new Error('Matrix is rank deficient');\n    }\n\n    let count = value.columns;\n    let X = value.clone();\n    let n = qr.columns;\n    let i, j, k, s;\n\n    for (k = 0; k < n; k++) {\n      for (j = 0; j < count; j++) {\n        s = 0;\n        for (i = k; i < m; i++) {\n          s += qr.get(i, k) * X.get(i, j);\n        }\n        s = -s / qr.get(k, k);\n        for (i = k; i < m; i++) {\n          X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n        }\n      }\n    }\n    for (k = n - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n      }\n      for (i = 0; i < k; i++) {\n        for (j = 0; j < count; j++) {\n          X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n        }\n      }\n    }\n\n    return X.subMatrix(0, n - 1, 0, count - 1);\n  }\n\n  isFullRank() {\n    let columns = this.QR.columns;\n    for (let i = 0; i < columns; i++) {\n      if (this.Rdiag[i] === 0) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  get upperTriangularMatrix() {\n    let qr = this.QR;\n    let n = qr.columns;\n    let X = new Matrix(n, n);\n    let i, j;\n    for (i = 0; i < n; i++) {\n      for (j = 0; j < n; j++) {\n        if (i < j) {\n          X.set(i, j, qr.get(i, j));\n        } else if (i === j) {\n          X.set(i, j, this.Rdiag[i]);\n        } else {\n          X.set(i, j, 0);\n        }\n      }\n    }\n    return X;\n  }\n\n  get orthogonalMatrix() {\n    let qr = this.QR;\n    let rows = qr.rows;\n    let columns = qr.columns;\n    let X = new Matrix(rows, columns);\n    let i, j, k, s;\n\n    for (k = columns - 1; k >= 0; k--) {\n      for (i = 0; i < rows; i++) {\n        X.set(i, k, 0);\n      }\n      X.set(k, k, 1);\n      for (j = k; j < columns; j++) {\n        if (qr.get(k, k) !== 0) {\n          s = 0;\n          for (i = k; i < rows; i++) {\n            s += qr.get(i, k) * X.get(i, j);\n          }\n\n          s = -s / qr.get(k, k);\n\n          for (i = k; i < rows; i++) {\n            X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n          }\n        }\n      }\n    }\n    return X;\n  }\n}\n\nclass SingularValueDecomposition {\n  constructor(value, options = {}) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    if (value.isEmpty()) {\n      throw new Error('Matrix must be non-empty');\n    }\n\n    let m = value.rows;\n    let n = value.columns;\n\n    const {\n      computeLeftSingularVectors = true,\n      computeRightSingularVectors = true,\n      autoTranspose = false,\n    } = options;\n\n    let wantu = Boolean(computeLeftSingularVectors);\n    let wantv = Boolean(computeRightSingularVectors);\n\n    let swapped = false;\n    let a;\n    if (m < n) {\n      if (!autoTranspose) {\n        a = value.clone();\n        // eslint-disable-next-line no-console\n        console.warn(\n          'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n        );\n      } else {\n        a = value.transpose();\n        m = a.rows;\n        n = a.columns;\n        swapped = true;\n        let aux = wantu;\n        wantu = wantv;\n        wantv = aux;\n      }\n    } else {\n      a = value.clone();\n    }\n\n    let nu = Math.min(m, n);\n    let ni = Math.min(m + 1, n);\n    let s = new Float64Array(ni);\n    let U = new Matrix(m, nu);\n    let V = new Matrix(n, n);\n\n    let e = new Float64Array(n);\n    let work = new Float64Array(m);\n\n    let si = new Float64Array(ni);\n    for (let i = 0; i < ni; i++) si[i] = i;\n\n    let nct = Math.min(m - 1, n);\n    let nrt = Math.max(0, Math.min(n - 2, m));\n    let mrc = Math.max(nct, nrt);\n\n    for (let k = 0; k < mrc; k++) {\n      if (k < nct) {\n        s[k] = 0;\n        for (let i = k; i < m; i++) {\n          s[k] = hypotenuse(s[k], a.get(i, k));\n        }\n        if (s[k] !== 0) {\n          if (a.get(k, k) < 0) {\n            s[k] = -s[k];\n          }\n          for (let i = k; i < m; i++) {\n            a.set(i, k, a.get(i, k) / s[k]);\n          }\n          a.set(k, k, a.get(k, k) + 1);\n        }\n        s[k] = -s[k];\n      }\n\n      for (let j = k + 1; j < n; j++) {\n        if (k < nct && s[k] !== 0) {\n          let t = 0;\n          for (let i = k; i < m; i++) {\n            t += a.get(i, k) * a.get(i, j);\n          }\n          t = -t / a.get(k, k);\n          for (let i = k; i < m; i++) {\n            a.set(i, j, a.get(i, j) + t * a.get(i, k));\n          }\n        }\n        e[j] = a.get(k, j);\n      }\n\n      if (wantu && k < nct) {\n        for (let i = k; i < m; i++) {\n          U.set(i, k, a.get(i, k));\n        }\n      }\n\n      if (k < nrt) {\n        e[k] = 0;\n        for (let i = k + 1; i < n; i++) {\n          e[k] = hypotenuse(e[k], e[i]);\n        }\n        if (e[k] !== 0) {\n          if (e[k + 1] < 0) {\n            e[k] = 0 - e[k];\n          }\n          for (let i = k + 1; i < n; i++) {\n            e[i] /= e[k];\n          }\n          e[k + 1] += 1;\n        }\n        e[k] = -e[k];\n        if (k + 1 < m && e[k] !== 0) {\n          for (let i = k + 1; i < m; i++) {\n            work[i] = 0;\n          }\n          for (let i = k + 1; i < m; i++) {\n            for (let j = k + 1; j < n; j++) {\n              work[i] += e[j] * a.get(i, j);\n            }\n          }\n          for (let j = k + 1; j < n; j++) {\n            let t = -e[j] / e[k + 1];\n            for (let i = k + 1; i < m; i++) {\n              a.set(i, j, a.get(i, j) + t * work[i]);\n            }\n          }\n        }\n        if (wantv) {\n          for (let i = k + 1; i < n; i++) {\n            V.set(i, k, e[i]);\n          }\n        }\n      }\n    }\n\n    let p = Math.min(n, m + 1);\n    if (nct < n) {\n      s[nct] = a.get(nct, nct);\n    }\n    if (m < p) {\n      s[p - 1] = 0;\n    }\n    if (nrt + 1 < p) {\n      e[nrt] = a.get(nrt, p - 1);\n    }\n    e[p - 1] = 0;\n\n    if (wantu) {\n      for (let j = nct; j < nu; j++) {\n        for (let i = 0; i < m; i++) {\n          U.set(i, j, 0);\n        }\n        U.set(j, j, 1);\n      }\n      for (let k = nct - 1; k >= 0; k--) {\n        if (s[k] !== 0) {\n          for (let j = k + 1; j < nu; j++) {\n            let t = 0;\n            for (let i = k; i < m; i++) {\n              t += U.get(i, k) * U.get(i, j);\n            }\n            t = -t / U.get(k, k);\n            for (let i = k; i < m; i++) {\n              U.set(i, j, U.get(i, j) + t * U.get(i, k));\n            }\n          }\n          for (let i = k; i < m; i++) {\n            U.set(i, k, -U.get(i, k));\n          }\n          U.set(k, k, 1 + U.get(k, k));\n          for (let i = 0; i < k - 1; i++) {\n            U.set(i, k, 0);\n          }\n        } else {\n          for (let i = 0; i < m; i++) {\n            U.set(i, k, 0);\n          }\n          U.set(k, k, 1);\n        }\n      }\n    }\n\n    if (wantv) {\n      for (let k = n - 1; k >= 0; k--) {\n        if (k < nrt && e[k] !== 0) {\n          for (let j = k + 1; j < n; j++) {\n            let t = 0;\n            for (let i = k + 1; i < n; i++) {\n              t += V.get(i, k) * V.get(i, j);\n            }\n            t = -t / V.get(k + 1, k);\n            for (let i = k + 1; i < n; i++) {\n              V.set(i, j, V.get(i, j) + t * V.get(i, k));\n            }\n          }\n        }\n        for (let i = 0; i < n; i++) {\n          V.set(i, k, 0);\n        }\n        V.set(k, k, 1);\n      }\n    }\n\n    let pp = p - 1;\n    let eps = Number.EPSILON;\n    while (p > 0) {\n      let k, kase;\n      for (k = p - 2; k >= -1; k--) {\n        if (k === -1) {\n          break;\n        }\n        const alpha =\n          Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n        if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n          e[k] = 0;\n          break;\n        }\n      }\n      if (k === p - 2) {\n        kase = 4;\n      } else {\n        let ks;\n        for (ks = p - 1; ks >= k; ks--) {\n          if (ks === k) {\n            break;\n          }\n          let t =\n            (ks !== p ? Math.abs(e[ks]) : 0) +\n            (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n          if (Math.abs(s[ks]) <= eps * t) {\n            s[ks] = 0;\n            break;\n          }\n        }\n        if (ks === k) {\n          kase = 3;\n        } else if (ks === p - 1) {\n          kase = 1;\n        } else {\n          kase = 2;\n          k = ks;\n        }\n      }\n\n      k++;\n\n      switch (kase) {\n        case 1: {\n          let f = e[p - 2];\n          e[p - 2] = 0;\n          for (let j = p - 2; j >= k; j--) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            if (j !== k) {\n              f = -sn * e[j - 1];\n              e[j - 1] = cs * e[j - 1];\n            }\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n                V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n                V.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 2: {\n          let f = e[k - 1];\n          e[k - 1] = 0;\n          for (let j = k; j < p; j++) {\n            let t = hypotenuse(s[j], f);\n            let cs = s[j] / t;\n            let sn = f / t;\n            s[j] = t;\n            f = -sn * e[j];\n            e[j] = cs * e[j];\n            if (wantu) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n                U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          break;\n        }\n        case 3: {\n          const scale = Math.max(\n            Math.abs(s[p - 1]),\n            Math.abs(s[p - 2]),\n            Math.abs(e[p - 2]),\n            Math.abs(s[k]),\n            Math.abs(e[k]),\n          );\n          const sp = s[p - 1] / scale;\n          const spm1 = s[p - 2] / scale;\n          const epm1 = e[p - 2] / scale;\n          const sk = s[k] / scale;\n          const ek = e[k] / scale;\n          const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n          const c = sp * epm1 * (sp * epm1);\n          let shift = 0;\n          if (b !== 0 || c !== 0) {\n            if (b < 0) {\n              shift = 0 - Math.sqrt(b * b + c);\n            } else {\n              shift = Math.sqrt(b * b + c);\n            }\n            shift = c / (b + shift);\n          }\n          let f = (sk + sp) * (sk - sp) + shift;\n          let g = sk * ek;\n          for (let j = k; j < p - 1; j++) {\n            let t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            let cs = f / t;\n            let sn = g / t;\n            if (j !== k) {\n              e[j - 1] = t;\n            }\n            f = cs * s[j] + sn * e[j];\n            e[j] = cs * e[j] - sn * s[j];\n            g = sn * s[j + 1];\n            s[j + 1] = cs * s[j + 1];\n            if (wantv) {\n              for (let i = 0; i < n; i++) {\n                t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n                V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n                V.set(i, j, t);\n              }\n            }\n            t = hypotenuse(f, g);\n            if (t === 0) t = Number.MIN_VALUE;\n            cs = f / t;\n            sn = g / t;\n            s[j] = t;\n            f = cs * e[j] + sn * s[j + 1];\n            s[j + 1] = -sn * e[j] + cs * s[j + 1];\n            g = sn * e[j + 1];\n            e[j + 1] = cs * e[j + 1];\n            if (wantu && j < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n                U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n                U.set(i, j, t);\n              }\n            }\n          }\n          e[p - 2] = f;\n          break;\n        }\n        case 4: {\n          if (s[k] <= 0) {\n            s[k] = s[k] < 0 ? -s[k] : 0;\n            if (wantv) {\n              for (let i = 0; i <= pp; i++) {\n                V.set(i, k, -V.get(i, k));\n              }\n            }\n          }\n          while (k < pp) {\n            if (s[k] >= s[k + 1]) {\n              break;\n            }\n            let t = s[k];\n            s[k] = s[k + 1];\n            s[k + 1] = t;\n            if (wantv && k < n - 1) {\n              for (let i = 0; i < n; i++) {\n                t = V.get(i, k + 1);\n                V.set(i, k + 1, V.get(i, k));\n                V.set(i, k, t);\n              }\n            }\n            if (wantu && k < m - 1) {\n              for (let i = 0; i < m; i++) {\n                t = U.get(i, k + 1);\n                U.set(i, k + 1, U.get(i, k));\n                U.set(i, k, t);\n              }\n            }\n            k++;\n          }\n          p--;\n          break;\n        }\n        // no default\n      }\n    }\n\n    if (swapped) {\n      let tmp = V;\n      V = U;\n      U = tmp;\n    }\n\n    this.m = m;\n    this.n = n;\n    this.s = s;\n    this.U = U;\n    this.V = V;\n  }\n\n  solve(value) {\n    let Y = value;\n    let e = this.threshold;\n    let scols = this.s.length;\n    let Ls = Matrix.zeros(scols, scols);\n\n    for (let i = 0; i < scols; i++) {\n      if (Math.abs(this.s[i]) <= e) {\n        Ls.set(i, i, 0);\n      } else {\n        Ls.set(i, i, 1 / this.s[i]);\n      }\n    }\n\n    let U = this.U;\n    let V = this.rightSingularVectors;\n\n    let VL = V.mmul(Ls);\n    let vrows = V.rows;\n    let urows = U.rows;\n    let VLU = Matrix.zeros(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < scols; k++) {\n          sum += VL.get(i, k) * U.get(j, k);\n        }\n        VLU.set(i, j, sum);\n      }\n    }\n\n    return VLU.mmul(Y);\n  }\n\n  solveForDiagonal(value) {\n    return this.solve(Matrix.diag(value));\n  }\n\n  inverse() {\n    let V = this.V;\n    let e = this.threshold;\n    let vrows = V.rows;\n    let vcols = V.columns;\n    let X = new Matrix(vrows, this.s.length);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < vcols; j++) {\n        if (Math.abs(this.s[j]) > e) {\n          X.set(i, j, V.get(i, j) / this.s[j]);\n        }\n      }\n    }\n\n    let U = this.U;\n\n    let urows = U.rows;\n    let ucols = U.columns;\n    let Y = new Matrix(vrows, urows);\n\n    for (let i = 0; i < vrows; i++) {\n      for (let j = 0; j < urows; j++) {\n        let sum = 0;\n        for (let k = 0; k < ucols; k++) {\n          sum += X.get(i, k) * U.get(j, k);\n        }\n        Y.set(i, j, sum);\n      }\n    }\n\n    return Y;\n  }\n\n  get condition() {\n    return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n  }\n\n  get norm2() {\n    return this.s[0];\n  }\n\n  get rank() {\n    let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n    let r = 0;\n    let s = this.s;\n    for (let i = 0, ii = s.length; i < ii; i++) {\n      if (s[i] > tol) {\n        r++;\n      }\n    }\n    return r;\n  }\n\n  get diagonal() {\n    return Array.from(this.s);\n  }\n\n  get threshold() {\n    return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n  }\n\n  get leftSingularVectors() {\n    return this.U;\n  }\n\n  get rightSingularVectors() {\n    return this.V;\n  }\n\n  get diagonalMatrix() {\n    return Matrix.diag(this.s);\n  }\n}\n\nfunction inverse(matrix, useSVD = false) {\n  matrix = WrapperMatrix2D.checkMatrix(matrix);\n  if (useSVD) {\n    return new SingularValueDecomposition(matrix).inverse();\n  } else {\n    return solve(matrix, Matrix.eye(matrix.rows));\n  }\n}\n\nfunction solve(leftHandSide, rightHandSide, useSVD = false) {\n  leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n  rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n  if (useSVD) {\n    return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n  } else {\n    return leftHandSide.isSquare()\n      ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n      : new QrDecomposition(leftHandSide).solve(rightHandSide);\n  }\n}\n\nfunction determinant(matrix) {\n  matrix = Matrix.checkMatrix(matrix);\n  if (matrix.isSquare()) {\n    if (matrix.columns === 0) {\n      return 1;\n    }\n\n    let a, b, c, d;\n    if (matrix.columns === 2) {\n      // 2 x 2 matrix\n      a = matrix.get(0, 0);\n      b = matrix.get(0, 1);\n      c = matrix.get(1, 0);\n      d = matrix.get(1, 1);\n\n      return a * d - b * c;\n    } else if (matrix.columns === 3) {\n      // 3 x 3 matrix\n      let subMatrix0, subMatrix1, subMatrix2;\n      subMatrix0 = new MatrixSelectionView(matrix, [1, 2], [1, 2]);\n      subMatrix1 = new MatrixSelectionView(matrix, [1, 2], [0, 2]);\n      subMatrix2 = new MatrixSelectionView(matrix, [1, 2], [0, 1]);\n      a = matrix.get(0, 0);\n      b = matrix.get(0, 1);\n      c = matrix.get(0, 2);\n\n      return (\n        a * determinant(subMatrix0) -\n        b * determinant(subMatrix1) +\n        c * determinant(subMatrix2)\n      );\n    } else {\n      // general purpose determinant using the LU decomposition\n      return new LuDecomposition(matrix).determinant;\n    }\n  } else {\n    throw Error('determinant can only be calculated for a square matrix');\n  }\n}\n\nfunction xrange(n, exception) {\n  let range = [];\n  for (let i = 0; i < n; i++) {\n    if (i !== exception) {\n      range.push(i);\n    }\n  }\n  return range;\n}\n\nfunction dependenciesOneRow(\n  error,\n  matrix,\n  index,\n  thresholdValue = 10e-10,\n  thresholdError = 10e-10,\n) {\n  if (error > thresholdError) {\n    return new Array(matrix.rows + 1).fill(0);\n  } else {\n    let returnArray = matrix.addRow(index, [0]);\n    for (let i = 0; i < returnArray.rows; i++) {\n      if (Math.abs(returnArray.get(i, 0)) < thresholdValue) {\n        returnArray.set(i, 0, 0);\n      }\n    }\n    return returnArray.to1DArray();\n  }\n}\n\nfunction linearDependencies(matrix, options = {}) {\n  const { thresholdValue = 10e-10, thresholdError = 10e-10 } = options;\n  matrix = Matrix.checkMatrix(matrix);\n\n  let n = matrix.rows;\n  let results = new Matrix(n, n);\n\n  for (let i = 0; i < n; i++) {\n    let b = Matrix.columnVector(matrix.getRow(i));\n    let Abis = matrix.subMatrixRow(xrange(n, i)).transpose();\n    let svd = new SingularValueDecomposition(Abis);\n    let x = svd.solve(b);\n    let error = Matrix.sub(b, Abis.mmul(x)).abs().max();\n    results.setRow(\n      i,\n      dependenciesOneRow(error, x, i, thresholdValue, thresholdError),\n    );\n  }\n  return results;\n}\n\nfunction pseudoInverse(matrix, threshold = Number.EPSILON) {\n  matrix = Matrix.checkMatrix(matrix);\n  if (matrix.isEmpty()) {\n    // with a zero dimension, the pseudo-inverse is the transpose, since all 0xn and nx0 matrices are singular\n    // (0xn)*(nx0)*(0xn) = 0xn\n    // (nx0)*(0xn)*(nx0) = nx0\n    return matrix.transpose();\n  }\n  let svdSolution = new SingularValueDecomposition(matrix, { autoTranspose: true });\n\n  let U = svdSolution.leftSingularVectors;\n  let V = svdSolution.rightSingularVectors;\n  let s = svdSolution.diagonal;\n\n  for (let i = 0; i < s.length; i++) {\n    if (Math.abs(s[i]) > threshold) {\n      s[i] = 1.0 / s[i];\n    } else {\n      s[i] = 0.0;\n    }\n  }\n\n  return V.mmul(Matrix.diag(s).mmul(U.transpose()));\n}\n\nfunction covariance(xMatrix, yMatrix = xMatrix, options = {}) {\n  xMatrix = new Matrix(xMatrix);\n  let yIsSame = false;\n  if (\n    typeof yMatrix === 'object' &&\n    !Matrix.isMatrix(yMatrix) &&\n    !isAnyArray.isAnyArray(yMatrix)\n  ) {\n    options = yMatrix;\n    yMatrix = xMatrix;\n    yIsSame = true;\n  } else {\n    yMatrix = new Matrix(yMatrix);\n  }\n  if (xMatrix.rows !== yMatrix.rows) {\n    throw new TypeError('Both matrices must have the same number of rows');\n  }\n  const { center = true } = options;\n  if (center) {\n    xMatrix = xMatrix.center('column');\n    if (!yIsSame) {\n      yMatrix = yMatrix.center('column');\n    }\n  }\n  const cov = xMatrix.transpose().mmul(yMatrix);\n  for (let i = 0; i < cov.rows; i++) {\n    for (let j = 0; j < cov.columns; j++) {\n      cov.set(i, j, cov.get(i, j) * (1 / (xMatrix.rows - 1)));\n    }\n  }\n  return cov;\n}\n\nfunction correlation(xMatrix, yMatrix = xMatrix, options = {}) {\n  xMatrix = new Matrix(xMatrix);\n  let yIsSame = false;\n  if (\n    typeof yMatrix === 'object' &&\n    !Matrix.isMatrix(yMatrix) &&\n    !isAnyArray.isAnyArray(yMatrix)\n  ) {\n    options = yMatrix;\n    yMatrix = xMatrix;\n    yIsSame = true;\n  } else {\n    yMatrix = new Matrix(yMatrix);\n  }\n  if (xMatrix.rows !== yMatrix.rows) {\n    throw new TypeError('Both matrices must have the same number of rows');\n  }\n\n  const { center = true, scale = true } = options;\n  if (center) {\n    xMatrix.center('column');\n    if (!yIsSame) {\n      yMatrix.center('column');\n    }\n  }\n  if (scale) {\n    xMatrix.scale('column');\n    if (!yIsSame) {\n      yMatrix.scale('column');\n    }\n  }\n\n  const sdx = xMatrix.standardDeviation('column', { unbiased: true });\n  const sdy = yIsSame\n    ? sdx\n    : yMatrix.standardDeviation('column', { unbiased: true });\n\n  const corr = xMatrix.transpose().mmul(yMatrix);\n  for (let i = 0; i < corr.rows; i++) {\n    for (let j = 0; j < corr.columns; j++) {\n      corr.set(\n        i,\n        j,\n        corr.get(i, j) * (1 / (sdx[i] * sdy[j])) * (1 / (xMatrix.rows - 1)),\n      );\n    }\n  }\n  return corr;\n}\n\nclass EigenvalueDecomposition {\n  constructor(matrix, options = {}) {\n    const { assumeSymmetric = false } = options;\n\n    matrix = WrapperMatrix2D.checkMatrix(matrix);\n    if (!matrix.isSquare()) {\n      throw new Error('Matrix is not a square matrix');\n    }\n\n    if (matrix.isEmpty()) {\n      throw new Error('Matrix must be non-empty');\n    }\n\n    let n = matrix.columns;\n    let V = new Matrix(n, n);\n    let d = new Float64Array(n);\n    let e = new Float64Array(n);\n    let value = matrix;\n    let i, j;\n\n    let isSymmetric = false;\n    if (assumeSymmetric) {\n      isSymmetric = true;\n    } else {\n      isSymmetric = matrix.isSymmetric();\n    }\n\n    if (isSymmetric) {\n      for (i = 0; i < n; i++) {\n        for (j = 0; j < n; j++) {\n          V.set(i, j, value.get(i, j));\n        }\n      }\n      tred2(n, e, d, V);\n      tql2(n, e, d, V);\n    } else {\n      let H = new Matrix(n, n);\n      let ort = new Float64Array(n);\n      for (j = 0; j < n; j++) {\n        for (i = 0; i < n; i++) {\n          H.set(i, j, value.get(i, j));\n        }\n      }\n      orthes(n, H, ort, V);\n      hqr2(n, e, d, V, H);\n    }\n\n    this.n = n;\n    this.e = e;\n    this.d = d;\n    this.V = V;\n  }\n\n  get realEigenvalues() {\n    return Array.from(this.d);\n  }\n\n  get imaginaryEigenvalues() {\n    return Array.from(this.e);\n  }\n\n  get eigenvectorMatrix() {\n    return this.V;\n  }\n\n  get diagonalMatrix() {\n    let n = this.n;\n    let e = this.e;\n    let d = this.d;\n    let X = new Matrix(n, n);\n    let i, j;\n    for (i = 0; i < n; i++) {\n      for (j = 0; j < n; j++) {\n        X.set(i, j, 0);\n      }\n      X.set(i, i, d[i]);\n      if (e[i] > 0) {\n        X.set(i, i + 1, e[i]);\n      } else if (e[i] < 0) {\n        X.set(i, i - 1, e[i]);\n      }\n    }\n    return X;\n  }\n}\n\nfunction tred2(n, e, d, V) {\n  let f, g, h, i, j, k, hh, scale;\n\n  for (j = 0; j < n; j++) {\n    d[j] = V.get(n - 1, j);\n  }\n\n  for (i = n - 1; i > 0; i--) {\n    scale = 0;\n    h = 0;\n    for (k = 0; k < i; k++) {\n      scale = scale + Math.abs(d[k]);\n    }\n\n    if (scale === 0) {\n      e[i] = d[i - 1];\n      for (j = 0; j < i; j++) {\n        d[j] = V.get(i - 1, j);\n        V.set(i, j, 0);\n        V.set(j, i, 0);\n      }\n    } else {\n      for (k = 0; k < i; k++) {\n        d[k] /= scale;\n        h += d[k] * d[k];\n      }\n\n      f = d[i - 1];\n      g = Math.sqrt(h);\n      if (f > 0) {\n        g = -g;\n      }\n\n      e[i] = scale * g;\n      h = h - f * g;\n      d[i - 1] = f - g;\n      for (j = 0; j < i; j++) {\n        e[j] = 0;\n      }\n\n      for (j = 0; j < i; j++) {\n        f = d[j];\n        V.set(j, i, f);\n        g = e[j] + V.get(j, j) * f;\n        for (k = j + 1; k <= i - 1; k++) {\n          g += V.get(k, j) * d[k];\n          e[k] += V.get(k, j) * f;\n        }\n        e[j] = g;\n      }\n\n      f = 0;\n      for (j = 0; j < i; j++) {\n        e[j] /= h;\n        f += e[j] * d[j];\n      }\n\n      hh = f / (h + h);\n      for (j = 0; j < i; j++) {\n        e[j] -= hh * d[j];\n      }\n\n      for (j = 0; j < i; j++) {\n        f = d[j];\n        g = e[j];\n        for (k = j; k <= i - 1; k++) {\n          V.set(k, j, V.get(k, j) - (f * e[k] + g * d[k]));\n        }\n        d[j] = V.get(i - 1, j);\n        V.set(i, j, 0);\n      }\n    }\n    d[i] = h;\n  }\n\n  for (i = 0; i < n - 1; i++) {\n    V.set(n - 1, i, V.get(i, i));\n    V.set(i, i, 1);\n    h = d[i + 1];\n    if (h !== 0) {\n      for (k = 0; k <= i; k++) {\n        d[k] = V.get(k, i + 1) / h;\n      }\n\n      for (j = 0; j <= i; j++) {\n        g = 0;\n        for (k = 0; k <= i; k++) {\n          g += V.get(k, i + 1) * V.get(k, j);\n        }\n        for (k = 0; k <= i; k++) {\n          V.set(k, j, V.get(k, j) - g * d[k]);\n        }\n      }\n    }\n\n    for (k = 0; k <= i; k++) {\n      V.set(k, i + 1, 0);\n    }\n  }\n\n  for (j = 0; j < n; j++) {\n    d[j] = V.get(n - 1, j);\n    V.set(n - 1, j, 0);\n  }\n\n  V.set(n - 1, n - 1, 1);\n  e[0] = 0;\n}\n\nfunction tql2(n, e, d, V) {\n  let g, h, i, j, k, l, m, p, r, dl1, c, c2, c3, el1, s, s2;\n\n  for (i = 1; i < n; i++) {\n    e[i - 1] = e[i];\n  }\n\n  e[n - 1] = 0;\n\n  let f = 0;\n  let tst1 = 0;\n  let eps = Number.EPSILON;\n\n  for (l = 0; l < n; l++) {\n    tst1 = Math.max(tst1, Math.abs(d[l]) + Math.abs(e[l]));\n    m = l;\n    while (m < n) {\n      if (Math.abs(e[m]) <= eps * tst1) {\n        break;\n      }\n      m++;\n    }\n\n    if (m > l) {\n      do {\n\n        g = d[l];\n        p = (d[l + 1] - g) / (2 * e[l]);\n        r = hypotenuse(p, 1);\n        if (p < 0) {\n          r = -r;\n        }\n\n        d[l] = e[l] / (p + r);\n        d[l + 1] = e[l] * (p + r);\n        dl1 = d[l + 1];\n        h = g - d[l];\n        for (i = l + 2; i < n; i++) {\n          d[i] -= h;\n        }\n\n        f = f + h;\n\n        p = d[m];\n        c = 1;\n        c2 = c;\n        c3 = c;\n        el1 = e[l + 1];\n        s = 0;\n        s2 = 0;\n        for (i = m - 1; i >= l; i--) {\n          c3 = c2;\n          c2 = c;\n          s2 = s;\n          g = c * e[i];\n          h = c * p;\n          r = hypotenuse(p, e[i]);\n          e[i + 1] = s * r;\n          s = e[i] / r;\n          c = p / r;\n          p = c * d[i] - s * g;\n          d[i + 1] = h + s * (c * g + s * d[i]);\n\n          for (k = 0; k < n; k++) {\n            h = V.get(k, i + 1);\n            V.set(k, i + 1, s * V.get(k, i) + c * h);\n            V.set(k, i, c * V.get(k, i) - s * h);\n          }\n        }\n\n        p = (-s * s2 * c3 * el1 * e[l]) / dl1;\n        e[l] = s * p;\n        d[l] = c * p;\n      } while (Math.abs(e[l]) > eps * tst1);\n    }\n    d[l] = d[l] + f;\n    e[l] = 0;\n  }\n\n  for (i = 0; i < n - 1; i++) {\n    k = i;\n    p = d[i];\n    for (j = i + 1; j < n; j++) {\n      if (d[j] < p) {\n        k = j;\n        p = d[j];\n      }\n    }\n\n    if (k !== i) {\n      d[k] = d[i];\n      d[i] = p;\n      for (j = 0; j < n; j++) {\n        p = V.get(j, i);\n        V.set(j, i, V.get(j, k));\n        V.set(j, k, p);\n      }\n    }\n  }\n}\n\nfunction orthes(n, H, ort, V) {\n  let low = 0;\n  let high = n - 1;\n  let f, g, h, i, j, m;\n  let scale;\n\n  for (m = low + 1; m <= high - 1; m++) {\n    scale = 0;\n    for (i = m; i <= high; i++) {\n      scale = scale + Math.abs(H.get(i, m - 1));\n    }\n\n    if (scale !== 0) {\n      h = 0;\n      for (i = high; i >= m; i--) {\n        ort[i] = H.get(i, m - 1) / scale;\n        h += ort[i] * ort[i];\n      }\n\n      g = Math.sqrt(h);\n      if (ort[m] > 0) {\n        g = -g;\n      }\n\n      h = h - ort[m] * g;\n      ort[m] = ort[m] - g;\n\n      for (j = m; j < n; j++) {\n        f = 0;\n        for (i = high; i >= m; i--) {\n          f += ort[i] * H.get(i, j);\n        }\n\n        f = f / h;\n        for (i = m; i <= high; i++) {\n          H.set(i, j, H.get(i, j) - f * ort[i]);\n        }\n      }\n\n      for (i = 0; i <= high; i++) {\n        f = 0;\n        for (j = high; j >= m; j--) {\n          f += ort[j] * H.get(i, j);\n        }\n\n        f = f / h;\n        for (j = m; j <= high; j++) {\n          H.set(i, j, H.get(i, j) - f * ort[j]);\n        }\n      }\n\n      ort[m] = scale * ort[m];\n      H.set(m, m - 1, scale * g);\n    }\n  }\n\n  for (i = 0; i < n; i++) {\n    for (j = 0; j < n; j++) {\n      V.set(i, j, i === j ? 1 : 0);\n    }\n  }\n\n  for (m = high - 1; m >= low + 1; m--) {\n    if (H.get(m, m - 1) !== 0) {\n      for (i = m + 1; i <= high; i++) {\n        ort[i] = H.get(i, m - 1);\n      }\n\n      for (j = m; j <= high; j++) {\n        g = 0;\n        for (i = m; i <= high; i++) {\n          g += ort[i] * V.get(i, j);\n        }\n\n        g = g / ort[m] / H.get(m, m - 1);\n        for (i = m; i <= high; i++) {\n          V.set(i, j, V.get(i, j) + g * ort[i]);\n        }\n      }\n    }\n  }\n}\n\nfunction hqr2(nn, e, d, V, H) {\n  let n = nn - 1;\n  let low = 0;\n  let high = nn - 1;\n  let eps = Number.EPSILON;\n  let exshift = 0;\n  let norm = 0;\n  let p = 0;\n  let q = 0;\n  let r = 0;\n  let s = 0;\n  let z = 0;\n  let iter = 0;\n  let i, j, k, l, m, t, w, x, y;\n  let ra, sa, vr, vi;\n  let notlast, cdivres;\n\n  for (i = 0; i < nn; i++) {\n    if (i < low || i > high) {\n      d[i] = H.get(i, i);\n      e[i] = 0;\n    }\n\n    for (j = Math.max(i - 1, 0); j < nn; j++) {\n      norm = norm + Math.abs(H.get(i, j));\n    }\n  }\n\n  while (n >= low) {\n    l = n;\n    while (l > low) {\n      s = Math.abs(H.get(l - 1, l - 1)) + Math.abs(H.get(l, l));\n      if (s === 0) {\n        s = norm;\n      }\n      if (Math.abs(H.get(l, l - 1)) < eps * s) {\n        break;\n      }\n      l--;\n    }\n\n    if (l === n) {\n      H.set(n, n, H.get(n, n) + exshift);\n      d[n] = H.get(n, n);\n      e[n] = 0;\n      n--;\n      iter = 0;\n    } else if (l === n - 1) {\n      w = H.get(n, n - 1) * H.get(n - 1, n);\n      p = (H.get(n - 1, n - 1) - H.get(n, n)) / 2;\n      q = p * p + w;\n      z = Math.sqrt(Math.abs(q));\n      H.set(n, n, H.get(n, n) + exshift);\n      H.set(n - 1, n - 1, H.get(n - 1, n - 1) + exshift);\n      x = H.get(n, n);\n\n      if (q >= 0) {\n        z = p >= 0 ? p + z : p - z;\n        d[n - 1] = x + z;\n        d[n] = d[n - 1];\n        if (z !== 0) {\n          d[n] = x - w / z;\n        }\n        e[n - 1] = 0;\n        e[n] = 0;\n        x = H.get(n, n - 1);\n        s = Math.abs(x) + Math.abs(z);\n        p = x / s;\n        q = z / s;\n        r = Math.sqrt(p * p + q * q);\n        p = p / r;\n        q = q / r;\n\n        for (j = n - 1; j < nn; j++) {\n          z = H.get(n - 1, j);\n          H.set(n - 1, j, q * z + p * H.get(n, j));\n          H.set(n, j, q * H.get(n, j) - p * z);\n        }\n\n        for (i = 0; i <= n; i++) {\n          z = H.get(i, n - 1);\n          H.set(i, n - 1, q * z + p * H.get(i, n));\n          H.set(i, n, q * H.get(i, n) - p * z);\n        }\n\n        for (i = low; i <= high; i++) {\n          z = V.get(i, n - 1);\n          V.set(i, n - 1, q * z + p * V.get(i, n));\n          V.set(i, n, q * V.get(i, n) - p * z);\n        }\n      } else {\n        d[n - 1] = x + p;\n        d[n] = x + p;\n        e[n - 1] = z;\n        e[n] = -z;\n      }\n\n      n = n - 2;\n      iter = 0;\n    } else {\n      x = H.get(n, n);\n      y = 0;\n      w = 0;\n      if (l < n) {\n        y = H.get(n - 1, n - 1);\n        w = H.get(n, n - 1) * H.get(n - 1, n);\n      }\n\n      if (iter === 10) {\n        exshift += x;\n        for (i = low; i <= n; i++) {\n          H.set(i, i, H.get(i, i) - x);\n        }\n        s = Math.abs(H.get(n, n - 1)) + Math.abs(H.get(n - 1, n - 2));\n        // eslint-disable-next-line no-multi-assign\n        x = y = 0.75 * s;\n        w = -0.4375 * s * s;\n      }\n\n      if (iter === 30) {\n        s = (y - x) / 2;\n        s = s * s + w;\n        if (s > 0) {\n          s = Math.sqrt(s);\n          if (y < x) {\n            s = -s;\n          }\n          s = x - w / ((y - x) / 2 + s);\n          for (i = low; i <= n; i++) {\n            H.set(i, i, H.get(i, i) - s);\n          }\n          exshift += s;\n          // eslint-disable-next-line no-multi-assign\n          x = y = w = 0.964;\n        }\n      }\n\n      iter = iter + 1;\n\n      m = n - 2;\n      while (m >= l) {\n        z = H.get(m, m);\n        r = x - z;\n        s = y - z;\n        p = (r * s - w) / H.get(m + 1, m) + H.get(m, m + 1);\n        q = H.get(m + 1, m + 1) - z - r - s;\n        r = H.get(m + 2, m + 1);\n        s = Math.abs(p) + Math.abs(q) + Math.abs(r);\n        p = p / s;\n        q = q / s;\n        r = r / s;\n        if (m === l) {\n          break;\n        }\n        if (\n          Math.abs(H.get(m, m - 1)) * (Math.abs(q) + Math.abs(r)) <\n          eps *\n            (Math.abs(p) *\n              (Math.abs(H.get(m - 1, m - 1)) +\n                Math.abs(z) +\n                Math.abs(H.get(m + 1, m + 1))))\n        ) {\n          break;\n        }\n        m--;\n      }\n\n      for (i = m + 2; i <= n; i++) {\n        H.set(i, i - 2, 0);\n        if (i > m + 2) {\n          H.set(i, i - 3, 0);\n        }\n      }\n\n      for (k = m; k <= n - 1; k++) {\n        notlast = k !== n - 1;\n        if (k !== m) {\n          p = H.get(k, k - 1);\n          q = H.get(k + 1, k - 1);\n          r = notlast ? H.get(k + 2, k - 1) : 0;\n          x = Math.abs(p) + Math.abs(q) + Math.abs(r);\n          if (x !== 0) {\n            p = p / x;\n            q = q / x;\n            r = r / x;\n          }\n        }\n\n        if (x === 0) {\n          break;\n        }\n\n        s = Math.sqrt(p * p + q * q + r * r);\n        if (p < 0) {\n          s = -s;\n        }\n\n        if (s !== 0) {\n          if (k !== m) {\n            H.set(k, k - 1, -s * x);\n          } else if (l !== m) {\n            H.set(k, k - 1, -H.get(k, k - 1));\n          }\n\n          p = p + s;\n          x = p / s;\n          y = q / s;\n          z = r / s;\n          q = q / p;\n          r = r / p;\n\n          for (j = k; j < nn; j++) {\n            p = H.get(k, j) + q * H.get(k + 1, j);\n            if (notlast) {\n              p = p + r * H.get(k + 2, j);\n              H.set(k + 2, j, H.get(k + 2, j) - p * z);\n            }\n\n            H.set(k, j, H.get(k, j) - p * x);\n            H.set(k + 1, j, H.get(k + 1, j) - p * y);\n          }\n\n          for (i = 0; i <= Math.min(n, k + 3); i++) {\n            p = x * H.get(i, k) + y * H.get(i, k + 1);\n            if (notlast) {\n              p = p + z * H.get(i, k + 2);\n              H.set(i, k + 2, H.get(i, k + 2) - p * r);\n            }\n\n            H.set(i, k, H.get(i, k) - p);\n            H.set(i, k + 1, H.get(i, k + 1) - p * q);\n          }\n\n          for (i = low; i <= high; i++) {\n            p = x * V.get(i, k) + y * V.get(i, k + 1);\n            if (notlast) {\n              p = p + z * V.get(i, k + 2);\n              V.set(i, k + 2, V.get(i, k + 2) - p * r);\n            }\n\n            V.set(i, k, V.get(i, k) - p);\n            V.set(i, k + 1, V.get(i, k + 1) - p * q);\n          }\n        }\n      }\n    }\n  }\n\n  if (norm === 0) {\n    return;\n  }\n\n  for (n = nn - 1; n >= 0; n--) {\n    p = d[n];\n    q = e[n];\n\n    if (q === 0) {\n      l = n;\n      H.set(n, n, 1);\n      for (i = n - 1; i >= 0; i--) {\n        w = H.get(i, i) - p;\n        r = 0;\n        for (j = l; j <= n; j++) {\n          r = r + H.get(i, j) * H.get(j, n);\n        }\n\n        if (e[i] < 0) {\n          z = w;\n          s = r;\n        } else {\n          l = i;\n          if (e[i] === 0) {\n            H.set(i, n, w !== 0 ? -r / w : -r / (eps * norm));\n          } else {\n            x = H.get(i, i + 1);\n            y = H.get(i + 1, i);\n            q = (d[i] - p) * (d[i] - p) + e[i] * e[i];\n            t = (x * s - z * r) / q;\n            H.set(i, n, t);\n            H.set(\n              i + 1,\n              n,\n              Math.abs(x) > Math.abs(z) ? (-r - w * t) / x : (-s - y * t) / z,\n            );\n          }\n\n          t = Math.abs(H.get(i, n));\n          if (eps * t * t > 1) {\n            for (j = i; j <= n; j++) {\n              H.set(j, n, H.get(j, n) / t);\n            }\n          }\n        }\n      }\n    } else if (q < 0) {\n      l = n - 1;\n\n      if (Math.abs(H.get(n, n - 1)) > Math.abs(H.get(n - 1, n))) {\n        H.set(n - 1, n - 1, q / H.get(n, n - 1));\n        H.set(n - 1, n, -(H.get(n, n) - p) / H.get(n, n - 1));\n      } else {\n        cdivres = cdiv(0, -H.get(n - 1, n), H.get(n - 1, n - 1) - p, q);\n        H.set(n - 1, n - 1, cdivres[0]);\n        H.set(n - 1, n, cdivres[1]);\n      }\n\n      H.set(n, n - 1, 0);\n      H.set(n, n, 1);\n      for (i = n - 2; i >= 0; i--) {\n        ra = 0;\n        sa = 0;\n        for (j = l; j <= n; j++) {\n          ra = ra + H.get(i, j) * H.get(j, n - 1);\n          sa = sa + H.get(i, j) * H.get(j, n);\n        }\n\n        w = H.get(i, i) - p;\n\n        if (e[i] < 0) {\n          z = w;\n          r = ra;\n          s = sa;\n        } else {\n          l = i;\n          if (e[i] === 0) {\n            cdivres = cdiv(-ra, -sa, w, q);\n            H.set(i, n - 1, cdivres[0]);\n            H.set(i, n, cdivres[1]);\n          } else {\n            x = H.get(i, i + 1);\n            y = H.get(i + 1, i);\n            vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;\n            vi = (d[i] - p) * 2 * q;\n            if (vr === 0 && vi === 0) {\n              vr =\n                eps *\n                norm *\n                (Math.abs(w) +\n                  Math.abs(q) +\n                  Math.abs(x) +\n                  Math.abs(y) +\n                  Math.abs(z));\n            }\n            cdivres = cdiv(\n              x * r - z * ra + q * sa,\n              x * s - z * sa - q * ra,\n              vr,\n              vi,\n            );\n            H.set(i, n - 1, cdivres[0]);\n            H.set(i, n, cdivres[1]);\n            if (Math.abs(x) > Math.abs(z) + Math.abs(q)) {\n              H.set(\n                i + 1,\n                n - 1,\n                (-ra - w * H.get(i, n - 1) + q * H.get(i, n)) / x,\n              );\n              H.set(\n                i + 1,\n                n,\n                (-sa - w * H.get(i, n) - q * H.get(i, n - 1)) / x,\n              );\n            } else {\n              cdivres = cdiv(\n                -r - y * H.get(i, n - 1),\n                -s - y * H.get(i, n),\n                z,\n                q,\n              );\n              H.set(i + 1, n - 1, cdivres[0]);\n              H.set(i + 1, n, cdivres[1]);\n            }\n          }\n\n          t = Math.max(Math.abs(H.get(i, n - 1)), Math.abs(H.get(i, n)));\n          if (eps * t * t > 1) {\n            for (j = i; j <= n; j++) {\n              H.set(j, n - 1, H.get(j, n - 1) / t);\n              H.set(j, n, H.get(j, n) / t);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  for (i = 0; i < nn; i++) {\n    if (i < low || i > high) {\n      for (j = i; j < nn; j++) {\n        V.set(i, j, H.get(i, j));\n      }\n    }\n  }\n\n  for (j = nn - 1; j >= low; j--) {\n    for (i = low; i <= high; i++) {\n      z = 0;\n      for (k = low; k <= Math.min(j, high); k++) {\n        z = z + V.get(i, k) * H.get(k, j);\n      }\n      V.set(i, j, z);\n    }\n  }\n}\n\nfunction cdiv(xr, xi, yr, yi) {\n  let r, d;\n  if (Math.abs(yr) > Math.abs(yi)) {\n    r = yi / yr;\n    d = yr + r * yi;\n    return [(xr + r * xi) / d, (xi - r * xr) / d];\n  } else {\n    r = yr / yi;\n    d = yi + r * yr;\n    return [(r * xr + xi) / d, (r * xi - xr) / d];\n  }\n}\n\nclass CholeskyDecomposition {\n  constructor(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n    if (!value.isSymmetric()) {\n      throw new Error('Matrix is not symmetric');\n    }\n\n    let a = value;\n    let dimension = a.rows;\n    let l = new Matrix(dimension, dimension);\n    let positiveDefinite = true;\n    let i, j, k;\n\n    for (j = 0; j < dimension; j++) {\n      let d = 0;\n      for (k = 0; k < j; k++) {\n        let s = 0;\n        for (i = 0; i < k; i++) {\n          s += l.get(k, i) * l.get(j, i);\n        }\n        s = (a.get(j, k) - s) / l.get(k, k);\n        l.set(j, k, s);\n        d = d + s * s;\n      }\n\n      d = a.get(j, j) - d;\n\n      positiveDefinite &&= d > 0;\n      l.set(j, j, Math.sqrt(Math.max(d, 0)));\n      for (k = j + 1; k < dimension; k++) {\n        l.set(j, k, 0);\n      }\n    }\n\n    this.L = l;\n    this.positiveDefinite = positiveDefinite;\n  }\n\n  isPositiveDefinite() {\n    return this.positiveDefinite;\n  }\n\n  solve(value) {\n    value = WrapperMatrix2D.checkMatrix(value);\n\n    let l = this.L;\n    let dimension = l.rows;\n\n    if (value.rows !== dimension) {\n      throw new Error('Matrix dimensions do not match');\n    }\n    if (this.isPositiveDefinite() === false) {\n      throw new Error('Matrix is not positive definite');\n    }\n\n    let count = value.columns;\n    let B = value.clone();\n    let i, j, k;\n\n    for (k = 0; k < dimension; k++) {\n      for (j = 0; j < count; j++) {\n        for (i = 0; i < k; i++) {\n          B.set(k, j, B.get(k, j) - B.get(i, j) * l.get(k, i));\n        }\n        B.set(k, j, B.get(k, j) / l.get(k, k));\n      }\n    }\n\n    for (k = dimension - 1; k >= 0; k--) {\n      for (j = 0; j < count; j++) {\n        for (i = k + 1; i < dimension; i++) {\n          B.set(k, j, B.get(k, j) - B.get(i, j) * l.get(i, k));\n        }\n        B.set(k, j, B.get(k, j) / l.get(k, k));\n      }\n    }\n\n    return B;\n  }\n\n  get lowerTriangularMatrix() {\n    return this.L;\n  }\n}\n\nclass nipals {\n  constructor(X, options = {}) {\n    X = WrapperMatrix2D.checkMatrix(X);\n    let { Y } = options;\n    const {\n      scaleScores = false,\n      maxIterations = 1000,\n      terminationCriteria = 1e-10,\n    } = options;\n\n    let u;\n    if (Y) {\n      if (isAnyArray.isAnyArray(Y) && typeof Y[0] === 'number') {\n        Y = Matrix.columnVector(Y);\n      } else {\n        Y = WrapperMatrix2D.checkMatrix(Y);\n      }\n      if (Y.rows !== X.rows) {\n        throw new Error('Y should have the same number of rows as X');\n      }\n      u = Y.getColumnVector(0);\n    } else {\n      u = X.getColumnVector(0);\n    }\n\n    let diff = 1;\n    let t, q, w, tOld;\n\n    for (\n      let counter = 0;\n      counter < maxIterations && diff > terminationCriteria;\n      counter++\n    ) {\n      w = X.transpose().mmul(u).div(u.transpose().mmul(u).get(0, 0));\n      w = w.div(w.norm());\n\n      t = X.mmul(w).div(w.transpose().mmul(w).get(0, 0));\n\n      if (counter > 0) {\n        diff = t.clone().sub(tOld).pow(2).sum();\n      }\n      tOld = t.clone();\n\n      if (Y) {\n        q = Y.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n        q = q.div(q.norm());\n\n        u = Y.mmul(q).div(q.transpose().mmul(q).get(0, 0));\n      } else {\n        u = t;\n      }\n    }\n\n    if (Y) {\n      let p = X.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n      p = p.div(p.norm());\n      let xResidual = X.clone().sub(t.clone().mmul(p.transpose()));\n      let residual = u.transpose().mmul(t).div(t.transpose().mmul(t).get(0, 0));\n      let yResidual = Y.clone().sub(\n        t.clone().mulS(residual.get(0, 0)).mmul(q.transpose()),\n      );\n\n      this.t = t;\n      this.p = p.transpose();\n      this.w = w.transpose();\n      this.q = q;\n      this.u = u;\n      this.s = t.transpose().mmul(t);\n      this.xResidual = xResidual;\n      this.yResidual = yResidual;\n      this.betas = residual;\n    } else {\n      this.w = w.transpose();\n      this.s = t.transpose().mmul(t).sqrt();\n      if (scaleScores) {\n        this.t = t.clone().div(this.s.get(0, 0));\n      } else {\n        this.t = t;\n      }\n      this.xResidual = X.sub(t.mmul(w.transpose()));\n    }\n  }\n}\n\nexports.AbstractMatrix = AbstractMatrix;\nexports.CHO = CholeskyDecomposition;\nexports.CholeskyDecomposition = CholeskyDecomposition;\nexports.DistanceMatrix = DistanceMatrix;\nexports.EVD = EigenvalueDecomposition;\nexports.EigenvalueDecomposition = EigenvalueDecomposition;\nexports.LU = LuDecomposition;\nexports.LuDecomposition = LuDecomposition;\nexports.Matrix = Matrix;\nexports.MatrixColumnSelectionView = MatrixColumnSelectionView;\nexports.MatrixColumnView = MatrixColumnView;\nexports.MatrixFlipColumnView = MatrixFlipColumnView;\nexports.MatrixFlipRowView = MatrixFlipRowView;\nexports.MatrixRowSelectionView = MatrixRowSelectionView;\nexports.MatrixRowView = MatrixRowView;\nexports.MatrixSelectionView = MatrixSelectionView;\nexports.MatrixSubView = MatrixSubView;\nexports.MatrixTransposeView = MatrixTransposeView;\nexports.NIPALS = nipals;\nexports.Nipals = nipals;\nexports.QR = QrDecomposition;\nexports.QrDecomposition = QrDecomposition;\nexports.SVD = SingularValueDecomposition;\nexports.SingularValueDecomposition = SingularValueDecomposition;\nexports.SymmetricMatrix = SymmetricMatrix;\nexports.WrapperMatrix1D = WrapperMatrix1D;\nexports.WrapperMatrix2D = WrapperMatrix2D;\nexports.correlation = correlation;\nexports.covariance = covariance;\nexports.default = Matrix;\nexports.determinant = determinant;\nexports.inverse = inverse;\nexports.linearDependencies = linearDependencies;\nexports.pseudoInverse = pseudoInverse;\nexports.solve = solve;\nexports.wrap = wrap;\n","import * as matrix from './matrix.js';\n\nexport const AbstractMatrix = matrix.AbstractMatrix;\nexport const CHO = matrix.CHO;\nexport const CholeskyDecomposition = matrix.CholeskyDecomposition;\nexport const DistanceMatrix = matrix.DistanceMatrix;\nexport const EVD = matrix.EVD;\nexport const EigenvalueDecomposition = matrix.EigenvalueDecomposition;\nexport const LU = matrix.LU;\nexport const LuDecomposition = matrix.LuDecomposition;\nexport const Matrix = matrix.Matrix;\nexport const MatrixColumnSelectionView = matrix.MatrixColumnSelectionView;\nexport const MatrixColumnView = matrix.MatrixColumnView;\nexport const MatrixFlipColumnView = matrix.MatrixFlipColumnView;\nexport const MatrixFlipRowView = matrix.MatrixFlipRowView;\nexport const MatrixRowSelectionView = matrix.MatrixRowSelectionView;\nexport const MatrixRowView = matrix.MatrixRowView;\nexport const MatrixSelectionView = matrix.MatrixSelectionView;\nexport const MatrixSubView = matrix.MatrixSubView;\nexport const MatrixTransposeView = matrix.MatrixTransposeView;\nexport const NIPALS = matrix.NIPALS;\nexport const Nipals = matrix.Nipals;\nexport const QR = matrix.QR;\nexport const QrDecomposition = matrix.QrDecomposition;\nexport const SVD = matrix.SVD;\nexport const SingularValueDecomposition = matrix.SingularValueDecomposition;\nexport const SymmetricMatrix = matrix.SymmetricMatrix;\nexport const WrapperMatrix1D = matrix.WrapperMatrix1D;\nexport const WrapperMatrix2D = matrix.WrapperMatrix2D;\nexport const correlation = matrix.correlation;\nexport const covariance = matrix.covariance;\nexport default matrix.default.Matrix ? matrix.default.Matrix : matrix.Matrix;\nexport const determinant = matrix.determinant;\nexport const inverse = matrix.inverse;\nexport const linearDependencies = matrix.linearDependencies;\nexport const pseudoInverse = matrix.pseudoInverse;\nexport const solve = matrix.solve;\nexport const wrap = matrix.wrap;\n","import { floydWarshall } from 'ml-floyd-warshall';\nimport { Matrix } from 'ml-matrix';\n/**\n * Returns a connectivity matrix\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {boolean} [options.pathLength=false] - get the path length between atoms\n * @param {boolean} [options.mass=false] - set the nominal mass of the atoms on diagonal\n * @param {boolean} [options.atomicNo=false] - set the atomic number of the atom on diagonal\n * @param {boolean} [options.negativeAtomicNo=false] - set the atomic number * -1 of the atom on diagonal\n * @param {boolean} [options.sdt=false] - set 1, 2 or 3 depending if single, double or triple bond\n * @param {boolean} [options.sdta=false] - set 1, 2, 3 or 4 depending if single, double, triple or aromatic  bond\n */\nexport function getConnectivityMatrix(molecule, options = {}) {\n    const OCL = molecule.getOCL();\n    molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n    const nbAtoms = molecule.getAllAtoms();\n    let result = new Array(nbAtoms).fill();\n    result = result.map(() => new Array(nbAtoms).fill(0));\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        }\n        else if (options.negativeAtomicNo) {\n            for (let i = 0; i < nbAtoms; i++) {\n                result[i][i] = -molecule.getAtomicNo(i);\n            }\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        }\n        else {\n            for (let i = 0; i < nbAtoms; i++) {\n                result[i][i] = 1;\n            }\n        }\n    }\n    if (options.sdt) {\n        for (let i = 0; i < nbAtoms; i++) {\n            const 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    }\n    else if (options.sdta) {\n        for (let i = 0; i < nbAtoms; i++) {\n            const l = molecule.getAllConnAtoms(i);\n            for (let j = 0; j < l; j++) {\n                const bondNumber = molecule.getConnBond(i, j);\n                if (molecule.isAromaticBond(bondNumber)) {\n                    result[i][molecule.getConnAtom(i, j)] = 4;\n                }\n                else {\n                    result[i][molecule.getConnAtom(i, j)] = molecule.getConnBondOrder(i, j);\n                }\n            }\n        }\n    }\n    else {\n        for (let i = 0; i < nbAtoms; i++) {\n            const l = molecule.getAllConnAtoms(i);\n            for (let j = 0; j < l; j++) {\n                result[i][molecule.getConnAtom(i, j)] = 1;\n            }\n        }\n    }\n    if (options.pathLength) {\n        result = floydWarshall(new Matrix(result)).to2DArray();\n    }\n    return result;\n}\n//# sourceMappingURL=getConnectivityMatrix.js.map","import { Matrix } from 'ml-matrix';\n/**\n * Algorithm that finds the shortest distance from one node to the other\n * @param {Matrix} adjMatrix - A squared adjacency matrix\n * @return {Matrix} - Distance from a node to the other, -1 if the node is unreachable\n */\nexport function floydWarshall(adjMatrix) {\n    if (Matrix.isMatrix(adjMatrix) && adjMatrix.columns !== adjMatrix.rows) {\n        throw new TypeError('The adjacency matrix should be squared');\n    }\n    const numVertices = adjMatrix.columns;\n    let distMatrix = new Matrix(numVertices, numVertices);\n    distMatrix.apply((row, column) => {\n        // principal diagonal is 0\n        if (row === column) {\n            distMatrix.set(row, column, 0);\n        }\n        else {\n            let val = adjMatrix.get(row, column);\n            if (val || Object.is(val, -0)) {\n                // edges values remain the same\n                distMatrix.set(row, column, val);\n            }\n            else {\n                // 0 values become infinity\n                distMatrix.set(row, column, Number.POSITIVE_INFINITY);\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    // 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//# sourceMappingURL=index.js.map","import { getXAtomicNumber } from '../util/getXAtomicNumber.js';\n/**\n * Returns the atoms that are chiral or pseudo chiral.\n * There could be some issues if the original molecule lacks chiral bonds.\n * The function will add them and this could lead to some issues in the case of pseudochiral atoms.\n * @param {import('openchemlib').Molecule} molecule\n * @returns {number[]}\n */\nexport function getChiralOrHeterotopicCarbons(molecule) {\n    const { Molecule } = molecule.getOCL();\n    const xAtomicNumber = getXAtomicNumber(molecule);\n    const internalMolecule = molecule.getCompactCopy();\n    // hydrogens may be diastereotopic, we need to add them\n    internalMolecule.addImplicitHydrogens();\n    for (let i = 0; i < internalMolecule.getAllAtoms(); i++) {\n        // hydrogens are not taken into account during canonization, we need to change them with an atom with a valence of 1\n        if (internalMolecule.getAtomicNo(i) === 1) {\n            internalMolecule.setAtomicNo(i, xAtomicNumber);\n        }\n    }\n    addPossibleChiralBonds(internalMolecule);\n    internalMolecule.ensureHelperArrays(Molecule.cHelperSymmetryStereoHeterotopicity);\n    const atoms = [];\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        if (internalMolecule.getAtomicNo(i) === xAtomicNumber) {\n            continue;\n        }\n        if (molecule.getAtomicNo(i) !== internalMolecule.getAtomicNo(i)) {\n            throw new Error('getChiralOrHeterotopicCarbons: mismatching atomic numbers');\n        }\n        if (internalMolecule.getAtomicNo(i) !== 6) {\n            continue;\n        }\n        const neighbourSymmetries = getNeighbourSymmetries(internalMolecule, i);\n        if (neighbourSymmetries.length === 4) {\n            atoms.push(i);\n        }\n    }\n    return atoms;\n}\nfunction addPossibleChiralBonds(molecule) {\n    const { Molecule } = molecule.getOCL();\n    molecule.ensureHelperArrays(Molecule.cHelperSymmetryStereoHeterotopicity);\n    for (let i = 0; i < molecule.getAtoms(); i++) {\n        if (molecule.getAtomicNo(i) !== 6)\n            continue;\n        if (molecule.getStereoBond(i) >= 0)\n            continue;\n        const neighbourSymmetries = getNeighbourSymmetries(molecule, i);\n        if (neighbourSymmetries.length <= 2)\n            continue;\n        const stereoBond = molecule.getAtomPreferredStereoBond(i);\n        if (stereoBond !== -1) {\n            molecule.setBondType(stereoBond, Molecule.cBondTypeUp);\n            if (molecule.getBondAtom(1, stereoBond) === i) {\n                const 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, Molecule.cESRTypeAnd, 0);\n        }\n    }\n}\nfunction getNeighbourSymmetries(molecule, iAtom) {\n    const neighbourSymmetries = [];\n    for (let j = 0; j < molecule.getAllConnAtoms(iAtom); j++) {\n        const connAtom = molecule.getConnAtom(iAtom, j);\n        const symmetryRank = molecule.getSymmetryRank(connAtom);\n        if (!neighbourSymmetries.includes(symmetryRank)) {\n            neighbourSymmetries.push(molecule.getSymmetryRank(connAtom));\n        }\n    }\n    return neighbourSymmetries;\n}\n//# sourceMappingURL=getChiralOrHeterotopicCarbons.js.map","import { getChiralOrHeterotopicCarbons } from './getChiralOrHeterotopicCarbons.js';\n/**\n * This function will add missing chiral bonds on carbons ensure that all enantiotopic\n * or diastereotopic atoms can be identified uniquely\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {number} [options.esrType=Molecule.cESRTypeAnd]\n * @param {boolean} [options.atLeastThreeAtoms=true] - if true, only carbons with at least three atoms will be considered\n */\nexport function ensureHeterotopicChiralBonds(molecule, options = {}) {\n    const { Molecule } = molecule.getOCL();\n    const { esrType = Molecule.cESRTypeAnd, atLeastThreeAtoms = true } = options;\n    molecule.ensureHelperArrays(Molecule.cHelperBitNeighbours);\n    const heterotopicCarbons = getChiralOrHeterotopicCarbons(molecule);\n    for (const i of heterotopicCarbons) {\n        if (atLeastThreeAtoms && molecule.getAllConnAtoms(i) < 3)\n            continue;\n        if (molecule.getStereoBond(i) === -1) {\n            const stereoBond = molecule.getAtomPreferredStereoBond(i);\n            if (stereoBond !== -1) {\n                molecule.setBondType(stereoBond, Molecule.cBondTypeUp);\n                if (molecule.getBondAtom(1, stereoBond) === i) {\n                    const 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//# sourceMappingURL=ensureHeterotopicChiralBonds.js.map","import { getHoseCodesForAtomsAsFragments } from '../hose/getHoseCodesForAtomsInternal.js';\nimport { getAllAtomsPaths } from '../path/getAllAtomsPaths.js';\nimport { getConnectivityMatrix } from '../util/getConnectivityMatrix.js';\nimport { getCanonizedDiaIDs } from './getCanonizedDiaIDs.js';\nimport { getCanonizedHoseCodes } from './getCanonizedHoseCodes.js';\nimport { getDiaIDsAndInfo } from './getDiaIDsAndInfo.js';\nimport { getFinalRanks, getHeterotopicSymmetryRanks, } from './getHeterotopicSymmetryRanks.js';\nimport { getMoleculeWithH } from './getMoleculeWithH.js';\nimport { getXMolecule } from './getXMolecule.js';\n/**\n * This class deals with topicity information and hose codes\n * It is optimized to avoid recalculation of the same information\n */\nexport class TopicMolecule {\n    originalMolecule;\n    molecule;\n    idCode;\n    options;\n    cache;\n    constructor(molecule, options = {}) {\n        this.originalMolecule = molecule;\n        this.options = {\n            maxPathLength: 5,\n            maxNbAtoms: 250,\n            logger: console,\n            ...options,\n        };\n        this.idCode = molecule.getIDCode();\n        this.molecule = this.originalMolecule.getCompactCopy();\n        this.molecule.ensureHelperArrays(molecule.getOCL().Molecule.cHelperNeighbours);\n        this.molecule.ensureHelperArrays(this.molecule.getOCL().Molecule.cHelperNeighbours);\n        this.cache = {};\n    }\n    /**\n     * This method ensures that all the atoms have a mapNo corresponding to the atom number.\n     * It will enforce mapNo in molecule and moleculeWithH\n     * We start numbering the atoms at 1\n     */\n    setAtomNoInMapNo() {\n        const molecules = [this.molecule, this.moleculeWithH];\n        for (const molecule of molecules) {\n            for (let i = 0; i < molecule.getAllAtoms(); i++) {\n                molecule.setAtomMapNo(i, i + 1, false);\n            }\n        }\n    }\n    /**\n     * This method ensures that all the atoms have a mapNo in the molecule (and not the moleculeWithH! )\n     */\n    ensureMapNo() {\n        const existingMapNo = {};\n        for (let i = 0; i < this.molecule.getAllAtoms(); i++) {\n            const mapNo = this.molecule.getAtomMapNo(i);\n            if (mapNo) {\n                if (existingMapNo[mapNo]) {\n                    throw new Error('The molecule contains several atoms with the same mapNo');\n                }\n                existingMapNo[mapNo] = true;\n            }\n        }\n        let nextMapNo = 1;\n        for (let i = 0; i < this.molecule.getAllAtoms(); i++) {\n            const mapNo = this.molecule.getAtomMapNo(i);\n            if (!mapNo) {\n                while (existingMapNo[nextMapNo]) {\n                    nextMapNo++;\n                }\n                existingMapNo[nextMapNo] = true;\n                this.molecule.setAtomMapNo(i, nextMapNo, false);\n            }\n        }\n    }\n    getHoseFragment(rootAtoms, options = {}) {\n        const { sphereSize = 2, tagAtoms = rootAtoms, tagAtomFct } = options;\n        const fragments = getHoseCodesForAtomsAsFragments(this.moleculeWithH, {\n            rootAtoms,\n            minSphereSize: sphereSize,\n            maxSphereSize: sphereSize,\n            tagAtoms,\n            tagAtomFct,\n        });\n        return fragments[0];\n    }\n    getAtomPathsFrom(atom, options = {}) {\n        const { minPathLength = 1, maxPathLength = this.options.maxPathLength, toAtomicNo, } = options;\n        if (maxPathLength > this.options.maxPathLength) {\n            throw new Error('The maxPathLength is too long, you should increase the maxPathLength when instantiating the TopicMolecule');\n        }\n        const atomPaths = this.atomsPaths[atom];\n        const paths = [];\n        for (let i = minPathLength; i <= maxPathLength; i++) {\n            for (const atomPath of atomPaths[i]) {\n                if (!toAtomicNo ||\n                    this.moleculeWithH.getAtomicNo(atomPath.path.at(-1)) ===\n                        toAtomicNo) {\n                    paths.push(atomPath.path);\n                }\n            }\n        }\n        return paths;\n    }\n    getAtomPaths(atom1, atom2, options = {}) {\n        const { pathLength } = options;\n        if (pathLength !== undefined && pathLength > this.options.maxPathLength) {\n            throw new Error('The distance is too long, you should increase the maxPathLength when instantiating the TopicMolecule');\n        }\n        const atomPaths = this.atomsPaths[atom1];\n        const minDistance = pathLength || 0;\n        const maxDistance = pathLength || this.options.maxPathLength;\n        const paths = [];\n        for (let i = minDistance; i <= maxDistance; i++) {\n            for (const atomPath of atomPaths[i]) {\n                if (atomPath.path.at(-1) === atom2) {\n                    paths.push(atomPath.path);\n                }\n            }\n        }\n        return paths;\n    }\n    get atomsPaths() {\n        if (this.cache.atomsPaths)\n            return this.cache.atomsPaths;\n        this.cache.atomsPaths = getAllAtomsPaths(this.moleculeWithH, {\n            maxPathLength: this.options.maxPathLength,\n        });\n        return this.cache.atomsPaths;\n    }\n    toMolfile(options = {}) {\n        const { version = 2 } = options;\n        if (version === 2) {\n            return this.molecule.toMolfile();\n        }\n        return this.molecule.toMolfileV3();\n    }\n    getMolecule() {\n        return this.molecule;\n    }\n    /**\n     * Returns a new TopicMolecule but will copy precalculated information\n     * if possible (same idCode). This is very practical when expanding hydrogens\n     * for example.\n     * @param molecule\n     * @returns\n     */\n    fromMolecule(molecule) {\n        const idCode = molecule.getIDCode();\n        if (idCode !== this.idCode) {\n            // no way for optimisation\n            return new TopicMolecule(molecule);\n        }\n        const topicMolecule = new TopicMolecule(molecule);\n        topicMolecule.cache = {\n            canonizedDiaIDs: this.cache.canonizedDiaIDs,\n            canonizedHoseCodes: this.cache.canonizedHoseCodes,\n        };\n        return topicMolecule;\n    }\n    /**\n     * Returns a molecule with all the hydrogens added. The order is NOT canonized\n     */\n    get moleculeWithH() {\n        if (this.cache.moleculeWithH)\n            return this.cache.moleculeWithH;\n        this.cache.moleculeWithH = getMoleculeWithH(this.molecule, {\n            maxNbAtoms: this.options.maxNbAtoms,\n            logger: this.options.logger,\n        });\n        return this.cache.moleculeWithH;\n    }\n    get xMolecule() {\n        if (this.cache.xMolecule)\n            return this.cache.xMolecule;\n        this.cache.xMolecule = getXMolecule(this.moleculeWithH);\n        return this.cache.xMolecule;\n    }\n    /**\n     * This is related to the current moleculeWithH. The order is NOT canonized\n     */\n    get diaIDs() {\n        if (this.cache.diaIDs)\n            return this.cache.diaIDs;\n        const diaIDs = [];\n        if (this.moleculeWithH.getAllAtoms() > this.options.maxNbAtoms) {\n            this.options.logger.warn(`too many atoms to evaluate heterotopicity: ${this.moleculeWithH.getAllAtoms()} > ${this.options.maxNbAtoms}`);\n        }\n        else {\n            for (let i = 0; i < this.moleculeWithH.getAllAtoms(); i++) {\n                diaIDs.push(this.canonizedDiaIDs[this.finalRanks[i]]);\n            }\n        }\n        this.cache.diaIDs = diaIDs;\n        return diaIDs;\n    }\n    /**\n     * We return the atomIDs corresponding to the specified diaID as well has the attached hydrogens or heavy atoms\n     * @param diaID\n     * @returns\n     */\n    getDiaIDsObject() {\n        if (!this.diaIDs)\n            return undefined;\n        return groupDiastereotopicAtomIDsAsObject(this.diaIDs, this.molecule, this.moleculeWithH);\n    }\n    /**\n     * This is related to the current moleculeWithH. The order is NOT canonized\n     */\n    get hoseCodes() {\n        if (this.cache.hoseCodes)\n            return this.cache.hoseCodes;\n        const hoseCodes = [];\n        for (let i = 0; i < this.moleculeWithH.getAllAtoms(); i++) {\n            hoseCodes.push(this.canonizedHoseCodes[this.finalRanks[i]]);\n        }\n        this.cache.hoseCodes = hoseCodes;\n        return hoseCodes;\n    }\n    get canonizedDiaIDs() {\n        if (this.cache.canonizedDiaIDs)\n            return this.cache.canonizedDiaIDs;\n        this.cache.canonizedDiaIDs = getCanonizedDiaIDs(this, {\n            maxNbAtoms: this.options.maxNbAtoms,\n            logger: this.options.logger,\n        });\n        return this.cache.canonizedDiaIDs;\n    }\n    get canonizedHoseCodes() {\n        if (this.cache.canonizedHoseCodes) {\n            return this.cache.canonizedHoseCodes;\n        }\n        this.cache.canonizedHoseCodes = getCanonizedHoseCodes(this);\n        return this.cache.canonizedHoseCodes;\n    }\n    /**\n     * Returns the distance matrix for the current moleculeWithH\n     */\n    get distanceMatrix() {\n        return getConnectivityMatrix(this.moleculeWithH, { pathLength: true });\n    }\n    get diaIDsAndInfo() {\n        if (this.cache.diaIDsAndInfo) {\n            return this.cache.diaIDsAndInfo;\n        }\n        this.cache.diaIDsAndInfo = getDiaIDsAndInfo(this, this.canonizedDiaIDs);\n        return this.cache.diaIDsAndInfo;\n    }\n    /**\n     * Returns symmetryRanks for all the atoms including hydrogens. Those ranks\n     * deals with topicity and is related to the current moleculeWithH.\n     * In order to calculate the ranks we replace all the\n     * hydrogens with a X atom.\n     */\n    get heterotopicSymmetryRanks() {\n        if (this.cache.heterotopicSymmetryRanks) {\n            return this.cache.heterotopicSymmetryRanks;\n        }\n        this.cache.heterotopicSymmetryRanks = getHeterotopicSymmetryRanks(this.xMolecule);\n        return [...this.cache.heterotopicSymmetryRanks];\n    }\n    /**\n     * Returns finalRanks for all the atoms including hydrogens. Those ranks\n     * deals with topicity and is related to the current moleculeWithH.\n     * All the atoms have a unique identifier.j\n     * In order to calculate the ranks we replace all the\n     * hydrogens with a X atom.\n     */\n    get finalRanks() {\n        if (this.cache.finalRanks)\n            return this.cache.finalRanks;\n        this.cache.finalRanks = getFinalRanks(this.xMolecule);\n        return this.cache.finalRanks;\n    }\n    toMolfileWithH(options = {}) {\n        const { version = 2 } = options;\n        if (version === 2) {\n            return this.moleculeWithH.toMolfile();\n        }\n        return this.moleculeWithH.toMolfileV3();\n    }\n    toMolfileWithoutH(options = {}) {\n        const molecule = this.molecule.getCompactCopy();\n        molecule.ensureHelperArrays(molecule.getOCL().Molecule.cHelperNeighbours);\n        const atomsToDelete = [];\n        for (let atomID = 0; atomID < molecule.getAtoms(); atomID++) {\n            if (molecule.getExplicitHydrogens(atomID) > 0) {\n                for (let i = 0; i < molecule.getAllConnAtoms(atomID); i++) {\n                    const connectedAtom = molecule.getConnAtom(atomID, i);\n                    if (molecule.getAtomicNo(connectedAtom) === 1) {\n                        atomsToDelete.push(connectedAtom);\n                    }\n                }\n            }\n        }\n        molecule.deleteAtoms(atomsToDelete);\n        const { version = 2 } = options;\n        if (version === 2) {\n            return molecule.toMolfile();\n        }\n        return molecule.toMolfileV3();\n    }\n    /**\n     * Returns an array of objects containing the oclID and the corresponding hydrogens and atoms\n     * for the specified atomLabel (if any)\n     * This always applied to the molecule with expanded hydrogens and chirality\n     * @param options\n     * @returns\n     */\n    getGroupedDiastereotopicAtomIDs(options = {}) {\n        if (!this.diaIDs)\n            return undefined;\n        return groupDiastereotopicAtomIDs(this.diaIDs, this.moleculeWithH, options);\n    }\n    /**\n     * This method returns a mapping between the diaIDs of the current molecule.\n     * It expects that the initial molfile and the final molfile contains atomMapNo\n     * in order to track which atom becomes which one.\n     * @param molecule\n     */\n    getDiaIDsMapping(molecule) {\n        const topicMolecule = new TopicMolecule(molecule);\n        const originalDiaIDs = this.diaIDsAndInfo.filter((diaID) => diaID.atomMapNo);\n        const destinationDiaIDs = topicMolecule.diaIDsAndInfo.filter((diaID) => diaID.atomMapNo);\n        const mapping = {};\n        // we first check all the atoms present in the molfile\n        for (const destinationDiaID of destinationDiaIDs) {\n            const originalDiaID = originalDiaIDs.find((diaID) => diaID.atomMapNo === destinationDiaID.atomMapNo);\n            const newIDCode = destinationDiaID.idCode;\n            const oldIDCode = originalDiaID.idCode;\n            if (oldIDCode in mapping) {\n                if (mapping[oldIDCode] !== newIDCode) {\n                    mapping[oldIDCode] = undefined;\n                }\n            }\n            else {\n                mapping[oldIDCode] = newIDCode;\n            }\n        }\n        // we now check all the attached hydrogens that are not defined in the molfile and were not yet mapped\n        for (const destinationDiaID of destinationDiaIDs) {\n            const originalDiaID = originalDiaIDs.find((diaID) => diaID.atomMapNo === destinationDiaID.atomMapNo);\n            for (let i = 0; i < originalDiaID.attachedHydrogensIDCodes.length; i++) {\n                const oldHydrogenIDCode = originalDiaID.attachedHydrogensIDCodes[i];\n                if (mapping[oldHydrogenIDCode])\n                    continue;\n                const newHydrogenIDCode = destinationDiaID.attachedHydrogensIDCodes[i];\n                if (oldHydrogenIDCode && newHydrogenIDCode) {\n                    if (oldHydrogenIDCode in mapping) {\n                        if (mapping[oldHydrogenIDCode] !== newHydrogenIDCode) {\n                            mapping[oldHydrogenIDCode] = undefined;\n                        }\n                    }\n                    else {\n                        mapping[oldHydrogenIDCode] = newHydrogenIDCode;\n                    }\n                }\n            }\n        }\n        return mapping;\n    }\n}\nexport function groupDiastereotopicAtomIDs(diaIDs, molecule, options = {}) {\n    const diaIDsObject = groupDiastereotopicAtomIDsAsObject(diaIDs, molecule, molecule, options);\n    return Object.keys(diaIDsObject).map((key) => diaIDsObject[key]);\n}\nfunction groupDiastereotopicAtomIDsAsObject(diaIDs, molecule, moleculeWithH, options = {}) {\n    const { atomLabel } = options;\n    const diaIDsObject = {};\n    for (let i = 0; i < diaIDs.length; i++) {\n        if (!atomLabel || moleculeWithH.getAtomLabel(i) === atomLabel) {\n            const diaID = diaIDs[i];\n            if (!diaIDsObject[diaID]) {\n                diaIDsObject[diaID] = {\n                    counter: 0,\n                    atoms: [],\n                    oclID: diaID,\n                    atomLabel: moleculeWithH.getAtomLabel(i),\n                    heavyAtoms: [],\n                    attachedHydrogens: [],\n                    existingAtoms: [],\n                };\n            }\n            if (moleculeWithH.getAtomicNo(i) === 1) {\n                const connected = moleculeWithH.getConnAtom(i, 0);\n                if (!diaIDsObject[diaID].heavyAtoms.includes(connected)) {\n                    diaIDsObject[diaID].heavyAtoms.push(connected);\n                }\n                if (molecule.getAtomicNo(i)) {\n                    diaIDsObject[diaID].existingAtoms.push(i);\n                }\n                else if (!diaIDsObject[diaID].existingAtoms.includes(connected)) {\n                    diaIDsObject[diaID].existingAtoms.push(connected);\n                }\n            }\n            else {\n                for (let j = 0; j < moleculeWithH.getAllConnAtoms(i); j++) {\n                    const connected = moleculeWithH.getConnAtom(i, j);\n                    if (moleculeWithH.getAtomicNo(connected) === 1) {\n                        diaIDsObject[diaID].attachedHydrogens.push(connected);\n                    }\n                }\n                diaIDsObject[diaID].existingAtoms.push(i);\n            }\n            diaIDsObject[diaID].counter++;\n            diaIDsObject[diaID].atoms.push(i);\n        }\n    }\n    for (const diaID in diaIDsObject) {\n        diaIDsObject[diaID].existingAtoms.sort((a, b) => a - b);\n        diaIDsObject[diaID].attachedHydrogens.sort((a, b) => a - b);\n    }\n    return diaIDsObject;\n}\n//# sourceMappingURL=TopicMolecule.js.map","/**\n * We need to create an array of atoms\n * that contains an array of pathLength\n * that contains an array of object\n * @param molecule\n * @param options\n * @returns\n */\nexport function getAllAtomsPaths(molecule, options = {}) {\n    const { maxPathLength = 5 } = options;\n    const allAtomsPaths = [];\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        const oneAtomPaths = [];\n        allAtomsPaths.push(oneAtomPaths);\n        let atomPaths = [];\n        atomPaths.push({ path: [i], pathLength: 0 });\n        oneAtomPaths.push(atomPaths);\n        let nextIndexes = [0];\n        let nextAtoms = [i];\n        for (let sphere = 1; sphere <= maxPathLength; sphere++) {\n            atomPaths = [];\n            oneAtomPaths.push(atomPaths);\n            const currentIndexes = nextIndexes;\n            const currentAtoms = nextAtoms;\n            nextIndexes = [];\n            nextAtoms = [];\n            for (let i = 0; i < currentIndexes.length; i++) {\n                const atom = currentAtoms[i];\n                const index = currentIndexes[i];\n                const previousPath = oneAtomPaths[sphere - 1][index].path;\n                for (let conn = 0; conn < molecule.getAllConnAtoms(atom); conn++) {\n                    const connectedAtom = molecule.getConnAtom(atom, conn);\n                    if (previousPath.includes(connectedAtom))\n                        continue;\n                    nextIndexes.push(atomPaths.length);\n                    nextAtoms.push(connectedAtom);\n                    atomPaths.push({\n                        path: [...previousPath, connectedAtom],\n                        pathLength: sphere,\n                    });\n                }\n            }\n        }\n    }\n    return allAtomsPaths;\n}\n//# sourceMappingURL=getAllAtomsPaths.js.map","import { ensureHeterotopicChiralBonds } from '../diastereotopic/ensureHeterotopicChiralBonds.js';\n/**\n * Expand all the implicit hydrogens and ensure chiral bonds on heterotopic bonds\n * @param molecule\n * @param options\n * @returns\n */\nexport function getMoleculeWithH(molecule, options) {\n    const { logger, maxNbAtoms } = options;\n    const moleculeWithH = molecule.getCompactCopy();\n    moleculeWithH.addImplicitHydrogens();\n    if (moleculeWithH.getAllAtoms() > maxNbAtoms) {\n        logger.warn(`too many atoms to evaluate heterotopic chiral bonds: ${moleculeWithH.getAllAtoms()} > ${maxNbAtoms}`);\n    }\n    else {\n        ensureHeterotopicChiralBonds(moleculeWithH);\n    }\n    return moleculeWithH;\n}\n//# sourceMappingURL=getMoleculeWithH.js.map","import { getXAtomicNumber } from '../util/getXAtomicNumber.js';\n/**\n * In order to be able to give a unique ID to all the atoms we are replacing the H by X\n * @param moleculeWithH\n * @returns\n */\nexport function getXMolecule(moleculeWithH) {\n    const xAtomNumber = getXAtomicNumber(moleculeWithH);\n    const xMolecule = moleculeWithH.getCompactCopy();\n    for (let i = 0; i < xMolecule.getAllAtoms(); i++) {\n        // hydrogens are not taken into account during canonization, we need to change them with an atom with a valence of 1\n        if (xMolecule.getAtomicNo(i) === 1) {\n            xMolecule.setAtomicNo(i, xAtomNumber);\n        }\n    }\n    return xMolecule;\n}\n//# sourceMappingURL=getXMolecule.js.map","import { makeRacemic } from '../util/makeRacemic.js';\nimport { tagAtom } from '../util/tagAtom.js';\nexport function getCanonizedDiaIDs(diaMol, options) {\n    const { logger, maxNbAtoms } = options;\n    const moleculeWithH = diaMol.moleculeWithH;\n    if (moleculeWithH.getAllAtoms() > maxNbAtoms) {\n        logger.warn(`too many atoms to evaluate heterotopic chiral bonds: ${moleculeWithH.getAllAtoms()} > ${maxNbAtoms}`);\n        return [];\n    }\n    const heterotopicSymmetryRanks = diaMol.heterotopicSymmetryRanks;\n    const finalRanks = diaMol.finalRanks;\n    const canonizedDiaIDs = new Array(moleculeWithH.getAllAtoms());\n    moleculeWithH.ensureHelperArrays(diaMol.molecule.getOCL().Molecule.cHelperSymmetryStereoHeterotopicity);\n    const cache = {};\n    for (let i = 0; i < diaMol.moleculeWithH.getAllAtoms(); i++) {\n        const rank = heterotopicSymmetryRanks[i];\n        if (rank && cache[rank]) {\n            canonizedDiaIDs[finalRanks[i]] = cache[rank].diaID;\n            continue;\n        }\n        const tempMolecule = diaMol.moleculeWithH.getCompactCopy();\n        tagAtom(tempMolecule, i);\n        makeRacemic(tempMolecule);\n        const diaID = tempMolecule.getCanonizedIDCode(diaMol.molecule.getOCL().Molecule.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS);\n        canonizedDiaIDs[finalRanks[i]] = diaID;\n    }\n    return canonizedDiaIDs;\n}\n//# sourceMappingURL=getCanonizedDiaIDs.js.map","import { getHoseCodesForAtomsInternal } from '../hose/getHoseCodesForAtomsInternal.js';\nimport { tagAtom } from '../util/tagAtom.js';\nexport function getCanonizedHoseCodes(topicMolecule) {\n    const options = topicMolecule.options;\n    const heterotopicSymmetryRanks = topicMolecule.heterotopicSymmetryRanks;\n    const moleculeWithH = topicMolecule.moleculeWithH;\n    const finalRanks = topicMolecule.finalRanks;\n    const canonizedHoseCodes = new Array(moleculeWithH.getAllAtoms());\n    moleculeWithH.ensureHelperArrays(topicMolecule.molecule.getOCL().Molecule\n        .cHelperSymmetryStereoHeterotopicity);\n    const cache = {};\n    for (let i = 0; i < topicMolecule.moleculeWithH.getAllAtoms(); i++) {\n        const rank = heterotopicSymmetryRanks[i];\n        if (rank && cache[rank]) {\n            canonizedHoseCodes[finalRanks[i]] = cache[rank].diaID;\n            continue;\n        }\n        const tempMolecule = topicMolecule.moleculeWithH.getCompactCopy();\n        tagAtom(tempMolecule, i);\n        const hoses = getHoseCodesForAtomsInternal(tempMolecule, options);\n        canonizedHoseCodes[finalRanks[i]] = hoses;\n    }\n    return canonizedHoseCodes;\n}\n//# sourceMappingURL=getCanonizedHoseCodes.js.map","export function getDiaIDsAndInfo(diaMol, canonizedDiaIDs) {\n    const newDiaIDs = [];\n    const molecule = diaMol.moleculeWithH;\n    const counts = {};\n    for (const diaID of canonizedDiaIDs) {\n        if (!counts[diaID]) {\n            counts[diaID] = 0;\n        }\n        counts[diaID]++;\n    }\n    for (let i = 0; i < canonizedDiaIDs.length; i++) {\n        const diaID = canonizedDiaIDs[diaMol.finalRanks[i]];\n        const newDiaID = {\n            idCode: diaID,\n            attachedHydrogensIDCodes: [],\n            attachedHydrogens: [],\n            nbAttachedHydrogens: 0,\n            atomLabel: molecule.getAtomLabel(i),\n            nbEquivalentAtoms: counts[diaID],\n            heavyAtom: undefined,\n            atomMapNo: molecule.getAtomMapNo(i),\n        };\n        if (molecule.getAtomicNo(i) === 1) {\n            const atom = molecule.getConnAtom(i, 0);\n            newDiaID.heavyAtom = canonizedDiaIDs[diaMol.finalRanks[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.nbAttachedHydrogens++;\n                newDiaID.attachedHydrogens.push(atom);\n                const hydrogenDiaID = canonizedDiaIDs[diaMol.finalRanks[atom]];\n                if (!newDiaID.attachedHydrogensIDCodes.includes(hydrogenDiaID)) {\n                    newDiaID.attachedHydrogensIDCodes.push(hydrogenDiaID);\n                }\n            }\n        }\n        newDiaIDs.push(newDiaID);\n    }\n    return newDiaIDs;\n}\n//# sourceMappingURL=getDiaIDsAndInfo.js.map","/**\n * Get a unique atomic number for a X\n * @param xMolecule\n * @returns\n */\nexport function getHeterotopicSymmetryRanks(xMolecule) {\n    xMolecule.ensureHelperArrays(xMolecule.getOCL().Molecule.cHelperSymmetryStereoHeterotopicity);\n    const symmetryRanks = [];\n    for (let i = 0; i < xMolecule.getAllAtoms(); i++) {\n        symmetryRanks.push(xMolecule.getSymmetryRank(i));\n    }\n    return symmetryRanks;\n}\nexport function getFinalRanks(xMolecule) {\n    xMolecule.ensureHelperArrays(xMolecule.getOCL().Molecule.cHelperSymmetryStereoHeterotopicity);\n    return xMolecule.getFinalRanks(0).map((rank) => rank - 1);\n}\n//# sourceMappingURL=getHeterotopicSymmetryRanks.js.map","import { getXAtomicNumber } from './getXAtomicNumber.js';\n/**\n * Returns an array of symmetry ranks.\n * @param {import('openchemlib').Molecule} molecule - An instance of a molecule\n * @returns\n */\nexport function getSymmetryRanks(molecule) {\n    const { Molecule } = molecule.getOCL();\n    const xAtomNumber = getXAtomicNumber(molecule);\n    // most of the molecules have some symmetry\n    const internalMolecule = molecule.getCompactCopy();\n    for (let i = 0; i < internalMolecule.getAllAtoms(); i++) {\n        // hydrogens are not taken into account during canonization, we need to change them with an atom with a valence of 1\n        if (internalMolecule.getAtomicNo(i) === 1) {\n            internalMolecule.setAtomicNo(i, xAtomNumber);\n        }\n    }\n    internalMolecule.ensureHelperArrays(Molecule.cHelperSymmetryStereoHeterotopicity);\n    const symmetryRanks = [];\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        symmetryRanks.push(internalMolecule.getSymmetryRank(i));\n    }\n    return symmetryRanks;\n}\n//# sourceMappingURL=getSymmetryRanks.js.map","import { getSymmetryRanks } from '../util/getSymmetryRanks.js';\nimport { makeRacemic } from '../util/makeRacemic.js';\nimport { tagAtom } from '../util/tagAtom.js';\nimport { ensureHeterotopicChiralBonds } from './ensureHeterotopicChiralBonds.js';\n/**\n * Returns an array of diastereotopic ID (as idCode)\n * @param {import('openchemlib').Molecule} molecule\n */\nexport function getDiastereotopicAtomIDs(molecule) {\n    const { Molecule } = molecule.getOCL();\n    ensureHeterotopicChiralBonds(molecule);\n    const symmetryRanks = getSymmetryRanks(molecule);\n    const numberAtoms = molecule.getAllAtoms();\n    const ids = [];\n    const cache = {};\n    for (let iAtom = 0; iAtom < numberAtoms; iAtom++) {\n        const rank = symmetryRanks[iAtom];\n        if (rank && cache[rank]) {\n            ids[iAtom] = cache[rank];\n            continue;\n        }\n        const 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(Molecule.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS);\n        cache[rank] = ids[iAtom];\n    }\n    return ids;\n}\n//# sourceMappingURL=getDiastereotopicAtomIDs.js.map","import { getDiastereotopicAtomIDs } from './getDiastereotopicAtomIDs.js';\n/**\n *\n * @param {import('openchemlib').Molecule} molecule\n */\nexport function getDiastereotopicAtomIDsAndH(molecule) {\n    const OCL = molecule.getOCL();\n    molecule = molecule.getCompactCopy();\n    molecule.addImplicitHydrogens();\n    molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n    const diaIDs = getDiastereotopicAtomIDs(molecule);\n    const newDiaIDs = [];\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.includes(diaIDs[atom])) {\n                    newDiaID.hydrogenOCLIDs.push(diaIDs[atom]);\n                }\n            }\n        }\n        newDiaIDs.push(newDiaID);\n    }\n    return newDiaIDs;\n}\n//# sourceMappingURL=getDiastereotopicAtomIDsAndH.js.map","import { getDiastereotopicAtomIDs } from './getDiastereotopicAtomIDs.js';\nimport { groupDiastereotopicAtomIDs } from './groupDiastereotopicAtomIDs.js';\n/**\n * This function groups the diasterotopic atomIds of the molecule based on equivalence of atoms. The output object contains\n * a set of chemically equivalent atoms(element.atoms) and the groups of magnetically equivalent atoms (element.magneticGroups)\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {string} [options.atomLabel] - Select atoms of the given atomLabel. By default it returns all the explicit atoms in the molecule\n * @returns {Array}\n */\nexport function getGroupedDiastereotopicAtomIDs(molecule, options = {}) {\n    const diaIDs = getDiastereotopicAtomIDs(molecule);\n    return groupDiastereotopicAtomIDs(diaIDs, molecule, options);\n}\n//# sourceMappingURL=getGroupedDiastereotopicAtomIDs.js.map","export function groupDiastereotopicAtomIDs(diaIDs, molecule, options = {}) {\n    const { atomLabel } = options;\n    const diaIDsObject = {};\n    for (let i = 0; i < diaIDs.length; i++) {\n        if (!atomLabel || molecule.getAtomLabel(i) === atomLabel) {\n            const 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    return Object.keys(diaIDsObject).map((key) => diaIDsObject[key]);\n}\n//# sourceMappingURL=groupDiastereotopicAtomIDs.js.map","import { ensureHeterotopicChiralBonds } from '../diastereotopic/ensureHeterotopicChiralBonds.js';\nimport { tagAtom } from '../util/tagAtom.js';\nimport { getHoseCodesForAtomsInternal } from './getHoseCodesForAtomsInternal.js';\nexport const FULL_HOSE_CODE = 1;\nexport const HOSE_CODE_CUT_C_SP3_SP3 = 2;\n/**\n * Returns the hose code for specific atom numbers\n * @param {import('openchemlib').Molecule} originalMolecule - The OCL molecule to be fragmented\n * @param {number[]} rootAtoms\n * @param {object} [options={}]\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(originalMolecule, rootAtoms = [], options = {}) {\n    const { minSphereSize = 0, maxSphereSize = 4, kind = FULL_HOSE_CODE, } = options;\n    const molecule = originalMolecule.getCompactCopy();\n    // those 2 lines should be done only once\n    molecule.addImplicitHydrogens();\n    ensureHeterotopicChiralBonds(molecule);\n    const allowedCustomLabels = [];\n    for (const rootAtom of rootAtoms) {\n        allowedCustomLabels.push(tagAtom(molecule, rootAtom));\n    }\n    return getHoseCodesForAtomsInternal(molecule, {\n        minSphereSize,\n        maxSphereSize,\n        allowedCustomLabels,\n        kind,\n    });\n}\n//# sourceMappingURL=getHoseCodesForAtoms.js.map","import { ensureHeterotopicChiralBonds } from '../diastereotopic/ensureHeterotopicChiralBonds.js';\nimport { makeRacemic } from '../util/makeRacemic.js';\nimport { tagAtom } from '../util/tagAtom.js';\nlet fragment;\n/**\n * Returns the hose code for a specific atom number\n * @param {import('openchemlib').Molecule} molecule\n * @param from\n * @param to\n * @param maxLength\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    const 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    const tag1 = tagAtom(molecule, from);\n    const tag2 = tagAtom(molecule, to);\n    molecule.addImplicitHydrogens();\n    ensureHeterotopicChiralBonds(molecule);\n    molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\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                }\n                else {\n                    to = i;\n                }\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    if (!fragment)\n        fragment = new OCL.Molecule(0, 0);\n    const atoms = [];\n    molecule.getPath(atoms, from, to, maxLength + 1);\n    let min = 0;\n    let max = 0;\n    const atomMask = new Array(molecule.getAllAtoms()).fill(false);\n    const atomList = new Array(molecule.getAllAtoms()).fill(-1);\n    const hoses = [];\n    for (let sphere = 0; sphere <= 2; sphere++) {\n        if (max === 0) {\n            for (const atom of atoms) {\n                atomMask[atom] = true;\n                atomList[max++] = atom;\n            }\n        }\n        else {\n            let newMax = max;\n            for (let i = min; i < max; i++) {\n                const atom = atomList[i];\n                for (let j = 0; j < molecule.getAllConnAtoms(atom); j++) {\n                    const 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        const atomMap = [];\n        molecule.copyMoleculeByAtoms(fragment, atomMask, true, atomMap);\n        makeRacemic(fragment);\n        const oclID = fragment.getCanonizedIDCode(OCL.Molecule.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS);\n        hoses.push({\n            sphere,\n            oclID,\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//# sourceMappingURL=getHoseCodesForPath.js.map","/**\n * Create a polymer from a unit, alpha and omega groups\n * A unit must contain a R1 and a R2\n * An alpha end group must contain a R1\n * An omega end group must contain a R2\n * @param {import('openchemlib').Molecule} unit - an instance of OCL.Molecule\n * @param {object} options\n * @param {number} [options.count=10] - number of units\n * @param {boolean} [options.markMonomer=false] - mark the different units of the polymer in the atom map\n * @param {import('openchemlib').Molecule} [options.alpha] - alpha end group, default is an hydrogen\n * @param {import('openchemlib').Molecule} [options.gamma] - omega end group, default is an hydrogen\n */\nexport function createPolymer(unit, options = {}) {\n    const { count = 10 } = options;\n    checkEntity(unit, 'unit');\n    const { Molecule } = unit.getOCL();\n    const { alpha, gamma } = getAlphaGamma(unit, options);\n    checkEntity(alpha, 'alpha');\n    checkEntity(gamma, 'gamma');\n    const { r1AtomicNo, r2AtomicNo } = getR1R2AtomicNo(Molecule);\n    const polymer = alpha.getCompactCopy();\n    polymer.addMolecule(getUnit(unit, 1, options));\n    addBond(polymer, r1AtomicNo, r1AtomicNo);\n    for (let i = 0; i < count - 1; i++) {\n        polymer.addMolecule(getUnit(unit, i + 2, options));\n        addBond(polymer, r2AtomicNo, r1AtomicNo);\n    }\n    polymer.addMolecule(gamma);\n    addBond(polymer, r2AtomicNo, r2AtomicNo);\n    polymer.ensureHelperArrays(Molecule.cHelperNeighbours);\n    // encoding directly in atomNapNo didn't work out because it was removed when deleting atoms\n    for (let i = 0; i < polymer.getAtoms(); i++) {\n        polymer.setAtomMapNo(i, (polymer.getAtomCustomLabel(i) || '').replace(/monomer_/, ''));\n        polymer.setAtomCustomLabel(i, '');\n    }\n    return polymer;\n}\nfunction getUnit(unit, index, options) {\n    const { markMonomer = false } = options;\n    if (markMonomer) {\n        unit = unit.getCompactCopy();\n        unit.ensureHelperArrays(unit.getOCL().Molecule.cHelperNeighbours);\n        for (let j = 0; j < unit.getAtoms(); j++) {\n            unit.setAtomCustomLabel(j, `monomer_${index}`);\n        }\n    }\n    return unit;\n}\nfunction addBond(molecule, firstAtomicNo, secondAtomicNo) {\n    molecule.ensureHelperArrays(molecule.getOCL().Molecule.cHelperNeighbours);\n    let i, j;\n    loop: for (i = 0; i < molecule.getAtoms(); i++) {\n        if (molecule.getAtomicNo(i) === firstAtomicNo) {\n            for (j = i + 1; j < molecule.getAtoms(); j++) {\n                if (molecule.getAtomicNo(j) === secondAtomicNo) {\n                    molecule.addBond(molecule.getConnAtom(i, 0), molecule.getConnAtom(j, 0), 1);\n                    break loop;\n                }\n            }\n        }\n    }\n    molecule.deleteAtoms([i, j]);\n}\nfunction checkEntity(unit, kind) {\n    let nbR1 = 1;\n    let nbR2 = 1;\n    switch (kind) {\n        case 'unit':\n            break;\n        case 'alpha':\n            nbR2 = 0;\n            break;\n        case 'gamma':\n            nbR1 = 0;\n            break;\n        default:\n            throw new Error('Unknown kind');\n    }\n    if (!unit) {\n        throw new Error('unit is required');\n    }\n    const { Molecule } = unit.getOCL();\n    // unit must contain ONE R1 and ONE R2\n    const { r1AtomicNo, r2AtomicNo } = getR1R2AtomicNo(Molecule);\n    let r1Count = 0;\n    let r2Count = 0;\n    for (let i = 0; i < unit.getAtoms(); i++) {\n        if (unit.getAtomicNo(i) === r1AtomicNo) {\n            r1Count++;\n        }\n        if (unit.getAtomicNo(i) === r2AtomicNo) {\n            r2Count++;\n        }\n    }\n    if (r1Count !== nbR1) {\n        throw new Error(`${kind} must contain ${nbR1} R1`);\n    }\n    if (r2Count !== nbR2) {\n        throw new Error(`${kind} must contain ${nbR2} R2`);\n    }\n}\nfunction getAlphaGamma(unit, options) {\n    let { alpha, gamma } = options;\n    const { Molecule } = unit.getOCL();\n    const { r1AtomicNo, r2AtomicNo } = getR1R2AtomicNo(Molecule);\n    if (!alpha) {\n        alpha = Molecule.fromSmiles('CC');\n        alpha.setAtomicNo(0, r1AtomicNo);\n        alpha.setAtomicNo(1, 1);\n    }\n    if (!gamma) {\n        gamma = Molecule.fromSmiles('CC');\n        gamma.setAtomicNo(0, r2AtomicNo);\n        gamma.setAtomicNo(1, 1);\n    }\n    return { alpha, gamma };\n}\nfunction getR1R2AtomicNo(Molecule) {\n    const r1AtomicNo = Molecule.getAtomicNoFromLabel('R1', Molecule.cPseudoAtomsRGroups);\n    const r2AtomicNo = Molecule.getAtomicNoFromLabel('R2', Molecule.cPseudoAtomsRGroups);\n    return { r1AtomicNo, r2AtomicNo };\n}\n//# sourceMappingURL=createPolymer.js.map","const MAX_R = 10;\n/**\n * Generate molecules and calculate predicted properties form a list of smiles and fragments\n * @param {string} coreSmiles\n * @param {Array} fragments - Array of {smiles,R1,R2,...}\n * @param {typeof import('openchemlib')} OCL - openchemlib library\n * @param {object} [options={}] - 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 * @returns {Promise<any>} 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}\nfunction getComplexity(rGroups) {\n    let complexity = 1;\n    for (const rGroup of rGroups) {\n        complexity *= rGroup.smiles.length;\n    }\n    return complexity;\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    while (true) {\n        counter++;\n        while (position < currents.length) {\n            if (currents[position] < sizes[position]) {\n                if (onStep) {\n                    // eslint-disable-next-line no-await-in-loop\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            }\n            else {\n                position++;\n            }\n        }\n        if ((position = currents.length)) {\n            if (onStep) {\n                // eslint-disable-next-line no-await-in-loop\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}\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    const currentMol = OCL.Molecule.fromSmiles(newSmiles);\n    const idCode = currentMol.getIDCode();\n    if (!molecules[idCode]) {\n        const molecule = {};\n        molecules[idCode] = molecule;\n        molecule.smiles = currentMol.toSmiles();\n        molecule.combinedSmiles = newSmiles;\n        molecule.idCode = idCode;\n        molecule.molfile = currentMol.toMolfile();\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        const mf = currentMol.getMolecularFormula();\n        molecule.mf = mf.formula;\n        molecule.mw = mf.relativeWeight;\n    }\n}\nfunction getCore(coreSmiles) {\n    const core = {\n        originalSmiles: coreSmiles,\n        smiles: coreSmiles.replaceAll(/\\[R(?<group>[1-4])]/g, '%5$<group>'),\n    };\n    for (let i = 0; i < MAX_R; i++) {\n        if (core.originalSmiles.includes(`[R${i}]`))\n            core[`R${i}`] = true;\n    }\n    return core;\n}\nfunction getRGroups(core, fragments) {\n    const 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}`] && // we only consider the R that are in the core\n                    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    return Object.keys(rGroups).map((key) => rGroups[key]);\n}\nfunction updateRPosition(smiles) {\n    // R group should not be at the beginning\n    if (smiles.indexOf('[R]') !== 0)\n        return smiles;\n    if (smiles.length === 3)\n        return '[H][R]';\n    // we are in trouble ... we need to move the R\n    const 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        const currentChar = newSmiles.charAt(j);\n        const currentSubstring = newSmiles.slice(j);\n        if (currentChar === '(') {\n            level++;\n        }\n        else if (currentChar === ')') {\n            level--;\n        }\n        else if (level === 0) {\n            if (currentSubstring.match(/^[a-z]/)) {\n                return `${newSmiles.slice(0, Math.max(0, j + 1))}([R])${newSmiles.slice(j + 1)}`;\n            }\n            else if (currentSubstring.match(/^[A-Z][a-z]/)) {\n                return `${newSmiles.slice(0, Math.max(0, j + 2))}([R])${newSmiles.slice(j + 2)}`;\n            }\n            else if (currentSubstring.match(/^[A-Z]/)) {\n                return `${newSmiles.slice(0, Math.max(0, j + 1))}([R])${newSmiles.slice(j + 1)}`;\n            }\n        }\n    }\n    return smiles;\n}\n//# sourceMappingURL=combineSmiles.js.map","import isutf8 from 'isutf8';\n/**\n * Ensure that the data is string. If it is an ArrayBuffer it will be converted to string using TextDecoder.\n * @param blob\n * @param options\n * @returns\n */\nexport function ensureString(blob, options = {}) {\n    if (typeof blob === 'string') {\n        return blob;\n    }\n    if (ArrayBuffer.isView(blob) || blob instanceof ArrayBuffer) {\n        const { encoding = guessEncoding(blob) } = options;\n        const decoder = new TextDecoder(encoding);\n        return decoder.decode(blob);\n    }\n    throw new TypeError(`blob must be a string, ArrayBuffer or ArrayBufferView`);\n}\nfunction guessEncoding(blob) {\n    const uint8 = ArrayBuffer.isView(blob)\n        ? new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength)\n        : new Uint8Array(blob);\n    if (uint8.length >= 2) {\n        if (uint8[0] === 0xfe && uint8[1] === 0xff) {\n            return 'utf-16be';\n        }\n        if (uint8[0] === 0xff && uint8[1] === 0xfe) {\n            return 'utf-16le';\n        }\n    }\n    //@ts-expect-error an ArrayBuffer is also ok\n    if (!isutf8(blob))\n        return 'latin1';\n    return 'utf-8';\n}\n//# sourceMappingURL=index.js.map","/*\n    https://tools.ietf.org/html/rfc3629\n\n    UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4\n\n    UTF8-1    = %x00-7F\n\n    UTF8-2    = %xC2-DF UTF8-tail\n\n    UTF8-3    = %xE0 %xA0-BF UTF8-tail\n                %xE1-EC 2( UTF8-tail )\n                %xED %x80-9F UTF8-tail\n                %xEE-EF 2( UTF8-tail )\n\n    UTF8-4    = %xF0 %x90-BF 2( UTF8-tail )\n                %xF1-F3 3( UTF8-tail )\n                %xF4 %x80-8F 2( UTF8-tail )\n\n    UTF8-tail = %x80-BF\n*/\n/**\n * Check if a Node.js Buffer or Uint8Array is UTF-8.\n */\nfunction isUtf8(buf) {\n    if (!buf) {\n        return false;\n    }\n    var i = 0;\n    var len = buf.length;\n    while (i < len) {\n        // UTF8-1 = %x00-7F\n        if (buf[i] <= 0x7F) {\n            i++;\n            continue;\n        }\n        // UTF8-2 = %xC2-DF UTF8-tail\n        if (buf[i] >= 0xC2 && buf[i] <= 0xDF) {\n            // if(buf[i + 1] >= 0x80 && buf[i + 1] <= 0xBF) {\n            if (buf[i + 1] >> 6 === 2) {\n                i += 2;\n                continue;\n            }\n            else {\n                return false;\n            }\n        }\n        // UTF8-3 = %xE0 %xA0-BF UTF8-tail\n        // UTF8-3 = %xED %x80-9F UTF8-tail\n        if (((buf[i] === 0xE0 && buf[i + 1] >= 0xA0 && buf[i + 1] <= 0xBF) ||\n            (buf[i] === 0xED && buf[i + 1] >= 0x80 && buf[i + 1] <= 0x9F)) && buf[i + 2] >> 6 === 2) {\n            i += 3;\n            continue;\n        }\n        // UTF8-3 = %xE1-EC 2( UTF8-tail )\n        // UTF8-3 = %xEE-EF 2( UTF8-tail )\n        if (((buf[i] >= 0xE1 && buf[i] <= 0xEC) ||\n            (buf[i] >= 0xEE && buf[i] <= 0xEF)) &&\n            buf[i + 1] >> 6 === 2 &&\n            buf[i + 2] >> 6 === 2) {\n            i += 3;\n            continue;\n        }\n        // UTF8-4 = %xF0 %x90-BF 2( UTF8-tail )\n        //          %xF1-F3 3( UTF8-tail )\n        //          %xF4 %x80-8F 2( UTF8-tail )\n        if (((buf[i] === 0xF0 && buf[i + 1] >= 0x90 && buf[i + 1] <= 0xBF) ||\n            (buf[i] >= 0xF1 && buf[i] <= 0xF3 && buf[i + 1] >> 6 === 2) ||\n            (buf[i] === 0xF4 && buf[i + 1] >= 0x80 && buf[i + 1] <= 0x8F)) &&\n            buf[i + 2] >> 6 === 2 &&\n            buf[i + 3] >> 6 === 2) {\n            i += 4;\n            continue;\n        }\n        return false;\n    }\n    return true;\n}\n\nexport { isUtf8 as default };\n","export function parseColumnbProperties(lines) {\n    lines = lines.map((line) => {\n        const [key, value] = line.slice(1, -1).split('=');\n        return { key, value: value.slice(1, -1) };\n    });\n    const columnProperties = {};\n    let currentColumnName = '';\n    for (const line of lines) {\n        switch (line.key) {\n            case 'columnName':\n                currentColumnName = line.value;\n                columnProperties[currentColumnName] = {};\n                break;\n            case 'columnProperty':\n                {\n                    if (!currentColumnName) {\n                        throw new Error('This should not happen');\n                    }\n                    const [key, value] = line.value.split('\\t');\n                    columnProperties[currentColumnName][key] = value;\n                }\n                break;\n            default:\n                throw new Error('This should not happen');\n        }\n    }\n    for (const key in columnProperties) {\n        const columnPropery = columnProperties[key];\n        if (columnProperties[key].parent) {\n            const target = columnProperties[columnPropery.parent];\n            if (!target) {\n                throw new Error('Parent column not found');\n            }\n            if (!target.related) {\n                target.related = {};\n            }\n            target.related[columnPropery.specialType] = key;\n        }\n    }\n    return columnProperties;\n}\n//# sourceMappingURL=parseColumnbProperties.js.map","export function parseData(lines, options = {}) {\n    lines = lines.filter((line) => !line.match(/^\\s*$/));\n    const { columnProperties = {} } = options;\n    const headers = lines\n        .shift()\n        .split('\\t')\n        .map((header) => {\n        if (columnProperties[header]) {\n            return { label: header, ...columnProperties[header] };\n        }\n        return { label: header };\n    });\n    const entries = [];\n    const rawEntries = [];\n    for (const line of lines) {\n        const fields = line.split('\\t');\n        const rawEntry = {};\n        for (const [index, header] of headers.entries()) {\n            rawEntry[header.label] = fields[index];\n        }\n        rawEntries.push(rawEntry);\n        const entry = {};\n        for (const header of headers) {\n            if (header.parent)\n                continue;\n            entry[header.label] = valueEhnhancer(header, rawEntry);\n        }\n        entries.push(entry);\n    }\n    return { entries, rawEntries };\n}\nfunction valueEhnhancer(header, rawEntry) {\n    if (header?.specialType === 'rxncode') {\n        return `${rawEntry[header.label]}#${rawEntry[header.related.atomMapping]}#${rawEntry[header.related.idcoordinates2D]}`;\n    }\n    return rawEntry[header.label];\n}\n/*\nentry.rxnCode =\n*/\n//# sourceMappingURL=parseData.js.map","import { ensureString } from 'ensure-string';\nimport { getParts } from './utils/getParts.js';\nimport { parseColumnbProperties } from './utils/parseColumnbProperties.js';\nimport { parseData } from './utils/parseData.js';\n/**\n * Convert a DataWarrior database into a JSON object\n * @param {string} text\n * @returns\n */\nexport function parseDwar(text) {\n    text = ensureString(text);\n    const parts = getParts(text);\n    improveParts(parts);\n    return parts;\n}\nfunction improveParts(parts) {\n    for (const key in parts) {\n        switch (key) {\n            case 'columnProperties':\n                parts[key] = parseColumnbProperties(parts[key]);\n                break;\n            case 'data':\n                break;\n            default:\n                parts[key] = parseDefault(parts[key]);\n        }\n    }\n    const data = parseData(parts.data, {\n        columnProperties: parts.columnProperties,\n    });\n    parts.data = data.entries;\n    parts.rawData = data.rawEntries;\n}\nfunction parseDefault(lines) {\n    const result = {};\n    for (const line of lines) {\n        const [key, value] = line.slice(1, -1).split('=');\n        result[key] = value.slice(1, -1);\n    }\n    return result;\n}\n//# sourceMappingURL=parseDwar.js.map","import { getDiastereotopicAtomIDs } from '../diastereotopic/getDiastereotopicAtomIDs.js';\n/**\n * Returns various information about atoms in the molecule\n * @param {import('openchemlib').Molecule} [molecule]\n */\nexport function getAtomsInfo(molecule) {\n    const OCL = molecule.getOCL();\n    molecule.ensureHelperArrays(OCL.Molecule.cHelperRings);\n    const diaIDs = getDiastereotopicAtomIDs(molecule);\n    const results = [];\n    for (let i = 0; i < diaIDs.length; i++) {\n        const 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        const 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        result.implicitHydrogens =\n            result.allHydrogens + result.connAtoms - result.allConnAtoms;\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        // 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            const bond = molecule.getConnBond(i, j);\n            const bondOrder = molecule.getBondOrder(bond);\n            if (molecule.isAromaticBond(bond)) {\n                extra.aromaticBonds++;\n            }\n            else if (bondOrder === 1) {\n                // not an hydrogen\n                extra.singleBonds++;\n            }\n            else if (bondOrder === 2) {\n                extra.doubleBonds++;\n            }\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        if (result.atomicNo === 6) {\n            result.extra.cnoHybridation = result.extra.totalBonds - 1;\n        }\n        else if (result.atomicNo === 7) {\n            result.extra.cnoHybridation = result.extra.totalBonds;\n        }\n        else if (result.atomicNo === 8) {\n            result.extra.cnoHybridation = result.extra.totalBonds + 1;\n        }\n        else if (result.atomicNo === 1) {\n            const connectedAtom = 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//# sourceMappingURL=getAtomsInfo.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.atomSorter = atomSorter;\n/**\n * Implementation of the Hill system for sorting atoms\n * https://en.wikipedia.org/wiki/Chemical_formula#Hill_system\n * @param a - first atom to compare\n * @param b - second atom to compare\n * @returns A value suitable for use in Array.prototype.sort.\n */\nfunction atomSorter(a, b) {\n    if (a === b)\n        return 0;\n    if (a === 'C')\n        return -1;\n    if (b === 'C')\n        return 1;\n    if (a === 'H')\n        return -1;\n    if (b === 'H')\n        return 1;\n    if (a < b)\n        return -1;\n    return 1;\n}\n//# sourceMappingURL=index.js.map","import { atomSorter } from 'atom-sorter';\n/**\n * Calculate the molecular formula in 'chemcalc' notation taking into account fragments, isotopes and charges\n * @param {import('openchemlib').Molecule} molecule - an instance of OCL.Molecule\n * @returns {object}\n */\nexport function getMF(molecule) {\n    const entries = molecule.getFragments();\n    const result = {};\n    let parts = [];\n    const allAtoms = [];\n    for (const entry of entries) {\n        const mf = getFragmentMF(entry, allAtoms);\n        parts.push(mf);\n    }\n    const counts = {};\n    for (const part of parts) {\n        if (!counts[part])\n            counts[part] = 0;\n        counts[part]++;\n    }\n    parts = [];\n    for (const key of Object.keys(counts).sort()) {\n        if (counts[key] > 1) {\n            parts.push(counts[key] + key);\n        }\n        else {\n            parts.push(key);\n        }\n    }\n    result.parts = parts;\n    result.mf = toMFString(allAtoms);\n    return result;\n}\nfunction getFragmentMF(molecule, allAtoms) {\n    const atoms = [];\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        const 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        if (atom.label === '?')\n            atom.label = 'R';\n        atoms.push(atom);\n        allAtoms.push(atom);\n    }\n    return toMFString(atoms);\n}\nfunction toMFString(atoms) {\n    let charge = 0;\n    const mfs = {};\n    for (const atom of atoms) {\n        let label = atom.label;\n        charge += atom.charge;\n        if (atom.mass) {\n            label = `[${atom.mass}${label}]`;\n        }\n        const mfAtom = mfs[label];\n        if (!mfAtom) {\n            mfs[label] = 0;\n        }\n        mfs[label] += 1;\n        if (atom.implicitHydrogens) {\n            if (!mfs.H)\n                mfs.H = 0;\n            mfs.H += atom.implicitHydrogens;\n        }\n    }\n    let mf = '';\n    const keys = Object.keys(mfs).sort(atomSorter);\n    for (const key of keys) {\n        mf += key;\n        if (mfs[key] > 1)\n            mf += mfs[key];\n    }\n    if (charge > 0) {\n        mf += `(+${charge > 1 ? charge : ''})`;\n    }\n    else if (charge < 0) {\n        mf += `(${charge < -1 ? charge : '-'})`;\n    }\n    return mf;\n}\n//# sourceMappingURL=getMF.js.map","const unsaturationsObject = {\n    O: 0,\n    N: 1,\n    H: -1,\n    C: 2,\n    F: -1,\n    Si: 2,\n    Cl: -1,\n    Br: -1,\n    I: -1,\n};\n/**\n * Simplified version of the calculation in mf-parser\n * @param {string} mf\n * @returns\n */\nexport function getUnsaturation(mf) {\n    if (!mf)\n        return undefined;\n    // split a molecular formula into its elements\n    const elements = mf.match(/[A-Z][a-z]*\\d*/g);\n    if (!elements || elements.length === 0)\n        return undefined;\n    let unsaturation = 0;\n    for (let i = 0; i < elements.length; i++) {\n        const element = elements[i];\n        const matches = element.match(/([A-Z][a-z]?)(\\d*)/);\n        const symbol = matches[1];\n        const count = matches[2] ? Number.parseInt(matches[2], 10) : 1;\n        const elementObject = unsaturationsObject[symbol];\n        if (elementObject === undefined) {\n            return undefined;\n        }\n        unsaturation += unsaturationsObject[symbol] * count;\n    }\n    return unsaturation / 2 + 1;\n}\n//# sourceMappingURL=getUnsaturation.js.map","// this page allows to debug the hints: https://my.cheminfo.org/?viewURL=https%3A%2F%2Fmyviews.cheminfo.org%2Fdb%2Fvisualizer%2Fentry%2F108024089da99d0cb70a57724486d0c6%2Fview.json\nimport { TopicMolecule } from '../topic/TopicMolecule.js';\nimport { getUnsaturation } from './getUnsaturation.js';\nconst defaultPossibleHints = [\n    {\n        idCode: String.raw `eF@Hp\\pcc`,\n        message: 'What about a non-aromatic ring?',\n    },\n    {\n        idCode: 'eF@HpZpk|X`',\n        message: 'You should consider an aromatic ring.',\n    },\n    {\n        idCode: 'gFp@DiTt@@B',\n        message: 'Did you think about benzene derivatives?',\n    },\n    {\n        idCode: 'eFHBLFLYpB@QVE_cD',\n        message: 'An aromatic cycle can be an heterocycle.',\n    },\n    {\n        idCode: 'eMHJN`q[N@PBGN@PBJhjU~JU@',\n        anyMatches: ['gFx@@eJf`@@P', 'gKP@Di\\\\YZ@qas`D@`'],\n        message: 'There could be more than one heteroatom in an aromatic cycle.',\n    },\n    {\n        idCode: 'gFp@DiTvjhCYbKFuXUEIVTUUWxlTeZMX',\n        anyMatches: ['gKP@Di\\\\Zj@vhbqkPjJRlhj?FbdkQ`'],\n        message: 'Aromatic cycles can have 5 or 6 atoms.',\n        remarks: 'Proposed 5 and it is 6',\n    },\n    {\n        idCode: 'gKP@Di\\\\Zj@vhbqkPjJRlhj?FbdkQ`',\n        anyMatches: ['gFp@DiTvjhCYbKFuXUEIVTUUWxlTeZMX'],\n        message: 'Aromatic cycles can have 5 or 6 atoms.',\n        remarks: 'Proposed 6 and it is 5',\n    },\n    {\n        idCode: 'gFx@@eJf`@@P',\n        message: 'Did you think about pyridine derivatives?',\n    },\n    {\n        idCode: 'gNp@LdbLjj@vdrpqSdm_qhXiKT',\n        message: 'I would consider bicyclo products.',\n        remarks: 'One atom bridge',\n    },\n    {\n        idCode: 'eFHBJD',\n        message: 'Adding a carbonyl could help.',\n    },\n    {\n        idCode: 'eMHAIhMi}EqfFBmN?vP',\n        message: 'You should consider an alcohol.',\n    },\n    {\n        idCode: 'eMB@HRZCBKSFXXJt{?Y@',\n        message: 'You should consider a thiol.',\n    },\n    {\n        idCode: 'gJQ@@eKU@[KFJtLAa`sAUR]g_zlP',\n        message: 'You should consider an ether.',\n    },\n    {\n        idCode: 'gJQ@@eKU@[KFJtLAa`r`q?EAcuX`',\n        anyMatches: ['gJQ@@eKU@[KFJtLAa`?uX`'],\n        message: 'An ether can be in a cycle.',\n    },\n    {\n        idCode: 'gJPH@DIRuPFrqbmC@XXLpUTgYw~kD',\n        message: 'You should consider a thioether.',\n    },\n    {\n        idCode: 'gJPH@DIRuPFrqbmC@XXLhL_qPX}VH',\n        anyMatches: ['gJPH@DIRuPFrqbmC@XXO}VH'],\n        message: 'A thioether can be in a cycle.',\n    },\n    {\n        idCode: 'eM`AIhLHmLYa`kSo}d',\n        message: 'You should consider a primary amine.',\n        remarks: 'primary',\n    },\n    {\n        idCode: 'gJX@@eKU@XPVVLUhXCCAUIv]?jq@',\n        message: 'You should consider a secondary amine.',\n        remarks: 'secondary',\n    },\n    {\n        idCode: 'gNx@@eRmUPFDElZxxppVFAppUv\\\\WUw~xu`',\n        message: 'You should consider a tertiary amine.',\n        remarks: 'tertiary',\n    },\n    {\n        idCode: 'gJX@@eKU@XPVVLUhXCCAeAcUIv]~JCGjq@',\n        anyMatches: ['gJX@@eKU@XPVVLUhXCCAfBjd{N?uX`'],\n        message: 'A secondary amine can be in a cycle.',\n        remarks: 'secondary cyclic amine',\n    },\n    {\n        idCode: 'gNx@@eRmUPFDElZxxppVFAppYPXuv\\\\WUwxhL^xu`',\n        anyMatches: ['gNx@@eRmUPFDElZxxppVFAppY`j{NKj{?\\\\Zp'],\n        message: 'A tertiary amine can be in a cycle.',\n        remarks: 'tertiary cyclic amine',\n    },\n    {\n        idCode: 'gGP`@df]j`MekEZFBppUa]?ju@',\n        message: 'What about an ester?',\n    },\n    {\n        idCode: 'gGP`@df]j`MekEZFBppYdZpn?FQzmP',\n        anyMatches: ['gGP`@df]j`MekEZFBppUa]?ju@'],\n        message: 'An ester can be in a cycle.',\n    },\n    {\n        idCode: 'gGY@DDf]j`MekEZFBppUa]?ju@',\n        message: 'There is an amide function in the molecule.',\n    },\n    {\n        idCode: 'gGY@DDf]j`MekEZFBppYdZpn?FQzmP',\n        anyMatches: ['gGY@DDf]j`MekEZFBppUa]?ju@@'],\n        message: 'An amide can be in a cycle.',\n    },\n    {\n        idCode: 'gCi@DDfZ@~btl',\n        message: 'There is a primary amide in the molecule.',\n    },\n    {\n        idCode: 'gC``@dfZ@~bl',\n        message: 'You should think about carboxylic acids. The OH signal may be very wide.',\n    },\n    {\n        idCode: String.raw `eF@Hh\\q@`,\n        message: 'What about having an olefin?',\n    },\n    {\n        idCode: 'gFp@DiTt@@CqC^LmV[m`',\n        anyMatches: ['gFp@DiTt@@CBqXwd@'],\n        message: 'Did you think about disubstituted aromatic rings?',\n        remarks: 'meta',\n    },\n    {\n        idCode: 'gFp@DiTt@@CqB~LmWkM`',\n        anyMatches: ['gFp@DiTt@@CBqXwd@'],\n        message: 'Did you think about disubstituted aromatic rings?',\n        remarks: 'para',\n    },\n    {\n        idCode: 'gFp@DiTt@@CqB^JoV[m',\n        anyMatches: ['gFp@DiTt@@CBqXwd@'],\n        message: 'Did you think about disubstituted aromatic rings?',\n        remarks: 'ortho',\n    },\n    {\n        idCode: 'gFp@DiTt@@CqB^JoV[m',\n        anyMatches: ['gFp@DiTt@@CqC^LmV[m`', 'gFp@DiTt@@CqB~LmWkM`'],\n        message: 'Disubstituted aromatic ring can be ortho (1,2), meta (1,3) or para (1,4).',\n        remarks: 'ortho',\n    },\n    {\n        idCode: 'gFp@DiTt@@CqC^LmV[m`',\n        anyMatches: ['gFp@DiTt@@CqB^JoV[m', 'gFp@DiTt@@CqB~LmWkM`'],\n        message: 'Disubstituted aromatic ring can be ortho (1,2), meta (1,3) or para (1,4).',\n        remarks: 'meta',\n    },\n    {\n        idCode: 'gFp@DiTt@@CqB~LmWkM`',\n        anyMatches: ['gFp@DiTt@@CqC^LmV[m`', 'gFp@DiTt@@CqB^JoV[m'],\n        message: 'Disubstituted aromatic ring can be ortho (1,2), meta (1,3) or para (1,4).',\n        remarks: 'para',\n    },\n    {\n        idCode: 'gGP`@df]j`H',\n        anyMatches: ['gGP`@dfUj`H'],\n        message: 'You should check the orientation of the ester.',\n    },\n    {\n        idCode: String.raw `gOq@@drm\\@@Aa@`,\n        message: 'Alcohols on aromatic ring may have surprising chemical shifts.',\n    },\n    {\n        idCode: String.raw `gOx@@drm\\@@A}A@`,\n        message: 'NH on aromatic ring may have surprising chemical shifts.',\n    },\n    {\n        idCode: 'eFHBJGuP',\n        message: 'Hydrogens on a carbonyl have very high chemical shifts.',\n    },\n];\n/**\n *\n * @param {import('openchemlib').Molecule} correct\n * @param {import('openchemlib').Molecule} proposed\n * @param {Record<string,any>} [options ={}]\n * @param {Array} [options.possibleHints=defaultPossibleHints]\n * @returns\n */\nexport function getNMRHints(correct, proposed, options = {}) {\n    const hints = [\n        ...checkMF(correct, proposed),\n        ...checkUnsaturation(correct, proposed),\n        ...checkStereoAndTautomer(correct, proposed),\n    ];\n    const { possibleHints = defaultPossibleHints } = options;\n    const OCL = correct.getOCL();\n    const searcherCorrect = new OCL.SSSearcher();\n    searcherCorrect.setMolecule(correct);\n    const searcherAnswer = new OCL.SSSearcher();\n    searcherAnswer.setMolecule(proposed);\n    for (const possibleHint of possibleHints) {\n        const { anyMatches } = possibleHint;\n        if (anyMatches) {\n            // we filter the molecules so they match at least one of the anyMatches\n            let match = false;\n            for (const anyMatch of anyMatches) {\n                const matchFragment = OCL.Molecule.fromIDCode(anyMatch);\n                searcherAnswer.setFragment(matchFragment);\n                if (searcherAnswer.isFragmentInMolecule()) {\n                    match = true;\n                    break;\n                }\n            }\n            if (!match)\n                continue;\n        }\n        const fragment = OCL.Molecule.fromIDCode(possibleHint.idCode);\n        searcherCorrect.setFragment(fragment);\n        searcherAnswer.setFragment(fragment);\n        if (searcherCorrect.isFragmentInMolecule() &&\n            !searcherAnswer.isFragmentInMolecule()) {\n            hints.push(possibleHint);\n        }\n    }\n    // we suggest symmetry only if MF is correct\n    if (isMFCorrect(correct, proposed)) {\n        hints.push(...checkSymmetry(correct, proposed));\n    }\n    return hints.map((hint) => ({\n        ...hint,\n        hash: getHash(JSON.stringify(hint)),\n    }));\n}\nfunction isMFCorrect(correct, answer) {\n    const mfCorrect = correct.getMolecularFormula().formula;\n    const mfAnswer = answer.getMolecularFormula().formula;\n    return mfCorrect === mfAnswer;\n}\nfunction checkMF(correct, answer) {\n    if (isMFCorrect(correct, answer))\n        return [];\n    return [\n        {\n            message: 'You should check the molecular formula.',\n        },\n    ];\n}\nfunction checkUnsaturation(correct, answer) {\n    const mfCorrect = correct.getMolecularFormula().formula;\n    const mfAnswer = answer.getMolecularFormula().formula;\n    if (mfCorrect !== mfAnswer) {\n        const unsaturationCorrect = getUnsaturation(mfCorrect);\n        const unsaturationAnswer = getUnsaturation(mfAnswer);\n        if (unsaturationCorrect === unsaturationAnswer ||\n            unsaturationAnswer === undefined ||\n            unsaturationCorrect === undefined) {\n            return [];\n        }\n        if (unsaturationCorrect > unsaturationAnswer) {\n            return [\n                {\n                    message: 'The proposed molecule has a double bond equivalent (DBE) that is too low.',\n                },\n            ];\n        }\n        else {\n            return [\n                {\n                    message: 'The proposed molecule has a double bond equivalent (DBE) that is too high.',\n                },\n            ];\n        }\n    }\n    return [];\n}\nfunction checkStereoAndTautomer(correct, answer) {\n    if (correct.getIDCode() === answer.getIDCode())\n        return [];\n    if (getNoStereoIDCode(correct) === getNoStereoIDCode(answer)) {\n        return [\n            {\n                message: 'There is only a problem with stereochemistry.',\n            },\n        ];\n    }\n    if (getTautomerIDCode(correct) === getTautomerIDCode(answer)) {\n        return [\n            {\n                message: \"Weird, you didn't draw the expected tautomer.\",\n            },\n        ];\n    }\n    return [];\n}\nfunction checkSymmetry(correct, answer) {\n    const nbCorrectRanks = Object.keys(new TopicMolecule(correct).getDiaIDsObject()).length;\n    const nbAnswerRanks = Object.keys(new TopicMolecule(answer).getDiaIDsObject()).length;\n    if (nbCorrectRanks === nbAnswerRanks)\n        return [];\n    if (nbCorrectRanks > nbAnswerRanks) {\n        return [\n            {\n                message: 'The proposed molecule is too symmetric.',\n            },\n        ];\n    }\n    else {\n        return [\n            {\n                message: 'The proposed molecule is not symmetric enough.',\n            },\n        ];\n    }\n}\nfunction getTautomerIDCode(molecule) {\n    const OCL = molecule.getOCL();\n    return OCL.CanonizerUtil.getIDCode(molecule, OCL.CanonizerUtil.TAUTOMER);\n}\nfunction getNoStereoIDCode(molecule) {\n    const OCL = molecule.getOCL();\n    return OCL.CanonizerUtil.getIDCode(molecule, OCL.CanonizerUtil.NOSTEREO);\n}\n/*\n    https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js\n    cyrb53a (c) 2023 bryc (github.com/bryc)\n    License: Public domain. Attribution appreciated.\n    The original cyrb53 has a slight mixing bias in the low bits of h1.\n    This shouldn't be a huge problem, but I want to try to improve it.\n    This new version should have improved avalanche behavior, but\n    it is not quite final, I may still find improvements.\n    So don't expect it to always produce the same output.\n*/\nfunction getHash(str, seed = 0) {\n    let h1 = 0xdeadbeef ^ seed;\n    let h2 = 0x41c6ce57 ^ seed;\n    for (let i = 0, ch; i < str.length; i++) {\n        ch = str.codePointAt(i);\n        h1 = Math.imul(h1 ^ ch, 0x85ebca77);\n        h2 = Math.imul(h2 ^ ch, 0xc2b2ae3d);\n    }\n    h1 ^= Math.imul(h1 ^ (h2 >>> 15), 0x735a2d97);\n    h2 ^= Math.imul(h2 ^ (h1 >>> 15), 0xcaf649a9);\n    h1 ^= h2 >>> 16;\n    h2 ^= h1 >>> 16;\n    return 2097152 * (h2 >>> 0) + (h1 >>> 11);\n}\n//# sourceMappingURL=getNMRHints.js.map","let toxicityPredictor;\nlet druglikenessPredictor;\n/**\n *\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {boolean} [options.includeToxicities=false]\n * @param {boolean} [options.includeDruglikeness=false]\n */\nexport function getProperties(molecule, options = {}) {\n    const { includeToxicities = false, includeDruglikeness = false } = options;\n    const OCL = molecule.getOCL();\n    if (!OCL.MoleculeProperties) {\n        throw new Error('OCL.MoleculeProperties is not defined');\n    }\n    const props = new OCL.MoleculeProperties(molecule);\n    const moleculeFormula = molecule.getMolecularFormula();\n    const result = {\n        acceptorCount: props.acceptorCount,\n        donorCount: props.donorCount,\n        logP: props.logP,\n        logS: props.logS,\n        polarSurfaceArea: props.polarSurfaceArea,\n        rotatableBondCount: props.rotatableBondCount,\n        stereoCenterCount: props.stereoCenterCount,\n        mw: moleculeFormula.relativeWeight,\n        mf: moleculeFormula.formula,\n    };\n    if (includeToxicities) {\n        const { ToxicityPredictor } = molecule.getOCL();\n        if (!ToxicityPredictor) {\n            throw new Error('OCL.ToxicityPredictor is not defined');\n        }\n        if (!toxicityPredictor) {\n            toxicityPredictor = new ToxicityPredictor();\n        }\n        result.mutagenic = toxicityPredictor.assessRisk(molecule, ToxicityPredictor.TYPE_MUTAGENIC);\n        result.tumorigenic = toxicityPredictor.assessRisk(molecule, ToxicityPredictor.TYPE_TUMORIGENIC);\n        result.irritant = toxicityPredictor.assessRisk(molecule, ToxicityPredictor.TYPE_IRRITANT);\n        result.reproductiveEffective = toxicityPredictor.assessRisk(molecule, ToxicityPredictor.TYPE_REPRODUCTIVE_EFFECTIVE);\n    }\n    if (includeDruglikeness) {\n        const { DruglikenessPredictor } = molecule.getOCL();\n        if (!DruglikenessPredictor) {\n            throw new Error('OCL.DruglikenessPredictor is not defined');\n        }\n        if (!druglikenessPredictor) {\n            druglikenessPredictor = new DruglikenessPredictor();\n        }\n        result.drugLikeness = druglikenessPredictor.assessDruglikeness(molecule);\n    }\n    if (result.drugLikeness !== undefined && result.mutagenic !== undefined) {\n        result.drugScore = OCL.DrugScoreCalculator.calculate(result.logP, result.polarSurfaceArea, result.mw, result.drugLikeness, [\n            result.mutagenic,\n            result.tumurogenic,\n            result.irritant,\n            result.reproductiveEffective,\n        ]);\n    }\n    return result;\n}\n//# sourceMappingURL=getProperties.js.map","import { getHoseCodesForPath } from '../hose/getHoseCodesForPath.js';\nimport { getAtomsInfo } from '../util/getAtomsInfo.js';\nimport { getConnectivityMatrix } from '../util/getConnectivityMatrix.js';\nimport { getPathAndTorsion } from './getPathAndTorsion.js';\nlet fragment;\n/**\n *\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {string} [options.fromLabel='H']\n * @param {string} [options.toLabel='H']\n * @param {number} [options.minLength=1]\n * @param {number} [options.maxLength=4]\n * @param {boolean} [options.withHOSES=false]\n */\nexport function getPathsInfo(molecule, options = {}) {\n    const { fromLabel = 'H', toLabel = 'H', minLength = 1, maxLength = 4, withHOSES = false, } = options;\n    const OCL = molecule.getOCL();\n    if (!fragment) {\n        fragment = new OCL.Molecule(0, 0);\n    }\n    const fromAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(fromLabel);\n    const toAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(toLabel);\n    // we need to find all the atoms 'fromLabel' and 'toLabel'\n    const atomsInfo = getAtomsInfo(molecule);\n    const pathLengthMatrix = getConnectivityMatrix(molecule, {\n        pathLength: true,\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                molecule.getAtomicNo(from) === fromAtomicNumber &&\n                molecule.getAtomicNo(to) === toAtomicNumber) {\n                const pathLength = pathLengthMatrix[from][to];\n                if (pathLength >= minLength && pathLength <= maxLength) {\n                    if (withHOSES) {\n                        atomsInfo[from].paths.push(getHoseCodesForPath(molecule, from, to, pathLength));\n                    }\n                    else {\n                        atomsInfo[from].paths.push(getPathAndTorsion(molecule, from, to, pathLength));\n                    }\n                }\n            }\n        }\n    }\n    return atomsInfo;\n}\n//# sourceMappingURL=getPathsInfo.js.map","/**\n * Calculate the molecular formula in 'chemcalc' notation taking into account fragments, isotopes and charges\n * @param {OCL.Molecule} [molecule] - an instance of OCL.Molecule\n * @returns {}\n */\nexport function getAtoms(molecule) {\n    const entries = molecule.getFragments();\n    const atoms = {};\n    const result = { atoms, parts: [] };\n    for (const entry of entries) {\n        const part = {};\n        result.parts.push(part);\n        appendAtomPart(entry, atoms, part);\n    }\n    return result;\n}\nfunction appendAtomPart(molecule, atoms, part) {\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        const label = molecule.getAtomLabel(i);\n        if (!atoms[label]) {\n            atoms[label] = 0;\n        }\n        atoms[label] += 1;\n        if (!part[label]) {\n            part[label] = 0;\n        }\n        part[label] += 1;\n        const implicitHydrogens = molecule.getImplicitHydrogens(i);\n        if (implicitHydrogens) {\n            if (!atoms.H) {\n                atoms.H = 0;\n            }\n            atoms.H += implicitHydrogens;\n            if (!part.H) {\n                part.H = 0;\n            }\n            part.H += implicitHydrogens;\n        }\n    }\n}\n//# sourceMappingURL=getAtoms.js.map","/**\n * Calculates the path between 2 atoms\n * @param {import('openchemlib').Molecule} molecule\n * @param {number} from - index of the first atom\n * @param {number} to - index of the end atom\n * @param {number} maxLength - maximal length of the path\n */\nexport function getPathAndTorsion(molecule, from, to, maxLength) {\n    const 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    return {\n        atoms: originalAtoms,\n        from,\n        to,\n        torsion,\n        length: originalAtoms.length - 1,\n    };\n}\n//# sourceMappingURL=getPathAndTorsion.js.map","/* @license\nPapa Parse\nv5.5.2\nhttps://github.com/mholt/PapaParse\nLicense: MIT\n*/\n((e,t)=>{\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof module&&\"undefined\"!=typeof exports?module.exports=t():e.Papa=t()})(this,function r(){var n=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==n?n:{};var d,s=!n.document&&!!n.postMessage,a=n.IS_PAPA_WORKER||!1,o={},h=0,v={};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(t,e){var i=parseInt(this._config.skipFirstNLines)||0;if(this.isFirstChunk&&0<i){let e=this._config.newline;e||(r=this._config.quoteChar||'\"',e=this._handle.guessLineEndings(t,r)),t=[...t.split(e).slice(i)].join(e)}this.isFirstChunk&&U(this._config.beforeFirstChunk)&&void 0!==(r=this._config.beforeFirstChunk(t))&&(t=r),this.isFirstChunk=!1,this._halted=!1;var i=this._partialLine+t,r=(this._partialLine=\"\",this._handle.parse(i,this._baseIndex,!this._finished));if(!this._handle.paused()&&!this._handle.aborted()){t=r.meta.cursor,i=(this._finished||(this._partialLine=i.substring(t-this._baseIndex),this._baseIndex=t),r&&r.data&&(this._rowCount+=r.data.length),this._finished||this._config.preview&&this._rowCount>=this._config.preview);if(a)n.postMessage({results:r,workerId:v.WORKER_ID,finished:i});else if(U(this._config.chunk)&&!e){if(this._config.chunk(r,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);this._completeResults=r=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(r.data),this._completeResults.errors=this._completeResults.errors.concat(r.errors),this._completeResults.meta=r.meta),this._completed||!i||!U(this._config.complete)||r&&r.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),i||r&&r.meta.paused||this._nextChunk(),r}this._halted=!0},this._sendError=function(e){U(this._config.error)?this._config.error(e):a&&this._config.error&&n.postMessage({workerId:v.WORKER_ID,error:e,finished:!1})}}function f(e){var r;(e=e||{}).chunkSize||(e.chunkSize=v.RemoteChunkSize),u.call(this,e),this._nextChunk=s?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),s||(r.onload=y(this._chunkLoaded,this),r.onerror=y(this._chunkError,this)),r.open(this._config.downloadRequestBody?\"POST\":\"GET\",this._input,!s),this._config.downloadRequestHeaders){var e,t=this._config.downloadRequestHeaders;for(e in t)r.setRequestHeader(e,t[e])}var i;this._config.chunkSize&&(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)}s&&0===r.status&&this._chunkError()}},this._chunkLoaded=function(){4===r.readyState&&(r.status<200||400<=r.status?this._chunkError():(this._start+=this._config.chunkSize||r.responseText.length,this._finished=!this._config.chunkSize||this._start>=(e=>null!==(e=e.getResponseHeader(\"Content-Range\"))?parseInt(e.substring(e.lastIndexOf(\"/\")+1)):-1)(r),this.parseChunk(r.responseText)))},this._chunkError=function(e){e=r.statusText||e;this._sendError(new Error(e))}}function l(e){(e=e||{}).chunkSize||(e.chunkSize=v.LocalChunkSize),u.call(this,e);var i,r,n=\"undefined\"!=typeof FileReader;this.stream=function(e){this._input=e,r=e.slice||e.webkitSlice||e.mozSlice,n?((i=new FileReader).onload=y(this._chunkLoaded,this),i.onerror=y(this._chunkError,this)):i=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,t=(this._config.chunkSize&&(t=Math.min(this._start+this._config.chunkSize,this._input.size),e=r.call(e,this._start,t)),i.readAsText(e,this._config.encoding));n||this._chunkLoaded({target:{result:t}})},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(i.error)}}function c(e){var i;u.call(this,e=e||{}),this.stream=function(e){return i=e,this._nextChunk()},this._nextChunk=function(){var e,t;if(!this._finished)return e=this._config.chunkSize,i=e?(t=i.substring(0,e),i.substring(e)):(t=i,\"\"),this._finished=!i,this.parseChunk(t)}}function p(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=y(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=y(function(e){this._streamCleanUp(),this._sendError(e)},this),this._streamEnd=y(function(){this._streamCleanUp(),r=!0,this._streamData(\"\")},this),this._streamCleanUp=y(function(){this._input.removeListener(\"data\",this._streamData),this._input.removeListener(\"end\",this._streamEnd),this._input.removeListener(\"error\",this._streamError)},this)}function i(m){var n,s,a,t,o=Math.pow(2,53),h=-o,u=/^\\s*-?(\\d+\\.?|\\.\\d+|\\d+\\.\\d+)([eE][-+]?\\d+)?\\s*$/,d=/^((\\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)))$/,i=this,r=0,f=0,l=!1,e=!1,c=[],p={data:[],errors:[],meta:{}};function y(e){return\"greedy\"===m.skipEmptyLines?\"\"===e.join(\"\").trim():1===e.length&&0===e[0].length}function g(){if(p&&a&&(k(\"Delimiter\",\"UndetectableDelimiter\",\"Unable to auto-detect delimiting character; defaulted to '\"+v.DefaultDelimiter+\"'\"),a=!1),m.skipEmptyLines&&(p.data=p.data.filter(function(e){return!y(e)})),_()){if(p)if(Array.isArray(p.data[0])){for(var e=0;_()&&e<p.data.length;e++)p.data[e].forEach(t);p.data.splice(0,1)}else p.data.forEach(t);function t(e,t){U(m.transformHeader)&&(e=m.transformHeader(e,t)),c.push(e)}}function i(e,t){for(var i=m.header?{}:[],r=0;r<e.length;r++){var n=r,s=e[r],s=((e,t)=>(e=>(m.dynamicTypingFunction&&void 0===m.dynamicTyping[e]&&(m.dynamicTyping[e]=m.dynamicTypingFunction(e)),!0===(m.dynamicTyping[e]||m.dynamicTyping)))(e)?\"true\"===t||\"TRUE\"===t||\"false\"!==t&&\"FALSE\"!==t&&((e=>{if(u.test(e)){e=parseFloat(e);if(h<e&&e<o)return 1}})(t)?parseFloat(t):d.test(t)?new Date(t):\"\"===t?null:t):t)(n=m.header?r>=c.length?\"__parsed_extra\":c[r]:n,s=m.transform?m.transform(s,n):s);\"__parsed_extra\"===n?(i[n]=i[n]||[],i[n].push(s)):i[n]=s}return m.header&&(r>c.length?k(\"FieldMismatch\",\"TooManyFields\",\"Too many fields: expected \"+c.length+\" fields but parsed \"+r,f+t):r<c.length&&k(\"FieldMismatch\",\"TooFewFields\",\"Too few fields: expected \"+c.length+\" fields but parsed \"+r,f+t)),i}var r;p&&(m.header||m.dynamicTyping||m.transform)&&(r=1,!p.data.length||Array.isArray(p.data[0])?(p.data=p.data.map(i),r=p.data.length):p.data=i(p.data,0),m.header&&p.meta&&(p.meta.fields=c),f+=r)}function _(){return m.header&&0===c.length}function k(e,t,i,r){e={type:e,code:t,message:i};void 0!==r&&(e.row=r),p.errors.push(e)}U(m.step)&&(t=m.step,m.step=function(e){p=e,_()?g():(g(),0!==p.data.length&&(r+=e.data.length,m.preview&&r>m.preview?s.abort():(p.data=p.data[0],t(p,i))))}),this.parse=function(e,t,i){var r=m.quoteChar||'\"',r=(m.newline||(m.newline=this.guessLineEndings(e,r)),a=!1,m.delimiter?U(m.delimiter)&&(m.delimiter=m.delimiter(e),p.meta.delimiter=m.delimiter):((r=((e,t,i,r,n)=>{var s,a,o,h;n=n||[\",\",\"\\t\",\"|\",\";\",v.RECORD_SEP,v.UNIT_SEP];for(var u=0;u<n.length;u++){for(var d,f=n[u],l=0,c=0,p=0,g=(o=void 0,new E({comments:r,delimiter:f,newline:t,preview:10}).parse(e)),_=0;_<g.data.length;_++)i&&y(g.data[_])?p++:(d=g.data[_].length,c+=d,void 0===o?o=d:0<d&&(l+=Math.abs(d-o),o=d));0<g.data.length&&(c/=g.data.length-p),(void 0===a||l<=a)&&(void 0===h||h<c)&&1.99<c&&(a=l,s=f,h=c)}return{successful:!!(m.delimiter=s),bestDelimiter:s}})(e,m.newline,m.skipEmptyLines,m.comments,m.delimitersToGuess)).successful?m.delimiter=r.bestDelimiter:(a=!0,m.delimiter=v.DefaultDelimiter),p.meta.delimiter=m.delimiter),w(m));return m.preview&&m.header&&r.preview++,n=e,s=new E(r),p=s.parse(n,t,i),g(),l?{meta:{paused:!0}}:p||{meta:{paused:!1}}},this.paused=function(){return l},this.pause=function(){l=!0,s.abort(),n=U(m.chunk)?\"\":n.substring(s.getCharIndex())},this.resume=function(){i.streamer._halted?(l=!1,i.streamer.parseChunk(n,!0)):setTimeout(i.resume,3)},this.aborted=function(){return e},this.abort=function(){e=!0,s.abort(),p.meta.aborted=!0,U(m.complete)&&m.complete(p),n=\"\"},this.guessLineEndings=function(e,t){e=e.substring(0,1048576);var t=new RegExp(P(t)+\"([^]*?)\"+P(t),\"gm\"),i=(e=e.replace(t,\"\")).split(\"\\r\"),t=e.split(\"\\n\"),e=1<t.length&&t[0].length<i[0].length;if(1===i.length||e)return\"\\n\";for(var r=0,n=0;n<i.length;n++)\"\\n\"===i[n][0]&&r++;return r>=i.length/2?\"\\r\\n\":\"\\r\"}}function P(e){return e.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function E(C){var S=(C=C||{}).delimiter,O=C.newline,x=C.comments,I=C.step,A=C.preview,T=C.fastMode,D=null,L=!1,F=null==C.quoteChar?'\"':C.quoteChar,j=F;if(void 0!==C.escapeChar&&(j=C.escapeChar),(\"string\"!=typeof S||-1<v.BAD_DELIMITERS.indexOf(S))&&(S=\",\"),x===S)throw new Error(\"Comment character same as delimiter\");!0===x?x=\"#\":(\"string\"!=typeof x||-1<v.BAD_DELIMITERS.indexOf(x))&&(x=!1),\"\\n\"!==O&&\"\\r\"!==O&&\"\\r\\n\"!==O&&(O=\"\\n\");var z=0,M=!1;this.parse=function(i,t,r){if(\"string\"!=typeof i)throw new Error(\"Input must be a string\");var n=i.length,e=S.length,s=O.length,a=x.length,o=U(I),h=[],u=[],d=[],f=z=0;if(!i)return b();if(T||!1!==T&&-1===i.indexOf(F)){for(var l=i.split(O),c=0;c<l.length;c++){if(d=l[c],z+=d.length,c!==l.length-1)z+=O.length;else if(r)return b();if(!x||d.substring(0,a)!==x){if(o){if(h=[],k(d.split(S)),R(),M)return b()}else k(d.split(S));if(A&&A<=c)return h=h.slice(0,A),b(!0)}}return b()}for(var p=i.indexOf(S,z),g=i.indexOf(O,z),_=new RegExp(P(j)+P(F),\"g\"),m=i.indexOf(F,z);;)if(i[z]===F)for(m=z,z++;;){if(-1===(m=i.indexOf(F,m+1)))return r||u.push({type:\"Quotes\",code:\"MissingQuotes\",message:\"Quoted field unterminated\",row:h.length,index:z}),E();if(m===n-1)return E(i.substring(z,m).replace(_,F));if(F===j&&i[m+1]===j)m++;else if(F===j||0===m||i[m-1]!==j){-1!==p&&p<m+1&&(p=i.indexOf(S,m+1));var y=v(-1===(g=-1!==g&&g<m+1?i.indexOf(O,m+1):g)?p:Math.min(p,g));if(i.substr(m+1+y,e)===S){d.push(i.substring(z,m).replace(_,F)),i[z=m+1+y+e]!==F&&(m=i.indexOf(F,z)),p=i.indexOf(S,z),g=i.indexOf(O,z);break}y=v(g);if(i.substring(m+1+y,m+1+y+s)===O){if(d.push(i.substring(z,m).replace(_,F)),w(m+1+y+s),p=i.indexOf(S,z),m=i.indexOf(F,z),o&&(R(),M))return b();if(A&&h.length>=A)return b(!0);break}u.push({type:\"Quotes\",code:\"InvalidQuotes\",message:\"Trailing quote on quoted field is malformed\",row:h.length,index:z}),m++}}else if(x&&0===d.length&&i.substring(z,z+a)===x){if(-1===g)return b();z=g+s,g=i.indexOf(O,z),p=i.indexOf(S,z)}else if(-1!==p&&(p<g||-1===g))d.push(i.substring(z,p)),z=p+e,p=i.indexOf(S,z);else{if(-1===g)break;if(d.push(i.substring(z,g)),w(g+s),o&&(R(),M))return b();if(A&&h.length>=A)return b(!0)}return E();function k(e){h.push(e),f=z}function v(e){var t=0;return t=-1!==e&&(e=i.substring(m+1,e))&&\"\"===e.trim()?e.length:t}function E(e){return r||(void 0===e&&(e=i.substring(z)),d.push(e),z=n,k(d),o&&R()),b()}function w(e){z=e,k(d),d=[],g=i.indexOf(O,z)}function b(e){if(C.header&&!t&&h.length&&!L){var s=h[0],a={},o=new Set(s);let n=!1;for(let r=0;r<s.length;r++){let i=s[r];if(a[i=U(C.transformHeader)?C.transformHeader(i,r):i]){let e,t=a[i];for(;e=i+\"_\"+t,t++,o.has(e););o.add(e),s[r]=e,a[i]++,n=!0,(D=null===D?{}:D)[e]=i}else a[i]=1,s[r]=i;o.add(i)}n&&console.warn(\"Duplicate headers found and renamed.\"),L=!0}return{data:h,errors:u,meta:{delimiter:S,linebreak:O,aborted:M,truncated:!!e,cursor:f+(t||0),renamedHeaders:D}}}function R(){I(b()),h=[],u=[]}},this.abort=function(){M=!0},this.getCharIndex=function(){return z}}function g(e){var t=e.data,i=o[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,_(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},pause:m,resume:m};if(U(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 U(i.userChunk)&&(i.userChunk(t.results,n,t.file),delete t.results)}t.finished&&!r&&_(t.workerId,t.results)}function _(e,t){var i=o[e];U(i.userComplete)&&i.userComplete(t),i.terminate(),delete o[e]}function m(){throw new Error(\"Not implemented.\")}function w(e){if(\"object\"!=typeof e||null===e)return e;var t,i=Array.isArray(e)?[]:{};for(t in e)i[t]=w(e[t]);return i}function y(e,t){return function(){e.apply(t,arguments)}}function U(e){return\"function\"==typeof e}return v.parse=function(e,t){var i=(t=t||{}).dynamicTyping||!1;U(i)&&(t.dynamicTypingFunction=i,i={});if(t.dynamicTyping=i,t.transform=!!U(t.transform)&&t.transform,!t.worker||!v.WORKERS_SUPPORTED)return i=null,v.NODE_STREAM_INPUT,\"string\"==typeof e?(e=(e=>65279!==e.charCodeAt(0)?e:e.slice(1))(e),i=new(t.download?f:c)(t)):!0===e.readable&&U(e.read)&&U(e.on)?i=new p(t):(n.File&&e instanceof File||e instanceof Object)&&(i=new l(t)),i.stream(e);(i=(()=>{var e;return!!v.WORKERS_SUPPORTED&&(e=(()=>{var e=n.URL||n.webkitURL||null,t=r.toString();return v.BLOB_URL||(v.BLOB_URL=e.createObjectURL(new Blob([\"var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; \",\"(\",t,\")();\"],{type:\"text/javascript\"})))})(),(e=new n.Worker(e)).onmessage=g,e.id=h++,o[e.id]=e)})()).userStep=t.step,i.userChunk=t.chunk,i.userComplete=t.complete,i.userError=t.error,t.step=U(t.step),t.chunk=U(t.chunk),t.complete=U(t.complete),t.error=U(t.error),delete t.worker,i.postMessage({input:e,config:t,workerId:i.id})},v.unparse=function(e,t){var n=!1,_=!0,m=\",\",y=\"\\r\\n\",s='\"',a=s+s,i=!1,r=null,o=!1,h=((()=>{if(\"object\"==typeof t){if(\"string\"!=typeof t.delimiter||v.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),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),t.escapeFormulae instanceof RegExp?o=t.escapeFormulae:\"boolean\"==typeof t.escapeFormulae&&t.escapeFormulae&&(o=/^[=+\\-@\\t\\r].*$/)}})(),new RegExp(P(s),\"g\"));\"string\"==typeof e&&(e=JSON.parse(e));if(Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return u(null,e,i);if(\"object\"==typeof e[0])return u(r||Object.keys(e[0]),e,i)}else if(\"object\"==typeof e)return\"string\"==typeof e.data&&(e.data=JSON.parse(e.data)),Array.isArray(e.data)&&(e.fields||(e.fields=e.meta&&e.meta.fields||r),e.fields||(e.fields=Array.isArray(e.data[0])?e.fields:\"object\"==typeof e.data[0]?Object.keys(e.data[0]):[]),Array.isArray(e.data[0])||\"object\"==typeof e.data[0]||(e.data=[e.data])),u(e.fields||[],e.data||[],i);throw new Error(\"Unable to serialize unrecognized input\");function u(e,t,i){var r=\"\",n=(\"string\"==typeof e&&(e=JSON.parse(e)),\"string\"==typeof t&&(t=JSON.parse(t)),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+=k(e[a],a);0<t.length&&(r+=y)}for(var o=0;o<t.length;o++){var h=(n?e:t[o]).length,u=!1,d=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 f=[],l=0;l<h;l++){var c=s?e[l]:l;f.push(t[o][c])}u=\"\"===f.join(\"\").trim()}if(!u){for(var p=0;p<h;p++){0<p&&!d&&(r+=m);var g=n&&s?e[p]:p;r+=k(t[o][g],p)}o<t.length-1&&(!i||0<h&&!d)&&(r+=y)}}return r}function k(e,t){var i,r;return null==e?\"\":e.constructor===Date?JSON.stringify(e).slice(1,25):(r=!1,o&&\"string\"==typeof e&&o.test(e)&&(e=\"'\"+e,r=!0),i=e.toString().replace(h,a),(r=r||!0===n||\"function\"==typeof n&&n(e,t)||Array.isArray(n)&&n[t]||((e,t)=>{for(var i=0;i<t.length;i++)if(-1<e.indexOf(t[i]))return!0;return!1})(i,v.BAD_DELIMITERS)||-1<i.indexOf(m)||\" \"===i.charAt(0)||\" \"===i.charAt(i.length-1))?s+i+s:i)}},v.RECORD_SEP=String.fromCharCode(30),v.UNIT_SEP=String.fromCharCode(31),v.BYTE_ORDER_MARK=\"\\ufeff\",v.BAD_DELIMITERS=[\"\\r\",\"\\n\",'\"',v.BYTE_ORDER_MARK],v.WORKERS_SUPPORTED=!s&&!!n.Worker,v.NODE_STREAM_INPUT=1,v.LocalChunkSize=10485760,v.RemoteChunkSize=5242880,v.DefaultDelimiter=\",\",v.Parser=E,v.ParserHandle=i,v.NetworkStreamer=f,v.FileStreamer=l,v.StringStreamer=c,v.ReadableStreamStreamer=p,n.jQuery&&((d=n.jQuery).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()&&n.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)U(o.complete)&&o.complete();else{var e,t,i,r,n=h[0];if(U(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(U(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){U(a)&&a(e,n.file,n.inputElem),u()},v.parse(n.file,n.instanceConfig)}}function u(){h.splice(0,1),e()}}),a&&(n.onmessage=function(e){e=e.data;void 0===v.WORKER_ID&&e&&(v.WORKER_ID=e.workerId);\"string\"==typeof e.input?n.postMessage({workerId:v.WORKER_ID,results:v.parse(e.input,e.config),finished:!0}):(n.File&&e.input instanceof File||e.input instanceof Object)&&(e=v.parse(e.input,e.config))&&n.postMessage({workerId:v.WORKER_ID,results:e,finished:!0})}),(f.prototype=Object.create(u.prototype)).constructor=f,(l.prototype=Object.create(u.prototype)).constructor=l,(c.prototype=Object.create(c.prototype)).constructor=c,(p.prototype=Object.create(u.prototype)).constructor=p,v});","export default function getMoleculeCreators(OCL) {\n    const fields = new Map();\n    fields.set('oclid', OCL.Molecule.fromIDCode);\n    fields.set('idcode', OCL.Molecule.fromIDCode);\n    fields.set('smiles', OCL.Molecule.fromSmiles);\n    fields.set('molfile', OCL.Molecule.fromMolfile);\n    fields.set('smarts', (smarts) => {\n        const smilesParser = new OCL.SmilesParser({ smartsMode: 'smarts' });\n        return smilesParser.parseMolecule(smarts);\n    });\n    return fields;\n}\n//# sourceMappingURL=getMoleculeCreators.js.map","import { ensureString } from 'ensure-string';\nimport Papa from 'papaparse';\nimport getMoleculeCreators from './getMoleculeCreators.js';\nconst defaultCSVOptions = {\n    header: true,\n    dynamicTyping: true,\n    skipEmptyLines: true,\n};\nexport default async function appendCSV(moleculesDB, csv, options = {}) {\n    const { onStep } = options;\n    csv = ensureString(csv);\n    const moleculeCreators = getMoleculeCreators(moleculesDB.OCL);\n    if (typeof csv !== 'string') {\n        throw new TypeError('csv must be a string');\n    }\n    options = { ...defaultCSVOptions, ...options };\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    for (let i = 0; i < parsed.data.length; i++) {\n        moleculesDB.pushEntry(moleculeCreator(parsed.data[i][moleculeField]), parsed.data[i]);\n        if (onStep) {\n            // eslint-disable-next-line no-await-in-loop\n            await onStep(i + 1, parsed.data.length);\n        }\n    }\n}\n//# sourceMappingURL=appendCSV.js.map","var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// index.ts\nvar isObject = /* @__PURE__ */ __name((v) => v !== null && typeof v === \"object\", \"isObject\");\nvar join = /* @__PURE__ */ __name((segs, joinChar, options) => {\n  if (typeof options.join === \"function\") {\n    return options.join(segs);\n  }\n  return segs[0] + joinChar + segs[1];\n}, \"join\");\nvar split = /* @__PURE__ */ __name((path, splitChar, options) => {\n  if (typeof options.split === \"function\") {\n    return options.split(path);\n  }\n  return path.split(splitChar);\n}, \"split\");\nvar isValid = /* @__PURE__ */ __name((key, target = {}, options) => {\n  if (typeof options?.isValid === \"function\") {\n    return options.isValid(key, target);\n  }\n  return true;\n}, \"isValid\");\nvar isValidObject = /* @__PURE__ */ __name((v) => {\n  return isObject(v) || typeof v === \"function\";\n}, \"isValidObject\");\nvar getValue = /* @__PURE__ */ __name((target, path, options = {}) => {\n  if (!isObject(options)) {\n    options = { default: options };\n  }\n  if (!isValidObject(target)) {\n    return typeof options.default !== \"undefined\" ? options.default : target;\n  }\n  if (typeof path === \"number\") {\n    path = String(path);\n  }\n  const pathIsArray = Array.isArray(path);\n  const pathIsString = typeof path === \"string\";\n  const splitChar = options.separator || \".\";\n  const joinChar = options.joinChar || (typeof splitChar === \"string\" ? splitChar : \".\");\n  if (!pathIsString && !pathIsArray) {\n    return target;\n  }\n  if (target[path] !== void 0) {\n    return isValid(path, target, options) ? target[path] : options.default;\n  }\n  const segs = pathIsArray ? path : split(path, splitChar, options);\n  const len = segs.length;\n  let idx = 0;\n  do {\n    let prop = segs[idx];\n    if (typeof prop !== \"string\") {\n      prop = String(prop);\n    }\n    while (prop && prop.slice(-1) === \"\\\\\") {\n      prop = join([prop.slice(0, -1), segs[++idx] || \"\"], joinChar, options);\n    }\n    if (target[prop] !== void 0) {\n      if (!isValid(prop, target, options)) {\n        return options.default;\n      }\n      target = target[prop];\n    } else {\n      let hasProp = false;\n      let n = idx + 1;\n      while (n < len) {\n        prop = join([prop, segs[n++]], joinChar, options);\n        if (hasProp = target[prop] !== void 0) {\n          if (!isValid(prop, target, options)) {\n            return options.default;\n          }\n          target = target[prop];\n          idx = n - 1;\n          break;\n        }\n      }\n      if (!hasProp) {\n        return options.default;\n      }\n    }\n  } while (++idx < len && isValidObject(target));\n  if (idx === len) {\n    return target;\n  }\n  return options.default;\n}, \"getValue\");\nvar index_default = getValue;\nexport {\n  index_default as default\n};\n/*!\n * get-value <https://github.com/jonschlinkert/get-value>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n//# sourceMappingURL=index.mjs.map","/**\n * Parse the molfile and the properties with > < labels >\n * @param {string} sdfPart\n * @param {*} labels\n * @param {*} currentLabels\n * @param {object} options\n * @returns\n */\nexport function getMolecule(sdfPart, labels, currentLabels, options) {\n  let parts = sdfPart.split(`${options.eol}>`);\n  if (parts.length === 0 || parts[0].length <= 5) return;\n  let molecule = {};\n  molecule.molfile = parts[0] + options.eol;\n  for (let j = 1; j < parts.length; j++) {\n    let lines = parts[j].split(options.eol);\n    let from = lines[0].indexOf('<');\n    let to = lines[0].indexOf('>');\n    let label = lines[0].slice(from + 1, to);\n    currentLabels.push(label);\n    if (!labels[label]) {\n      labels[label] = {\n        counter: 0,\n        isNumeric: options.dynamicTyping,\n        keep: false,\n      };\n      if (\n        (!options.exclude || !options.exclude.includes(label)) &&\n        (!options.include || options.include.includes(label))\n      ) {\n        labels[label].keep = true;\n        if (options.modifiers[label]) {\n          labels[label].modifier = options.modifiers[label];\n        }\n        if (options.forEach[label]) {\n          labels[label].forEach = options.forEach[label];\n        }\n      }\n    }\n    if (labels[label].keep) {\n      for (let k = 1; k < lines.length - 1; k++) {\n        if (molecule[label]) {\n          molecule[label] += options.eol + lines[k];\n        } else {\n          molecule[label] = lines[k];\n        }\n      }\n      if (labels[label].modifier) {\n        let modifiedValue = labels[label].modifier(molecule[label]);\n        if (modifiedValue === undefined || modifiedValue === null) {\n          delete molecule[label];\n        } else {\n          molecule[label] = modifiedValue;\n        }\n      }\n      if (\n        labels[label].isNumeric &&\n        (!Number.isFinite(+molecule[label]) || molecule[label].match(/^0[0-9]/))\n      ) {\n        labels[label].isNumeric = false;\n      }\n    }\n  }\n  return molecule;\n}\n","import { ensureString } from 'ensure-string';\nimport { parse } from 'sdf-parser';\nexport default async function appendSDF(moleculesDB, sdf, options = {}) {\n    const { onStep, dynamicTyping, mixedEOL = true, eol } = 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, { dynamicTyping, mixedEOL, eol });\n    for (let i = 0; i < parsed.molecules.length; i++) {\n        const molecule = parsed.molecules[i];\n        moleculesDB.pushEntry(moleculesDB.OCL.Molecule.fromMolfile(molecule.molfile), molecule);\n        if (onStep) {\n            // eslint-disable-next-line no-await-in-loop\n            await onStep(i + 1, parsed.molecules.length);\n        }\n    }\n}\n//# sourceMappingURL=appendSDF.js.map","import { ensureString } from 'ensure-string';\n\nimport { getEntriesBoundaries } from './getEntriesBoundaries';\nimport { getMolecule } from './util/getMolecule';\n/**\n *  Parse a SDF file\n * @param {string|ArrayBuffer|Uint8Array} sdf - SDF file to parse\n * @param {object} [options={}]\n * @param {string[]} [options.include] - List of fields to include\n * @param {string[]} [options.exclude] - List of fields to exclude\n * @param {Function} [options.filter] - Callback allowing to filter the molecules\n * @param {boolean} [options.dynamicTyping] - Dynamically type the data\n * @param {object} [options.modifiers] - Object containing callbacks to apply on some specific fields\n * @param {boolean} [options.mixedEOL=false] - Set to true if you know there is a mixture between \\r\\n and \\n\n * @param {string} [options.eol] - Specify the end of line character. Default will be the one found in the file\n * @returns {object} - Object containing the molecules, the labels and the statistics\n */\nexport function parse(sdf, options = {}) {\n  options = { ...options };\n  if (options.modifiers === undefined) options.modifiers = {};\n  if (options.forEach === undefined) options.forEach = {};\n  if (options.dynamicTyping === undefined) options.dynamicTyping = true;\n\n  sdf = ensureString(sdf);\n  if (typeof sdf !== 'string') {\n    throw new TypeError('Parameter \"sdf\" must be a string');\n  }\n\n  if (options.eol === undefined) {\n    options.eol = '\\n';\n    if (options.mixedEOL) {\n      sdf = sdf.replaceAll('\\r\\n', '\\n');\n      sdf = sdf.replaceAll('\\r', '\\n');\n    } else {\n      // we will find the delimiter in order to be much faster and not use regular expression\n      let header = new Set(sdf.slice(0, 1000));\n      if (header.has('\\r\\n')) {\n        options.eol = '\\r\\n';\n      } else if (header.has('\\r')) {\n        options.eol = '\\r';\n      }\n    }\n  }\n\n  let entriesBoundaries = getEntriesBoundaries(\n    sdf,\n    `${options.eol}$$$$`,\n    options.eol,\n  );\n  let molecules = [];\n  let labels = {};\n\n  let start = Date.now();\n\n  for (let i = 0; i < entriesBoundaries.length; i++) {\n    let sdfPart = sdf.slice(...entriesBoundaries[i]);\n    if (sdfPart.length < 40) continue;\n    let currentLabels = [];\n    const molecule = getMolecule(sdfPart, labels, currentLabels, options);\n    if (!molecule) continue;\n    if (!options.filter || options.filter(molecule)) {\n      molecules.push(molecule);\n      // only now we can increase the counter\n      for (let j = 0; j < currentLabels.length; j++) {\n        labels[currentLabels[j]].counter++;\n      }\n    }\n  }\n  // all numeric fields should be converted to numbers\n  for (let label in labels) {\n    let currentLabel = labels[label];\n    if (currentLabel.isNumeric) {\n      currentLabel.minValue = Infinity;\n      currentLabel.maxValue = -Infinity;\n      for (let j = 0; j < molecules.length; j++) {\n        if (molecules[j][label]) {\n          let value = Number.parseFloat(molecules[j][label]);\n          molecules[j][label] = value;\n          if (value > currentLabel.maxValue) {\n            currentLabel.maxValue = value;\n          }\n          if (value < currentLabel.minValue) {\n            currentLabel.minValue = value;\n          }\n        }\n      }\n    }\n  }\n\n  // we check that a label is in all the records\n  for (let key in labels) {\n    if (labels[key].counter === molecules.length) {\n      labels[key].always = true;\n    } else {\n      labels[key].always = false;\n    }\n  }\n\n  let statistics = [];\n  for (let key in labels) {\n    let statistic = labels[key];\n    statistic.label = key;\n    statistics.push(statistic);\n  }\n\n  return {\n    time: Date.now() - start,\n    molecules,\n    labels: Object.keys(labels),\n    statistics,\n  };\n}\n","/**\n *\n * @param {*} string\n * @param {*} substring\n * @param {*} eol\n * @returns\n */\nexport function getEntriesBoundaries(string, substring, eol) {\n  const res = [];\n  let previous = 0;\n  let next = 0;\n  while (next !== -1) {\n    next = string.indexOf(substring, previous);\n    if (next !== -1) {\n      res.push([previous, next]);\n      const nextMatch = string.indexOf(eol, next + substring.length);\n      if (nextMatch === -1) {\n        next = -1;\n      } else {\n        previous = nextMatch + eol.length;\n        next = previous;\n      }\n    } else {\n      res.push([previous, string.length]);\n    }\n  }\n  return res;\n}\n","var IDX=256, HEX=[], BUFFER;\nwhile (IDX--) HEX[IDX] = (IDX + 256).toString(16).substring(1);\n\nexport function v4() {\n\tvar i=0, num, out='';\n\n\tif (!BUFFER || ((IDX + 16) > 256)) {\n\t\tBUFFER = Array(i=256);\n\t\twhile (i--) BUFFER[i] = 256 * Math.random() | 0;\n\t\ti = IDX = 0;\n\t}\n\n\tfor (; i < 16; i++) {\n\t\tnum = BUFFER[IDX + i];\n\t\tif (i==6) out += HEX[num & 15 | 64];\n\t\telse if (i==8) out += HEX[num & 63 | 128];\n\t\telse out += HEX[num];\n\n\t\tif (i & 1 && i > 1 && i < 11) out += '-';\n\t}\n\n\tIDX++;\n\treturn out;\n}\n","import { v4 } from '@lukeed/uuid';\n/**\n *\n * @param {MoleculesDB} moleculesDB\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} data\n * @param {object} [moleculeInfo]\n * @param {string} [moleculeInfo.idCode]\n * @param {number[]} [moleculeInfo.index]\n */\nexport default function pushEntry(moleculesDB, molecule, data = {}, moleculeInfo = {}) {\n    // the following line could be the source of problems if the idCode version\n    // changes\n    const moleculeIDCode = getMoleculeIDCode(molecule, moleculeInfo);\n    const id = moleculeIDCode || v4();\n    let entry = moleculesDB.db[id];\n    if (!entry) {\n        // a new molecule\n        // ensure helper arrays needed for substructure search\n        molecule.ensureHelperArrays(moleculesDB.OCL.Molecule.cHelperRings);\n        let index;\n        if (!moleculeInfo.index) {\n            index = molecule.getIndex();\n        }\n        else {\n            index = moleculeInfo.index;\n        }\n        const molecularFormula = molecule.getMolecularFormula();\n        entry = {\n            molecule,\n            properties: {\n                mw: molecularFormula.relativeWeight,\n                em: molecularFormula.absoluteWeight,\n                mf: molecularFormula.formula,\n            },\n            data: [],\n            idCode: moleculeIDCode,\n            index,\n        };\n        moleculesDB.db[id] = entry;\n        if (moleculesDB.computeProperties) {\n            const properties = new moleculesDB.OCL.MoleculeProperties(molecule);\n            entry.properties = {\n                ...entry.properties,\n                acceptorCount: properties.acceptorCount,\n                donorCount: properties.donorCount,\n                logP: properties.logP,\n                logS: properties.logS,\n                polarSurfaceArea: properties.polarSurfaceArea,\n                rotatableBondCount: properties.rotatableBondCount,\n                stereoCenterCount: properties.stereoCenterCount,\n            };\n        }\n        updateStatistics(moleculesDB.calculatedStatistics, entry.properties);\n    }\n    entry.data.push(data);\n    updateStatistics(moleculesDB.dataStatistics, data);\n}\nfunction updateStatistics(statistics, data) {\n    for (const key in data) {\n        const value = data[key];\n        if (!statistics.has(key)) {\n            statistics.set(key, {\n                counter: 0,\n                kind: typeof value,\n            });\n        }\n        const stat = statistics.get(key);\n        stat.counter++;\n        if (stat.kind !== typeof value) {\n            stat.kind = 'mixed';\n        }\n    }\n}\nfunction getMoleculeIDCode(molecule, moleculeInfo) {\n    let idCode = moleculeInfo.idCode;\n    if (!idCode) {\n        idCode = molecule.getIDCode();\n    }\n    if (idCode === 'd@')\n        return ''; // empty molecule\n    return idCode;\n}\n//# sourceMappingURL=pushEntry.js.map","export async function noWait() {\n    return new Promise((resolve) => {\n        if (typeof setImmediate === 'function') {\n            setImmediate(() => resolve());\n        }\n        else {\n            // didn't find a better way to do it in the browser\n            setTimeout(() => resolve(), 0);\n        }\n    });\n}\n//# sourceMappingURL=noWait.js.map","import { noWait } from '../../util/noWait.js';\nimport { MoleculesDB } from '../MoleculesDB.js';\nimport getMoleculeCreators from './getMoleculeCreators.js';\nclass AbortError extends Error {\n    name = 'AbortError';\n    code = 20;\n}\nfunction getQuery(moleculesDB, query, options) {\n    const { format = 'idCode' } = options;\n    if (typeof query === 'string') {\n        const moleculeCreators = getMoleculeCreators(moleculesDB.OCL);\n        query = moleculeCreators.get(format.toLowerCase())(query);\n    }\n    else if (!(query instanceof moleculesDB.OCL.Molecule)) {\n        throw new TypeError('toSearch must be a Molecule or string');\n    }\n    return query;\n}\n/**\n * Internal function to search in the database\n * @param {MoleculesDB} moleculesDB\n * @param {string} query\n * @param {Record<string, any>} [options={}]\n * @param {'exact'|'substructure'|'substructureOR'|'similarity'} [options.mode='substructure']\n * @returns\n */\nexport function search(moleculesDB, query = '', options = {}) {\n    const { mode = 'substructure' } = options;\n    query = getQuery(moleculesDB, query, options);\n    let result;\n    switch (mode.toLowerCase()) {\n        case 'exact':\n            result = exactSearch(moleculesDB, query);\n            break;\n        case 'substructure':\n            result = substructureSearch(moleculesDB, query);\n            break;\n        case 'substructureor':\n            result = substructureSearchOR(moleculesDB, query);\n            break;\n        case 'similarity':\n            result = similaritySearch(moleculesDB, query);\n            break;\n        default:\n            throw new Error(`unknown search mode: ${options.mode}`);\n    }\n    return processResult(result, options);\n}\nexport async function searchAsync(moleculesDB, query = '', options = {}) {\n    const { mode = 'substructure' } = options;\n    query = getQuery(moleculesDB, query, options);\n    let result;\n    switch (mode.toLowerCase()) {\n        case 'exact':\n            result = exactSearch(moleculesDB, query);\n            break;\n        case 'substructure':\n            result = await subStructureSearchAsync(moleculesDB, query, options);\n            break;\n        case 'substructureor':\n            result = substructureSearchOR(moleculesDB, query);\n            break;\n        case 'similarity':\n            result = similaritySearch(moleculesDB, query);\n            break;\n        default:\n            throw new Error(`unknown search mode: ${options.mode}`);\n    }\n    return processResult(result, options);\n}\nfunction exactSearch(moleculesDB, query) {\n    query = query.getCompactCopy();\n    query.setFragment(false);\n    const queryIDCode = query.getIDCode();\n    const searchResult = moleculesDB.db[queryIDCode]\n        ? [moleculesDB.db[queryIDCode]]\n        : [];\n    return searchResult;\n}\n/**\n * No atoms in the query, we return all the molecules\n * @param {MoleculesDB} moleculesDB\n * @param {import('openchemlib').Molecule} query\n * @returns\n */\nfunction substructureSearchBegin(moleculesDB, query) {\n    const searchResult = [];\n    if (query.getAllAtoms() === 0) {\n        for (const idCode in moleculesDB.db) {\n            searchResult.push(moleculesDB.db[idCode]);\n        }\n    }\n    return { searchResult };\n}\nfunction substructureSearchEnd(searchResult, queryMW) {\n    searchResult.sort((a, b) => {\n        return (Math.abs(queryMW - a.properties.mw) - Math.abs(queryMW - b.properties.mw));\n    });\n    return searchResult;\n}\n/**\n * Search by substructure in the database\n * If the substructure is composed of many fragments all the fragments must be present\n * @param {*} moleculesDB\n * @param {*} query\n * @returns\n */\nfunction substructureSearch(moleculesDB, query) {\n    const queryMW = getMW(query);\n    const { searchResult } = substructureSearchBegin(moleculesDB, query);\n    if (searchResult.length === 0) {\n        query = query.getCompactCopy();\n        query.setFragment(true);\n        const queryIndex = query.getIndex();\n        const searcher = moleculesDB.searcher;\n        searcher.setFragment(query, queryIndex);\n        for (const idCode in moleculesDB.db) {\n            const entry = moleculesDB.db[idCode];\n            searcher.setMolecule(entry.molecule, entry.index);\n            if (searcher.isFragmentInMolecule()) {\n                searchResult.push(entry);\n            }\n        }\n    }\n    return substructureSearchEnd(searchResult, queryMW);\n}\n/**\n * Search by substructure in the database\n * If the substructure is composed of many fragments only one fragment must be present\n * @param {*} moleculesDB\n * @param {import('openchemlib').Molecule} query\n * @returns\n */\nfunction substructureSearchOR(moleculesDB, query) {\n    const queryMW = getMW(query);\n    const { searchResult } = substructureSearchBegin(moleculesDB, query);\n    if (searchResult.length === 0) {\n        query = query.getCompactCopy();\n        query.setFragment(true);\n        const queries = [];\n        for (const fragment of query.getFragments()) {\n            queries.push({\n                fragment,\n                queryIndex: fragment.getIndex(),\n            });\n        }\n        const searcher = moleculesDB.searcher;\n        molecule: for (const idCode in moleculesDB.db) {\n            const entry = moleculesDB.db[idCode];\n            searcher.setMolecule(entry.molecule, entry.index);\n            for (const { fragment, queryIndex } of queries) {\n                searcher.setFragment(fragment, queryIndex);\n                if (searcher.isFragmentInMolecule()) {\n                    searchResult.push(entry);\n                    continue molecule;\n                }\n            }\n        }\n    }\n    return substructureSearchEnd(searchResult, queryMW);\n}\nasync function subStructureSearchAsync(moleculesDB, query, options = {}) {\n    const queryMW = getMW(query); // we\n    query = query.getCompactCopy();\n    query.setFragment(true);\n    const { interval = 100, onStep, controller } = options;\n    let shouldAbort = false;\n    if (controller) {\n        const abortEventListener = () => {\n            shouldAbort = true;\n        };\n        controller.signal.addEventListener('abort', abortEventListener);\n    }\n    const { searchResult } = substructureSearchBegin(moleculesDB, query);\n    let begin = performance.now();\n    if (searchResult.length === 0) {\n        const queryIndex = query.getIndex();\n        const searcher = moleculesDB.searcher;\n        searcher.setFragment(query, queryIndex);\n        let index = 0;\n        const length = Object.keys(moleculesDB.db).length;\n        for (const idCode in moleculesDB.db) {\n            if (shouldAbort) {\n                throw new AbortError('Query aborted');\n            }\n            const entry = moleculesDB.db[idCode];\n            searcher.setMolecule(entry.molecule, entry.index);\n            if (searcher.isFragmentInMolecule()) {\n                searchResult.push(entry);\n            }\n            if ((onStep || controller) && performance.now() - begin >= interval) {\n                begin = performance.now();\n                if (onStep) {\n                    onStep(index, length);\n                }\n                if (controller && !onStep) {\n                    // eslint-disable-next-line no-await-in-loop\n                    await noWait();\n                }\n            }\n            index++;\n        }\n    }\n    return substructureSearchEnd(searchResult, queryMW);\n}\nfunction similaritySearch(moleculesDB, query) {\n    const queryIndex = query.getIndex();\n    const queryMW = getMW(query);\n    const queryIdCode = query.getIDCode();\n    const searchResult = [];\n    let similarity;\n    for (const idCode in moleculesDB.db) {\n        const entry = moleculesDB.db[idCode];\n        if (entry.idCode === queryIdCode) {\n            similarity = Number.MAX_SAFE_INTEGER;\n        }\n        else {\n            similarity =\n                moleculesDB.OCL.SSSearcherWithIndex.getSimilarityTanimoto(queryIndex, entry.index) *\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}\nfunction getMW(query) {\n    const copy = query.getCompactCopy();\n    copy.setFragment(false);\n    return copy.getMolecularFormula().relativeWeight;\n}\nfunction processResult(entries, options = {}) {\n    const { flattenResult = true, keepMolecule = false, limit = Number.MAX_SAFE_INTEGER, } = options;\n    const results = [];\n    if (flattenResult) {\n        for (const entry of entries) {\n            for (const data of entry.data) {\n                const result = {\n                    data,\n                    idCode: entry.idCode,\n                    properties: entry.properties,\n                };\n                if (keepMolecule) {\n                    result.molecule = entry.molecule;\n                }\n                results.push(result);\n            }\n        }\n    }\n    else {\n        for (const 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)\n        results.length = limit;\n    return results;\n}\n//# sourceMappingURL=search.js.map","let rAtomicNumber = 0;\n/**\n * Returns the atomic number of the X atom\n * @param {import('openchemlib').Molecule} molecule - An instance of a molecule\n * @returns\n */\nexport function getRAtomicNumber(molecule) {\n    if (!rAtomicNumber) {\n        const OCL = molecule.getOCL();\n        rAtomicNumber = OCL.Molecule.getAtomicNoFromLabel('R', OCL.Molecule.cPseudoAtomR);\n    }\n    return rAtomicNumber;\n}\n//# sourceMappingURL=getRAtomicNumber.js.map","/**\n *\n * @param {*} processedMolecules\n * @param {import('openchemlib').Molecule|string} molecule\n * @param {*} options\n * @returns\n */\nexport function checkIfExistsOrAddInfo(processedMolecules, molecule, options) {\n    const { moleculeInfoCallback, asReagent, asProduct } = options;\n    const idCode = typeof molecule === 'string' ? idCode : molecule.getIDCode();\n    if (processedMolecules.has(idCode)) {\n        const entry = processedMolecules.get(idCode);\n        let exists = false;\n        if (asReagent) {\n            if (entry.asReagent) {\n                exists = true;\n            }\n            else {\n                entry.asReagent = true;\n            }\n        }\n        if (asProduct) {\n            if (entry.asProduct) {\n                exists = true;\n            }\n            else {\n                entry.asProduct = true;\n            }\n        }\n        return { exists, info: entry };\n    }\n    else {\n        let info = {\n            idCode,\n            asReagent,\n            asProduct,\n            info: {},\n        };\n        if (moleculeInfoCallback) {\n            info.info = moleculeInfoCallback(molecule);\n        }\n        processedMolecules.set(idCode, info);\n        return { exists: false, info };\n    }\n}\n//# sourceMappingURL=checkIfExistsOrAddInfo.js.map","import { checkIfExistsOrAddInfo } from './checkIfExistsOrAddInfo.js';\n/**\n * @description apply one reaction to one reactant\n * @param {import('openchemlib').Molecule[]} reactants\n * @param tree\n * @param {Array<object>} reactions - rxnCode of the reaction\n * @param {object} options - options to apply the reaction\n * @param {number} options.currentDepth - current depth of the recursion\n * @param {number} options.maxDepth - max depth of the recursion\n * @param {number} options.maxCurrentDepth - max depth of the recursion for this set of reactions\n * @param {number} options.limitReactions - limit the number of reactions\n * @param {object} options.stats - stats of the recursion\n * @param {number} options.stats.counter - number of reactions\n * @param {Map} options.processedMolecules - set of processed molecules\n * @param {Array} options.trees - array of trees of previous recursions\n * @param {object} options.OCL - OCL object\n * @returns {Array} array of results\n */\nexport function applyOneReactantReactions(tree, reactions, options) {\n    const { currentDepth, maxDepth, maxCurrentDepth, processedMolecules, OCL, logger, } = options;\n    if (tree.molecules.length !== 1) {\n        logger?.warn('applyOneReactantReactions:tree.reactants.length!==1', tree.reactants.length);\n        return [];\n    }\n    const reactant = OCL.Molecule.fromIDCode(tree.molecules[0].idCode);\n    const todoNextDepth = [];\n    // if the current depth is greater than the max depth, we stop the recursion and return an empty array\n    if (currentDepth > maxCurrentDepth || tree.depth >= maxDepth) {\n        return [];\n    }\n    const existsAndInfo = checkIfExistsOrAddInfo(processedMolecules, reactant, {\n        ...options,\n        asReagent: true,\n    });\n    // check if the reactant has already been processed\n    if (existsAndInfo.exists) {\n        return [];\n    }\n    for (const reaction of reactions) {\n        if (options.stats.counter >= options.limitReactions) {\n            return [];\n        }\n        const reactor = new OCL.Reactor(reaction.oclReaction);\n        // isMatching is true if the reactant is matching the reaction else we continue to the next reaction\n        const isMatching = Boolean(reactor.setReactant(0, reactant));\n        if (isMatching) {\n            options.stats.counter++;\n            // get the products of the reaction\n            const oneReactionProducts = reactor.getProducts();\n            for (const oneReactionProduct of oneReactionProducts) {\n                for (const reactionProduct of oneReactionProduct) {\n                    // get the info of the product (idCode, mf)\n                    const productExistsAndInfo = checkIfExistsOrAddInfo(processedMolecules, reactionProduct, { ...options, asProduct: true });\n                    // if the product has not been processed yet, we add it to the list of products and we add it to the list of todoNextDepth\n                    if (!productExistsAndInfo.exists) {\n                        // eslint-disable-next-line no-unused-vars\n                        const { oclReaction, needToBeCharged, ...reactionWithoutOCL } = reaction;\n                        const oneReaction = {\n                            reaction: reactionWithoutOCL,\n                            depth: tree.depth + 1,\n                            isValid: true,\n                            currentDepth,\n                            molecules: [\n                                checkIfExistsOrAddInfo(processedMolecules, reactionProduct, options).info,\n                            ],\n                        };\n                        if (!tree.children)\n                            tree.children = [];\n                        tree.children.push(oneReaction);\n                        todoNextDepth.push(() => {\n                            return applyOneReactantReactions(oneReaction, reactions, {\n                                ...options,\n                                currentDepth: options.currentDepth + 1,\n                            });\n                        });\n                    }\n                }\n            }\n        }\n    }\n    // by returning todoNextDepth, we make sure that the recursion will continue\n    return todoNextDepth;\n}\n//# sourceMappingURL=applyOneReactantReactions.js.map","export function getFilteredTrees(reactions, options = {}) {\n    const { filter = () => true } = options;\n    const nodesToKeep = reactions.getNodes().filter(filter);\n    const parentMap = reactions.getParentMap();\n    for (let currentNode of nodesToKeep) {\n        const parent = parentMap.get(currentNode);\n        if (parent && nodesToKeep.includes(parent) === false) {\n            nodesToKeep.push(parent);\n        }\n    }\n    return getValidChildren(reactions.trees, { nodesToKeep });\n}\nfunction getValidChildren(nodes, options) {\n    const { nodesToKeep } = options;\n    const validNodes = nodes\n        .filter((node) => nodesToKeep.includes(node))\n        .map((node) => ({ ...node }));\n    for (const node of validNodes) {\n        if (node.children) {\n            const validChildren = node.children.filter((child) => nodesToKeep.includes(child));\n            if (validChildren.length > 0) {\n                node.children = getValidChildren(validChildren, { nodesToKeep });\n            }\n            else {\n                delete node.children;\n            }\n        }\n    }\n    return validNodes;\n}\n//# sourceMappingURL=getFilteredTrees.js.map","export function getLeaves(trees) {\n    const leaves = [];\n    for (const tree of trees) {\n        appendLeavesSS(leaves, tree);\n    }\n    return leaves;\n}\nfunction appendLeavesSS(leaves, currentBranch) {\n    if (!currentBranch.children || currentBranch.children.length === 0) {\n        leaves.push(currentBranch);\n        return;\n    }\n    for (const child of currentBranch.children) {\n        appendLeavesSS(leaves, child);\n    }\n}\n//# sourceMappingURL=getLeaves.js.map","export function getNodes(trees) {\n    const nodes = [];\n    for (const tree of trees) {\n        getNodesSS(nodes, tree);\n    }\n    return nodes;\n}\nfunction getNodesSS(nodes, currentBranch) {\n    nodes.push(currentBranch);\n    for (const child of currentBranch?.children || []) {\n        getNodesSS(nodes, child);\n    }\n}\n//# sourceMappingURL=getNodes.js.map","import { appendOCLReaction } from './utils/appendOCLReaction.js';\nimport { applyOneReactantReactions } from './utils/applyOneReactantReactions.js';\nimport { checkIfExistsOrAddInfo } from './utils/checkIfExistsOrAddInfo.js';\nimport { getFilteredTrees } from './utils/getFilteredTrees.js';\nimport { getLeaves } from './utils/getLeaves.js';\nimport { getNodes } from './utils/getNodes.js';\nexport class Reactions {\n    /**\n     *\n     * @param OCL\n     * @param {object} [options={}]\n     * @param {import('cheminfo-types').Logger} logger\n     * @param {number} [options.maxDepth=5]\n     * @param {Function} [options.moleculeInfoCallback]\n     * @param {boolean} [options.skipProcessed=true]\n     */\n    constructor(OCL, options = {}) {\n        this.moleculeInfoCallback = options.moleculeInfoCallback;\n        this.maxDepth = options.maxDepth ?? 5;\n        this.limitReactions = options.limitReactions ?? 200;\n        this.skipProcessed = options.skipProcessed ?? true;\n        this.logger = options.logger;\n        this.processedMolecules = new Map();\n        this.OCL = OCL;\n        this.trees = [];\n        this.moleculeInfo = {}; // a cache containing molecule information like mw, etc.\n    }\n    /**\n     * We need to call this method for all the reactants on which we want to apply the reactions.\n     * If there is only one reactant, we call this method with an array of one reactant.\n     * If there are multiple reactants, we call this method with an array of the reactants.\n     * This method has to be called for all the reactants\n     * @param {import('openchemlib').Molecule[]|string[]} molecules\n     * @param moleculesOrIDCodes\n     */\n    appendHead(moleculesOrIDCodes) {\n        if (!Array.isArray(moleculesOrIDCodes)) {\n            throw new TypeError('reactants must be an array');\n        }\n        const molecules = moleculesOrIDCodes.map((molecule) => checkIfExistsOrAddInfo(this.processedMolecules, molecule, {\n            moleculeInfoCallback: this.moleculeInfoCallback,\n        }).info);\n        const tree = {\n            molecules,\n            depth: 0,\n            isValid: true, // this node could be implied in reactions\n        };\n        this.trees.push(tree);\n    }\n    /**\n     * Returns all the leaves of the trees\n     * @returns\n     */\n    getLeaves() {\n        return getLeaves(this.trees);\n    }\n    /**\n     * Returns all the nodes of the trees\n     * @returns\n     */\n    getNodes() {\n        return getNodes(this.trees);\n    }\n    getParentMap() {\n        const parentMap = new Map();\n        const nodes = this.getNodes();\n        for (const node of nodes) {\n            if (node.children) {\n                for (const child of node.children) {\n                    parentMap.set(child, node);\n                }\n            }\n        }\n        return parentMap;\n    }\n    /**\n     * When applying reactions some branches may be dead because it can not be implied in any reaction.\n     * This is the case when we specify a 'min' reaction depth.\n     * This will returno only the valid nodes\n     * @returns\n     */\n    getValidNodes() {\n        return this.getNodes().filter((node) => node.isValid);\n    }\n    /**\n     *\n     * @param {object} [options={}]\n     * @param {(object):boolean} [options.filter] - a function that will be called for each node and return true if the node should be kept\n     */\n    getFilteredReactions(options = {}) {\n        const filteredReactions = new Reactions();\n        filteredReactions.moleculeInfoCallback = this.moleculeInfoCallback;\n        filteredReactions.maxDepth = this.maxDepth;\n        filteredReactions.limitReactions = this.limitReactions;\n        filteredReactions.skipProcessed = this.skipProcessed;\n        filteredReactions.logger = this.logger;\n        filteredReactions.processedMolecules = this.processedMolecules;\n        filteredReactions.OCL = this.OCL;\n        filteredReactions.moleculeInfo = this.moleculeInfo; // a cache containing molecule information like mw, etc.\n        filteredReactions.trees = getFilteredTrees(this, options);\n        return filteredReactions;\n    }\n    /**\n     *\n     * @param {object[]} reactions - array of reactions that should be applied\n     * @param {object} [options={}]\n     * @param {number} [options.min=0] - min depth of the reaction\n     * @param {number} [options.max=3] - max depth of the reaction\n     */\n    applyOneReactantReactions(reactions, options = {}) {\n        const { min = 0, max = 3 } = options;\n        clearAsFromProcessedMolecules(this.processedMolecules);\n        const nodes = this.getNodes().filter((node) => node.isValid);\n        for (const node of nodes) {\n            node.currentDepth = 0;\n        }\n        reactions = appendOCLReaction(reactions, this.OCL);\n        const stats = { counter: 0 };\n        // Start the recursion by applying the first level of reactions\n        for (const node of nodes) {\n            let todoCurrentLevel = applyOneReactantReactions(node, reactions, {\n                OCL: this.OCL,\n                currentDepth: 1,\n                processedMolecules: this.processedMolecules,\n                moleculeInfoCallback: this.moleculeInfoCallback,\n                maxDepth: this.maxDepth,\n                maxCurrentDepth: max,\n                stats,\n                limitReactions: this.limitReactions,\n            });\n            do {\n                const nexts = [];\n                for (const todo of todoCurrentLevel) {\n                    nexts.push(todo());\n                }\n                todoCurrentLevel = nexts.flat();\n            } while (todoCurrentLevel.length > 0);\n        }\n        const newNodes = this.getNodes().filter((node) => node.isValid);\n        for (const node of newNodes) {\n            if (node.currentDepth < min || node.currentDepth > max) {\n                node.isValid = false;\n            }\n            delete node.currentDepth;\n        }\n    }\n}\nfunction clearAsFromProcessedMolecules(processedMolecules) {\n    for (const [, value] of processedMolecules) {\n        if (value.asReagent) {\n            value.asReagent = false;\n        }\n        if (value.asProduct) {\n            value.asProduct = false;\n        }\n    }\n}\n//# sourceMappingURL=Reactions.js.map","/**\n * @description Append the OCL reaction to the reaction object\n * @param {Array} reactions - array of reactions objects with rxnCode and label\n * @param {typeof import('openchemlib')} OCL - OCL object\n * @param {object} [options={}]\n * @param {import('cheminfo-types').Logger} [options.logger]\n * @returns {Array} array of reactions objects with rxnCode, label and oclReaction (a decoded version of rxnCode reaction)\n */\nexport function appendOCLReaction(reactions, OCL, options = {}) {\n    const { logger } = options;\n    const newReactions = [];\n    for (const reaction of reactions) {\n        if (reaction.rxnCode) {\n            newReactions.push({\n                ...reaction,\n                oclReaction: OCL.ReactionEncoder.decode(reaction.rxnCode),\n            });\n        }\n        else if (logger) {\n            logger.warn(reaction, 'Reaction without rxnCode');\n        }\n    }\n    return newReactions;\n}\n//# sourceMappingURL=appendOCLReaction.js.map","import appendCSV from './utils/appendCSV.js';\nimport appendColor from './utils/appendColor.js';\nimport appendEntries from './utils/appendEntries.js';\nimport appendSDF from './utils/appendSDF.js';\nimport appendSmilesList from './utils/appendSmilesList.js';\nimport pushEntry from './utils/pushEntry.js';\nimport pushMoleculeInfo from './utils/pushMoleculeInfo.js';\nimport { search, searchAsync } from './utils/search.js';\n/*\n * @typedef {object} InternalStatistics\n * @property {number} counter - number of entries\n * @property {'number'|'boolean'|'string'|'object'|'mixed'} kind - kind of value\n */\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 */\nexport class MoleculesDB {\n    /**\n     * Creates an instance of MoleculesDB.\n     * @param {typeof import('openchemlib')} OCL - openchemlib library\n     * @param {object} [options={}] - Options.\n     * @param {boolean} [options.computeProperties=false]\n     * @param {boolean} [options.keepEmptyMolecules=false]\n     */\n    constructor(OCL, options = {}) {\n        const { computeProperties = false, keepEmptyMolecules = false } = options;\n        this.OCL = OCL;\n        this.db = {};\n        /**\n         * @type {Map<string, InternalStatistics>}\n         */\n        this.dataStatistics = new Map();\n        /**\n         * @type {Map<string, InternalStatistics>}\n         */\n        this.calculatedStatistics = new Map();\n        this.computeProperties = computeProperties;\n        this.keepEmptyMolecules = keepEmptyMolecules;\n        this.searcher = new OCL.SSSearcherWithIndex();\n    }\n    clear() {\n        this.db = {};\n        this.dataStatistics.clear();\n        this.calculatedStatistics.clear();\n    }\n    get nbMolecules() {\n        return Object.keys(this.db).length;\n    }\n    get nbData() {\n        let number = 0;\n        for (const entry of Object.values(this.db)) {\n            number += entry.data.length;\n        }\n        return number;\n    }\n    get statistics() {\n        const nbData = this.nbData;\n        const nbMolecules = this.nbMolecules;\n        const statistics = {\n            data: [],\n            calculated: [],\n        };\n        for (const [key, value] of this.dataStatistics.entries()) {\n            const statistic = {\n                label: key,\n                counter: value.counter,\n                kind: value.kind,\n                always: value.counter === nbData,\n                isNumber: false,\n            };\n            statistics.data.push(statistic);\n            // if kind is numeric, add minValue and maxValue. Need to go through all the values\n            if (value.kind === 'number') {\n                statistic.isNumeric = true;\n                statistic.minValue = Number.POSITIVE_INFINITY;\n                statistic.maxValue = Number.NEGATIVE_INFINITY;\n                for (const entry of Object.values(this.db)) {\n                    for (const data of entry.data) {\n                        if (data[key] < statistic.minValue) {\n                            statistic.minValue = data[key];\n                        }\n                        if (data[key] > statistic.maxValue) {\n                            statistic.maxValue = data[key];\n                        }\n                    }\n                }\n            }\n        }\n        for (const [key, value] of this.calculatedStatistics.entries()) {\n            const statistic = {\n                label: key,\n                counter: value.counter,\n                kind: value.kind,\n                always: value.counter === nbMolecules,\n                isNumeric: false,\n            };\n            statistics.calculated.push(statistic);\n            // if kind is numeric, add minValue and maxValue. Need to go through all the values\n            if (value.kind === 'number') {\n                statistic.isNumeric = true;\n                statistic.minValue = Number.POSITIVE_INFINITY;\n                statistic.maxValue = Number.NEGATIVE_INFINITY;\n                for (const entry of Object.values(this.db)) {\n                    if (entry.properties[key] < statistic.minValue) {\n                        statistic.minValue = entry.properties[key];\n                    }\n                    if (entry.properties[key] > statistic.maxValue) {\n                        statistic.maxValue = entry.properties[key];\n                    }\n                }\n            }\n        }\n        return statistics;\n    }\n    /**\n     * Append an array of entries to the current database. An entry is an object that by default should contain a 'ocl' property containing idCode and optionally index and coordinates\n     * @param {*} moleculesDB\n     * @param {object[]} entries\n     * @param {object} [options={}]\n     * @param {string} [options.idCodePath='ocl.idCode']\n     * @param {string} [options.indexPath='ocl.index']\n     * @param {string} [options.coordinatesPath='ocl.coordinates']\n     * @param {string} [options.mwPath='mw']\n     * @param {string} [options.smilesPath]\n     * @param {string} [options.molfilePath]\n     * @param {Function} [options.onStep] - call back to execute after each molecule\n     * @returns {Promise<void>}\n     */\n    appendEntries(entries, options) {\n        return appendEntries(this, entries, {\n            computeProperties: this.computeProperties,\n            ...options,\n        });\n    }\n    /**\n     * append to the current database a CSV file\n     * @param {string|ArrayBuffer} csv - text file containing the comma separated value file\n     * @param {object} [options={}] - options.\n     * @param {boolean} [options.header=true] - if the first line of the file is a header\n     * @param {boolean} [options.dynamicTyping=true] - dynamically type the data (convert values to number of boolean if possible)\n     * @param {boolean} [options.skipEmptyLines=true] - skip empty lines\n     * @param {Function} [options.onStep] - call back to execute after each molecule\n     * @returns {Promise<void>}\n     */\n    appendCSV(csv, options) {\n        return appendCSV(this, csv, options);\n    }\n    /**\n     * Append a SDF to the current database\n     * @param {string|ArrayBuffer} sdf - text file containing the sdf\n     * @param {object} [options={}] - options\n     * @param {Function} [options.onStep] - callback to execute after each molecule\n     * @param {boolean} [options.dynamicTyping=true] - Dynamically type the data\n     * @param {boolean} [options.mixedEOL=false] - Set to true if you know there is a mixture between \\r\\n and \\n\n     * @param {string} [options.eol] - Specify the end of line character. Default will be the one found in the file\n     * @returns {Promise<void>}\n     */\n    appendSDF(sdf, options) {\n        return appendSDF(this, sdf, options);\n    }\n    /**\n     * Append a list of SMILES to the current database.\n     * @param {string|ArrayBuffer} smiles - text file containing a list of smiles\n     * @param {object} [options={}] - Options\n     * @param {Function} [options.onStep] - call back to execute after each molecule\n     * @returns {Promise<void>}\n     */\n    appendSmilesList(smiles, options) {\n        return appendSmilesList(this, smiles, options);\n    }\n    /**\n     * Add a molecule to the current database.\n     * @param {import('openchemlib').Molecule} molecule - The molecule to append.\n     * @param {object} [data={}] - Options.\n     * @param {object} [moleculeInfo={}] - May contain precalculated index and mw.\n     */\n    pushEntry(molecule, data, moleculeInfo) {\n        pushEntry(this, molecule, data, moleculeInfo);\n    }\n    /**\n     * Add an entry in the database.\n     * @param {object} moleculeInfo - a molecule as a JSON that may contain the following properties: molfile, smiles, idCode, mf, index\n     * @param {object} [data={}]\n     */\n    pushMoleculeInfo(moleculeInfo, data) {\n        return pushMoleculeInfo(this, moleculeInfo, data);\n    }\n    /**\n     * Search in a MoleculesDB\n     * Inside the database all the same molecules are group together\n     * @param {string|import('openchemlib').Molecule} [query] - smiles, molfile, idlCode or instance of Molecule to look for\n     * @param {object} [options={}] - Options\n     * @param {'smiles'|'idCode'|'smarts'|'molfile'} [options.format='idCode'] - query format\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     * @returns {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     * Search in a MoleculesDB\n     * Inside the database all the same molecules are group together\n     * @param {string|import('openchemlib').Molecule} [query] - smiles, molfile, idCode or instance of Molecule to look for\n     * @param {object} [options={}] - Options.\n     * @param {'smiles'|'idCode'|'smarts'|'molfile'} [options.format='idCode'] - query format\n     * @param {string} [options.mode='substructure'] - search by 'substructure', 'exact' or 'similarity'\n     * @param {boolean} [options.flattenResult=true] - The database group the data for the same product. This allows to flatten the result\n     * @param {boolean} [options.keepMolecule=false] - keep the OCL.Molecule object in the result\n     * @param {number} [options.limit=Number.MAX_SAFE_INTEGER] - maximal number of result\n     * @param {number} [options.interval=100] - interval in ms to call the onStep callback\n     * @param {Function} [options.onStep] - callback to execute after each interval\n     * @param {AbortController} [options.controler] - callback to execute to check if the search should be aborted\n     * @returns {Promise<Array>} array of object of the type {(molecule), idCode, data, properties}\n     */\n    searchAsync(query, options) {\n        return searchAsync(this, query, options);\n    }\n    /**\n     * 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     * 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     * @param options\n     */\n    appendColor(options) {\n        appendColor(this, options);\n    }\n}\n//# sourceMappingURL=MoleculesDB.js.map","import get from 'get-value';\n/**\n * Append an array of entries to the current database. An entry is an object that by default should contain a 'ocl' property containing idCode and optionally index and coordinates\n * @param {*} moleculesDB\n * @param {object[]} entries\n * @param {object} [options={}]\n * @param {string} [options.idCodePath='ocl.idCode']\n * @param {string} [options.indexPath='ocl.index']\n * @param {string} [options.coordinatesPath='ocl.coordinates']\n * @param {string} [options.mwPath='mw']\n * @param {string} [options.smilesPath]\n * @param {string} [options.molfilePath]\n * @param {Function} [options.onStep] - call back to execute after each molecule\n * @returns\n */\nexport default async function appendEntries(moleculesDB, entries, options = {}) {\n    const { onStep, idCodePath = 'ocl.idCode', indexPath = 'ocl.index', coordinatesPath = 'ocl.coordinates', mwPath = 'mw', smilesPath, molfilePath, } = options;\n    const Molecule = moleculesDB.OCL.Molecule;\n    for (let i = 0; i < entries.length; i++) {\n        let idCode;\n        const entry = entries[i];\n        let molecule;\n        if (smilesPath) {\n            molecule = Molecule.fromSmiles(get(entry, smilesPath));\n        }\n        if (molfilePath && !molecule) {\n            molecule = Molecule.fromMolfile(get(entry, molfilePath));\n        }\n        if (!molecule) {\n            idCode = get(entry, idCodePath);\n            if (idCode) {\n                const coordinates = get(entry, coordinatesPath);\n                molecule = Molecule.fromIDCode(idCode, coordinates || false);\n            }\n        }\n        const index = get(entry, indexPath);\n        const mw = get(entry, mwPath);\n        if (onStep) {\n            // eslint-disable-next-line no-await-in-loop\n            await onStep(i + 1, entries.length);\n        }\n        if (!moleculesDB.keepEmptyMolecules &&\n            (!molecule || molecule.getAllAtoms() === 0)) {\n            continue;\n        }\n        else if (!molecule) {\n            molecule = new moleculesDB.OCL.Molecule(0, 0);\n        }\n        if (molecule) {\n            moleculesDB.pushEntry(molecule, entry, { index, mw });\n        }\n    }\n}\n//# sourceMappingURL=appendEntries.js.map","import { ensureString } from 'ensure-string';\nexport default async function appendSmilesList(moleculesDB, text, options = {}) {\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(Boolean);\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            // eslint-disable-next-line no-await-in-loop\n            await onStep(i + 1, smilesArray.length);\n        }\n    }\n}\n//# sourceMappingURL=appendSmilesList.js.map","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)\n        molecule = Molecule.fromSmiles(moleculeInfo.smiles);\n    if (moleculeInfo.idCode) {\n        if (moleculesDB.db[moleculeInfo.idCode]) {\n            molecule = moleculesDB.db[moleculeInfo.idCode].molecule;\n        }\n        else {\n            molecule = Molecule.fromIDCode(moleculeInfo.idCode, moleculeInfo.coordinates || false);\n        }\n    }\n    if (molecule) {\n        moleculesDB.pushEntry(molecule, data, moleculeInfo);\n    }\n}\n//# sourceMappingURL=pushMoleculeInfo.js.map","export default function appendColor(moleculesDB, options = {}) {\n    const { dataLabel, propertyLabel, minValue, maxValue, minHue = 0, maxHue = 360, saturation = 65, lightness = 65, colorLabel = 'color', } = options;\n    const db = moleculesDB.getDB();\n    let values;\n    if (dataLabel) {\n        values = db.flatMap((result) => result.data.map((datum) => ({ value: datum[dataLabel], data: datum })));\n    }\n    else if (propertyLabel) {\n        values = db.flatMap((result) => result.data.map((datum) => ({\n            value: result.properties[propertyLabel],\n            data: datum,\n        })));\n    }\n    else {\n        values = db.flatMap((result) => result.data.map((datum) => ({ value: undefined, data: datum })));\n    }\n    if (minValue !== undefined) {\n        for (const value of values) {\n            if (value.value !== undefined && value.value < minValue) {\n                value.value = minValue;\n            }\n        }\n    }\n    if (maxValue !== undefined) {\n        for (const value of values) {\n            if (value.value !== undefined && value.value > maxValue) {\n                value.value = maxValue;\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    for (const value of values) {\n        if (value.value !== undefined) {\n            value.data[colorLabel] = `hsl(${Math.floor(((value.value - min) / (max - min)) * (maxHue - minHue) + minHue)},${saturation}%,${lightness}%)`;\n        }\n        else {\n            value.data.color = 'black';\n        }\n    }\n}\n//# sourceMappingURL=appendColor.js.map","import { getMF } from '../util/getMF.js';\nimport { getRAtomicNumber } from '../util/getRAtomicNumber.js';\nexport function fragmentAcyclicSingleBonds(molecule) {\n    const OCL = molecule.getOCL();\n    const atoms = [];\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        const atom = {};\n        atoms.push(atom);\n        atom.i = i;\n        atom.links = []; // we will store connected atoms of broken bonds\n    }\n    const bonds = [];\n    for (let i = 0; i < molecule.getAllBonds(); i++) {\n        const 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    const brokenMolecule = molecule.getCompactCopy();\n    for (const bond of bonds) {\n        if (bond.selected) {\n            brokenMolecule.markBondForDeletion(bond.i);\n        }\n    }\n    brokenMolecule.deleteMarkedAtomsAndBonds();\n    const fragmentMap = [];\n    const nbFragments = brokenMolecule.getFragmentNumbers(fragmentMap);\n    const results = [];\n    for (let i = 0; i < nbFragments; i++) {\n        const result = {};\n        result.atomMap = [];\n        const includeAtom = fragmentMap.map((id) => {\n            return id === i;\n        });\n        const fragment = new OCL.Molecule(0, 0);\n        const 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(getRAtomicNumber(brokenMolecule)), 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    return results;\n}\n//# sourceMappingURL=fragmentAcyclicSingleBonds.js.map","import { makeRacemic } from '../util/makeRacemic.js';\nexport function getAtomFeatures(originalMolecule, options = {}) {\n    const OCL = originalMolecule.getOCL();\n    const { sphere = 1 } = options;\n    const fragment = new OCL.Molecule(0, 0);\n    const results = [];\n    for (let rootAtom = 0; rootAtom < originalMolecule.getAllAtoms(); rootAtom++) {\n        let min = 0;\n        let max = 0;\n        const atomMask = new Array(originalMolecule.getAtoms());\n        const atomList = new Array(originalMolecule.getAtoms());\n        const molecule = originalMolecule.getCompactCopy();\n        for (let currentSphere = 0; currentSphere <= sphere; currentSphere++) {\n            if (max === 0) {\n                atomList[max] = rootAtom;\n                atomMask[rootAtom] = true;\n                max++;\n            }\n            else {\n                let newMax = max;\n                for (let i = min; i < max; i++) {\n                    const atom = atomList[i];\n                    for (let j = 0; j < molecule.getAllConnAtoms(atom); j++) {\n                        const connAtom = molecule.getConnAtom(atom, j);\n                        if (!atomMask[connAtom]) {\n                            atomMask[connAtom] = true;\n                            atomList[newMax++] = connAtom;\n                        }\n                    }\n                }\n                min = max;\n                max = newMax;\n            }\n            molecule.copyMoleculeByAtoms(fragment, atomMask, true, null);\n            if (currentSphere === sphere) {\n                makeRacemic(fragment);\n                results.push(fragment.getCanonizedIDCode());\n            }\n        }\n    }\n    const atoms = {};\n    for (const result of results) {\n        if (!atoms[result]) {\n            atoms[result] = 1;\n        }\n        else {\n            atoms[result]++;\n        }\n    }\n    return atoms;\n}\n//# sourceMappingURL=getAtomFeatures.js.map","/**\n * Returns the charge of a molecule\n * @param {import('openchemlib').Molecule} molecule - an instance of OCL.Molecule\n * @returns {number}\n */\nexport function getCharge(molecule) {\n    let charge = 0;\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        charge += molecule.getAtomCharge(i);\n    }\n    return charge;\n}\n//# sourceMappingURL=getCharge.js.map","import { getDiastereotopicAtomIDsAndH } from './getDiastereotopicAtomIDsAndH.js';\n/**\n * Parse a molfile and returns an object containing the molecule, the map and the diaIDs\n * The map allows to reload properties assigned to the atom molfile\n * Please take care than numbering of atoms starts at 0 !\n * @param {typeof import('openchemlib')} OCL - openchemlib library\n * @param {string} molfile\n * @returns\n */\nexport function getDiastereotopicAtomIDsFromMolfile(OCL, molfile) {\n    const { map, molecule } = OCL.Molecule.fromMolfileWithAtomMap(molfile);\n    const diaIDsArray = getDiastereotopicAtomIDsAndH(molecule);\n    const diaIDs = {};\n    for (let i = 0; i < map.length; i++) {\n        diaIDs[map[i]] = { source: map[i], destination: i, ...diaIDsArray[i] };\n    }\n    return { map: diaIDs, molecule, diaIDs: diaIDsArray };\n}\n//# sourceMappingURL=getDiastereotopicAtomIDsFromMolfile.js.map","import { ensureHeterotopicChiralBonds } from '../diastereotopic/ensureHeterotopicChiralBonds.js';\nimport { tagAtom } from '../util/tagAtom.js';\nimport { getHoseCodesForAtomsInternal } from './getHoseCodesForAtomsInternal.js';\n/**\n * Returns the hose codes for all atoms in the molecule\n * @param {*} molecule\n * @param {object} [options={}]\n * @param {string[]} [options.atomLabels]\n * @param {number} [options.minSphereSize=0]\n * @param {number} [options.maxSphereSize=4]\n * @returns\n */\nexport function getHoseCodes(molecule, options = {}) {\n    const { atomLabels, minSphereSize, maxSphereSize } = options;\n    const { Molecule } = molecule.getOCL();\n    const atomicNumbers = atomLabels?.map((label) => Molecule.getAtomicNoFromLabel(label));\n    const internalMolecule = molecule.getCompactCopy();\n    internalMolecule.addImplicitHydrogens();\n    ensureHeterotopicChiralBonds(internalMolecule);\n    const hoses = [];\n    for (let i = 0; i < internalMolecule.getAllAtoms(); i++) {\n        if (atomicNumbers &&\n            !atomicNumbers.includes(internalMolecule.getAtomicNo(i))) {\n            hoses.push(undefined);\n        }\n        else {\n            const tempMolecule = internalMolecule.getCompactCopy();\n            tagAtom(tempMolecule, i);\n            hoses.push(getHoseCodesForAtomsInternal(tempMolecule, {\n                minSphereSize,\n                maxSphereSize,\n            }));\n        }\n    }\n    return hoses;\n}\n//# sourceMappingURL=getHoseCodes.js.map","import { ensureHeterotopicChiralBonds } from '../diastereotopic/ensureHeterotopicChiralBonds.js';\nimport { getConnectivityMatrix } from '../util/getConnectivityMatrix.js';\nimport { getSymmetryRanks } from '../util/getSymmetryRanks.js';\nimport { makeRacemic } from '../util/makeRacemic.js';\nimport { tagAtom } from '../util/tagAtom.js';\nimport { getHoseCodesForAtomsInternal } from './getHoseCodesForAtomsInternal.js';\n/**\n * Returns an object containing a molfile, molfile with hydrogens, hoses codes and optionally the diaIDs\n * and the diaIDs\n * The map allows to reload properties assigned to the atom molfile\n * Please take care than numbering of atoms starts at 0 !\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {string[]} [options.atomLabels]\n * @param {boolean} [options.calculateDiastereotopicIDs=true]\n * @param {number} [options.minSphereSize=0]\n * @param {number} [options.maxSphereSize=4]\n * @returns\n */\nexport function getHoseCodesAndInfo(molecule, options = {}) {\n    const { minSphereSize, maxSphereSize, calculateDiastereotopicIDs = true, } = options;\n    const { Molecule } = molecule.getOCL();\n    molecule = molecule.getCompactCopy();\n    // this will force reordering of the hydrogens to the end, just to have the same order as in the molfile\n    molecule.ensureHelperArrays(Molecule.cHelperNeighbours);\n    const newMolfile = molecule.toMolfile();\n    molecule.addImplicitHydrogens();\n    ensureHeterotopicChiralBonds(molecule);\n    molecule.ensureHelperArrays(Molecule.cHelperSymmetryStereoHeterotopicity);\n    const newMolfileWithH = molecule.toMolfile();\n    const symmetryRanks = getSymmetryRanks(molecule);\n    const cache = {};\n    const hoses = [];\n    const diaIDs = [];\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        const rank = symmetryRanks[i];\n        if (rank && cache[rank]) {\n            diaIDs.push(cache[rank].diaID);\n            hoses.push(cache[rank].hose);\n            continue;\n        }\n        const tempMolecule = molecule.getCompactCopy();\n        tagAtom(tempMolecule, i);\n        let diaID;\n        if (calculateDiastereotopicIDs) {\n            makeRacemic(tempMolecule);\n            diaID = tempMolecule.getCanonizedIDCode(Molecule.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS);\n            diaIDs.push(diaID);\n        }\n        const hose = getHoseCodesForAtomsInternal(tempMolecule, {\n            minSphereSize,\n            maxSphereSize,\n        });\n        hoses.push(hose);\n        cache[rank] = { diaID, hose };\n    }\n    const distanceMatrix = getConnectivityMatrix(molecule, { pathLength: true });\n    return {\n        molfile: newMolfile,\n        molfileWithH: newMolfileWithH,\n        hoses,\n        diaIDs: calculateDiastereotopicIDs ? diaIDs : undefined,\n        moleculeWithHydrogens: molecule,\n        distanceMatrix,\n    };\n}\n//# sourceMappingURL=getHoseCodesAndInfo.js.map","import { getHoseCodesForAtoms } from './getHoseCodesForAtoms.js';\n/**\n * Returns the hose code for a specific atom number\n * @param {import('openchemlib').Molecule} originalMolecule\n * @param {number} rootAtom\n * @param {object} [options={}]\n * @param {boolean} [options.isTagged] - Specify is the atom is already tagged\n * @param {number} [options.minSphereSize=0] - Smallest hose code sphere\n * @param {number} [options.maxSphereSize=4] - Largest hose code sphere\n * @param {number} [options.kind=FULL_HOSE_CODE] - Kind of hose code, default usual sphere\n */\nexport function getHoseCodesForAtom(originalMolecule, rootAtom, options = {}) {\n    return getHoseCodesForAtoms(originalMolecule, [rootAtom], options);\n}\n//# sourceMappingURL=getHoseCodesForAtom.js.map","import { ensureHeterotopicChiralBonds } from '../diastereotopic/ensureHeterotopicChiralBonds.js';\nimport { getHoseCodesForAtomsInternal } from './getHoseCodesForAtomsInternal.js';\n/**\n * Returns the hose code for a specific marked atom\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} options\n */\nexport function getHoseCodesFromDiastereotopicID(molecule, options = {}) {\n    molecule.addImplicitHydrogens();\n    ensureHeterotopicChiralBonds(molecule);\n    return getHoseCodesForAtomsInternal(molecule, options);\n}\n//# sourceMappingURL=getHoseCodesFromDiastereotopicID.js.map","export function getImplicitHydrogensCount(molecule, atomID) {\n    return molecule.getImplicitHydrogens(atomID);\n}\n//# sourceMappingURL=getImplicitHydrogensCount.js.map","/**\n * We have 2 molfiles and we would like to map the atom number from one to the other.\n * We expect that both molfiles contain the same atoms that can be in a different order.\n * @param {typeof import('openchemlib')} OCL - openchemlib library\n * @param {string} from\n * @param {string} to\n * @returns {{fromTo: number[], toFrom: number[]}} - fromTo is an array of the same length as the number of atoms in the from molfile. Each element is the index of the corresponding atom in the to molfile. toFrom is the opposite.\n */\nexport function getMolfilesMapping(OCL, from, to) {\n    const { Molecule } = OCL;\n    const fromF = from.replaceAll(' H ', ' X ');\n    const toF = to.replaceAll(' H ', ' X ');\n    // we may ignore mapping because we should not have hydrogens anymore\n    const fromMoleculeF = Molecule.fromMolfile(fromF);\n    const toMoleculeF = Molecule.fromMolfile(toF);\n    if (fromMoleculeF.getIDCode() !== toMoleculeF.getIDCode()) {\n        // only a problem of hydrogens ?\n        const fromMolecule = Molecule.fromMolfile(from);\n        const toMolecule = Molecule.fromMolfile(to);\n        if (fromMolecule.getIDCode() === toMolecule.getIDCode()) {\n            throw new Error('Molecules do not have the same explicit hydrogens');\n        }\n        else {\n            throw new Error('Molecules are different');\n        }\n    }\n    const fromFinalRanks = [...fromMoleculeF.getFinalRanks()];\n    const toFinalRanks = [...toMoleculeF.getFinalRanks()];\n    // need now to create the mapping\n    const fromTo = [];\n    const toFrom = [];\n    for (let i = 0; i < fromFinalRanks.length; i++) {\n        const fromRank = fromFinalRanks[i];\n        const toRank = toFinalRanks.indexOf(fromRank);\n        if (toRank === -1) {\n            throw new Error('Rank not found. This should never happen.');\n        }\n        fromTo[i] = toRank;\n        toFrom[toRank] = i;\n    }\n    return { fromTo, toFrom };\n}\n//# sourceMappingURL=getMolfilesMapping.js.map","import { getNMRHints } from './getNMRHints.js';\n/**\n *\n * @param {import('openchemlib').Molecule} correct\n * @param {import('openchemlib').Molecule} proposed\n * @param {Array} providedHints\n */\nexport function getNextNMRHint(correct, proposed, providedHints) {\n    const hints = getNMRHints(correct, proposed);\n    const possibleHints = hints.filter((possibleHint) => !providedHints.some((providedHint) => possibleHint.hash === providedHint.hash));\n    if (possibleHints.length === 0)\n        return undefined;\n    return {\n        ...possibleHints[0],\n        idCode: proposed.getIDCode(),\n    };\n}\n//# sourceMappingURL=getNextNMRHint.js.map","/**\n * Get the shortest path between each pair of atoms in the molecule\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {string} [opions.fromLabel='H']\n * @param {string} [opions.toLabel='H']\n * @param {string} [opions.maxLength=4]\n * @returns {Array<Array>} A matrix containing on each cell (i,j) the shortest path from atom i to atom j\n */\nexport function getShortestPaths(molecule, options = {}) {\n    const OCL = molecule.getOCL();\n    const { fromLabel = '', toLabel = '', maxLength = 3 } = options;\n    const fromAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(fromLabel);\n    const toAtomicNumber = OCL.Molecule.getAtomicNoFromLabel(toLabel);\n    const nbAtoms = molecule.getAllAtoms();\n    const allShortestPaths = new Array(nbAtoms);\n    for (let i = 0; i < nbAtoms; i++) {\n        allShortestPaths[i] = new Array(nbAtoms);\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 ((fromAtomicNumber === 0 ||\n                molecule.getAtomicNo(from) === fromAtomicNumber) &&\n                (toAtomicNumber === 0 || molecule.getAtomicNo(to) === toAtomicNumber)) {\n                const path = [];\n                molecule.getPath(path, from, to, maxLength);\n                if (path.length > 0) {\n                    allShortestPaths[from][to] = path.slice();\n                    allShortestPaths[to][from] = path.reverse();\n                }\n                else {\n                    allShortestPaths[from][to] = null;\n                    allShortestPaths[to][from] = null;\n                }\n            }\n            else {\n                allShortestPaths[from][to] = null;\n                allShortestPaths[to][from] = null;\n            }\n        }\n    }\n    return allShortestPaths;\n}\n//# sourceMappingURL=getShortestPaths.js.map","/**\n * Return the number of Carbonyl groups in a molecule or fragment\n * @param {import('openchemlib').Molecule} molecule\n * @returns {number} 'Number of Carbonyl groups'\n */\nexport function nbCHO(molecule) {\n    let counter = 0;\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        // if there is not at least one hydrogen in the carbon atom there can not be a carbonyl group\n        if (molecule.getAtomicNo(i) === 6 && molecule.getAllHydrogens(i) > 0) {\n            let carbonyl = false;\n            let carbonOrHydrogen = true;\n            for (let neighbour = 0; neighbour < molecule.getConnAtoms(i); neighbour++) {\n                const neighbourAtom = molecule.getConnAtom(i, neighbour);\n                const neighbourBond = molecule.getConnBond(i, neighbour);\n                if (molecule.getAtomicNo(neighbourAtom) === 8) {\n                    if (molecule.getBondOrder(neighbourBond) === 2) {\n                        // If there is more than one carbonyl group on the same carbon atom they are not counted as carbonyl groups\n                        if (carbonyl) {\n                            carbonyl = false;\n                            break;\n                        }\n                        carbonyl = true;\n                    }\n                }\n                else if (\n                // If there is not at least one carbon or hydrogen as neighbour atom it is not counted as Carbonyl group\n                molecule.getAtomicNo(neighbourAtom) !== 6 &&\n                    molecule.getAtomicNo(neighbourAtom) !== 1) {\n                    carbonOrHydrogen = false;\n                }\n            }\n            if (carbonyl && carbonOrHydrogen)\n                counter++;\n        }\n    }\n    return counter;\n}\n//# sourceMappingURL=nbCHO.js.map","/**\n * Return the number of Nitrile groups in a molecule or fragment\n * @param {import('openchemlib').Molecule} molecule\n * @returns {number} 'Number of Nitrile groups'\n */\nexport function nbCN(molecule) {\n    let counter = 0;\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        if (molecule.getAtomicNo(i) === 6) {\n            let cn = false;\n            let carbonOrHydrogen = true;\n            for (let neighbour = 0; neighbour < molecule.getConnAtoms(i); neighbour++) {\n                const neighbourAtom = molecule.getConnAtom(i, neighbour);\n                const neighbourBond = molecule.getConnBond(i, neighbour);\n                if (molecule.getAtomicNo(neighbourAtom) === 7 &&\n                    molecule.getBondOrder(neighbourBond) === 3) {\n                    // If there is more than one Nitrile group in the same carbon atome they are not counted as Nitrile groups\n                    if (cn) {\n                        cn = false;\n                        break;\n                    }\n                    cn = true;\n                }\n                else if (\n                // If there is not at least one carbon or hydrogen as neighbour atom it is not counted as Nitrile group\n                molecule.getAtomicNo(neighbourAtom) !== 6 &&\n                    molecule.getAtomicNo(neighbourAtom) !== 1) {\n                    carbonOrHydrogen = false;\n                }\n            }\n            if (cn && carbonOrHydrogen)\n                counter++;\n        }\n    }\n    return counter;\n}\n//# sourceMappingURL=nbCN.js.map","/**\n * Return the number of Carboxyl groups in a molecule or fragment\n * @param {import('openchemlib').Molecule} molecule\n * @returns {number} 'Number of Carboxyl groups'\n */\nexport function nbCOOH(molecule) {\n    let counter = 0;\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        if (molecule.getAtomicNo(i) === 6) {\n            let carbonyl = false;\n            let hydroxyl = false;\n            let carbonOrHydrogen = true;\n            for (let neighbour = 0; neighbour < molecule.getConnAtoms(i); neighbour++) {\n                const neighbourAtom = molecule.getConnAtom(i, neighbour);\n                const neighbourBond = molecule.getConnBond(i, neighbour);\n                if (molecule.getAtomicNo(neighbourAtom) === 8) {\n                    if (molecule.getBondOrder(neighbourBond) === 1 &&\n                        molecule.getAllHydrogens(neighbourAtom) > 0) {\n                        // If there is more than a Hydroxyl in the same carbon atom it is not couted as Carboxyl group\n                        if (hydroxyl) {\n                            hydroxyl = false;\n                            break;\n                        }\n                        hydroxyl = true;\n                    }\n                    else if (molecule.getBondOrder(neighbourBond) === 2) {\n                        // If there is more than one carbonyl in the same carbon atom it is not count as Carboxyl group\n                        if (carbonyl) {\n                            carbonyl = false;\n                            break;\n                        }\n                        carbonyl = true;\n                    }\n                }\n                else if (\n                // If there is not at least one carbon or hydrogen as neighbour atom it is not counted as Carboxyl group\n                molecule.getAtomicNo(neighbourAtom) !== 6 &&\n                    molecule.getAtomicNo(neighbourAtom) !== 1) {\n                    carbonOrHydrogen = false;\n                }\n            }\n            if (carbonyl && hydroxyl && carbonOrHydrogen)\n                counter++;\n        }\n    }\n    return counter;\n}\n//# sourceMappingURL=nbCOOH.js.map","/**\n * Return the number of labile protons being either on O, N, Br, Cl, F, I or S\n * @param {import('openchemlib').Molecule} molecule\n * @param {object} [options={}]\n * @param {Array<number>} [options.atomicNumbers=[7, 8, 9, 16, 17, 35, 53]] - atomic numbers of the labile protons\n * @returns {number} 'Number of labile protons'\n */\nexport function nbLabileH(molecule, options = {}) {\n    const { atomicNumbers = [7, 8, 9, 16, 17, 35, 53] } = options;\n    let counter = 0;\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        if (atomicNumbers.includes(molecule.getAtomicNo(i))) {\n            counter += molecule.getAllHydrogens(i);\n        }\n    }\n    return counter;\n}\n//# sourceMappingURL=nbLabileH.js.map","/**\n * Return the number of Primary amine groups in a molecule or fragment\n * @param {import('openchemlib').Molecule} molecule\n * @returns {number} 'Number of Primary amine groups'\n */\nexport function nbNH2(molecule) {\n    let counter = 0;\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        if (molecule.getAtomicNo(i) === 6) {\n            let amine = false;\n            let carbonOrHydrogen = true;\n            for (let neighbour = 0; neighbour < molecule.getConnAtoms(i); neighbour++) {\n                const neighbourAtom = molecule.getConnAtom(i, neighbour);\n                const neighbourBond = molecule.getConnBond(i, neighbour);\n                if (molecule.getAtomicNo(neighbourAtom) === 7 &&\n                    molecule.getBondOrder(neighbourBond) === 1 &&\n                    molecule.getAllHydrogens(neighbourAtom) > 1) {\n                    // If there is more than a Primary amine in the same carbon atom they are not couted as Primary amines groups\n                    if (amine) {\n                        amine = false;\n                        break;\n                    }\n                    amine = true;\n                }\n                else if (\n                // If there is not at least one carbon or hydrogen as neighbour atom it is not counted as Primary amine group\n                molecule.getAtomicNo(neighbourAtom) !== 6 &&\n                    molecule.getAtomicNo(neighbourAtom) !== 1) {\n                    carbonOrHydrogen = false;\n                }\n            }\n            if (amine && carbonOrHydrogen)\n                counter++;\n        }\n    }\n    return counter;\n}\n//# sourceMappingURL=nbNH2.js.map","/**\n * Return the number of Hydroxyl groups in a molecule or fragment\n * @param {import('openchemlib').Molecule} molecule\n * @returns {number} 'Number of Hydroxyl groups'\n */\nexport function nbOH(molecule) {\n    let counter = 0;\n    for (let i = 0; i < molecule.getAllAtoms(); i++) {\n        if (molecule.getAtomicNo(i) === 6) {\n            let carbonyl = false;\n            let hydroxyl = false;\n            let carbonOrHydrogen = true;\n            for (let neighbour = 0; neighbour < molecule.getConnAtoms(i); neighbour++) {\n                const neighbourAtom = molecule.getConnAtom(i, neighbour);\n                const neighbourBond = molecule.getConnBond(i, neighbour);\n                if (molecule.getAtomicNo(neighbourAtom) === 8) {\n                    if (molecule.getBondOrder(neighbourBond) === 1 &&\n                        molecule.getAllHydrogens(neighbourAtom) > 0) {\n                        // If there is more than a Hydroxyl in the same carbon atome they are not couted as Hydroxyl groups\n                        if (hydroxyl) {\n                            hydroxyl = false;\n                            break;\n                        }\n                        hydroxyl = true;\n                    }\n                    else if (molecule.getBondOrder(neighbourBond) === 2) {\n                        // If there is Carbonyl group on the same carbon atom it is not couted as Hydroxyl group\n                        carbonyl = true;\n                    }\n                }\n                else if (\n                // If there is not at least one carbon or hydrogen as neighbour atom it is not counted as Hydroxyl group\n                molecule.getAtomicNo(neighbourAtom) !== 6 &&\n                    molecule.getAtomicNo(neighbourAtom) !== 1) {\n                    carbonOrHydrogen = false;\n                }\n            }\n            if (!carbonyl && hydroxyl && carbonOrHydrogen)\n                counter++;\n        }\n    }\n    return counter;\n}\n//# sourceMappingURL=nbOH.js.map","import { getCamelCase } from './getCamelCase.js';\nexport function getParts(text) {\n    const lines = text.split(/\\r?\\n/);\n    const parts = { data: [] };\n    let currentPart = parts.data;\n    let currentLabel = '';\n    for (const line of lines) {\n        if (line.startsWith('</')) {\n            // close existing part\n            if (currentLabel !== line.slice(2, -1)) {\n                throw new Error('This should not happen');\n            }\n            currentLabel = '';\n            currentPart = parts.data;\n        }\n        else if (line.startsWith('<') && !line.includes('=')) {\n            // open new part\n            if (currentLabel) {\n                throw new Error('This should not happen');\n            }\n            currentLabel = line.slice(1, -1);\n            const target = getCamelCase(currentLabel);\n            parts[target] = [];\n            currentPart = parts[target];\n        }\n        else if (currentLabel) {\n            // add line to current part\n            currentPart.push(line);\n        }\n        else {\n            //data lines\n            currentPart.push(line);\n        }\n    }\n    return parts;\n}\n//# sourceMappingURL=getParts.js.map","/**\n * Converts a string to camel case.\n * @param {string} name\n * @returns {string}\n */\nexport function getCamelCase(name) {\n    return name.replaceAll(/[ -][a-z]/g, (string) => string[1].toUpperCase());\n}\n//# sourceMappingURL=getCamelCase.js.map","import { getDiastereotopicAtomIDsAndH } from './getDiastereotopicAtomIDsAndH.js';\n/**\n * Returns a SVG\n * @param {*} molecule\n * @param {*} [options={}]\n */\nexport function toDiastereotopicSVG(molecule, options = {}) {\n    const { width = 300, height = 200, prefix = 'ocl', heavyAtomHydrogen = false, } = options;\n    let svg = options.svg;\n    let diaIDs = [];\n    const hydrogenInfo = {};\n    for (const line of getDiastereotopicAtomIDsAndH(molecule)) {\n        hydrogenInfo[line.oclID] = line;\n    }\n    if (heavyAtomHydrogen) {\n        for (let i = 0; i < molecule.getAtoms(); i++) {\n            diaIDs.push([]);\n        }\n        const groupedDiaIDs = molecule.getGroupedDiastereotopicAtomIDs();\n        for (const diaID of groupedDiaIDs) {\n            if (hydrogenInfo[diaID.oclID] &&\n                hydrogenInfo[diaID.oclID].nbHydrogens > 0) {\n                for (const atom of diaID.atoms) {\n                    for (const id of hydrogenInfo[diaID.oclID].hydrogenOCLIDs) {\n                        if (!diaIDs[atom * 1].includes(id))\n                            diaIDs[atom].push(id);\n                    }\n                }\n            }\n        }\n    }\n    else {\n        diaIDs = molecule.getDiastereotopicAtomIDs().map((a) => [a]);\n    }\n    if (!svg)\n        svg = molecule.toSVG(width, height, prefix);\n    svg = svg.replaceAll(/Atom:\\d+\"/g, (value) => {\n        const atom = value.replaceAll(/\\D/g, '');\n        return `${value} data-diaid=\"${diaIDs[atom].join(',')}\"`;\n    });\n    return svg;\n}\n//# sourceMappingURL=toDiastereotopicSVG.js.map","import { getDiastereotopicAtomIDsAndH } from '../diastereotopic/getDiastereotopicAtomIDsAndH.js';\nimport { getGroupedDiastereotopicAtomIDs } from '../diastereotopic/getGroupedDiastereotopicAtomIDs.js';\nexport function toVisualizerMolfile(molecule, options = {}) {\n    const { diastereotopic, heavyAtomHydrogen } = options;\n    let highlight = [];\n    let atoms = {};\n    if (diastereotopic) {\n        const hydrogenInfo = {};\n        const extendedIDs = getDiastereotopicAtomIDsAndH(molecule);\n        for (const line of extendedIDs) {\n            hydrogenInfo[line.oclID] = line;\n        }\n        const diaIDs = getGroupedDiastereotopicAtomIDs(molecule);\n        for (const diaID of diaIDs) {\n            atoms[diaID.oclID] = diaID.atoms;\n            highlight.push(diaID.oclID);\n            if (heavyAtomHydrogen &&\n                hydrogenInfo[diaID.oclID] &&\n                hydrogenInfo[diaID.oclID].nbHydrogens > 0) {\n                for (const id of hydrogenInfo[diaID.oclID].hydrogenOCLIDs) {\n                    highlight.push(id);\n                    atoms[id] = diaID.atoms;\n                }\n            }\n        }\n    }\n    else {\n        const size = molecule.getAllAtoms();\n        highlight = new Array(size).fill(0).map((a, index) => index);\n        atoms = highlight.map((a) => [a]);\n    }\n    const molfile = {\n        type: 'mol2d',\n        value: molecule.toMolfile(),\n        _highlight: highlight,\n        _atoms: atoms,\n    };\n    return molfile;\n}\n//# sourceMappingURL=toVisualizerMolfile.js.map","/**\n * Toggle presence of implicity hydrogens on/off\n * @param molecule\n * @param atomID\n */\nexport function toggleHydrogens(molecule, atomID) {\n    if (molecule.getImplicitHydrogens(atomID) === 0) {\n        const atomsToDelete = [];\n        for (let i = 0; i < molecule.getAllConnAtoms(atomID); i++) {\n            const connectedAtom = molecule.getConnAtom(atomID, i);\n            if (molecule.getAtomicNo(connectedAtom) === 1) {\n                atomsToDelete.push(connectedAtom);\n            }\n        }\n        molecule.deleteAtoms(atomsToDelete);\n    }\n    else {\n        molecule.addImplicitHydrogens(atomID);\n    }\n}\n//# sourceMappingURL=toggleHydrogens.js.map"],"names":["xAtomicNumber","getXAtomicNumber","molecule","OCL","getOCL","Molecule","getAtomicNoFromLabel","cPseudoAtomX","isCsp3","atomID","getAtomicNo","getAtomCharge","getImplicitHydrogens","getConnAtoms","makeRacemic","ensureHelperArrays","cHelperCIP","i","getAllAtoms","getAtomParity","cAtomParityNone","setAtomESR","cESRTypeAnd","tagAtom","iAtom","customLabel","getAtomLabel","setAtomCustomLabel","setAtomicNo","setAtomMass","getAtomMass","FULL_HOSE_CODE","getHoseCodesForAtomsInternal","options","fragments","getHoseCodesForAtomsAsFragments","hoses","fragment","push","getCanonizedIDCode","CANONIZER_ENCODE_ATOM_CUSTOM_LABELS","allowedCustomLabels","minSphereSize","maxSphereSize","kind","tagAtoms","tagAtomFct","rootAtoms","slice","getCompactCopy","length","setAtomMapNo","atom","cHelperNeighbours","mapping","Int32Array","getAtomMapNo","internalTagAtoms","j","includes","getAtomCustomLabel","mappings","min","max","atomMask","Uint8Array","atomList","sphere","rootAtom","newMax","getAllConnAtoms","connAtom","getConnAtom","Error","copyMoleculeByAtoms","indexOf","removeExplicitHydrogens","addQueryFeaturesAndRemoveMapNo","isAromaticAtom","setAtomQueryFeature","cAtomQFAromatic","cAtomQFNotAromatic","getAtomRingSize","cAtomQFRingSize3","cAtomQFRingSize4","cAtomQFRingSize5","cAtomQFRingSize6","cAtomQFRingSize7","cAtomQFRingSizeLarge","nbHydrogens","getAllHydrogens","cAtomQFNot0Hydrogen","cAtomQFNot1Hydrogen","cAtomQFNot2Hydrogen","cAtomQFNot3Hydrogen","toString","Object","prototype","isAnyArray","value","tag","call","endsWith","input","output","arguments","undefined","TypeError","Array","currentMin","_options$fromIndex","fromIndex","_options$toIndex","toIndex","Number","isInteger","minValue","currentMax","maxValue","RangeError","_options$min","autoMinMax","_options$max","factor","defineProperty","matrix","require$$0","rescale","require$$1","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","padMinus","constructor","name","rows","columns","maxI","Math","maxJ","result","loop","get","line","formatNumber","join","inspectData","num","formatNumber2","padEnd","len","str","fix","toFixed","startsWith","exp","toExponential","checkRowIndex","index","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRowIndices","rowIndices","checkColumnIndices","columnIndices","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","array","checkNonEmpty","isEmpty","AbstractMatrix","from1DArray","newRows","newColumns","newData","newMatrix","Matrix","row","column","set","rowVector","columnVector","zeros","ones","fill","rand","random","randInt","interval","round","eye","this","diag","data","l","matrix1","matrix2","checkMatrix","isMatrix","klass","size","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isDistance","isEchelonForm","previousColumn","checked","isReducedEchelonForm","k","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","m","n","maxRow","p","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","setRow","row1","row2","temp","getColumn","getColumnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","NEGATIVE_INFINITY","maxIndex","v","idx","POSITIVE_INFINITY","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","norm","type","sqrt","dot","cumulativeSum","sum","vector2","vector1","mmul","other","Bcolj","Float64Array","s","mpow","scalar","bb","e","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","y","x","r1","c1","r2","c2","embed","mat","cols","r","c","resultat","console","warn","blockMult","a","b","halfRows","parseInt","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","last","flipColumns","kroneckerProduct","q","kroneckerSum","AxI","IxB","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndex","columnIndex","trace","from","to","entries","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","scale","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","iterator","col","values","for","randomInt","diagonal","identity","negate","tensorProduct","initData","nRows","nColumns","super","arrayData","every","element","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","abs","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","floor","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","pow","arg0","powS","powM","installMathOperations","SymmetricMatrix","diagonalSize","isSymmetricMatrix","klassType","upperRightEntries","toMatrix","removeCross","addCross","applyMask","mask","sidesToRemove","passthroughs","reverse","sideIndex","toCompact","compact","fromCompact","compactSize","JSON","stringify","upperRightValues","DistanceMatrix","isDistanceMatrix","klassSubType","sideSize","toSymmetricMatrix","BaseView","MatrixSelectionView","WrapperMatrix1D","_calculateIndex","WrapperMatrix2D","LuDecomposition","t","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","solve","count","X","determinant","lowerTriangularMatrix","upperTriangularMatrix","pivotPermutationVector","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","orthogonalMatrix","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","eps","EPSILON","kase","alpha","MIN_VALUE","isNaN","ks","f","cs","sn","sp","spm1","epm1","sk","ek","shift","g","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","condition","norm2","rank","tol","ii","leftSingularVectors","diagonalMatrix","leftHandSide","rightHandSide","useSVD","xrange","exception","range","dependenciesOneRow","error","thresholdValue","thresholdError","returnArray","EigenvalueDecomposition","assumeSymmetric","d","hh","tred2","dl1","c3","el1","s2","tst1","tql2","H","ort","low","high","orthes","nn","w","ra","sa","vr","vi","notlast","cdivres","exshift","z","iter","cdiv","hqr2","realEigenvalues","imaginaryEigenvalues","eigenvectorMatrix","xr","xi","yr","yi","CholeskyDecomposition","dimension","positiveDefinite","L","isPositiveDefinite","B","nipals","scaleScores","maxIterations","terminationCriteria","u","tOld","diff","counter","xResidual","residual","yResidual","betas","CHO","EVD","Matrix_1","MatrixColumnSelectionView","MatrixColumnView","MatrixFlipColumnView","MatrixFlipRowView","MatrixRowSelectionView","MatrixRowView","MatrixSubView","MatrixTransposeView","NIPALS","Nipals","SVD","correlation","xMatrix","yMatrix","yIsSame","sdx","sdy","corr","covariance","cov","_default","default","subMatrix0","subMatrix1","subMatrix2","linearDependencies","results","Abis","pseudoInverse","svdSolution","wrap","getConnectivityMatrix","nbAtoms","map","pathLength","atomicNo","negativeAtomicNo","mass","cRoundedMass","sdt","getConnBondOrder","sdta","bondNumber","getConnBond","isAromaticBond","adjMatrix","numVertices","distMatrix","val","is","dist","floydWarshall","getChiralOrHeterotopicCarbons","internalMolecule","addImplicitHydrogens","cHelperSymmetryStereoHeterotopicity","getAtoms","getStereoBond","getNeighbourSymmetries","stereoBond","getAtomPreferredStereoBond","setBondType","cBondTypeUp","getBondAtom","setBondAtom","addPossibleChiralBonds","atoms","neighbourSymmetries","symmetryRank","getSymmetryRank","ensureHeterotopicChiralBonds","esrType","atLeastThreeAtoms","cHelperBitNeighbours","heterotopicCarbons","TopicMolecule","originalMolecule","idCode","cache","maxPathLength","maxNbAtoms","logger","getIDCode","setAtomNoInMapNo","molecules","moleculeWithH","ensureMapNo","existingMapNo","mapNo","nextMapNo","getHoseFragment","sphereSize","getAtomPathsFrom","minPathLength","toAtomicNo","atomPaths","atomsPaths","paths","atomPath","path","at","getAtomPaths","atom1","atom2","minDistance","maxDistance","allAtomsPaths","oneAtomPaths","nextIndexes","nextAtoms","currentIndexes","currentAtoms","previousPath","conn","connectedAtom","getAllAtomsPaths","toMolfile","version","toMolfileV3","getMolecule","fromMolecule","topicMolecule","canonizedDiaIDs","canonizedHoseCodes","getMoleculeWithH","xMolecule","xAtomNumber","getXMolecule","diaIDs","finalRanks","getDiaIDsObject","groupDiastereotopicAtomIDsAsObject","hoseCodes","diaMol","heterotopicSymmetryRanks","diaID","tempMolecule","getCanonizedDiaIDs","getCanonizedHoseCodes","distanceMatrix","diaIDsAndInfo","newDiaIDs","counts","newDiaID","attachedHydrogensIDCodes","attachedHydrogens","nbAttachedHydrogens","atomLabel","nbEquivalentAtoms","heavyAtom","atomMapNo","hydrogenDiaID","getDiaIDsAndInfo","symmetryRanks","getHeterotopicSymmetryRanks","getFinalRanks","toMolfileWithH","toMolfileWithoutH","atomsToDelete","getExplicitHydrogens","deleteAtoms","getGroupedDiastereotopicAtomIDs","groupDiastereotopicAtomIDs","getDiaIDsMapping","originalDiaIDs","filter","destinationDiaIDs","destinationDiaID","originalDiaID","find","newIDCode","oldIDCode","oldHydrogenIDCode","newHydrogenIDCode","diaIDsObject","keys","key","oclID","heavyAtoms","existingAtoms","connected","getSymmetryRanks","getDiastereotopicAtomIDs","numberAtoms","ids","getDiastereotopicAtomIDsAndH","hydrogenOCLIDs","getHoseCodesForAtoms","getHoseCodesForPath","maxLength","originalFrom","originalTo","originalAtoms","torsion","getPath","calculateTorsion","tag1","tag2","atomMap","getUnit","unit","markMonomer","addBond","firstAtomicNo","secondAtomicNo","checkEntity","nbR1","nbR2","r1AtomicNo","r2AtomicNo","getR1R2AtomicNo","r1Count","r2Count","cPseudoAtomsRGroups","appendMolecule","core","rGroups","currents","newSmiles","smiles","currentMol","fromSmiles","toSmiles","combinedSmiles","molfile","props","MoleculeProperties","nbHAcceptor","acceptorCount","nbHDonor","donorCount","logP","logS","PSA","polarSurfaceArea","nbRottable","rotatableBondCount","nbStereoCenter","stereoCenterCount","mf","getMolecularFormula","formula","mw","relativeWeight","updateRPosition","replace","level","currentChar","charAt","currentSubstring","match","ensureString","blob","ArrayBuffer","isView","encoding","guessEncoding","TextDecoder","decode","uint8","buffer","byteOffset","byteLength","buf","isutf8","parseColumnbProperties","lines","split","columnProperties","currentColumnName","columnPropery","parent","target","related","specialType","valueEhnhancer","header","rawEntry","label","atomMapping","idcoordinates2D","parseDefault","getAtomsInfo","cHelperRings","extra","singleBonds","doubleBonds","tripleBonds","aromaticBonds","cnoHybridation","abnormalValence","getAtomAbnormalValence","charge","cipParity","getAtomCIPParity","color","getAtomColor","radical","getAtomRadical","ringBondCount","getAtomRingBondCount","ringSize","getAtomX","getAtomY","getAtomZ","allHydrogens","connAtoms","allConnAtoms","implicitHydrogens","isAromatic","isAllylic","isAllylicAtom","isStereoCenter","isAtomStereoCenter","isRing","isRingAtom","isSmallRing","isSmallRingAtom","isStabilized","isStabilizedAtom","bond","bondOrder","getBondOrder","totalBonds","hydrogenOnAtomicNo","labileHydrogen","getMF","getFragments","parts","allAtoms","entry","getFragmentMF","part","toMFString","mfs","atomSorter","unsaturationsObject","O","N","C","F","Si","Cl","Br","I","getUnsaturation","elements","unsaturation","matches","symbol","defaultPossibleHints","String","raw","message","anyMatches","remarks","getNMRHints","correct","proposed","hints","checkMF","checkUnsaturation","checkStereoAndTautomer","possibleHints","searcherCorrect","SSSearcher","setMolecule","searcherAnswer","possibleHint","anyMatch","matchFragment","fromIDCode","setFragment","isFragmentInMolecule","isMFCorrect","answer","nbCorrectRanks","nbAnswerRanks","checkSymmetry","hint","hash","getHash","mfCorrect","mfAnswer","unsaturationCorrect","unsaturationAnswer","getNoStereoIDCode","getTautomerIDCode","CanonizerUtil","TAUTOMER","NOSTEREO","seed","h1","h2","ch","codePointAt","imul","toxicityPredictor","druglikenessPredictor","appendAtomPart","getPathAndTorsion","module","exports","self","window","document","postMessage","IS_PAPA_WORKER","o","_handle","_finished","_completed","_halted","_input","_baseIndex","_partialLine","_rowCount","_start","_nextChunk","isFirstChunk","_completeResults","errors","meta","chunkSize","step","chunk","streamer","_config","parseChunk","skipFirstNLines","newline","quoteChar","guessLineEndings","beforeFirstChunk","parse","paused","aborted","cursor","substring","preview","workerId","WORKER_ID","finished","concat","complete","_sendError","RemoteChunkSize","_readChunk","_chunkLoaded","stream","XMLHttpRequest","withCredentials","onload","onerror","_chunkError","open","downloadRequestBody","downloadRequestHeaders","setRequestHeader","send","status","readyState","responseText","getResponseHeader","lastIndexOf","statusText","LocalChunkSize","FileReader","webkitSlice","mozSlice","FileReaderSync","readAsText","pause","resume","on","_streamData","_streamEnd","_streamError","_checkIsFinished","_streamCleanUp","removeListener","skipEmptyLines","trim","DefaultDelimiter","_","isArray","forEach","transformHeader","dynamicTypingFunction","dynamicTyping","test","parseFloat","Date","transform","fields","code","abort","delimiter","RECORD_SEP","UNIT_SEP","E","comments","successful","bestDelimiter","delimitersToGuess","getCharIndex","setTimeout","RegExp","P","S","A","T","fastMode","D","escapeChar","BAD_DELIMITERS","M","R","substr","Set","has","linebreak","truncated","renamedHeaders","userError","file","userStep","userChunk","userComplete","terminate","worker","WORKERS_SUPPORTED","NODE_STREAM_INPUT","charCodeAt","download","readable","read","File","URL","webkitURL","BLOB_URL","createObjectURL","Blob","Worker","onmessage","id","config","unparse","quotes","escapeFormulae","fromCharCode","BYTE_ORDER_MARK","Parser","ParserHandle","NetworkStreamer","FileStreamer","StringStreamer","ReadableStreamStreamer","jQuery","fn","each","prop","toUpperCase","attr","toLowerCase","files","inputElem","instanceConfig","extend","before","action","reason","create","getMoleculeCreators","Map","fromMolfile","smarts","SmilesParser","smartsMode","parseMolecule","defaultCSVOptions","__defProp","__name","configurable","isObject","segs","joinChar","splitChar","isValid","isValidObject","index_default","pathIsArray","pathIsString","separator","hasProp","sdfPart","labels","currentLabels","eol","isNumeric","keep","exclude","include","modifiers","modifier","modifiedValue","async","appendSDF","moleculesDB","sdf","onStep","mixedEOL","parsed","replaceAll","entriesBoundaries","string","res","previous","next","nextMatch","getEntriesBoundaries","start","now","currentLabel","Infinity","always","statistics","statistic","time","pushEntry","BUFFER","IDX","HEX","moleculeInfo","moleculeIDCode","getMoleculeIDCode","out","v4","db","getIndex","molecularFormula","properties","em","absoluteWeight","computeProperties","updateStatistics","calculatedStatistics","dataStatistics","stat","noWait","Promise","resolve","setImmediate","AbortError","getQuery","query","format","moleculeCreators","search","mode","exactSearch","queryMW","getMW","searchResult","substructureSearchBegin","queryIndex","searcher","substructureSearchEnd","substructureSearch","substructureSearchOR","similaritySearch","processResult","searchAsync","controller","shouldAbort","abortEventListener","signal","addEventListener","begin","performance","subStructureSearchAsync","queryIDCode","queries","queryIdCode","similarity","MAX_SAFE_INTEGER","SSSearcherWithIndex","getSimilarityTanimoto","flattenResult","keepMolecule","limit","rAtomicNumber","getRAtomicNumber","cPseudoAtomR","checkIfExistsOrAddInfo","processedMolecules","moleculeInfoCallback","asReagent","asProduct","exists","info","applyOneReactantReactions","tree","reactions","currentDepth","maxDepth","maxCurrentDepth","reactants","reactant","todoNextDepth","depth","reaction","stats","limitReactions","reactor","Reactor","oclReaction","setReactant","oneReactionProducts","getProducts","oneReactionProduct","reactionProduct","needToBeCharged","reactionWithoutOCL","oneReaction","children","getFilteredTrees","nodesToKeep","getNodes","parentMap","getParentMap","currentNode","getValidChildren","trees","nodes","validNodes","node","validChildren","child","appendLeavesSS","leaves","currentBranch","getNodesSS","Reactions","skipProcessed","appendHead","moleculesOrIDCodes","getLeaves","getValidNodes","getFilteredReactions","filteredReactions","clearAsFromProcessedMolecules","newReactions","rxnCode","ReactionEncoder","appendOCLReaction","todoCurrentLevel","nexts","todo","flat","newNodes","keepEmptyMolecules","clear","nbMolecules","nbData","number","calculated","isNumber","appendEntries","idCodePath","indexPath","coordinatesPath","mwPath","smilesPath","molfilePath","coordinates","appendCSV","csv","Papa","firstElement","moleculeCreator","moleculeField","lowerField","appendSmilesList","text","smilesArray","oneSmiles","pushMoleculeInfo","getDB","appendColor","dataLabel","propertyLabel","minHue","maxHue","saturation","lightness","colorLabel","flatMap","datum","definedValues","coreSmiles","complexity","originalSmiles","getCore","group","getRGroups","rGroup","getComplexity","sizes","position","generate","gamma","getAlphaGamma","polymer","addMolecule","links","bonds","getAllBonds","order","getBondType","isRingBond","selected","brokenMolecule","markBondForDeletion","deleteMarkedAtomsAndBonds","fragmentMap","nbFragments","getFragmentNumbers","includeAtom","addAtom","currentSphere","fromMolfileWithAtomMap","diaIDsArray","source","destination","atomLabels","atomicNumbers","calculateDiastereotopicIDs","newMolfile","newMolfileWithH","hose","molfileWithH","moleculeWithHydrogens","fromF","toF","fromMoleculeF","toMoleculeF","toMolecule","fromFinalRanks","toFinalRanks","fromTo","toFrom","fromRank","toRank","providedHints","some","providedHint","fromLabel","toLabel","minLength","withHOSES","fromAtomicNumber","toAtomicNumber","atomsInfo","pathLengthMatrix","includeToxicities","includeDruglikeness","moleculeFormula","ToxicityPredictor","mutagenic","assessRisk","TYPE_MUTAGENIC","tumorigenic","TYPE_TUMORIGENIC","irritant","TYPE_IRRITANT","reproductiveEffective","TYPE_REPRODUCTIVE_EFFECTIVE","DruglikenessPredictor","drugLikeness","assessDruglikeness","drugScore","DrugScoreCalculator","calculate","tumurogenic","allShortestPaths","carbonyl","carbonOrHydrogen","neighbour","neighbourAtom","neighbourBond","cn","hydroxyl","amine","currentPart","getParts","headers","rawEntries","parseData","rawData","improveParts","width","height","prefix","heavyAtomHydrogen","svg","hydrogenInfo","groupedDiaIDs","toSVG","diastereotopic","highlight","extendedIDs","_highlight","_atoms"],"mappings":"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","x_google_ignoreList":[5,6,7,8,9,10,12,32,33,38,46,49,50,52,53,54]}